トレーリングストップは、利益を確保するためにストップロスを自動的に移動させることで、私たちの取引を大いにサポートしてくれます。これにより、常に利益エリアを保持しつつ、相場の動きに追従できます。
では、まず入力パラメータを設定するところから始めましょう。
input bool isTrailingStop = true; // トレーリングストップを有効にする input int trailingStart = 15; // トレーリング開始(pips) input int trailingStep = 5; // トレーリングステップ(pips) input int MagicNumber = 0; // マジックナンバー
次に、グローバル変数を設定します。
// グローバル変数 double myPoint = 0.0;
このEAを実行すると、最初にOnInit()関数が実行され、ここで入力パラメータの検証と初期化が行われます。
int OnInit() { if (isTrailingStop && trailingStart <= 0){ Alert ("パラメータが不正です"); return(INIT_PARAMETERS_INCORRECT); } myPoint = GetPipPoint(Symbol()); return(INIT_SUCCEEDED); }
価格が動くたびに、OnTick()関数が実行され、その中でsetTrailingStop()関数が呼び出されます。
void OnTick() { //--- setTrailingStop(MagicNumber); }
setTrailingStop()関数の詳細は以下の通りです。
void setTrailingStop(int magicNumber=0){ if (isTrailingStop==false) return; int tOrder = 0; string pair = ""; double sl = 0.0, tp = 0.0; pair = Symbol(); tOrder = OrdersTotal(); for (int i=tOrder-1; i>=0; i--){ bool hrsSelect = OrderSelect(i, SELECT_BY_POS, MODE_TRADES); if (OrderMagicNumber() == magicNumber && StringFind(OrderSymbol(), pair, 0) == 0 ){ if (OrderType() == OP_BUY){ if ( (Bid - (trailingStart * myPoint)) >= OrderOpenPrice() && (Bid - ((trailingStart+trailingStep) * myPoint) >= OrderStopLoss() ) ){ sl = NormalizeDouble(Bid - (trailingStart * myPoint), Digits()); if (!OrderModify(OrderTicket(), OrderOpenPrice(), sl, OrderTakeProfit(), 0, clrBlue)){ Print ("#", OrderTicket(), " SLの更新に失敗しました"); } } } if (OrderType() == OP_SELL){ if ( (Ask + (trailingStart * myPoint)) <= OrderOpenPrice() && ( (Ask + ((trailingStart+trailingStep) * myPoint) <= OrderStopLoss() ) || OrderStopLoss() == 0.0) ){ sl = NormalizeDouble(Ask + (trailingStart * myPoint), Digits() ); if (!OrderModify(OrderTicket(), OrderOpenPrice(), sl, OrderTakeProfit(), 0, clrBlue)){ Print ("#", OrderTicket(), " SLの更新に失敗しました"); } } } // マジックナンバーの処理終了 }// ループ終了 }
他に必要な標準関数としては、GetPipPoint()があります。
// GetPipPoint関数 double GetPipPoint(string pair) { double point= 0.0; int digits = (int) MarketInfo(pair, MODE_DIGITS); if(digits == 2 || digits== 3) point= 0.01; else if(digits== 4 || digits== 5) point= 0.0001; return(point); }
何か質問があれば、コメント欄に残すか、私たちのグループに参加してください。t.me/codeMQLで共有しています。
また、SignalForexアプリも提供しています。こちらをダウンロードして、より利益を上げるために活用してください。