PureBytes Links
Trading Reference Links
|
Mike:
Thanks for your reply. I've had a go at implementing that, but there's a devil in the details somewhere.
I defined a variable MyRisk, which shows up correctly when I run an Exploration, however custombacktestproc appears unable to find it when I do a Backtest.
The custommetrics involving MyRisk all result in zero, everything else about the code below appears to give correct results, including MyClose giving me the correct close price for the symbol/date which I put in there in case I had made a syntax error, and my trade count giving the correct number of trades.
Any suggestions would be much appreciated!
Jeff
Code:
//custom backtest indicators to measure system performance
SetOption("UseCustomBacktestProc", True );
SetCustomBacktestProc("",True);
if( Status("action") == actionPortfolio ) // point to correct iteration of backtest engine
{
//initialize custom backtest engine
backtestobject = GetBacktesterObject();
// run the standard backtest
backtestobject.Backtest(1);
// pointers to find specific trades
bars = BarIndex();
dates = DateTime();
// intialize variables for SQN Calculations
SumR = 0;
SumR2 = 0;
Trades = 0;
expectancyR = 0;
stdDevR = 0;
SQN = 0;
R = 0;
//add data to trade list, starting with closed trades
for( trade = backtestobject.GetFirstTrade(); trade; trade = backtestobject.GetNextTrade() )
{
SetForeign( trade.Symbol, True, True );
entryBar = LastValue( ValueWhen( trade.EntryDateTime == dates, bars ) );
R = MyRisk[entryBar];
trade.addcustommetric("MyRisk",R);
trade.addcustommetric("MyClose",Close[entrybar]);
sumR += R;
sumR2 += R^2;
Trades++;
RestorePriceArrays(True);
}
//add data for trades still open at end of process
for( trade = backtestobject.GetFirstOpenPos(); trade; trade = backtestobject.GetNextOpenPos() )
{
SetForeign( trade.Symbol, True, True );
entryBar = LastValue( ValueWhen( trade.EntryDateTime == dates, bars ) );
R = MyRisk[entryBar];
trade.addcustommetric("MyRisk",R);
trade.addcustommetric("MyClose",Close[entrybar]);
sumR += R;
sumR2 += R^2;
Trades++;
RestorePriceArrays(True);
}
//SQN calculations
if (Trades > 0)
{
testcalc = Trades * 2;
expectancyR = sumR / Trades;
stdDevR = sqrt((sumR2 - (sumR^2 / Trades)) / (Trades - 1));
SQN = ((expectancyR / stdDevR) * sqrt(Min(100, Trades)));
}
//display results
backtestobject.AddCustomMetric("TestCalc", testcalc);
backtestobject.AddCustomMetric("Trades", Trades);
backtestobject.AddCustomMetric("sumR", SumR);
backtestobject.AddCustomMetric("sumR2", SumR2);
backtestobject.AddCustomMetric("ExpectancyR ($)", expectancyR);
backtestobject.AddCustomMetric("StdDevR", stdDevR);
backtestobject.AddCustomMetric("SQN", SQN);
backtestobject.ListTrades();
}
------------------------------------
**** IMPORTANT PLEASE READ ****
This group is for the discussion between users only.
This is *NOT* technical support channel.
TO GET TECHNICAL SUPPORT send an e-mail directly to
SUPPORT {at} amibroker.com
TO SUBMIT SUGGESTIONS please use FEEDBACK CENTER at
http://www.amibroker.com/feedback/
(submissions sent via other channels won't be considered)
For NEW RELEASE ANNOUNCEMENTS and other news always check DEVLOG:
http://www.amibroker.com/devlog/
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/
|