こんばんは。キリンです。
今日ご紹介するのは、とっても便利な関数です。
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も存在しています。
これも主力関数として名乗りを上げてくれそうです。
コメント