「トレーリングストップ注文」のページでは、ポジションを保有したら即座にトレーリングストップを発動させるためのプログラミング方法について解説しています。
つまり、「トレーリングストップ注文」のページで解説しているコードによれば、以下のような動作を行うことになります。
- 損切り価格までの幅を「100」pips、トレーリングストップ幅を「50」pipsとした注文を出したとする。
- 上記注文が約定すると、その瞬間に、約定値から損切り価格までの幅が「50」pipsとなり、損切り価格までの幅を「100」pipsとした当初の設定は無効となる。
そこで、このページでは、指定したpips数分の利益が発生して初めて、トレーリングストップを発動させるためのプログラミング方法について解説します。
以下では、具体例として、
- 当初の損切り価格までの幅を「100」pips
- トレーリングストップ幅を「50」pips
- トレーリングストップを発動させるための利益幅を「50」pips
とした場合を掲げています。
つまり、以下に掲げる具体例においては、ポジションを保有してから「50」pips分の利益が生じると、「ブレークイーブン」(詳細は「こちら」を参照してください。)が設定されることになり、その後は、価格が保有ポジションにとって有利な方向に進んでいくにつれて、損切り価格がその方向に変動していく、ということになります。
以下のリンクからプログラムの全体像のサンプルコードをダウンロードして読み進めてください。
1.変数の宣言
変数の詳細については「こちら」を参照してください。
具体例においては、以下のように変数を宣言しています。
//変数の宣言
extern int Magic = 1111;
extern int Stop_Loss = 100;
extern int Trailing_Stop = 50;
extern int Minimum_Profit = 50;
int Ticket = 0;
double Pips = 0;
各変数の意味は、以下のとおりです。
- Magic
マジックナンバー(EAを識別する整数値)を格納します。
この変数は、EAをチャートに適用した際に、任意の値に設定することができるようにするため、「extern」(詳細は「こちら」を参照してください。)を付けて宣言します。 - Stop_Loss
ポジションを保有した際の設定される約定価格から損切り価格までの幅(単位はpips)を格納します。
この変数は、EAをチャートに適用した際に、任意の値に設定することができるようにするため、「extern」(詳細は「こちら」を参照してください。)を付けて宣言します。 - Trailing_Stop
トレーリングストップ幅(単位はpips)を格納します。
この変数は、EAをチャートに適用した際に、任意の値に設定することができるようにするため、「extern」(詳細は「こちら」を参照してください。)を付けて宣言します。 - Minimum_Profit
トレーリングストップを発動させる最小の利益幅(単位はpips)を格納します。
この変数は、EAをチャートに適用した際に、任意の値に設定することができるようにするため、「extern」(詳細は「こちら」を参照してください。)を付けて宣言します。 - Pips
AdjustPoint()関数の戻り値を格納します。
2.関数の定義
関数の詳細については「こちら」を参照してください。
コードの詳細な解説については「こちら」を参照してください。
3.init()関数の記述
init()関数の詳細については「こちら」を参照してください。
コードの詳細な解説については「こちら」を参照してください。
4.エントリー処理の記述
⑴ 買いエントリーでの損切り価格を設定する
具体例においては、ポジションを保有した当初は、一定の利益が出るまで、約定価格から「100」pips離れた位置に損切り価格を設定するようにしています。
買いポジションにおいては、約定価格は「Ask」、決済価格は「Bid」を基準として計算されるため、ポジション保有当初の損切り価格は、以下のように算出されます。
損切り価格 = 注文約定時のBid - 損切りまでの幅 × pips
したがって、具体例においては、以下のように記述しています。
if(買いエントリー条件)
{
Ticket =
OrderSend(…,OP_BUY,…,Ask,…,
Bid - Stop_Loss * Pips,
…,…,Magic,…,…);
}
- OrderSend()関数の詳細については「こちら」を参照してください。
⑵ 売りエントリーでの損切り価格を設定する
具体例においては、ポジションを保有した当初は、一定の利益が出るまで、約定価格から「100」pips離れた位置に損切り価格を設定するようにしています。
買いポジションにおいては、約定価格は「Bid」、決済価格は「Ask」を基準として計算されるため、ポジション保有当初の損切り価格は、以下のように算出されます。
損切り価格 = 注文約定時のAsk + 損切りまでの幅 × pips
したがって、具体例においては、以下のように記述しています。
if(売りエントリー条件)
{
Ticket =
OrderSend(…,OP_SELL,…,Bid,…,
Ask + Stop_Loss * Pips,
…,…,Magic,…,…);
}
- OrderSend()関数の詳細については「こちら」を参照してください。
5.トレーリングストップの記述
トレーリングストップを設定するコードの記述については、基本的には「トレーリングストップ注文」のページで解説したものと同様ですが、以下の⑴~⑹の6点において異なります。
⑴ 買いポジションの現在の含み益を算出する
一定の利益が出てから初めて、トレーリングストップを発動させるためには、現在の買いポジションが、どれだけのpips数の含み益を抱えているのかを確認する必要があります。
保有している買いポジションが、どれだけのpips数の含み益を抱えているかは、以下の計算式により算出されます。
Bid - 約定価格
そこで、具体例においては、以下のように記述して、保有している買いポジションが抱えている利益となるpips数を、変数「Pips_Profit」に格納しています。
double Pips_Profit = Bid - OrderOpenPrice();
- OrderOpenPrice()関数の詳細については「こちら」を参照してください。
⑵ 最小限の利益を格納する
一定の利益が出てから初めて、トレーリングストップを発動させるためには、トレーリングストップを発動させるための、利益となる最小限のpips数を確認しておく必要があります。
利益となる最小限のpips数は、以下の計算式により算出されます。
トレーリングストップを発動させる最小の利益幅 × pips
そこで、具体例においては、以下のように記述して、トレーリングストップを発動させる最小の利益幅を、変数「Min_Profit」に格納しています。
double Min_Profit = Minimum_Profit * Pips;
⑶ トレーリングストップの条件式に条件を加える
トレーリングストップを、一定の利益が出てから初めて発動させるためには、トレーリングストップを発動させる条件式に、以下のような条件を加える必要があります。
現在の含み益が最小限の利益以上
そこで、具体例においては、以下のように、トレーリングストップを発動させる条件式を記述しています。
if(OrderMagicNumber() == Magic &&
OrderSymbol() == Symbol() &&
Current_Stop < Max_Stop_Loss &&
Pips_Profit >= Min_Profit)
⑷ 売りポジションの現在の含み益を算出する
一定の利益が出てから初めて、トレーリングストップを発動させるためには、現在の売りポジションが、どれだけのpips数の含み益を抱えているのかを確認する必要があります。
保有している売りポジションが、どれだけのpips数の含み益を抱えているかは、以下の計算式により算出されます。
約定価格 - Ask
そこで、具体例においては、以下のように記述して、保有している売りポジションが抱えている利益となるpips数を、変数「Pips_Profit」に格納しています。
Pips_Profit = OrderOpenPrice() - Ask;
- OrderOpenPrice()関数の詳細については「こちら」を参照してください。
⑸ 最小限の利益を格納する
上記⑵と同様です。
⑹ トレーリングストップの条件式に条件を加える
上記⑶と同様です。