[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[amibroker] Equity as an indicator - some questions



PureBytes Links

Trading Reference Links

After Herman's remark some time ago that it's much faster to do a visual 
optimization by running the system as an indicator and plotting the equity 
curve, I've searched for a convenient way to achieve this.

I'm doing it right now by using Daniel LaLiberte's TradeVisualizer.afl which 
he published in this list (Dan was so kind to send me his newest version - 
thanks again!) - see the code at the end of this posting. I saved it in my 
Include folder and add it with #include <TradeVisualizer.afl> to the 
appropriate system. I added some code to Dan's formula from Amibroker's 
Portfolio.afl which I modified a bit in order to plot the Equity curve, Cash 
and Drawdown.

So far it works well - but not always! There is a phenomenon  that really 
puzzles me: Yesterday the formula worked well. Today I started Amibroker and 
doubleclicked a formula (with #include <TradeVisualizer.afl>). The Equity 
curve was plotted - but only as a horizontal straight line equivalent to the 
initial equity amount. Changing the variables via the Param slider didn't 
have any effect. The same was true for other formulas I tried. Then I 
performed a backtest of a formula - now all of a sudden the equity curve as 
an indicator plotted as expected! In order to evaluate this I restarted 
Amibroker but this time everything worked as it should - funny. Do you have 
any idea what's going on here? If that's called a consistent behavior of 
Amibroker then I simply don't understand it.

A second problem is that the equity curve plotted by TradeVisualizer is *very* 
similar to the equity curve plotted by the Backtester but not completely 
identical. The end values are identical, but in some situations the values 
for equity and drawdown differ a bit from the ones of the Backtester, in 
other situations they are identical. To give you an impression of the 
magnitude: If I select 50000 as initial equity, the differences in the equity 
and drawdown figures are not higher than a few hundred bucks. No big deal, 
but nevertheless I would like to understand why.

Any help would be highly appreciated.

Regards, Thomas

Here's Dan' code which I modified as mentined above:

// TradeVisualizer.afl -- Indicate trades and change in equity.
// Daniel LaLiberte liberte@xxxxxxxxxxxxx

/*
Features:
	Show realized and unrealized net profit
	Show trade signals.
	Show trade arrows.

Bugs, assumptions, limitations, and side effects:
	Assumes GraphZOrder == 0 which is the default.
	Assume only one open position.
	Assumes Short and Cover are defined - at least do this: Short = Cover = false
	Assumes order delay is 1.  (It should never be 0.)
	Calls Equity(0, 0), which should not have side effects.
	This visualizer should not affect your actual signals.
	The unrealized net profit is moved back one bar, which is easier to 
understand.

Instructions:
	Save TradeVisualizer.afl in your Include folder. 
	Add the following at the end of your scripts, after your final Buy, Sell, 
Short, Cover assignments:
//	  #include <TradeVisualizer.afl>
	(It does not work to add this as an Overlay)
	Remove your ExRem() calls to see regions of raw Buy, Sell, Short, Cover 
signals

More ideas:
  Show stops/limits. 
  Deal with order delays - it assumes 1 bar delay.
  Show pyramid trades, number of shares per trade.
  Display text of profit/loss.
  Optionally compute equity across stocks.
  Parameterize all this.

Please send improvements or suggestions.
*/

_SECTION_BEGIN("TradeVisualizer");

//========================================

backgroundColor = colorWhite;

// Colors of signal bars
buyColor = colorPaleGreen; // ColorRGB(230, 255, 230); // very pale
sellColor = colorRose;
shortColor = colorLavender;
coverColor = colorSkyblue;

// Colors of arrows
buyArrowColor = colorLime; 
sellArrowColor = colorRed;
shortArrowColor = colorViolet;
coverArrowColor = colorBlue;

// Colors of net profit
gainColor = colorLime; // unrealized gain relative to last trade
lossColor = colorOrange; // unrealized loss relative to last trade
netPositiveColor = colorGreen; // overall realized net profit is positive
netNegativeColor = colorRed; // overall realized net profit is negative


//========================================
// Only show stuff if this is running as an indicator
GraphXSpace = 5;   // adds 5% extra space above AND below.

isIndicator = Status("action") == actionIndicator;
if (isIndicator)
{

rawBuy = Buy;
rawSell = Sell;
rawShort = Short;
rawCover = Cover;

// Assume only one open position.
buyExRem = ExRem(Buy, Sell);
sellExRem = ExRem(Sell, Buy);
shortExRem = ExRem(Short, Cover);
coverExRem = ExRem(Cover, Short);

sinceBuy = BarsSince (buyExRem);
sincesell = BarsSince(Sellexrem);
sinceshort = BarsSince(ShortExRem);
sincecover = BarsSince(CoverExRem);
incash=sincesell<sincebuy OR sincecover<sinceshort;


eq=Equity();
dr = eq - Highest(eq);
bslh = HighestBars(eq);
Cash=ValueWhen( incash, eq);
GraphZOrder=1;
Plot(eq, "Portfolio Equity", IIf(incash,colorGreen,colorLightBlue), 
styleArea );
//if( ParamToggle("Show Cash", "No|Yes", 1 ) ) Plot(cash, "Cash", colorGreen, 
styleArea );
if( ParamToggle("Show Drawdown", "No|Yes", 1 ) ) Plot(dr, "Drawdown", 
colorDarkRed, styleArea );
if( ParamToggle("Show #bars since last high", "No|Yes", 0 ) ) 
Plot(bslh, "#bars since last high", colorDarkYellow, styleLine | 
styleOwnScale, 0, 10 * LastValue( Highest( bslh ) )  );
islastbar = Status("lastbarintest");
isfirstbar = Status("firstbarintest");
bar = BarIndex();
firstbar = LastValue( ValueWhen( isfirstbar, bar ) );
lastbar = LastValue( ValueWhen( islastbar, bar ) );
al = LastValue( ValueWhen( islastbar, LinRegSlope( eq, Lastbar - firstbar + 
1 ) ) );
bl = LastValue( ValueWhen( islastbar, LinRegIntercept( eq, Lastbar - firstbar 
+ 1 ) ) );
Lr = al * ( BarIndex() - firstbar ) + bl;
Lr = IIf( bar >= firstbar AND bar <= lastbar , Lr, Null );
if( ParamToggle("Show lin. reg.", "No|Yes", 0 ) )Plot( Lr , "Linear Reg", 
colorRed, styleThick );
RelPerf=eq/C;
if(ParamToggle("Show Rel.Perf Equity", "No|Yes",0)) Plot(RelPerf, "Rel.Perf.", 
colorBlack,styleThick|styleOwnScale);

if( ParamToggle("Show Buy-and-Hold?", "No|Yes", 1 ) ) 
{ 
/* now buy and hold simulation */ 
Short=Cover=0; 
Buy=Status("firstbarintest"); 
Sell=Status("lastbarintest"); 
SetTradeDelays(0,0,0,0); PositionSize = -100; 
ApplyStop(0,0,0,0); 
ApplyStop(1,0,0,0); 
ApplyStop(2,0,0,0); 
Plot( Equity( 0, -2 ), "Buy&Hold", -9 ); 
} 



// Show realized and unrealized gain or loss relative to last buy or short 
trade.


if (ParamToggle("Show net profit", "no|yes", 0))
{

	// Last trade event: buy, sell, short or cover.
	//lastTrade = buyExRem + shortExRem + sellExRem + coverExRem;
	closeTrade = sellExRem + coverExRem;


	// Calculate equity change since initial equity, i.e. the unrealized net 
profit.
	// Equity is what we might have at the beginning of each bar, if we were to 
sell all assets.
	// Avoid calling Equity(1) which has side effects on trades.
	netProfit = Nz( Equity(0, 0) - GetOption("InitialEquity")); 

	// Calculate realized net profit at beginning of last close trade event.
	// Since trade happens at the beginning of the bar after the signal (i.e. a 
delay of 1), 
	// then we check whether there was a close trade in the previous bar.
	realP = Nz( ValueWhen( Ref(closeTrade, -1), netProfit) ); 

	//realP = Ref(realizedNetProfit, 0); 


	// Move the unrealized profit back to when it was generated by looking 
forward 1 bar.
	unrealP = Ref(netProfit, 1);  // try 0 to see if you like it better.

	PlotOHLC( realP , realP , unrealP , unrealP , "net profit", 
		IIf (unrealP > realP , gainColor, 
		IIf (unrealP < realP , lossColor,
		// no change, so height is zero.  Use realized net profit color instead.
		IIf (realP > 0, netPositiveColor, netNegativeColor))), 
			styleCandle | styleOwnScale ); // Use styleLeftAxisScale if also showing 
realP above.


}

//========================================
// Show buy, sell, short, or cover signals

if (ParamToggle("Show trade signals", "no|yes", 0))
{
	

	Plot(IIf(buyExRem OR sellExRem, 95, 3), "",
		IIf(rawBuy, buyColor, IIf(rawSell, sellColor, backgroundColor)), 
			styleHistogram | styleThick | styleOwnScale | styleNoLabel, 0, 100);
	Plot(IIf(shortExRem OR coverExRem, -95, -3), "",
		IIf(rawShort, shortColor, IIf(rawCover, coverColor, backgroundColor)), 
			styleHistogram | styleThick | styleOwnScale | styleNoLabel, -100, 0);

}

//========================================
// Add up and down arrows. The vertical position will be your first plot, if 
any.
// Too noisy with many trades.

if (ParamToggle("Show trade arrows", "no|yes", 0))
{
	PlotShapes(shapeUpArrow * buyExRem, buyArrowColor);
	PlotShapes(shapeDownArrow * sellExRem, sellArrowColor);
	// Bump the short and cover arrows out one if there is a sell or buy arrow
	PlotShapes(shapeHollowDownArrow * shortExRem, shortArrowColor, 0,  
IIf(sellExRem, -26, -15));
	PlotShapes(shapeHollowUpArrow * coverExRem, coverArrowColor, 0,  
IIf(buyExRem, -26, -15));
}



/*
sinceBuy = BarsSince (buyExRem);
sinceSell = BarsSince (sellExRem);
sinceShort = BarsSince (shortExRem);
sinceCover = BarsSince (coverExRem);

inLong = ref(sinceSell, -1) > sinceBuy;
inShort = ref(sinceCover, -1) > sinceShort;

lastBuyPrice = ref ( BuyPrice, - sinceBuy);
lastShortPrice = ref ( ShortPrice, - sinceShort);
percentBuy = inLong * 100 * (SellPrice - lastBuyPrice) / lastBuyPrice;
percentShort = inShort * 100 * (CoverPrice - lastShortPrice) / lastShortPrice;
*/

} // end if indicator

_SECTION_END();


Please note that this group is for discussion between users only.

To get support from AmiBroker please send an e-mail directly to 
SUPPORT {at} amibroker.com

For NEW RELEASE ANNOUNCEMENTS and other news always check DEVLOG:
http://www.amibroker.com/devlog/

For other support material please check also:
http://www.amibroker.com/support.html
 
Yahoo! Groups Links

<*> To visit your group on the web, go to:
    http://groups.yahoo.com/group/amibroker/

<*> Your email settings:
    Individual Email | Traditional

<*> To change settings online go to:
    http://groups.yahoo.com/group/amibroker/join
    (Yahoo! ID required)

<*> To change settings via email:
    mailto:amibroker-digest@xxxxxxxxxxxxxxx 
    mailto:amibroker-fullfeatured@xxxxxxxxxxxxxxx

<*> To unsubscribe from this group, send an email to:
    amibroker-unsubscribe@xxxxxxxxxxxxxxx

<*> Your use of Yahoo! Groups is subject to:
    http://docs.yahoo.com/info/terms/