前回は、OriginalTrade.mqhファイルに、以下の関数を追加しました。
- CalBuySL関数(買いポジションのSL値を算出する独立関数)
- CalBuyTP関数(買いポジションのTP値を算出する独立関数)
- CalSellSL関数(売りポジションのSL値を算出する独立関数)
- CalSellTP関数(売りポジションのTP値を算出する独立関数)
いずれも、ポイントベースの固定SLTP値を算出する為の関数になります。
これで、
をOriginalTrade.mqhファイルに実装できたことになりますが、SLTPについてはまだ考慮しなくてはいけない事があります。
それが 「ストップレベル」 です。
今回はその、ストップレベルという概念について解説していきたいと思います
ストップレベルとは?
ストップロス(SL)やテイクプロフィット(TP)をポジションに設定する時や、待機注文で新規ポジションを建てようとする時、そのSLTPの値や、待機注文の約定希望価格は「現在のBid値とAsk値から最低限これだけのポイントは離れたところに設定しなくてはいけない」という決まりがあります。
この「現在のBid値やAsk値から最低限離さなくてはいけないポイント」の事をストップレベルと言います。
このストップレベルを守っていない、現在のBid値とAsk値から近すぎる価格は「適切ではない価格(invalid price)」として、エラーが発生する可能性があります。
従って、EAを作る際にはストップレベルに違反しないようなコード記述をプログラム内に組み込む必要があります。
ストップレベル情報の取得方法
ストップレベル情報を取得するには、SymbolInfoInteger関数の第2引数に定数値「SYMBOL_TRADE_STOPS_LEVEL」を記述します。
取得した値は整数型のポイント単位データになります。このままだと、ストップレベルに違反しない値を求めることはできないので取得したストップレベルに定義済み変数の「_Point」を掛け算します。
この処理によって、価格ベースでのストップレベル値が求められます。↓
double stopLevel = SymbolInfoInteger(parSymbol,SYMBOL_TRADE_STOPS_LEVEL) * point;
※SymbolInfoInteger関数の詳細については↓の記事をご参照ください
ストップレベル最小値の設定
上記のサンプルコードでは変数「stopLevel」に価格ベースでのストップレベル値が格納されたわけですが、現在のAsk値(SymbolInfoDouble関数を使って取得)を足し合わせればストップレベルに違反しない、以下の注文をする場合のストップレベル最小値が求まります。
- 買い注文のTP値
- 売り注文のSL値
- 買い逆指値注文の約定希望価格
- 売り指値注文の約定希望価格
↑上記の注文(端的に言えば、現在値よりも上の価格帯を指定する注文)を出す場合は、↓のサンプルコードにおける変数「minStopLevel」に格納された値よりも、上の価格を設定する必要があります。
double minStopLevel = SymbolInfoDouble(parSymbol,SYMBOL_ASK)+stopLevel;
変数「minStopLevel」に格納されている値より下の価格帯で値を設置した場合、リターンコードTRADE_RETCODE_INVALID_STOPS(リクエスト内の無効なストップ)が返されます。
※買い逆指値注文については→のORDER_TYPE_BUY_STOPリンクをご覧ください。
※売り指値注文については→のORDER_TYPE_SELL_LIMITリンクをご覧ください。
ストップレベル最大値の設定
一方、逆に現在のBid値(Askと同様にSymbolInfoDouble関数を使って取得)から、変数「stopLevel」に格納された価格ベースでのストップレベル値を引くと以下の注文におけるストップレベル最大値が求まります。↓
- 買い注文のSL値
- 売り注文のTP値
- 売り逆指値注文の約定希望価格
- 買い指値注文の約定希望価格
↑上記の注文を出す場合(現在値よりも下の価格帯を指定する注文)は、↓のサンプルコードにおける変数「maxStopLevel」に格納された値よりも、下の価格を設定する必要があります。
double maxStopLevel= SymbolInfoDouble(parSymbol,SYMBOL_BID)-stopLevel;
変数「maxStopLevel」より上の価格帯で値を設置した場合、リターンコードTRADE_RETCODE_INVALID_STOPS(リクエスト内の無効なストップ)が返されます。
※売り逆指値注文については→のORDER_TYPE_SELL_STOPリンクをご覧ください。
※買い指値注文については→のORDER_TYPE_BUY_LIMITリンクをご覧ください。
ストップレベル情報を使ったコード例
ストップレベル最小値とストップレベル最大値の取得・算出方法が分かれば、後は自身が設定するSLやTP、待機注文の約定希望価格と比較して、ストップレベルに引っかからないような価格になっていないかチェックする記述を行います。例えば↓のような形です。
double stopLevel = SymbolInfoInteger(parSymbol,SYMBOL_TRADE_STOPS_LEVEL) * point;
double minStopLevel = SymbolInfoDouble(parSymbol,SYMBOL_ASK)+stopLevel;
if(request.price<=minStopLevel)
{
Print("ストップレベルに違反しています");
}
仮に、request.Priceに買い逆指値の待機注文による価格がセットされていたとして、その価格が変数「minStopLevel」に格納されている値より大きいかどうかをif文の()でチェックしています。
もしrequest.Priceに設定されている価格の方が変数「minStopLevel」の値より小さければストップレベルに違反していることになりますから、それをPrint関数によってログ出力する・・・という流れです。
※request.Price については→コチラをご覧ください。
まとめ
今回はストップレベルについての概略をお伝えしました。
を実装していく予定です。
今回は一旦以上になります。
最後までお読みいただきありがとうございました。<m(__)m>
コメント