保有中ポジションを全決済する関数 OrderCloseAll

MetaTrader 4
GogoJungle
2019/08/02 20:54
7086

現在保有中のポジションを全て決済する関数です。
ナンピンやピラミッディングで増えたポジションを一括決済する場合にご利用下さい。

bool OrderCloseAll(
   int magic,
   int slippage
);

パラメータ
magic
決済対象とするポジションのマジックナンバー

slippage
スリッページ

戻り値
magicに指定したマジックナンバーで、尚且つ実行中のチャートの通貨ペアと同じ通貨ペアのポジションを決済します。
ポジションが全て決済されるか、決済対象となるポジションが存在しない場合、結果はtrueとなります。
決済に失敗した場合や、処理中に何らかのエラーが発生した場合には結果がfalseとなります。
待機注文は削除しません。

bool OrderCloseAll(int magic, int slippage){
   double price = 0;
   
   for(int i = OrdersTotal() - 1; i >= 0; i--){
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) return(false);
      if(OrderMagicNumber() != magic) continue;
      if(OrderSymbol() != Symbol()) continue;
      if(OrderType() != OP_BUY && OrderType() != OP_SELL) continue;
      
      RefreshRates();
      if(OrderType() == OP_BUY){
         price = Bid;
      }
      else if(OrderType() == OP_SELL){
         price = Ask;
      }
      
      if(OrderClose(OrderTicket(), OrderLots(), price, slippage, clrNONE) == false){
         Print(__FUNCTION__, " OrderClose Error : ErrorCode=", GetLastError());
         return(false);
      }
   }
   return(true);
}

マジックナンバーをチェックしている部分や通貨ペアをチェックしている部分を削除することで、全てのマジックナンバー・全ての通貨ペアを対象とするよう修正可能です。
例えば以下のコードは全てのマジックナンバー・通貨ペアのポジションを決済します。

bool OrderCloseAll(int slippage){
   double price = 0;
   
   for(int i = OrdersTotal() - 1; i >= 0; i--){
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) return(false);
      if(OrderType() != OP_BUY && OrderType() != OP_SELL) continue;
      
      RefreshRates();
      if(OrderType() == OP_BUY){
         price = Bid;
      }
      else if(OrderType() == OP_SELL){
         price = Ask;
      }
      
      if(OrderClose(OrderTicket(), OrderLots(), price, slippage, clrNONE) == false){
         Print(__FUNCTION__, " OrderClose Error : ErrorCode=", GetLastError());
         return(false);
      }
   }
   return(true);
}

コメント

tizawa3
2022/08/17 16:25

いつも大変助けられています。ありがとうございます。
本記事に関連し、同時に待機注文も全決済しようと思い、次の行をコメントアウトしました。
//if(OrderType() != OP_BUY && OrderType() != OP_SELL) continue;
しかし、実行しても待機注文は残ったままでした。
これだけでは駄目なのでしょうか。ご教示頂けると幸甚です。

GogoJungle
2022/08/22 21:27

いつもご利用いただきまして誠にありがとうございます。

待機注文を削除する際はOrderDelete()をご利用くださいませ。

下記に待機注文削除の関連記事をご案内いたします。

条件付きの注文キャンセルについて
https://labo.gogojungle.co.jp/articles/272

両建てトラップ、決済時全キャンセルのコードを教えて下さい。
https://labo.gogojungle.co.jp/articles/117

ご参考いただけますと幸いです。
今後とも何卒よろしくお願い申し上げます。

BigRiver
2024/02/25 11:51

本件、オプションにある
 全決済 にチェックを入れていれば(マジックナンバー 未記入)であれば) 機能する(=保有ポジ 全決済)
されるとの認識ですが、正しいでしょうか?

~~~~~~~~~~~~~~~~~~~
本件、ちょうど下記
https://labo.gogojungle.co.jp/articles/1659

上記質問中の 【追加質問】部分にて質問させていただいた内容となります。

GogoJungle
2024/02/27 12:11

全決済のオプションで機能いたします。
取引条件以外の決済(基本項目の損切り・利食い)には適用されませんので予めご了承くださいませ。

全決済のオプション機能を追加
https://labo.gogojungle.co.jp/articles/159

ご参考いただけますと幸いです。何卒よろしくお願い申し上げます。

関連トピックス

検索結果がありません。

ノーコードで誰でも簡単EA開発!MQL言語学習にも使える! | GogoJungle

注目トピックス

検索結果がありません。