Trailing Stop是一个强大的工具,它通过将止损移至盈利区来支持我们的交易,从而使我们能够自动保护我们的交易。
在这篇文章中,我们将介绍如何在MetaTrader 4 (MT4)平台上设置Trailing Stop,并用代码示例来说明如何实现这一功能。
首先,我们需要定义输入的Trailing Stop参数:
input bool isTrailingStop = true; // 启用Trailing Stop input int trailingStart = 15; // Trailing开始(点数) input int trailingStep = 5; // Trailing步长(点数) 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所配对的图表上发生价格变动(tick)时,OnTick()函数将被执行。在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应用程序
您可以通过下载并继续使用SignalForex应用程序来支持我们的工作,使您的交易更加盈利
https://play.google.com/store/apps/details?id=com.autobotfx.signalforex