恥は/dev/nullへ by 初心者

プログラミング素人がのろのろと学んだことをつづっています♪

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よりも小さくなっていました。