MetaTrader4でのオーダーが130 invalid stopsでエラーになる場合の対処(ストップレベルの確認)
今回はFXの自動売買に利用するMT4(MetaTrader4)についてのTipsを。
MetaTraderでOrderSend()した際に、オーダーに失敗することがあります。
GetLastError()でエラーが取得できるので、確認してみると、
[OrderSendError] : 130 invalid stops
といったエラーになっていました。
130はエラーコード、「invalid stops」がエラー理由のようです。
調べてみると、このエラーが出る場合は、大きく2つの原因があるようです。
1.ストップレベル(StopLevel)に引っかかっている
各ブローカーでは、現在値から近すぎる(逆)指値注文は受け付けないような設定があります。
これをストップレベル(StopLevel,FreezeLevel)と呼びます。
なぜこのような設定がされているかというと、近い値での注文を許容すると、スキャルピングなど、短い時間で数多くの注文を送ることで、利ザヤを稼ぐ手法がやりやすくなるため、結果としてサーバの負荷が上がってしまうことにつながるからです。
そのため、例えば、現在値が83.800円(AUD/JPY)の場合、ストップレベルが5pipsだと、83.840円や83.77円の(逆)指値注文を受け付けないということになります。
もし、そのような値を指定してSendOrder()した場合、注文はエラーで受け付けられず、「130 invalid stops」がブローカーのサーバから返却されます。
お使いのMT4で自分のブローカーのストップレベルを確認するには?
このストップレベルはMT4の画面で確認することができます。
- MT4の左側にある通貨ペアの中で、ストップレベルを確認したい通貨ペアを選択し、右クリックする。
- コンテキストメニューが開くので、その中から「仕様」を選択。
- すると、プロパティのダイアログが開くので、その中の「ストップレベル」の値がそれです。
上記の例だと、10なので、1pips以上離れている必要があります。
ブローカーや通貨ペアによっては100など、10pips以上離れている必要がある場合もあるので、お使いのEA(Expert Advisor)の注文がよくエラーになる場合は確認してみてください。
2.OrderSendに渡す値が不正の場合
購入した市販のEAではあまりないかもしれませんが、自作のEAを動かして自動売買させている場合は、こういうこともあるかもしれません。
OrderSendに渡すopenPriceやslippage, stoploss, closePriceなどの値が不正な場合、このエラーが出ることがあるようです。
不正な値の例としては、83.500000001のように、小数点以下3桁までが有効なブローカーで、さらに小さな桁数を持った値などが考えられます。
計算によっては上記のような値が出る可能性はありますが、OrderSend()に渡す前に「NormalizeDouble()」関数で、お使いのブローカーの対応している桁数(Digits)にそろえてオーダーを出すようにしましょう。
NormalizeDouble(<値段>, Digits)
使い方はこんな感じ ↓ ↓ ↓
Comment
おせわになります。Ordersend error 130に悩まされており、上記NormalizeDoubleも試したのですが解消されませんでした。なお、リアル口座ではEAは思った通り動作していますが、ストラテジーテスターだと上記エラーが発生し、シミュレーションができない状況です。ブローカーはTradeviewでストップレベルが0なので、StoplossやTakeprofitの設定には影響ないはずなのですが。何かいい知恵あるでしょうか?