7bit氏作成 MQLライブラリー解析 part12

スポンサーリンク

こんばんは。キリンです。
今日ご紹介するのは、とっても便利な関数です。
■超直感!MT4(MQL)プログラミング講座■
typeに注文タイプを指定し、magicにマジックナンバーを指定し、該当するオープンポジションを全て決済します。
両方に-1を入力すれば全てのポジションの決済が可能。
全ポジションの決済スプリクトなどをこれで作成すれば、if文を追加するだけできちゃいますね。
ちなみに、ソースがこちら。

void closeOpenOrders(int type, int magic){   int total, cnt;   double price;   color clr;   int order_type;
Print ("closeOpenOrders(" + type + "," + magic + ")");
while (getNumOpenOrders(type, magic) > 0){      while (IsTradeContextBusy()){         Print("closeOpenOrders(): waiting for trade context.");         Sleep(MathRand()/10);      }      total=OrdersTotal();      RefreshRates();      if (type == OP_BUY){         price = Bid;         clr = CLR_SELL_ARROW;      }else{         price = Ask;         clr = CLR_BUY_ARROW;      }      for(cnt=0; cnt<total; cnt++){         OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);         if((type == -1 || OrderType() == type) && (magic == -1 || OrderMagicNumber() == magic)){            if(IsTradeContextBusy()){               break; // something else is trading too, back to the while loop.            }            order_type = OrderType();            if (order_type == OP_BUYSTOP || order_type == OP_SELLSTOP || order_type == OP_BUYLIMIT || order_type == OP_SELLLIMIT){
               orderDeleteReliable(OrderTicket());            }else{               orderCloseReliable(OrderTicket(), OrderLots(), price, 999, clr);            }            break; // restart the loop from 0 (hello FIFO!)         }       }   }}

おもしろいのが、一番最初のwhile文の条件指定ですね。
getNumOpenOrdersで常にポジションの有無を確認させて、forループを振り出しに戻しています。
これ、実は結構大事で、SELECT_BY_POSをするときに
決済されてしまったポジション文一つ少なくなってしまうため、
結局は1つ飛ばしで決済されていってしまうということがあります。
それを避けるための仕様なのですね。
だから、最後にbreakも存在しています。
これも主力関数として名乗りを上げてくれそうです。

コメント

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