いやー、MQL4は仕様どおりに作っても、取引所が絡んだエラーが多いです。
OrderCloseの関数でも同じでした。エラーコード138が必ず返ってくる。
色々調べて試して、ようやく解決しました。記事にまとめてみました。
OrderCloseのエラー内容
20日移動平均線にタッチしたら手仕舞いするというロジックを組んだんだけど、どうしてもオーダーがオープンになったままクローズしない。
ログで表示するようにしてみると、OrderCloseの際に、エラーコード138、その内容はREQUOTEでした。
エラーコード138の意味
公式リファレンスによると

Runtime Errors - Codes of Errors and Warnings - Constants, Enumerations and Structures - MQL4 Reference
Runtime Errors - Codes of Errors and Warnings - Constants, Enumerations and Structures - MQL4 Reference

矢野テック
REQUOTE(再見積もり)のエラーという意味のようですが、意味がわからん。
原因はスリッページの値が低いから
相当しらべて、あれこれ色々いじってみたのですが、解決せず。
しかし、以下の方の記事に検索でヒットして、解決しました。

『138エラーの謎がとけた・・・』
スリップページの設定が狭すぎたことが原因だったようだ参考にしていた書籍では OrderSendのスリップページの単位はpipsとあり 見本のプログラムでも「3…

矢野テック
スリッページの値を低く設定すると発生するようです。現に、僕のソースではスリッページ0で動かしてました。
スリッページ=30で実施したところ無事うごきました
スリッページを30ポイントに設定したら、ちゃんとクロースできました。
取引所によって、スリッページの下限は変わるみたい。
調べてもわからないはずだ。。
最後に正常稼働したOrderCloseのソース
このページに検索でたどり着いた方は、色々やっている方だろうから、ご存知だと思うけど。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | voidClosePositions_BUY(intmy_magic){ inti; intmy_ticket_no; doublemy_lots; doublemy_price=NormalizeDouble(Ask,int(MarketInfo(Symbol(),MODE_DIGITS))); boolchk; interrorcode; for(i=0;i<OrdersTotal();i++){ if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false){ break; } if(OrderMagicNumber()!=my_magic||OrderSymbol()!=Symbol()){ continue; } my_ticket_no=OrderTicket(); my_lots=OrderLots(); //買いポジションのチェック if(OrderType()==OP_BUY){ chk=OrderClose(my_ticket_no,my_lots,my_price,Slippage,White); printf("OrderClose ret=%d , ticket_no=%d , lots=%f , BUY price=%f",chk,my_ticket_no,my_lots,my_price); if(chk==False){ errorcode=GetLastError(); // エラーコード取得 printf("OrderClose Error! error_code:%d , detail:%s ",errorcode,ErrorDescription(errorcode)); }else{ printf("OrderClose Done!"); } break; } // ループを抜ける break; } } |

矢野テック
長くなるので書かなかったけど、上記はロングのみのオーダーをクローズする関数です。OrderType() == OP_SELL でショートのオーダーを検知できます。
コメント