【MT4】対象通貨の複数ポジションを一括決済するボタンの作り方

別のnoteで保有してる全ポジションを一括決済するボタンの作り方を紹介しました。

するとこんなお声が

「ある通貨のポジションだけ一括決済したい!」

確かにそんな場面ありますよね!

・対象の通貨だけはプラス収支になった
・スキャルピングとスイングトレード両方行って、全通貨決済はしたくない

画像1

基本的なボタンの作り方は一緒

int OnInit()
{
  //通貨決済ボタン
   ObjectCreate("btnNow", OBJ_BUTTON, 0, 0, 0);
   ObjectSet("btnNow", OBJPROP_XDISTANCE, 90);
   ObjectSet("btnNow", OBJPROP_YDISTANCE, 115);
   ObjectSet("btnNow", OBJPROP_XSIZE, 80);
   ObjectSet("btnNow", OBJPROP_YSIZE, 25);
   ObjectSet("btnNow", OBJPROP_CORNER, 1);
   ObjectSet("btnNow", OBJPROP_FONTSIZE, 10);
   ObjectSet("btnNow", OBJPROP_COLOR, Black);
   ObjectSet("btnNow", OBJPROP_BGCOLOR, DarkGray);
   ObjectSetString(0, "btnNow", OBJPROP_TEXT, "現通貨決済");
   ObjectSetString(0, "btnNow", OBJPROP_FONT, "MS ゴシック");
      
   return(INIT_SUCCEEDED);
}

同じとろこの説明は省かせてもらいます。上にリンク貼ってますので以前のnote参照してくださいね。

違うのはココだけ!

void OnChartEvent(const int id,
                 const long &lparam,
                 const double &dparam,
                 const string &sparam)
{
  int Ret;
   if(sparam == "btnNow" && id==CHARTEVENT_OBJECT_CLICK)
   {
       for(int i = OrdersTotal() -1; i >= 0; i--)
       {
       
           Ret = OrderSelect(i, SELECT_BY_POS);
           if (OrderSymbol() == Symbol()) {
              if(OrderType() == OP_BUY)
              {
                  RefreshRates();
                  if(OrderClose(OrderTicket(), OrderLots(), SymbolInfoDouble(OrderSymbol(), SYMBOL_BID), 5, Yellow) == false)
                  {
                      Print(GetLastError());
                      continue;
                  }
              }
              else if(OrderType() == OP_SELL)
              {
                  RefreshRates();
                  if(OrderClose(OrderTicket(), OrderLots(), SymbolInfoDouble(OrderSymbol(), SYMBOL_ASK), 5, Yellow) == false)
                  {
                      Print(GetLastError());
                      continue;
                  }
              } 
           }
       }
   
       Sleep(100);
       ObjectSet("btnNow", OBJPROP_STATE, False);
   }
}

どこが違うかわかりますか?

           if (OrderSymbol() == Symbol()) {

このIF文が追加されてます。

OrderSymbol()は、OrderSelectで選択したチケットの通貨が取得できます。

Symbol()は、ボタンを設置したチャートの通貨ですね。

つまり、選択したチケットの通貨とボタンを設置したチャートの通貨の時だけ、決済処理を行うように指示します。

こうする事で、対象通貨の複数ポジションが一括決済する事が出来ます。



この記事が気に入ったらサポートをしてみませんか?