Trailing Stop EA - the forum thread
ATR Trailing Stop: good thread about trailing stop indicators posted and coded.
-------------------
Forum on trading, automated trading systems and testing trading strategies
Sergey Golubev, 2019.02.14 05:31
CodeBase
- Candle Trailing Stop - expert for MetaTrader 4
- Expert Advisor Template with Trailing Stop v2 - expert for MetaTrader 4
Article
Pending Trailing - expert for MetaTrader 5
The EA belongs to the utility class. It works with all pending orders installed in the terminal. Pulls a pending order after the price.
The figure below shows HOW PENDING ORDERS WORK -
Static Trailing stop or Dynamic for scalping?
Any EA you write should have—at a minimum—trailing stop methods based upon fixed, percent, and ATR.
Then you can back test and find which works best for your specific instrument, time frame, volatility, etc.
I doubt the usefulness of a trailing stop, because the trade closes on the stop in the worst position. You need to manage both opening and closing trades yourself. Here is the best trailing stop, but better without it. Code MT4:
//the StopLoss is kept at a Distance from the most extreme shadow of the last Number hours int DoTrailOrders(double eDistance, double eHoursNumber, int eMagicNumber, string eSymbol, int eTimeFrame) { int eDigits=(int)MarketInfo(eSymbol,MODE_DIGITS); eDistance*=MarketInfo(eSymbol,MODE_POINT); double eSpread=MarketInfo(eSymbol,MODE_SPREAD)*MarketInfo(eSymbol,MODE_POINT); int eBarsNumber=(int)MathMax(MathCeil(3600.0/PeriodSeconds(eTimeFrame)*eHoursNumber),1); double eExtremum; int ePosition, eTotal=OrdersTotal(), eType; for(ePosition=0; ePosition<eTotal; ePosition++) { if(!OrderSelect(ePosition,SELECT_BY_POS,MODE_TRADES)) { //error handling continue; } eType=OrderType(); if(eType!=OP_BUY && eType!=OP_SELL) continue; if(OrderMagicNumber()!=eMagicNumber) continue; if(OrderSymbol()!=eSymbol) continue; //we observe starting from the bar following the opening bar if(iBarShift(eSymbol,eTimeFrame,OrderOpenTime())==0) continue; if(eType==OP_BUY) { //the stop is set at the eDistance from the lowest shadow of the bar in the history of eBarsNumber eExtremum=iLow(eSymbol,eTimeFrame,iLowest(eSymbol,eTimeFrame,MODE_LOW,eBarsNumber,1)); //the distance from the minimum to StopLoss must exceed the TrailingLevel if(NormalizeDouble(eExtremum-OrderStopLoss(),eDigits)<=eDistance && OrderStopLoss()>0) continue; //the distance from the minimum to the opening price must exceed the TrailingLevel if(NormalizeDouble(eExtremum-OrderOpenPrice(),eDigits)<=eDistance) continue; //the new stop must be no closer to the current price than two spreads if(NormalizeDouble(MarketInfo(eSymbol,MODE_BID)-eExtremum+eDistance,eDigits)<=eSpread) continue; if(!OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(eExtremum-eDistance,eDigits),OrderTakeProfit(),OrderExpiration(),clOpenBuy)) { //error handling } } if(eType==OP_SELL) { eExtremum=iHigh(eSymbol,eTimeFrame,iHighest(eSymbol,eTimeFrame,MODE_HIGH,eBarsNumber,1)); if(NormalizeDouble(OrderStopLoss()-eExtremum,eDigits)<=eDistance && OrderStopLoss()>0) continue; if(NormalizeDouble(OrderOpenPrice()-eExtremum,eDigits)<=eDistance) continue; if(NormalizeDouble(eExtremum+eDistance-MarketInfo(eSymbol,MODE_ASK),eDigits)<=eSpread) continue; if(!OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(eExtremum+eDistance,eDigits),OrderTakeProfit(),OrderExpiration(),clOpenSell)) { //error handling } } } return(0); }
- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
You agree to website policy and terms of use