MQL4でOrderSendエラーコード130 invalid stopsの解決策

バックテストでは正常に稼働するけど、リアル口座ではOrderSend時に、エラーコード130(Invalid Stops)が出てしまう。かなりあれこれ調べまくって、なんとかある程度は解決しました。記事に残しておこうと思います。普通に仕様通りにプログラム組むだけではだめで、対処は必須ですね。

エラーコード130の意味

主に以下です。

  • 損切りや利益の設定価格が今現在価格にとても近い
  • 損切り、利益の計算が正しくない
  • 損切り、利益の小数点の桁数が多すぎる

取引所によってはOrderSend時にSL、TPを設定するとエラー

なんと、取引所によっては、OrderSend時に、引数でSL、TPを設定するとエラーになるそうです。マジかよ~。

矢野テック
矢野テック

XMはたまに通るけどエラーが帰って来るときもありました。

 

その場合は、損切り、利益は0で設定して、OrderModifyで変更するのが鉄板らしい。

ただし、成功しないときもある(マジかよ~)

 

以下のようにする事で対処しました。Long、Short、それぞれ用でオリジナル関数を作りました。こうすることで、メイン処理がごちゃつかない。

 

オーダー修正するリトライ部分は以下のような関数を作りました。

矢野テック
矢野テック

30回ほどリトライさせてます。やってみると分かるのですが、結構失敗します。

 

上記は、以下の方の処理を参考にさせて頂きました。

OrderModify | MT4でEA自作しちゃお〜[FX自動売買(システムトレード)-MQL4プログラミング]
当サイトはMetaQuotes Software社のMT4(メタトレーダー4)で、EA(自動売買)やカスタムインジケータを作成したいけど・・・ まず何をやったらいいのか分からずスタート地点で挫折してしまっている初心者向けのサイトです。またMQL4の日本語リファレンスもあります。

損切り、利益の価格が狭い時も発生

現在価格と比べて、損切りや、利益の金額設定が近すぎる時も、エラーコード130が発生します。ここで関係があるのが、ストップレベルです。

 

MQL4の公式ページに、これについて言及があります。

Requirements and Limitations in Making Trades - Appendixes - MQL4 Tutorial
Requirements and Limitations in Making Trades - Appendixes - MQL4 Tutorial
矢野テック
矢野テック

結構盲点だったかも。

ストップレベルの確認方法は通貨ごと

最小設定値は、取引所ごと、通貨毎に異なります。

 

MT4上で、該当通貨にて「右クリック」⇒「仕様

 

ストップレベルは40と表示されています。これは、単位はポイントです。10分の1にすれば、pipsで表せます。

上記はXMTradingのUSDJPYのペアの表示。OrderSend時に損切り、利確最低ともに、4pipsは空けないといけないということが分かります。

選択通貨のストップレベルの取得

MarketInfo関数を使います。

小数点の桁数も重要

同じく小数点の桁数もかなり重要です。XMTradingのUSDJPYでは、3桁です。

ところが、普通にMQL4でdouble型で扱うと、小数点はdoubleの型の有効桁数で扱われます。桁数は15桁。

これも、桁数を揃えないと、リアルトレードでエラー130が発生します。

選択した通貨の桁数をチェックするには?

MarketInfoを使って、2番めの引数に、DIGITSを渡すと、チャート上の通貨の有効桁数が帰ってきます。

小数点の桁数を丸めるには?

NormalizeDouble関数を使います。1番めの引数は丸めたい数値、2番めは桁数です。

 

それでもポジションが残る事もあり

これで解決かと思ったんですが、30回リトライしても、SL、TPが設定できないときがあります。その場合は、逆指値、指値、ともに0のままなので、オーダーが残ったままになります。

 

矢野テック
矢野テック

うーん、困ったね。みんなどうしてんだろ。。

多少スリープかませるかとか、色々実験中です。

 

コメント