Another question: is it me or it really slows down the optimization
process?  I kind of waited like 5 minutes for a simple backtest...  ;-)

Louis

2008/5/9 Louis Préfontaine <[EMAIL PROTECTED]>:

> 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
>>> > >>
>>> > >>
>>> > >>
>>> > >
>>> > >
>>> >
>>>
>>>  
>>>
>>
>>
>

Reply via email to