【MQL4】OrderCloseでエラーコード138が返ってくる原因と解決方法

いやー、MQL4は仕様どおりに作っても、取引所が絡んだエラーが多いです。

OrderCloseの関数でも同じでした。エラーコード138が必ず返ってくる。

色々調べて試して、ようやく解決しました。記事にまとめてみました。

OrderCloseのエラー内容

20日移動平均線にタッチしたら手仕舞いするというロジックを組んだんだけど、どうしてもオーダーがオープンになったままクローズしない。

 

ログで表示するようにしてみると、OrderCloseの際に、エラーコード138、その内容はREQUOTEでした。

エラーコード138の意味

公式リファレンスによると

Runtime Errors - Codes of Errors and Warnings - Constants, Enumerations and Structures - MQL4 Reference - MQL4 Documentation
Runtime Errors - Codes of Errors and Warnings - Constants, Enumerations and Structures - MQL4 Reference - MQL4 Documentation
矢野テック
矢野テック

REQUOTE(再見積もり)のエラーという意味のようですが、意味がわからん。

原因はスリッページの値が低いから

相当しらべて、あれこれ色々いじってみたのですが、解決せず。

 

しかし、以下の方の記事に検索でヒットして、解決しました。

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

スリッページの値を低く設定すると発生するようです。現に、僕のソースではスリッページ0で動かしてました。

スリッページ=30で実施したところ無事うごきました

スリッページを30ポイントに設定したら、ちゃんとクロースできました。

取引所によって、スリッページの下限は変わるみたい。

調べてもわからないはずだ。。

最後に正常稼働したOrderCloseのソース

このページに検索でたどり着いた方は、色々やっている方だろうから、ご存知だと思うけど。

矢野テック
矢野テック

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

 

コメント

  1. tukomihimeko より:

    バックテストとの整合性もあるので、スリッページ30は痛くないですか?
    私の場合はAlpariのデモで、スリッページ3~5だとエラー138がたびたび返ってきますが、
    スリッページ6だと大丈夫なようです?!
    サーバーが遠いんですかね?

    • 匿名 より:

      先月までは3でも問題なく約定していましたが、今月に入ってエラー138が頻発し始めました。
      ただpipsでなくpoint表記だから30point=3pipsなのでバックテスト結果とそれほど乖離もないだろうし、それでいいわけですかね?

      • 矢野テック 矢野テック より:

        今まで動いていたのにスリッページでエラーになるということは仕様が変わったのかもしれませんね。スリッページの許容値については、自分ではコントロールできないので、動く範囲にこちらが合わせるしかないかなと思ってます。

    • 矢野テック 矢野テック より:

      コメントありがとうございます。サーバーによって、スリッページの許容値はかなり違うと思います。そして、デモとリアルでも変わってきます。デモでは低スリッページでも動くけど、いざリアルで動かすとエラー連発みたいな。それでかなり悩まされました。