Building a good objective function is more difficult than I though. Is it ok to have different objective functions depending on the system or part of the system? I mean: sometimes you prefer to have a high ratio of win no matter how much you win while other time %profit is more important...
Louis 2008/5/9 Louis Préfontaine <[EMAIL PROTECTED]>: > Thanks Mike! ;-) > > Louis > > 2008/5/9 Mike <[EMAIL PROTECTED]>: > > 1. Uncomment the Buy/Sell signals. You need to generate statistics in >> order to calculate the objective function. >> >> 2. Type in the name of your custom variable for the optimization >> target of the walk forward settings tab (yours is named >> ObjectiveFunction in the code below) >> >> See http://www.amibroker.com/kb/2008/02/12/getting-started-with- >> automatic-walk-forward-optimization/ >> >> Mike >> >> --- In [email protected] <amibroker%40yahoogroups.com>, "Louis >> Préfontaine" >> <[EMAIL PROTECTED]> wrote: >> > >> > Hi Howard, >> > >> > I am using the following code >> > >> > // CustomMetricWithPenalty.afl >> > // >> > // Add a custom metric to the backtest report. >> > // The metric is the KRatio, multiplied by a >> > // penalty function based on: >> > // the average percentage profit or loss per trade. >> > // the percentage the system is exposed to the market. >> > // the holding period per trade. >> > // the percent of trades that are winners. >> > // the RAR value. >> > >> > KRatioVal = 0; >> > >> > SetCustomBacktestProc(""); >> > >> > if (Status("action") == actionPortfolio) >> > { >> > bo = GetBacktesterObject(); >> > >> > bo.backtest(); >> > >> > st = bo.getperformancestats(0); >> > >> > KRatioVal = 100.0 * st.getvalue("KRatio"); >> > RRR = st.getvalue("RRR"); >> > >> > AvgPctGainVal = 0.01 >> > * st.getvalue("AllAvgProfitLossPercent"); >> > ExposureVal = 0.01 * st.getvalue("ExposurePercent"); >> > HoldingPeriodVal = st.getvalue("AllAvgBarsHeld"); >> > PctWinnersVal = 0.01 * st.getvalue("WinnersPercent"); >> > RarVal = 0.01 * st.getvalue("RAR"); >> > >> > AvgPctGainMult = IIf(AvgPctGainVal<0.01, >> > 0.0, >> > 1.00); >> > >> > ExposureMult = IIf(ExposureVal<0.10, >> > 1.00-(0.50/0.10)*(0.10-ExposureVal), >> > IIf((ExposureVal>=0.10 AND ExposureVal<=0.20), >> > 1.00, >> > IIf((ExposureVal>0.20 AND ExposureVal<0.40), >> > 1.00-(0.50/0.20)*(ExposureVal-0.20), >> > 0.50 ))); >> > >> > HoldingPeriodMult = IIf(HoldingPeriodVal<3, >> > 1.00-(0.50/3)*(3-HoldingPeriodVal), >> > IIf((HoldingPeriodVal>=3 AND HoldingPeriodVal<=7), >> > 1.00, >> > IIf((HoldingPeriodVal>7 AND HoldingPeriodVal<14), >> > 1.00-(0.50/7)*(HoldingPeriodVal-7), >> > 0.50 ))); >> > >> > PctWinnersMult = IIf(PctWinnersVal<0.50, >> > 0.50, >> > IIf((PctWinnersVal>=0.50 AND PctWinnersVal<=0.65), >> > 1.00-(0.50/0.15)*(0.65-PctWinnersVal), >> > 1.00 )); >> > >> > RarMult = IIf(RarVal<0.10, >> > 0.50, >> > IIf((RarVal>=0.10 AND RarVal<=0.20), >> > 1.00-(0.50/0.10)*(0.20-RarVal), >> > 1.00 )); >> > >> > ObFn = KRatioVal * AvgPctGainMult * ExposureMult >> > * HoldingPeriodMult * PctWinnersMult * RarMult; >> > >> > bo.addcustommetric("ObjectiveFunction", ObFn); >> > } >> > >> > // The trading system starts here >> > /* >> > fast = Optimize("fast",16,1,20,1); >> > slow = Optimize("slow",8,1,20,1); >> > MAF = DEMA(C,fast); >> > MAS = DEMA(C,slow); >> > >> > HoldDays = Optimize("HoldDays",1,1,20,1); >> > Buy = Cross(MAF,MAS); >> > Sell = Cross(MAS,MAF) OR BarsSince(Buy)>=HoldDays; >> > Sell = ExRem(Sell,Buy); >> > */ >> > e = Equity(); >> > >> > //Plot(C,"C",colorBlack,styleCandle); >> > //shape = Buy * shapeUpArrow + Sell * shapeDownArrow; >> > //PlotShapes( shape, IIf( Buy, colorGreen, colorRed ), >> > // 0, IIf( Buy, Low, High ) ); >> > Plot(e,"Equity",colorGreen,styleLine|styleOwnScale); >> > //GraphXSpace = 5; >> > //Figure A.7 Custom Metric with Penalty >> > >> > I didn't post it at first because I was not sure if you wanted the >> code to >> > be made public. >> > >> > I worked on another objective function, and I wonder... how can you >> put the >> > objective function in the walk-forward tab? >> > >> > Thanks! >> > >> > Louis >> > >> > 2008/5/9 Howard B <[EMAIL PROTECTED]>: >> > >> > > Hi Louis -- >> > > >> > > Please post the code you are trying to use. >> > > >> > > Yes, you can use your custom objective function when running >> backtests and >> > > automatic walk forward runs. >> > > >> > > Thanks, >> > > Howard >> > > >> > > >> > > On Fri, May 9, 2008 at 3:33 PM, Louis Préfontaine <[EMAIL PROTECTED]> >> > > wrote: >> > > >> > >> Hi, >> > >> >> > >> I've been trying to build a custom objective function and tried >> to see >> > >> what it would be like to use Howard's one in the Appendix A. >> However, after >> > >> running it with different symbols/markets/systems, the results >> is ALWAYS >> > >> 0.00 Anyone know why this can happen? >> > >> >> > >> BTW, is it possible to add the custom OB to the walk-forward? >> > >> >> > >> Thanks, >> > >> >> > >> Louis >> > >> >> > >> >> > >> >> > > >> > > >> > >> >> >> > >
