在交易中,Trailing Stop(移动止损)是一个非常有用的工具,它能帮助我们自动锁定利润。通过将止损点移至盈利区域,我们可以更好地保护我们的交易。
接下来,我们将从设置输入参数开始编写代码,以下是基础代码示例:
input bool isTrailingStop = true; //启用移动止损 input int trailingStart = 15; //移动止损开始 (点数) input int trailingStep = 5; //移动止损步长 (点数) 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); }
每当图表上发生价格变动(tick)时,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():
// 获取点值函数 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 应用程序,欢迎大家下载并使用,助力你的交易更上一层楼!