MT5のストップレベル(StopLevel)とは何か?
ストップレベル(StopLevel)とは?
MT5でバックテスト中、注文に失敗しました。「TRADE_RETCODE_INVALID_STOPS」というリターンコードが返ってきており、原因はストップレベル違反でした。
ストップレベル違反とは「TP(利確価格)やSL(損切価格)を指定する場合、基準となる価格(AskまたはBid)から一定以上離れていなくてはならないのに、そうなっていない」ということです。
この「一定以上」という部分がストップレベルです。たとえば、買い注文が約定してポジションを持った時に、Bidが1.09060だったとします。この時、ストップレベルが10ポイントだとしたら、SLは1.09050以下に設定しなくてはなりません。一方、TPは1.09070以上に設定しなくてはなりません。
基準となる価格はAskかBidか?
先述の文章に登場した「基準となる価格(AskまたはBid)」は買い注文をしたか売り注文をしたかによって異なります。
トレード時の注文から決済までの流れを「買い注文」を例にして見てみましょう。
買い注文の場合、Askで購入してBidで決済することになります。「Askが1.09068 Bidが1.09064」の時にMT5の「BUY」ボタンを押すと、1.09068でポジションを持ちます(購入価格は1.09068)。その後、「Askが1.09067 Bidが1.09063」の時に決済したら、決済価格は 1.09063です。
この例から分かるように、Askは注文時に関与するだけで、ポジションを持った後の主役はBidです。なぜなら、そのポジションに利益が出るか損失が出るかはBidが上がるか下がるかで決まるからです。
いま述べた「主役」が、ストップレベルに関わる「基準となる価格」です。この例では、Bidが主役でした。よって、SLやTPはBidを基準にストップレベルを考慮して決めることになります。
簡単にまとめると次のようになります。
買い注文(成行) → Bidからストップレベル以上離れた所にSLやTPを置く 売り注文(成行) → Askからストップレベル以上離れた所にSLやTPを置く
ストップレベルの情報源
MQL5用のページではありませんが、ストップレベルに関しては以下のページを参考にしました。
https://book.mql4.com/appendix/limits
このページにある表で「成行買い注文」に関する行を見るとSLとTPに関して次のように書かれています。
Order Type Open Price StopLoss (SL) TakeProfit (TP) ------------------------------------------------------------------------------------------- Buy Modification is prohibited Bid-SL ≥ StopLevel TP-Bid ≥ StopLevel
これを見ると、SLの位置はBidからStopLevel分以上安くなければならないと分かります。同様に、TPの位置はBidからStopLevel分以上高い価格でなければならないと分かります。
他の注文タイプについても引用しておきます。
Order Type Open Price StopLoss (SL) TakeProfit (TP) ------------------------------------------------------------------------------------------- Buy Modification is prohibited Bid-SL ≥ StopLevel TP-Bid ≥ StopLevel Sell Modification is prohibited SL-Ask ≥ StopLevel Ask-TP ≥ StopLevel BuyLimit Ask-OpenPrice ≥ StopLevel OpenPrice-SL ≥ StopLevel TP-OpenPrice ≥ StopLevel SellLimit OpenPrice-Bid ≥ StopLevel SL-OpenPrice ≥StopLevel OpenPrice-TP ≥ StopLevel BuyStop OpenPrice-Ask ≥ StopLevel OpenPrice-SL ≥ StopLevel TP-OpenPrice ≥ StopLevel SellStop Bid-OpenPrice ≥ StopLevel SL-OpenPrice ≥ StopLevel OpenPrice-TP ≥ StopLevel
ストップレベルの調べ方
ストップレベルをコードで調べる場合、以下のようにします。
SymbolInfoInteger(_Symbol, SYMBOL_TRADE_STOPS_LEVEL)
ただし、これを使う場合にはPoint数にする必要があります。
SymbolInfoInteger(_Symbol, SYMBOL_TRADE_STOPS_LEVEL) * _Point
これもストップレベル違反
私のアホな失敗事例を1つ書いておきます。ショートエントリーの実験コードを書いた折、おかしなTP価格を設定してサーバーに売り注文を送信しました。その結果、TRADE_RETCODE_INVALID_STOPSが返ってきました(この時のストップレベルは 0 でした)。
具体的な価格は以下のとおりです。
SL 1.06784 TP 1.06736 Ask 1.06702 Bid 1.06701
売り注文なので、SLはAsk価格よりも高く、TPはAsk価格よりも低くなければいけません。しかし、AskよりもTPの方が高いというおかしな内容になっています。
これもストップレベル違反に該当します。先に引用した表の一部を見てみましょう。
Order Type Open Price StopLoss (SL) TakeProfit (TP) ------------------------------------------------------------------------------------------- Sell Modification is prohibited SL-Ask ≥ StopLevel Ask-TP ≥ StopLevel
この表にあるとおり、成行の売り注文においてTPは「Ask - TP」が StopLevel以上でなくてはなりません。しかし、私の失敗事例では
StopLevel = 0 Ask - TP = 1.06702 - 1.06736 = -0.00034
となっており、「Ask - TP」の方がStopLevelよりも小さくなっていました。