トレーリングストップは、ストップロスを利益エリアに移動させることで、常に自動的に取引を確保するのをサポートします。
まず、トレーリングストップの入力パラメータを指定するコードから始めましょう。
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); }
価格の動き(ティック)が発生するたびに、このEAがペアリングされているチャート上で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(), " ストップロスの更新に失敗しました"); } } } 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(), " ストップロスの更新に失敗しました"); } } } } } }
他に必要な標準関数は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アプリも提供しています。
SignalForexアプリをダウンロードし、使用することで、より利益を上げるためのサポートをしていただけます。
SignalForexアプリはこちらからダウンロードできます。