さまざまな種類のトレーリング ストップが考えられますが、ここでは最も効果的なものを検討します。トレーリング ストップはカスタムしきい値の後にアクティブになり、カスタム レベルのピップで追跡します。 このトレーリングストップは、注文価格が初めて利益しきい値に達した後、注文価格に応じてストップロスを上下に移動させます。 この MQL4 トレーリング ストップの記事では、利益を確保し損失保護を提供するために、トレーリング ストップを使用して Expert Advisor をプログラムする方法を学びます。
たとえば、利益しきい値を 50 に設定し、トレーリング ストップを 50 に設定した場合、トレーリング ストップが有効になる前に取引は 50 移動する必要があります。利益ポイント、この時点でストップロスは損益分岐点に移動します。 さらに、トレーリングステップが 5 であると述べた場合、ストップが損益分岐点を 5 ポイント上回るまでに、市場はさらに 5 ポイント前進する必要があります。 その後、そこから徐々に上向きに調整し、5 ピップスの利益ごとにさらに 5 ピップスの利益を確定させます。
したがって、この新しいトレーリング ストップには 3 つの外部変数が必要です。1 つは利益しきい値用、もう 1 つはトレーリング ストップ用、最後の 1 つはステップ距離用です。
外部 Double TrailingStart=50;
外部 Double TrailingStop=25;
外部 Double TrailingStep=5 ;
ユーザーが操作する変数は、したがって、トレーリングストップを有効にする前に到達する必要がある利益のしきい値であるTrailingStartと、TrailingStopです。 Profit High Trailing のポイント数、TrailingStep、ストップロスが利益の量を増やす前に取得する必要がある新しいポイントの数です。
このトレイルを確認してみましょう ストップロスコード:
void TrailOrder(double Trailingstart,double Trailingstop){
国際線チケット = 0;
double tStopLoss = NormalizeDouble(OrderStopLoss(),number); // ストップロス
int cnt,vPoint,vSlippage;
< br/>
Double sl = OrderStopLoss(); // ストップロス
if (number == 3 | |数値 == 5)
{vPoint = ポイント * 10; vSlippage = スリッページ * 10; }
other
{vPoint = ポイント; vSlippage = スリップページ;}
< /p>
リフレッシュ レート();
if(orderstotal()> 0){
for(cnt=OrdersTotal();cnt> ;=0;cnt– ){
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if(OrderType()<=OP_SELL && OrderSymbol()==シンボル ()
&& OrderMagicNumber()==MagicNumber){
if(OrderType()==OP_BUY){< /p>
if(Ask> NormalizeDouble(OrderOpenPrice()+TrailingStart* vPoint,Digits)
&& tStopLoss < NormalizeDouble(Bid-(TrailingStop+TrailingStep)*vPoint, Digits)){ p>
tStopLoss = NormalizeDouble(Bid-TrailingStop*vPoint,Digits);
ticket = OrderModify(OrderTicket(),OrderOpenPrice(),tStopLoss,OrderTakeProfit(),0 ,Blue);
p>
if (チケット > 0){
print("TrailingStop #2 が有効化されています:", OrderSymbol(), ":SL", tStopLoss, ": Bid", Bid);< /p>
return(0);
}}}
if (OrderType( )==OP_SELL) { p>
if (Bid < NormalizeDouble(OrderOpenPrice()-TrailingStart*vPoint,Digits)
&& (sl >(NormalizeDouble(Ask+( TrailingStop+TrailingStep)*vPoint,Digits) )))
|| (OrderStopLoss()==0)){
tStopLoss = NormalizeDouble(Ask+TrailingStop*vPoint,Digits);
チケット= OrderModify(OrderTicket(),OrderOpenPrice(),tStopLoss,OrderTakeProfit(),0,Red);
if (ticket> 0){
< p>Print("トレーリング #2 がアクティブになりました:", OrderSymbol(), ": SL", tStopLoss, ": Ask", Ask);Return(0);
}}}
}}}}
説明
独自の定義関数として void TrailOrder() を使用します。
注文ループ コード内に for ループと OrderSelect() 関数があることがわかります。 注文プールを反復処理し、各注文をチェックして、トレーリングストップを適用する必要があるかどうかを確認します。 現在の成行注文が OP_BUY で示されるように買い成行注文であり、チャート シンボルとマジック ナンバーに一致する場合、トレーリング ストップの計算を続行します。
2 つのトレーリング ストップを有効にする前に、2 つの条件を決定する必要があります。
条件 1: [TrailingStart] をチェックします。 アスク価格が始値とTrailingStart値を足したものより大きいかどうかを観察するようにプログラムに依頼します。 たとえば、トレーリング スタートが 50 ピップスに設定されている場合、トレーリング ストップは市場利益が 50 ピップスに達した場合にのみアクティブになります。 トレーリングストップを最初よりも利益のしきい値を超えた後にアクティブにする方が合理的です。
条件 2: TrailingStop と TrailingStep をチェックします。 2 番目の条件は、現在のストップロスが現在の価格からトレーリング ストップとトレーリング ステップを差し引いた値より小さいかどうかを確認します。 たとえば、トレーリング スタートが 50 ピップス、トレーリング ストップが 25 ピップス、トレーリング ステップが 5 ピップスの場合、トレードで 50 ピップス利益が得られると、条件 1 がアクティブになり、プログラムは条件 2 に進み、チェックを続けることができます。トレーリングストップとトレーリングステップ。 条件 2 次に、最初のストップロスを利益しきい値の 50 ピップスより 25 ピップス下に調整するようにしてください。 取引で利益が得られ続ける場合、定義された TrailingStep 金額の 5 ピップごとに、トレーリング ストップが 5 ピップずつ増加します。
トレーリング ストップ設定を減算し、vPoint(), fr を掛けることで、現在の入札からのストップロス距離を決定します。 これは変数 tStopLoss に保存されます。 tStopLoss 変数を新しいストップロスとして OrderModify() 関数に渡します。
注: MQL 関数 NormalizeDouble() を使用して、変数を小数点以下の正しい桁数に丸めます。 引用符には小数点以下 8 桁までを含めることができ、NormalizeDouble() はそれらを 4 桁または 5 桁 (円ペアの場合は 2 ~ 3 桁) に丸めるのに役立ちます。
このトレーリングストップがアクティブ化されたときの情報をログタブに印刷するために、ここのコードに印刷関数を追加しました。
一般に、売り注文のトレーリングストップ条件は買い注文と同じロジックに従います。
では、このカスタム関数を Start() 関数にどのように組み込んで、コードがそれを使用していることを認識できるようにするのでしょうか?
start() 関数内の任意の場所、できれば関数の先頭付近に行を配置します。
if(TrailingStop>0 && TrailingStart > 0) TrailOrder (TrailingStart, TrailingStop);
基本的には、 m 条件付き if 式を作成して、TrailingStart と TrailingStop の両方が 0 より大きいかどうか、つまりユーザーがこれらのフィールドに整数値を定義しているかどうかを確認します。 「はい」の場合、カスタム関数 TrailOrder() がアクティブになります。 それ以外の場合、フィールドの両方または 1 つがデフォルト値の 0 のままであれば、トレーリングストップは無効のままになります。
これで終わりです。 追加の武器として、洗練されたトレーリング ストップ メカニズムが追加されました。