全注文を決済又はキャンセル処理する EA

サンプルEA

サンプルEA

 全注文(ポジションとオーダー)の決済とキャンセル処理をするサンプル EAです。
 ポジション化しているものは決済、指値注文などのオーダーはキャンセルします。

 当サイトのサンプルEAで FXで有名な取引手法であるトラリピのコードを公開していますが、トラリピをデモなどで試験運用する時、リセットしてテストをやり直すことがあります。この時、注文が多く残っていると一つ一つ手動で決済 又は キャンセルしていくことは非常に面倒な作業になります。

 これを一括して全注文を決済 又は キャンセルするための EAのコードになります。

 コードも簡単で 30行未満の短いコードなのでEAを作る練習台としても良いと思います。是非、学習しながらご自身の手で作ってみてください。

コード

// 全通貨の全ポジションと全オーダーをClose処理するEA
#property strict

void OnInit() {
   int cnt, dummy, msgret, total = OrdersTotal();
   
   if(IsTradeAllowed() == true) {
   
      msgret = MessageBox("全注文決済します", "確認", MB_ICONINFORMATION | MB_OKCANCEL | MB_DEFBUTTON2 ); 
      
      if(msgret == IDOK) {
      
         for(cnt=0; cnt < total; cnt=cnt) {

            if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES)==false) break;
               
            if(OrderType() == 0 || OrderType() == 1){
               dummy = OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(),0);
            }
            else {
               dummy = OrderDelete(OrderTicket());
            }
         }
      }
   }
}

このコードをコンパイルして実行するのに、自動売買を許可しておく必要があります。
自動売買を許可する方法はこちら、コードをコンパイルして実行する方法はこちらを参考にしてください。(デモ口座でお試しください)

全注文の決済とキャンセル処理 コードの概要

任意設定した変数とその仕様

 プログラム中で設定した変数の一覧表です。

変数名データ型説明
msgretintMessageBox関数の戻り値を取得します。
cntintMT4より各注文に自動付与されたインデックス番号です。
totalintポジションとオーダーの合計です。
OrdersTotal関数で取得した値を初期値とします。
dummyintOrderClose関数、OrderDelete関数の戻り値を取得します。
取得した戻り値は使わないので変数は必要がないのですが、変数が無い場合、コンパイルで警告が出るため、それを回避するために付けています。今回の場合は警告が出ても問題なく処理されます。
※変数は出てくる順番で並べています。

コードの解説

① 5行目は、変数の型を宣言。

② 7行目は、IsTradeAllowed関数で自動売買が許可されているかの確認。許可されている時のみ処理が開始されます。

③ 9行目は、MessageBox関数を使って、全注文を決済するかの確認をさせます。これは誤って決済処理をしてしまわないように設けた方が良いでしょう。

④ 13行目以降は、ポジション 又は オーダーがある限り、ポジションであれば決済処理、オーダーであればキャンセルをするようにしています。

 ここでインデックス番号を元に注文の処理をしていますが、インデックス番号は、現在取引中のポジションとオーダーに MT4が自動付与する番号で、注文した順番に 0、1、2、…というように番号が付与されていきます。ポジションが決済などで減少するとポジションが持つインデックス番号が 0から順番に並んだ番号で再取得されます。ですので途中の番号が飛ぶことはありません。(0,1,3…のように2が飛ぶことはないです) 故に、インデックス番号 0 が存在するかをチェックすることで注文が残っていないかを見ています。注文が残っていれば、OrderClose関数か OrderDelete関数で処理され、注文がなければ 15行目の breakfor文を抜けて処理が終了します。

使用例

「全通貨の全ポジションと全オーダーをClose処理するEA」を実行すると、メッセージボックスで確認後、ターミナルの取引タブにある全ての通貨ペア、全ての注文が決済 又は キャンセルされて終了します。
 


 今回は、全注文を決済 又は キャンセルをするコードを書きましたが、少し変えるだけでポジションのみの決済、オーダーのみのキャンセル、指定した通貨ペアのみの決済、指定したマジックナンバーのみの決済 などいろいろな状況にあわせたものに作り替えることができます。是非、ここで学習してチャレンジしてみてください。

 

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