Volatile Trailing Stop - update trail amount

Hello All,

I tried to implement trailingstop loss wih 1% as the activation floor. The trailing amount is varying and set as the previous HA( Heinken Ashi) open+- some amount. This will be active after 1 % profit.

I want to apply the concept for both longs and shorts.

In order to feed the correct trailing amount, I need to know whether I am in long position or short position.
when dealing with dynamic stopModePoints trailing stops, the math is a bit different: the stop value should be subtracted/added from the highest high/lowest low. Well, at least that's what I thought how it should be done.
I tried to invoke Equity function before ApplyStop but Changes to buy/sell/short/coverrules made after the call have no effect. I dont get the status of the position correctly.

So the question is: what math one should use to match the values used by ApplyStop(stopTypeTrailing, stopModePoints, ARRAY, 1, TRUE) in AB? Or maybe that's not how dynamic ApplyStop() works?

How can I find whether I am on Long or Short before ApplyStop??

Any help?

_SECTION_BEGIN("TS");
    Version(6.30);
    
    HaClose = ( O+H+L+C ) / 4;
	HaOpen = AMA( Ref(HaClose, -1), 0.5);
	HaHigh = Max(H, Max(HaClose, HaOpen));
	HaLow = Min(L, Min(HaClose, HaOpen));
	
	TradeDelay = 1; // set it to 0 for no delays	
	
	SetTradeDelays( TradeDelay, 0, TradeDelay, 0 );
	SetOption("EveryBarNullCheck", True );
	SetOption("ActivateStopsImmediately",True); 
	SetOption("AllowSameBarExit",True);
	
	SetOption( "FuturesMode", False );
	SetOption( "MaxOpenPositions", 100 );
	SetPositionSize( 1, spsShares );
	SetBacktestMode(backtestRegular);

		
	TickSize = 0.05;

	BuyPrice = SellPrice = ShortPrice = CoverPrice = Open;
	
	BarsSinceNewDay = 1 + BarsSince( Day() != Ref(Day(), -1));
	
	
	Buy = Cross( MACD(), Signal() );
	Short = Cross( Signal(), MACD() );
	
	Sell=iif(BarsSinceNewDay==25,1,0);
	Cover=iif(BarsSinceNewDay==25,1,0);
	
	BuyPrice = ValueWhen( Ref(Buy,-TradeDelay), BuyPrice );
	ShortPrice = ValueWhen( Ref(Short,-TradeDelay), ShortPrice );			
		
		
	stopTrailingBuff=Ref(ATR(14),-1)*0.45;
	AddColumn(stopTrailingBuff,"stopTrailingBuff");
	
	stopTrailHigh=HighestSince( Ref( Buy, -TradeDelay ), High );
	stopTrailLowLine=Ref(HaOpen,-1) - stopTrailingBuff;
	trailAmountLong=((stopTrailHigh-stopTrailLowLine)/stopTrailHigh)*100;
	
	AddColumn(trailAmountLong,"trailAmountLong");
	
	stopTrailLow=LowestSince( Ref( Short, -TradeDelay ), Low );
	stopTrailHighLine=Ref(HaOpen,-1) + stopTrailingBuff;
	trailAmountShort=((stopTrailHighLine-stopTrailLow)/stopTrailLow)*100;
	AddColumn(trailAmountShort,"trailAmountShort");
	
	//using Volatile true to change the trail amount and activation floor parameters
	ApplyStop( stopTypeTrailing, stopModePercent, trailAmountLong,1, True, 0, 0, -1, 1 ); // I dont know how to select the trailAmount for shorts & longs before applying ApplyStop??
//	ApplyStop( stopTypeTrailing, stopModePercent, trailAmountShort,1, True, 0, 0, -1, 1 );

	Equity(1,0); // // update equity to get the status of the open positions
			
	//InLong=Flip(1,0);
	//InShort=Flip(1,0);


	Filter=Buy;
			
	AddColumn(Buy,"Buy");
	AddColumn(Sell,"Sell");

	
_SECTION_END();	

I have already experimented with https://www.amibroker.com/kb/2014/10/17/using-price-levels-with-applystop-function/ - where the stoploss is fixed from entry.

Some one expert in Applystop, please help me..

How to find whenever you are long or short (flip/flop mechanism) was covered lots of time on this forum. Just use search, few examples (there are dozens of that on the forum):


Thank you for the pointer,

But I want to know the position status before calling Trailing Applystop.
I can call Flip function after Equity in order to evaluate stops.
Not able to understand how Applystop, Equity and Flip can be used in when I have maxstop loss and trailing.

Can any one have look on the code please ?

ApplyStop( stopTypeLoss, stopModePoint, stopAmount, True,False,0,1 );	
	
	stopTrailingBuff=Ref(ATR(14),-1)*0.30;
	AddColumn(stopTrailingBuff,"stopTrailingBuff");
	
	stopTrailHigh=HighestSince( Ref( Buy, -TradeDelay ), High );
	stopTrailLowLine=Ref(HaOpen,-1) - stopTrailingBuff;
	trailAmountLong=((stopTrailHigh-stopTrailLowLine)/stopTrailHigh)*100;
	
	AddColumn(trailAmountLong,"trailAmountLong");
	
	stopTrailLow=LowestSince( Ref( Short, -TradeDelay ), Low );
	stopTrailHighLine=Ref(HaOpen,-1) + stopTrailingBuff;
	trailAmountShort=((stopTrailHighLine-stopTrailLow)/stopTrailLow)*100;
	AddColumn(trailAmountShort,"trailAmountShort");

	ApplyStop( stopTypeTrailing, stopModePercent, trailAmountLong,1, True, 0, 0, -1, 1 ); // I dont know how to select the trailAmount for shorts & longs before applying ApplyStop??
//	ApplyStop( stopTypeTrailing, stopModePercent, trailAmountShort,1, True, 0, 0, -1, 1 );

	Equity(1,0); // evaluate stops, all quotes
	InLong=Flip(Buy,Sell);
	InShort=Flip(Short,Cover);

No, you don't need Equity call. As I wrote, read/search the forum. It has been explained many times how to do different amount for long/shorts. It is just one call to ApplyStop.

trailAmount = IIF( Flip( Buy, Short ), trailAmountLong, trailAmountShort ) );
ApplyStop( stopTypeTrailing, stopModePercent, trailAmount ,1, True, 0, 0, -1, 1 ); 
1 Like

Thanks a million!, I will improve.