FX-EA System Projectはこちら公式ラインに登録して
プレゼントをもらう

【MQL】ポジションを一括決済することができるボタン【中級編】

MQL MT4 EA 決済 ボタンMT4EA作成

ポジションを一括決済することができるボタン

トレードしている際に一つずつポジションを決済していると知らない間にマイナスになることがあります。

そうした際に全決済してポジションを一気に決済できるボタンを作成しましょう。

  • ポジションを全決済するボタン

メタエディタ(MetaEditor)を立ち上げる

メタエディタ(MetaEditor)を立ち上げましょう。今回は名前を「All-Delete」にします。

OnInit()関数を記述する

OnInit()関数を記述していきます。

まずはObjectCreateでボタンを作成しましょう。

ObjectCreate("All_Delete", OBJ_BUTTON, 0, 0, 0);

次にObjectSetでX軸とY軸のアンカーを決めましょう。

今回はX軸は0PixelでY軸は30Pixelにしましょう。

ObjectSet("All_Delete", OBJPROP_XDISTANCE, 0);//ピクセル単位のX軸アンカー
ObjectSet("All_Delete", OBJPROP_YDISTANCE, 30);//ピクセル単位のY軸アンカー

次にオブジェクトのサイズを決めましょう。

ObjectSetでX軸のサイズを180PixelにY軸のサイズを50Pixelにしましょう。

ObjectSet("All_Delete", OBJPROP_XSIZE, 180);//オブジェクトのX軸のサイズ
ObjectSet("All_Delete", OBJPROP_YSIZE, 50);//オブジェクトのY軸のサイズ

次にアンカーコーナーを決めましょう。

アンカーコーナーというのはチャートの四つ角をどこの視点にするかです。

今回は、左上なので0を選択します。

ObjectSet("All_Delete", OBJPROP_CORNER, 0);// オブジェクトのアンカーコーナー0: 左上、1: 右上、2: 右下、3: 左下)

次にフォントサイズを10にしましょう。

ObjectSet("All_Delete", OBJPROP_FONTSIZE, 10);//フォントサイズ

次にカラーを決めましょう。

文字カラーをブラックにして背景カラーをダークグレーにしましょう。

ObjectSet("All_Delete", OBJPROP_COLOR, Black);//文字カラー
bjectSet("All_Delete", OBJPROP_BGCOLOR, DarkGray);//背景カラー

表示テキストを作りましょう。今回はポチッととなにしました。

ObjectSetString(0, "All_Delete", OBJPROP_TEXT, "_(┐「ε:)_ポチッとな");//表示テキスト

最後です。フォントの種類を決めましょう。無難にMSゴシックにしました。

ObjectSetString(0, "All_Delete", OBJPROP_FONT, "MS ゴシック");//フォントの種類

これでOnInit()関数を記述は完了です。

   ObjectCreate("All_Delete", OBJ_BUTTON, 0, 0, 0);//ボタンを作成
   ObjectSet("All_Delete", OBJPROP_XDISTANCE, 0);//ピクセル単位のX軸アンカー
   ObjectSet("All_Delete", OBJPROP_YDISTANCE, 30);//ピクセル単位のY軸アンカー
   ObjectSet("All_Delete", OBJPROP_XSIZE, 180);//オブジェクトのX軸のサイズ
   ObjectSet("All_Delete", OBJPROP_YSIZE, 50);//オブジェクトのY軸のサイズ
   ObjectSet("All_Delete", OBJPROP_CORNER, 0);// オブジェクトのアンカーコーナー0: 左上、1: 右上、2: 右下、3: 左下)
   ObjectSet("All_Delete", OBJPROP_FONTSIZE, 10);//フォントサイズ
   ObjectSet("All_Delete", OBJPROP_COLOR, Black);//文字カラー
   ObjectSet("All_Delete", OBJPROP_BGCOLOR, DarkGray);//背景カラー
   ObjectSetString(0, "All_Delete", OBJPROP_TEXT, "_(┐「ε:)_ポチッとな");//表示テキスト
   ObjectSetString(0, "All_Delete", OBJPROP_FONT, "MS ゴシック");//フォントの種類
Copy

OnDeinit()関数を記述する

OnDeinit()関数を記述しましょう。チャートから削除後にオブジェクトが消えるようにしましょう。

ObjectDelete("All_Delete");

OnDeinit()関数を記述は完了です。

ObjectDelete("All_Delete");//チャートから削除後表示削除
Copy

OnChartEvent()関数を記述する

OnChartEvent()関数を記述していきます。

ポジション番号用の変数であるRetを作ります。

int Ret;//ポジション番号用の変数

オブジェクトがクリックしたタイミングを作るためにsparamと作成したオブジェクトを選択します。

if(sparam == "All_Delete")//オブジェクトがクリックされた場合

ポジション番号を取得してRetの変数に格納します。

Ret = OrderSelect(i, SELECT_BY_POS);//ポジション番号を取得

for文で現在、保有しているポジションと、待機注文の合計数を取得した値から1を引いたものをi変数を初期値にして

1が0になるまでループさせます。

for(int i = OrdersTotal() -1; i >= 0; i--)/pre>

次にポジション番号をRetに代入します。
Ret = OrderSelect(i, SELECT_BY_POS);//ポジション番号を取得

ポジションの通貨ペアとオブジェクトを表示している通貨ペアが同じであればという条件をつくります。

 if (OrderSymbol() == Symbol())//ポジションの通貨ペアと現在の通貨ペアが同じであれば

ポジションがロングの場合というif文を點せいします。

if(OrderType() == OP_BUY)//ポジションがロングの場合

次にレート更新しましょう。

RefreshRates();//レート更新

ポジションがあるかどうかの確認しましょう。

if(OrderClose(OrderTicket(), OrderLots(), SymbolInfoDouble(OrderSymbol(), SYMBOL_BID), 5, Yellow) == false)

ポジションがなければエラーコードがあれば取得してcontinueしましょう。

Print(GetLastError());//エラーがあれば表示
continue;//コンテニューでループ再開

ポジションがショートの場合は

else if(OrderType() == OP_SELL)//ポジションがショートの場合

同様にレートを更新して

RefreshRates();//レート更新

ポジションがあるかどうかの確認しましょう。

if(OrderClose(OrderTicket(), OrderLots(), SymbolInfoDouble(OrderSymbol(), SYMBOL_ASK), 5, Yellow) == false)

ポジションがなければエラーコードがあれば取得してcontinueしましょう。

Print(GetLastError());//エラーがあれば表示
continue;//コンテニューでループ再開

Sleep() 関数はプログラムコードの実行を停止し、所定の時間間隔が経過したあとに続行を許可します。

パラメータとしてミリ秒の単位であらわされる時間間隔の値を取ります。

今回は値を100にしました。

Sleep(100);//実行停止の時間間隔

OBJPROP_STATEはボタン押下状態を選択できます。

押されていないのでFalseにしましょう。

ObjectSet("All_Delete", OBJPROP_STATE, False);//ボタンが押されているかどうか

これでOnChartEvent()関数を記述は完了です。

  int Ret;//ポジション番号用の変数
   if(sparam == "All_Delete")//オブジェクトがクリックされた場合
   {
       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("All_Delete", OBJPROP_STATE, False);//ボタンが押されているかどうか
   }
}
Copy

コンパイルする

コンパイルしましょう。ポチッとなとボタンを押して決済できれば完了です。

MQL MT4 ポジション 決済 ボタン

ソースコード全体

//+------------------------------------------------------------------+
//|                                                   All-Delete.mq4 |
//|                     Copyright 2020, FX-EA System Project Creator |
//|                        https://creator.fx-ea-system-project.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, FX-EA System Project Creator"
#property link      "https://creator.fx-ea-system-project.com/"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   ObjectCreate("All_Delete", OBJ_BUTTON, 0, 0, 0);//ボタンを作成
   ObjectSet("All_Delete", OBJPROP_XDISTANCE, 0);//ピクセル単位のX軸アンカー
   ObjectSet("All_Delete", OBJPROP_YDISTANCE, 30);//ピクセル単位のY軸アンカー
   ObjectSet("All_Delete", OBJPROP_XSIZE, 180);//オブジェクトのX軸のサイズ
   ObjectSet("All_Delete", OBJPROP_YSIZE, 50);//オブジェクトのY軸のサイズ
   ObjectSet("All_Delete", OBJPROP_CORNER, 0);// オブジェクトのアンカーコーナー0: 左上、1: 右上、2: 右下、3: 左下)
   ObjectSet("All_Delete", OBJPROP_FONTSIZE, 10);//フォントサイズ
   ObjectSet("All_Delete", OBJPROP_COLOR, Black);//文字カラー
   ObjectSet("All_Delete", OBJPROP_BGCOLOR, DarkGray);//背景カラー
   ObjectSetString(0, "All_Delete", OBJPROP_TEXT, "_(┐「ε:)_ポチッとな");//表示テキスト
   ObjectSetString(0, "All_Delete", OBJPROP_FONT, "MS ゴシック");//フォントの種類
      
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   ObjectDelete("All_Delete");//チャートから削除後表示削除
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+
void OnChartEvent(const int id, //イベントID
                 const long &lparam,//lomgイベント
                 const double &dparam,//doubleイベント
                 const string &sparam)//stringイベント
{
  int Ret;
   if(sparam == "All_Delete")//オブジェクトがクリックされた場合
   {
       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("All_Delete", OBJPROP_STATE, False);
   }
}
Copy

まとめ

これでEAのポジションを決済できるボタンができましたね。

コメント

タイトルとURLをコピーしました