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

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

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

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);
}

コメント

関連項目

検索結果がありません。