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