しかし今度は、決済注文時に注意すべき事項がありましたので記事にしたいと思います。
EAを運用していて気づいたのですが、稀にコメント欄に「from #(チケット番号)」と書かれたポジションが残っている場合がありました。しかも、ロット数がそのEAで指定しているものから考えるとありえない。
ログ上にも該当するような約定履歴が残っておらず、「一体何なんだこれは・・・?」と思って調べていると、おそらくこういうことだろうという答えにたどり着きました。
一部のロットだけ決済されているようです。
コメントで指定されたチケット番号をたどると、約定時と決済時のロット数に差分があり、その差分のロット数で、新たな注文として約定されているようなのです。
こんな動きをされると、決済注文において不具合が発生してしまうケースが考えられます。
決済注文のコーディングとしては、だいたいこんな感じがオーソドックスかなと思います(買いポジションを決済するコードのイメージです)。
※ポジションを保有しているかどうかを変数で持っておき、「約定→true」、「決済→false」という状態管理をしておけば、注文が拒否されても次のTickでリトライできるような仕組みになります。
-----
if (position_hold){
ordersuccess = OrderSelect(Ticket, SELECT_BY_TICKET);
if (ordersuccess && OrderType() == OP_BUY){
ordersuccess = OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Red);
if (ordersuccess) position_hold = false;
else Print("ErrorCode:" + GetLastError());
}
}
[変数名の補足]
・position_hold:ポジションを保有している場合はtrue
・Ticket:保有ポジションのチケット番号
-----
ところが・・・この決済コードですが、オアンダジャパンで運用すると、この一部決済が仇となって状態管理外のポジションが発生してしまう可能性があるのです。
この一部決済のタチの悪いところは、(挙動からの推測ですが)一部決済しかできなくてもOrderCloseの返り値はtrueになってしまうというところなのです。
すなわち、上記のコードだと「ちゃんと決済ができた!」と勘違いして、新たなエントリーを受け付ける状態に遷移してしまうのです。。。
しかし残ったポジションは、上述の通り新しく約定したという扱いになってしまっています。
上記のコードだと「ポジション未保有」という状態遷移になっているので、この新たなポジションについては管理外になってしまうのです!!
しかもご丁寧に指値まで勝手にずらされるという始末。。。おそらく、元のポジションの約定価格と指値額の差分がそのままずらされているという感じです。ひどい。
指値注文の件はまだしも、これはさすがにあまりのクソ仕様と言わざるを得ません。
正直、この仕様を考えた人間の感性を疑うレベルです。。。
こんなことするくらいなら約定拒否してくれたほうがよっぽどマシです!
とはいえ、このような仕様になっている以上、使うためには対策をしなければなりません。
こんな感じのコードをはじめのほうに埋め込んでいけば対策になるかと思います。
-----
for (int i = 0; i < OrdersTotal(); i++){
ordersuccess = OrderSelect(i, SELECT_BY_POS);
if (ordersuccess && OrderMagicNumber() == MagicNo){
if (OrderType() == OP_BUY){
if (!position_hold){
ordersuccess = OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Red);
if (ordersuccess) Print("Unsettled Order is Closed.");
else Print("ErrorCode:" + GetLastError());
}
}
}
}
[変数名の補足]
・MagicNo:プログラムで使用するマジックナンバー
-----
「ポジションを持っていない」という管理状態において実際はポジションを持っている場合、状態合わせとして強制決済させるというコードです。こうすれば、残ったポジションの決済も試みてくれることになるかと思います。
アルパリが使えなくなってから、オアンダでのEA運用がメインになっています。
スプレッドとか約定滑りとかは特に大きな不満もないのですが、MT4の仕様に想定外が連続していて勘弁して欲しい感じです。
まあ、逆に言うと、オアンダでちゃんと動くEAは大体の業者でちゃんと動くといえるのではないでしょうかwww
以上です。
OANDAのEAは注意が必要なんですね。
なるほど。。
コメントありがとうございます。
オアンダはなかなか問題児のようで、ある意味で勉強になりますw