1,000人限定!!企画に参加してEAをGetする公式ラインに登録して
プレゼントをもらう

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

MQL MT4 EA 決済 ボタンMT4EA作成

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

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

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

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

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

メタエディタ(MetaEditor)を立ち上げましょう。操作は以下に記載しています。

【MQL】カスタムインジケーターを作成の流れについてわかりやすく説明してみた

今回は名前を「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--)

次にポジション番号を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のソースコード全体は以下に記載しています。

//+------------------------------------------------------------------+
//|                                                   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のポジションを決済できるボタンができましたね。

1,000人限定でFXの自動売買のEAを無料で配布中!!

FX-EA System Projectでは、

【1,000人限定で無料でFXの自動売買のEAを配布中】

です!!

・毎日チャートを見てるのに全く稼げなかった

・コンサルや塾に入ったけど全く稼げなかった

・裁量トレードは難しくて挫折した

・ツールやシステムを購入したが全く稼げなかった

・時間がなくて裁量トレードを行える時間がない

・自動で楽に稼ぎたい

という風に思っている方はこの企画はおすすめです。

フォワードテスト・バックテストを

しっかり行ったパフォーマンスの良いEAを提供中です!!

また、どんどん新しいEAも随時無料配布します!!

人数限定なので早いものがちです!!

もしFX-EA System Projectに興味があれば

是非参加してください。

MT4EA作成 中級編
\記事が役に立ったらシェアしてね/
FX-EA System Projectをフォローする
FX-EA System Project Creator

コメント

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