Paul,
Yes, this is a superior method and works flawlessly.  Not sure why I was making 
it more difficult than it needed to be but thank you.
B



--- In [email protected], "Paul Ho" <paul.t...@...> wrote:
>
> Yes, You can't have more elements in an array than the no. of bars because 
> all arrays are sized at barcount.
> but you dont need arrays though to do stdev and avgs
> what's wrong with 
> x = trade.GetPercentProfit();
> sumx += x;
> smx2 += (x * x) // x * x is order of magnitude faster than x^2
> 
> --- In [email protected], "bh.hicks" <bh.hicks@> wrote:
> >
> > I found an error in my standard deviation of trades code...
> > 
> > for( trade = bo.GetFirstTrade(); trade; trade = bo.GetNextTrade() )
> > {
> >     X[N] = trade.GetPercentProfit();
> >     SumX=SumX+X[N];
> >     SumX2=SumX2+(X[N]^2);
> >     N++;
> > }
> > 
> > I am getting an out of range error sometimes and I think it is only 
> > happening if there are more trades than bars in the test.  Does this make 
> > sense to anyone?  Any ideas?
> > 
> > 
> > 
> > 
> > --- In [email protected], "bh.hicks" <bh.hicks@> wrote:
> > >
> > > Huh, good question.  The honest answer is habit with a little bit of 
> > > legacy I guess as I like to be able to compare new things I am working on 
> > > to older systems and I have been using that metric for a while.  I also 
> > > use profit targets almost exclusively so I rarely have large positive 
> > > outliers anyway but it is worth a look for sure.
> > > Thanks.
> > > 
> > > 
> > > --- In [email protected], "Paul Ho" <paul.tsho@> wrote:
> > > >
> > > > you are welcome
> > > > just out of curosity why do you use stdev instead of ulcer index which 
> > > > doesnt penalise upward volatility?
> > > > --- In [email protected], "bh.hicks" <bh.hicks@> wrote:
> > > > >
> > > > > Paul,
> > > > > That worked!  I am not sure what I was doing wrong yesterday but I 
> > > > > was mentally drained so probably just something stupid.
> > > > > 
> > > > > I want to thank you and everyone else who helped out with this. I 
> > > > > know it is pretty simple for the seasoned AB users here but I figured 
> > > > > I might as well dive in if I am going to make the switch and this was 
> > > > > as good a place to start as any.  This community is certainly one of 
> > > > > the reasons I decided to begin switching platforms.  
> > > > > 
> > > > > Best,
> > > > > B
> > > > > 
> > > > > 
> > > > > --- In [email protected], "Paul Ho" <paul.tsho@> wrote:
> > > > > >
> > > > > > Worked when I tested it
> > > > > > See full code, just a few lines, less than that of traders studio:)
> > > > > >     eq  = Foreign("~~~EQUITY", "C");
> > > > > >     meq = TimeFrameCompress(eq, inMonthly);
> > > > > >     m = Cum(IsNull(meq) == 0);
> > > > > >     mret = ROC(meq, 1);
> > > > > >     mstd = lastvalue(StDev(mret, LastValue(m-2)));
> > > > > >     MAvg = lastvalue(MA(mret, LastValue(m - 2)));
> > > > > >     bo.AddCustomMetric("Monthly sharpe", (MAvg -.0025)/mstd); 
> > > > > > --- In [email protected], "bh.hicks" <bh.hicks@> wrote:
> > > > > > >
> > > > > > > Paul,
> > > > > > > Thanks for posting this.  I am not having any luck with it but I 
> > > > > > > will try again tomorrow when fresh. Thanks.
> > > > > > > 
> > > > > > > 
> > > > > > > 
> > > > > > > --- In [email protected], "Paul Ho" <paul.tsho@> wrote:
> > > > > > > >
> > > > > > > > You can try the following in your CBT
> > > > > > > > meq = timeframecompress(foreign("~~~Equity", "C"), inMonthly);
> > > > > > > > m = Cum(IsNull(meq) == 0);
> > > > > > > > mstd = StDev(meq, LastValue(m-1));
> > > > > > > > you can do a timeframeexpand, but if you're using the 
> > > > > > > > lastvalue, that isnt necessary. if you want std of return 
> > > > > > > > then add mret = roc(meq, 1); but mstd = stdev(mret, lastvalue(m 
> > > > > > > > - 2)) instead.
> > > > > > > > Enjoy.
> > > > > > > > 
> > > > > > > > --- In [email protected], "bh.hicks" <bh.hicks@> wrote:
> > > > > > > > >
> > > > > > > > > I should probably add that the challenge now is not 
> > > > > > > > > calculating the SD but how to load up an array with only 
> > > > > > > > > monthly returns...
> > > > > > > > > 
> > > > > > > > > 
> > > > > > > > > 
> > > > > > > > > --- In [email protected], "bh.hicks" <bh.hicks@> 
> > > > > > > > > wrote:
> > > > > > > > > >
> > > > > > > > > > Mike,
> > > > > > > > > > You are the man! Thank you! I have posted the code I ended 
> > > > > > > > > > up with to the bottom of this email in hopes it will help 
> > > > > > > > > > someone else someday but please be aware I am the worst 
> > > > > > > > > > "programmer" on the planet before using.  
> > > > > > > > > > 
> > > > > > > > > > Now onto StdDev of monthly returns.  Traders Studio has an 
> > > > > > > > > > object that stores monthly returns that I access like 
> > > > > > > > > > this...
> > > > > > > > > > 
> > > > > > > > > > NOTE: NOT AMIBROKER CODE
> > > > > > > > > > 
> > > > > > > > > > objReport = thisSession.MonthlyReport
> > > > > > > > > > ReDim(Mreturn,objReport.ItemCount)
> > > > > > > > > > 
> > > > > > > > > > For i = 0 To objReport.ItemCount - 1
> > > > > > > > > >     objPeriod = objReport.Period(i)
> > > > > > > > > >     Mreturn[i]=objPeriod.PercentReturn
> > > > > > > > > > Next
> > > > > > > > > > 
> > > > > > > > > > AvgMreturn=Average(Mreturn,i,0)
> > > > > > > > > > StDevMreturn=StdDevS(Mreturn,i,0)
> > > > > > > > > > Msharpe=(AvgMreturn-.0025)/StDevMreturn
> > > > > > > > > > 
> > > > > > > > > > I haven't been able to find something similar in AB.  Does 
> > > > > > > > > > it exist or is there another method I need to use to get at 
> > > > > > > > > > this data? Thanks again for any bones that can be thrown my 
> > > > > > > > > > way. I will do my best to leave the results behind for the 
> > > > > > > > > > next newbie who follows me.
> > > > > > > > > > 
> > > > > > > > > > --------------------------------------------------------------------
> > > > > > > > > > MY AB Code to calculate Standard Deviation of Trades and 
> > > > > > > > > > use it to calculate T-score.
> > > > > > > > > > 
> > > > > > > > > > SetCustomBacktestProc("");
> > > > > > > > > > 
> > > > > > > > > > if( Status("action") == actionPortfolio )
> > > > > > > > > > {
> > > > > > > > > > bo = GetBacktesterObject();
> > > > > > > > > > bo.Backtest(); 
> > > > > > > > > > st = bo.GetPerformanceStats(0);
> > > > > > > > > > 
> > > > > > > > > > //Get Variables
> > > > > > > > > > AvgTrade=st.GetValue("AllAvgProfitLossPercent");
> > > > > > > > > > 
> > > > > > > > > > // iterate through closed trades
> > > > > > > > > > X = 0;
> > > > > > > > > > N = 0;
> > > > > > > > > > SumX = 0;
> > > > > > > > > > SumX2 = 0;
> > > > > > > > > > 
> > > > > > > > > >    for( trade = bo.GetFirstTrade(); trade; trade = 
> > > > > > > > > > bo.GetNextTrade() )
> > > > > > > > > >    {
> > > > > > > > > >             X[N] = trade.GetPercentProfit();
> > > > > > > > > >             SumX=SumX+X[N];
> > > > > > > > > >             SumX2=SumX2+(X[N]^2);
> > > > > > > > > >             N++;
> > > > > > > > > >     }
> > > > > > > > > > 
> > > > > > > > > > // Custom Metric Caluclations
> > > > > > > > > > TradeStdDev=sqrt((SumX2-((SumX)*(SumX)/N))/(N-1));
> > > > > > > > > > TScore=sqrt(N)*AvgTrade/TradeStdDev;
> > > > > > > > > > 
> > > > > > > > > > // Here we add custom metric to backtest report
> > > > > > > > > > bo.AddCustomMetric( "TradeStdDev",TradeStdDev);
> > > > > > > > > > bo.AddCustomMetric( "T-Score",TScore);
> > > > > > > > > > }
> > > > > > > > > > 
> > > > > > > > > > 
> > > > > > > > > > 
> > > > > > > > > > 
> > > > > > > > > > 
> > > > > > > > > > 
> > > > > > > > > > 
> > > > > > > > > > 
> > > > > > > > > > 
> > > > > > > > > > 
> > > > > > > > > > 
> > > > > > > > > > 
> > > > > > > > > > 
> > > > > > > > > > 
> > > > > > > > > > 
> > > > > > > > > > 
> > > > > > > > > > 
> > > > > > > > > > 
> > > > > > > > > > 
> > > > > > > > > > 
> > > > > > > > > > --- In [email protected], "Mike" <sfclimbers@> 
> > > > > > > > > > wrote:
> > > > > > > > > > >
> > > > > > > > > > > I haven't verified any of this, but...
> > > > > > > > > > > 
> > > > > > > > > > > When you create your own arrays (e.g. TradeReturn[]), I 
> > > > > > > > > > > believe that they get aligned with the market data of the 
> > > > > > > > > > > current symbol (~~~Equity in this case). Assuming that 
> > > > > > > > > > > you had a total of 20 trades over 1000 bars, you would 
> > > > > > > > > > > have an array with values for the first 20 elements and 
> > > > > > > > > > > zeroes (or Nulls?) for the remaining 980 bars. Your StDev 
> > > > > > > > > > > call is operating on the last 3 bars, all of which will 
> > > > > > > > > > > be zero, giving zero.
> > > > > > > > > > > 
> > > > > > > > > > > I believe that the answer would be for you to manually 
> > > > > > > > > > > calculate the std. deviation of the trades yourself.
> > > > > > > > > > > 
> > > > > > > > > > > Then again, the problem might just be related to trying 
> > > > > > > > > > > to add an array as custom metric as opposed to a scaler, 
> > > > > > > > > > > in which case LastValue(TradeStdDev) would be the way to 
> > > > > > > > > > > go. Experiment and see what you come up with.
> > > > > > > > > > > 
> > > > > > > > > > > Mike
> > > > > > > > > > > 
> > > > > > > > > > > P.S. Great start for someone new to AmiBroker!
> > > > > > > > > > > 
> > > > > > > > > > > 
> > > > > > > > > > > --- In [email protected], "bh.hicks" <bh.hicks@> 
> > > > > > > > > > > wrote:
> > > > > > > > > > > >
> > > > > > > > > > > > Ok, I am making progress on this but getting hung up on 
> > > > > > > > > > > > the standard deviation calculations.  I have been 
> > > > > > > > > > > > through most of all 800+ posts that mention standard 
> > > > > > > > > > > > deviation but haven't been able to figure this out.  If 
> > > > > > > > > > > > anyone can offer some insight into why my TradeStDev is 
> > > > > > > > > > > > coming back empty, I would very much appreciate it as I 
> > > > > > > > > > > > barely have any hair left.
> > > > > > > > > > > > 
> > > > > > > > > > > > 
> > > > > > > > > > > > SetCustomBacktestProc("");
> > > > > > > > > > > > 
> > > > > > > > > > > > if( Status("action") == actionPortfolio )
> > > > > > > > > > > > {
> > > > > > > > > > > > bo = GetBacktesterObject();
> > > > > > > > > > > > bo.Backtest(); 
> > > > > > > > > > > > st = bo.GetPerformanceStats(0);
> > > > > > > > > > > > 
> > > > > > > > > > > > //Get Variables
> > > > > > > > > > > > WLratio=st.GetValue("PayoffRatio");
> > > > > > > > > > > > WinPercent=st.GetValue("WinnersPercent")/100;
> > > > > > > > > > > > PF=st.GetValue("ProfitFactor");
> > > > > > > > > > > > NetProfit=st.GetValue("NetProfit");
> > > > > > > > > > > > MaxDD=st.GetValue("MaxSystemDrawdown");
> > > > > > > > > > > > TestYears=(EndValue( BarIndex() ) - BeginValue( 
> > > > > > > > > > > > BarIndex() ))/252;
> > > > > > > > > > > > AvgTrade=st.GetValue("AllAvgProfitLossPercent");
> > > > > > > > > > > > 
> > > > > > > > > > > > // iterate through closed trades
> > > > > > > > > > > > TradeReturn = 0;
> > > > > > > > > > > > NumTrades = 0;
> > > > > > > > > > > > 
> > > > > > > > > > > >    for( trade = bo.GetFirstTrade(); trade; trade = 
> > > > > > > > > > > > bo.GetNextTrade() )
> > > > > > > > > > > >    {
> > > > > > > > > > > >                 TradeReturn[NumTrades] = 
> > > > > > > > > > > > trade.GetPercentProfit();
> > > > > > > > > > > >                 NumTrades++;
> > > > > > > > > > > >    }
> > > > > > > > > > > > 
> > > > > > > > > > > > // Metrics
> > > > > > > > > > > > Fscore=(((WLratio+1)*WinPercent)-1)/WLratio;
> > > > > > > > > > > > MyF=Fscore*PF;
> > > > > > > > > > > > DDR=(NetProfit/-MaxDD)*(TestYears/20);
> > > > > > > > > > > > TradeStdDev=StDev(TradeReturn,3); 
> > > > > > > > > > > > 
> > > > > > > > > > > > // Here we add custom metric to backtest report
> > > > > > > > > > > > bo.AddCustomMetric( "W/L Ratio",WLratio);
> > > > > > > > > > > > bo.AddCustomMetric( "Win %",WinPercent);
> > > > > > > > > > > > bo.AddCustomMetric( "ProfitFactor",PF);
> > > > > > > > > > > > bo.AddCustomMetric( "F-Score",Fscore);
> > > > > > > > > > > > bo.AddCustomMetric( "MyF",MyF);
> > > > > > > > > > > > bo.AddCustomMetric( "DDR",DDR);
> > > > > > > > > > > > bo.AddCustomMetric( "AvgTrade%",AvgTrade);
> > > > > > > > > > > > bo.AddCustomMetric( "Test0",TradeReturn[0]);
> > > > > > > > > > > > bo.AddCustomMetric( "Test1",TradeReturn[NumTrades-1]);
> > > > > > > > > > > > bo.AddCustomMetric( "TradeStDev",TradeStdDev);
> > > > > > > > > > > > }
> > > > > > > > > > > > 
> > > > > > > > > > > > 
> > > > > > > > > > > > --- In [email protected], "bh.hicks" 
> > > > > > > > > > > > <bh.hicks@> wrote:
> > > > > > > > > > > > >
> > > > > > > > > > > > > I have been a long time Traders Studio user and am 
> > > > > > > > > > > > > beginning the process of migrating everything over to 
> > > > > > > > > > > > > AmiBroker.  One of the more useful pieces of code I 
> > > > > > > > > > > > > wrote for Traders Studio was a custom optimization 
> > > > > > > > > > > > > metric that I would like to reproduce in AmiBroker.  
> > > > > > > > > > > > > I am a little overwhelmed at all the information 
> > > > > > > > > > > > > available and would very much appreciate it if 
> > > > > > > > > > > > > someone could point me towards some sources of info 
> > > > > > > > > > > > > that will allow me to accomplish this.
> > > > > > > > > > > > > 
> > > > > > > > > > > > > The ranking metric does the following:
> > > > > > > > > > > > > 
> > > > > > > > > > > > > Msharpe=(AvgMreturn-.0025)/StDevMreturn (m refers to 
> > > > > > > > > > > > > monthly)
> > > > > > > > > > > > > Tscore=Sqr(TradeCount)* AvgTrade/TradeStdDev (std 
> > > > > > > > > > > > > dev. is of % returns of each trade)
> > > > > > > > > > > > > Fscore=(((WLratio+1)*WinPercent)-1)/WLratio (WLratio 
> > > > > > > > > > > > > is W/L ratio)
> > > > > > > > > > > > > MyF=Fscore*ProfitFactor
> > > > > > > > > > > > > DDR=(NetProfit/MaxDD)*(YearsTested/20)
> > > > > > > > > > > > > 
> > > > > > > > > > > > > CustomScore=Msharpe*MyF*Tscore*DDR
> > > > > > > > > > > > > 
> > > > > > > > > > > > > This did a pretty good job allowing me to quickly 
> > > > > > > > > > > > > rank optimization runs on the criteria that is 
> > > > > > > > > > > > > important to me.
> > > > > > > > > > > > > 
> > > > > > > > > > > > > So although new to AmiBroker, I can work my myself 
> > > > > > > > > > > > > around some moderately difficult code and Trader 
> > > > > > > > > > > > > Studio's object-oriented back end but I really just 
> > > > > > > > > > > > > don't know where to start to dig up how to access 
> > > > > > > > > > > > > this data during backtests an optimization runs. 
> > > > > > > > > > > > > 
> > > > > > > > > > > > > Thanks for any help.
> > > > > > > > > > > > > B
> > > > > > > > > > > > >
> > > > > > > > > > > >
> > > > > > > > > > >
> > > > > > > > > >
> > > > > > > > >
> > > > > > > >
> > > > > > >
> > > > > >
> > > > >
> > > >
> > >
> >
>


Reply via email to