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.hi...@...> 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
> > > > > > >
> > > > > >
> > > > >
> > > >
> > >
> >
>