【MQL5】エラー10016の原因

投資関連
スポンサーリンク
スポンサーリンク

はじめに

作成したEAの動作検証やバックテストをデモ環境で行い、万全を期して本番環境で動かしたとしても、それでもやっぱりエラーが発生することがあります。原因はさまざまですが、今回はエラー10016を対象に、その原因の1つと対応策を紹介します。

まずは発生源を特定

エラー10016をオンラインのヘルプで調べると、説明のところに「リクエスト内の無効なストップ。」とだけ書かれています。これだけだと正直意味がわかりませんので、まずはデバッグを行い発生個所を特定します。私の場合は「PositionModify」関数実行時にエラーとなっていました。PositionModify関数を使ってやろうとした事はトレーリングによる逆指値(ストップロス)の更新で、デモ環境ではエラーは発生しませんでした。

原因はストップレベル

ストップレベルとは何ぞや?という方のために簡単に言いますと、指値注文や逆指値注文を行う時に、現在の価格から開けなくてはならない値幅の事です。具体的にMT5の画面で説明しますと、気配表示の通貨ペアを右クリックし、「仕様」をクリックすると以下のウインドウが表示されます。画像はとあるブローカーのとある時点でのUSDJPYの仕様ですが、赤枠の数値がストップレベルになります。

この40は4pipsを表し、ストップロスの設定値は現在価格より4pips以上開けなければならない事を意味します。例えば1$=100.50円の時に買い、現在価格が100.60円だったとしたら、ストップロスは100.56以下の値にしなければなりません。それ以上の値は受け付けてもらえずエラーとなります。

プログラムを確認したところ、このストップレベルを考慮しない作りとなっていました・・・。ちなみにデモ環境は下図の通りストップレベル=0となっているため、現在価格と同じ値で更新しようとしてもエラーにはなりません。

プログラムを修正して解決

ストップレベルを考慮してストップロスを更新するようにプログラムを修正することによって解決しました。通貨ペアのストップレベルはSymbolInfoInteger関数で取得できます。引数の識別子はSYMBOL_TRADE_STOPS_LEVELになりますので、以下のような感じで取得できます。


SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL)

ただ、これだと40という値が取得されますので、現在価格と比較する場合は_Pointを掛けるなどして円換算する必要があります。参考までに、下記であれば0.04の値が取得できます。


(double)SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL)*_Point

補足

価格は常に変動するため、ストップロスを現在価格からストップレベルを引いた値で更新しようとすると、更新処理を行う僅かな時間内に価格が変動し、ストップレベルの条件を満たさなくなってエラーとなります。特に価格変動が激しい時などはエラーが多く発生します。これは仕方ない事ですが、エラーがどうしても気になる方はストップレベルの値プラスαの値でストップロスを更新するようなプログラムにすると良いと思います。

今回の記事がどなたかのお役に立てば幸いです。

投資関連
スポンサーリンク
スポンサーリンク
カッテラをフォローする
スポンサーリンク
タイトルとURLをコピーしました