一般追踪止损
void orderTrailingStopGeneral(double startPips, double stopPips) {
double orderPrice = NormalizeDouble(OrderOpenPrice(), (int)MarketInfo(OrderSymbol(), MODE_DIGITS));
double orderStopLoss = NormalizeDouble(OrderStopLoss(), (int)MarketInfo(OrderSymbol(), MODE_DIGITS));
if (OrderType() == OP_BUY) {
RefreshRates();
double modifyStopLoss = Bid - stopPips;
if (Bid >= orderPrice + startPips) {
commonTrailingStop(modifyStopLoss, orderStopLoss);
}
} else if (OrderType() == OP_SELL) {
RefreshRates();
double modifyStopLoss = Ask + stopPips;
if (Ask <= orderPrice - startPips) {
commonTrailingStop(modifyStopLoss, orderStopLoss);
}
}
}
void commonTrailingStop(double modifyStopLoss, double stopLoss) {
if (OrderType() == OP_BUY) {
if (modifyStopLoss - 0.5 * Point > stopLoss) {
orderModifyReliable(OrderTicket(), 0.0, modifyStopLoss, 0.0, 0, clrYellow);
}
} else if (OrderType() == OP_SELL) {
if (modifyStopLoss < stopLoss - 0.5 * Point || stopLoss == 0.0) {
orderModifyReliable(OrderTicket(), 0.0, modifyStopLoss, 0.0, 0, clrYellow);
}
}
}
double currencyUnitPerPips(string symbol) {
double digits = MarketInfo(symbol, MODE_DIGITS);
double point = MarketInfo(symbol, MODE_POINT);
double currencyUnit = 0.0;
if (digits == 3.0 || digits == 5.0) {
currencyUnit = point * 10.0;
} else {
currencyUnit = point;
}
return (currencyUnit);
}
使用 ATR
void trailingStopATR(int ATRPeriod1, int ATRPeriod2, double ATRMulti) {
double orderStopLoss = NormalizeDouble(OrderStopLoss(), (int)MarketInfo(OrderSymbol(), MODE_DIGITS));
double ATR1 = iATR(OrderSymbol(), 0, ATRPeriod1, 1);
double ATR2 = iATR(OrderSymbol(), 0, ATRPeriod2, 1);
double ATR = MathMax(ATR1, ATR2);
double stop = ATR * ATRMulti;
if (OrderType() == OP_BUY) {
double modifyStopLoss = iHigh(OrderSymbol(), 0, 1) - stop;
commonTrailingStop(modifyStopLoss, orderStopLoss);
} else if (OrderType() == OP_SELL) {
double lowPrice = iLow(OrderSymbol(), 0, 1) + MarketInfo(OrderSymbol(), MODE_SPREAD) * currencyUnitPerPips(Symbol());
double modifyStopLoss = lowPrice + stop;
commonTrailingStop(modifyStopLoss, orderStopLoss);
}
}
追踪止损使用一定时间内的最高价和最低价
void trailingStopHL(int candleNum) {
double orderStopLoss = NormalizeDouble(OrderStopLoss(), (int)MarketInfo(OrderSymbol(), MODE_DIGITS));
if (OrderType() == OP_BUY) {
double modifyStopLoss = iLow(OrderSymbol(), 0, iLowest(OrderSymbol(), 0, MODE_LOW, candleNum, 1)) + MarketInfo(OrderSymbol(), MODE_SPREAD) * currencyUnitPerPips(Symbol());
commonTrailingStop(modifyStopLoss, orderStopLoss);
} else if (OrderType() == OP_SELL) {
double modifyStopLoss = iHigh(OrderSymbol(), 0, iHighest(OrderSymbol(), 0, MODE_HIGH, candleNum, 1));
commonTrailingStop(modifyStopLoss, orderStopLoss);
}
}
使用 MA
void TrailingByMA(int timeFrame, int MAPeriod, int MAShift, int MAMethod, int applPrice, int shift, double indent) {
double orderStopLoss = NormalizeDouble(OrderStopLoss(), (int)MarketInfo(OrderSymbol(), MODE_DIGITS));
double dMA = iMA(Symbol(), timeFrame, MAPeriod, MAShift, MAMethod, applPrice, shift);
if (OrderType() == OP_BUY) {
double modifyStopLoss = dMA - indent;
commonTrailingStop(modifyStopLoss, orderStopLoss);
} else if (OrderType() == OP_SELL) {
double modifyStopLoss = dMA + indent + MarketInfo(OrderSymbol(), MODE_SPREAD) * currencyUnitPerPips(Symbol());
commonTrailingStop(modifyStopLoss, orderStopLoss);
}
}
何时使用追踪止损
我们引入了各种追踪止损,但它们并不有效,具体取决于您如何使用它们。 此外,根据市场情况和交易风格,最佳用法将发生变化。
让我们考虑一些场景以及它们如何发挥最佳作用。
何时使用趋势跟踪策略
追踪止损特别适用于趋势跟踪 EA。 这是因为如果市场继续朝着某个方向移动,追踪止损可以帮助您跟随趋势并获利。
在区间市场中交易时
另一方面,在区间波动的市场中,追踪止损并不总是最好的衡量标准。 这是因为价格在一定范围内上下波动,因此追踪止损可能会过早激活,您可能无法完全增加利润。
在这种情况下,设置固定止损或止盈可能是更好的结果。
在高波动性环境中交易时
在高波动性环境中,价格波动迅速,因此可以通过采取广泛的追踪止损来防止因暂时的价格波动而造成的损失。