Jeff- will this work for looking back over only x number of trades at each new trade, or will it tally the sqn for all previous closed trades each time? Thanks
--- In [email protected], "Mike" <sfclimb...@...> wrote: > > SetForeign has no impact on user defined arrays (e.g. MyRisk). It only > affects the arrays of the current symbol (e.g. Buy, Sell, BuyPrice, > SellPrice, etc.). > > So, take whatever code you used to calculate MyRisk and move it directly into > the custom backtester between the SetForeign and RestorePriceArrays. > > In other words, calculate MyRisk on the fly. You cannot access it after the > fact. > > Alternatively, you could write to composite symbols or static arrays. But, > it's probably easier to do it in the custom backtest code. > > Mike > > --- In [email protected], "jeffarcherjr" <jeffarcherjr@> wrote: > > > > > > > > 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(); > > > > } > > >
