Hello,

It is doable with custom backtester and not so complicated.
 
As described in detail here:
http://www.amibroker.com/guide/a_custommetrics.html

You have direct access to ANY backtest performance metric using 
GetPerformanceStats() function of backtester object.

There is no obstacle in calling it every bar and storing the result in the 
array if you wish.

Let say you want UPI as array.


// your trading system here 
Buy = ...
Sell = ...

SetCustomBacktestProc(""); 

/* Now custom-backtest procedure follows */ 

if( Status("action") == actionPortfolio ) 
{ 
    UPI = 0; 
    bo = GetBacktesterObject(); 

    bo.PreProcess(); 

    for( bar = 0; bar < BarCount; bar++ ) 
    { 
      bo.ProcessTradeSignals( bar ); 

      st = bo.GetPerformanceStats(0); // get stats for all trades 
   
      UPI[ bar ] = st.GetValue("UlcerPerformanceIndex"); 
   } 
   
    bo.PostProcess(); 

    AddToComposite( UPI, "~~~UPI", "X", atcFlagDefaults | 
atcFlagEnableInPortfolio ); 
} 



Now ~~~UPI ticker will contain bar-by-bar values of Ulcer Performance Index.

As for "specifying lookback period" it is doable by creating Xth composites 
(and X backtests) each containing values for specified
lookback period.

As for Equity() - this is SINGLE security (OLD) backtest. It has no comparision 
to portfolio level backtest that
must go through entire portfolio. The complexity of portfolio backtest is Nth 
times the single security backtest
where N is number of symbols in portfolio. Therefore it is not feasible to be 
calculated on-the-fly in real time like
single-security backtest (i.e. Equity()).


Best regards,
Tomasz Janeczko
amibroker.com
  ----- Original Message ----- 
  From: Al Venosa` 
  To: [email protected] 
  Sent: Monday, July 28, 2008 1:02 AM
  Subject: Re: [amibroker] Re: How to save Metrics in Composites for Individual 
BTs


  Thanks, Fred, but I haven't a clue how to do OLE/Automation, and I wonder how 
many AB users out there really do. That's why I was calling for a simple, 
non-painful, easy-to-use AFL function that would do this for the 
non-techie/programmer, and if it existed, AB would be the only trading software 
out there that would be able to do this. I bet It would be a profit bonanza for 
TJ. 

  Al V.




  On 7/27/08, Fred Tonetti <[EMAIL PROTECTED]> wrote:

    I agree that this would be nice to have as directly as you have laid out …



    However, while somewhat painful, one can with Equity() and a list of trades 
calculate all the performance metrics as of any given bar or if you prefer as 
arrays of values …



    This could be fully automated with OLE/Automation




----------------------------------------------------------------------------

    From: [email protected] [mailto:[EMAIL PROTECTED] On Behalf Of Al 
Venosa
    Sent: Sunday, July 27, 2008 11:29 AM
    To: [email protected]
    Subject: [amibroker] Re: How to save Metrics in Composites for Individual 
BTs



    Having read this interesting thread begun last week, I'd like to 
    continue it with a follow-on question/comment that I think, if TJ were 
    to implement it, would make Amibroker infinitely more useful to the 
    actual trader. It would be awesome if we could have simple-to-use AFL 
    functions that read AFL backtest metrics directly. Adding a lookback 
    period would make them immensely more useful as indicators. What I am 
    suggesting is to have a function like:

    getEquityMetric ( MetricName,LookBackPeriod); 

    The example code provided by TJ gives us only the cumulative value of 
    each metric. What I'm suggesting is to go beyond this one cumulative 
    output number and create metric arrays with a specified lookback 
    period. Then, when we plot these metrics in an indicator, we can 
    visually look for correlations with price charts. For example, one 
    could plot winning trades/month and see if they change with trend. Or 
    one could look at AverageWin or UPI and see how that changes with 
    trend. These are all correlations that are best analyzed visually (in 
    an Indicator) but can ONLY be analyzed if we have access to these 
    metrics for variable lookback periods.

    Another use for these functions would be as a positionscore in a 
    trading system. What better way is there to select tickers/systems to 
    trade than the actual performance of those tickers or systems? The 
    procedure may require a preliminary scan/exploration to create metric-
    composites that can be read by the trading system and used as a 
    positionscore. Critical here is that the metric can be read for any 
    specified lookback period, i.e. 10 bars, 100 bars, etc. So the 
    function must have a period argument, which is the most important 
    factor. We already have equity(). Why not expand this with the other 
    backtest metrics? 

    Undoubtedly, all this can be implemented using the custom backtester, 
    but this solution probably excludes >95% of all AmiBroker users. 

    TJ, would this be possible to implement?

    Al Venosa 

    --- In [email protected], "Herman" <[EMAIL PROTECTED]> wrote:
    >
    > Thank you TJ :-) you saved the day once more !
    > 
    > Great stuff.
    > 
    > If someone is wondering why I wanted this program... You can design 
    trading
    > systems and use performance metric arrays as powerful Indicators. It 
    is
    > somewhat similar to trading the equity curve. Price arrays can have
    > qualities that can make your trading systems fail but that are 
    undetectable
    > with traditional indicators.
    > 
    > However, you can design small trading systems that target specific 
    price
    > characteristics, like patterns, trends, volatility, cycles, etc. 
    Using the
    > code below gives you statistical information about these 
    characteristics in
    > a form that can be plotted, and be used in other trading systems.
    > 
    > Thanks everyone for your help!
    > have a great trading day!
    > herman
    > 
    > // Demo trading system
    > Short = Cover = 0;
    > Buy = Cross( MACD(), Signal() );
    > Sell = Cross( Signal(), MACD() );
    > // Using the CBT to retrieve/save metrics
    > if( Status("action") == actionBacktest ) StaticVarSetText( "Symbol",
    > Name() );
    > SetOption( "UseCustomBacktestProc", True );
    > if ( Status( "action" ) == actionPortfolio )
    > {
    > bo = GetBacktesterObject();
    > bo.PreProcess();
    > MyHistStat1 = Null;
    > for ( bar = 0; bar < BarCount; bar++ )
    > {
    > bo.ProcessTradeSignals( bar );
    > stats = bo.GetPerformanceStats( 0 );
    > MyHistStat1[ bar ] = stats.GetValue( "UlcerIndex" ); // any metric 
    can be
    > retrieved
    > }
    > bo.PostProcess();
    > AddToComposite( MyHistStat1, "~~~UI_" + StaticVarGetText
    ( "Symbol" ), "X",
    > atcFlagEnableInPortfolio | atcFlagDefaults );
    > }
    > PlotForeign( "~~~UI_"+Name(), "UlcerIndex Historical", colorRed,
    > styleLine );
    > 
    > -----Original Message-----
    > From: [email protected] [mailto:[EMAIL PROTECTED] 
    Behalf
    > Of Tomasz Janeczko
    > Sent: July 25, 2008 5:49 AM
    > To: [email protected]
    > Subject: [SPAM]Re: [SPAM]Re: [amibroker] How to save Metrics in 
    Composites
    > for Individual BTs
    > 
    > 
    > Herman,
    > 
    > You forgot the CORRECTION I mentioned:
    > 
    > StaticVarSetText( "Symbol", Name() ); must NOT be called 
    unconditionally,
    > but THIS way:
    > 
    > =====================================================================
    > if( Status("action") == actionBacktest ) StaticVarSetText( "Symbol",
    > Name() );
    > ==============================================================
    > 
    > Best regards,
    > Tomasz Janeczko
    > amibroker.com
    > ----- Original Message -----
    > From: Herman
    > To: [email protected]
    > Sent: Friday, July 25, 2008 11:36 AM
    > Subject: RE: [SPAM]Re: [amibroker] How to save Metrics in Composites 
    for
    > Individual BTs
    > 
    > 
    > Still NO GO.
    > I am loading the code in the AA, select a watchlist, run an 
    Individual
    > backtest, and Refresh the WorkSpace. I get the BT report with 
    individual
    > results. I get two Composites in my Composites Group. One is named
    > ~~~EQUITY, the other ~~~UI_~~~EQUITY. The first makes sense but the 
    second
    > indicates that the StaticVar does not return the ticker name.
    > 
    > >> It appears that in this code the function Name() returns 
    "~~~EQUITY" and
    > does not return the name for the ticker being tested, it behaves as 
    if the
    > ~~~EQUITY composite is the ticker being tested.
    > Can anyone confirm this?
    > 
    > Thanks again!
    > Herman
    > 
    > // Demo trading system
    > Short = Cover = 0;
    > Buy = Cross( MACD(), Signal() );
    > Sell = Cross( Signal(), MACD() );
    > // Using the CBT to retrieve/save metrics
    > StaticVarSetText( "Symbol", Name() );
    > SetOption( "UseCustomBacktestProc", True );
    > if ( Status( "action" ) == actionPortfolio )
    > {
    > bo = GetBacktesterObject();
    > bo.PreProcess();
    > MyHistStat1 = Null;
    > for ( bar = 0; bar < BarCount; bar++ )
    > {
    > bo.ProcessTradeSignals( bar );
    > stats = bo.GetPerformanceStats( 0 );
    > MyHistStat1[ bar ] = stats.GetValue( "UlcerIndex" ); // any metric 
    can be
    > retrieved
    > }
    > bo.PostProcess();
    > AddToComposite( MyHistStat1, "~~~UI_" + StaticVarGetText
    ( "Symbol" ), "X",
    > atcFlagEnableInPortfolio | atcFlagDefaults );
    > }
    > PlotForeign( "~~~UI_"+Name(), "UlcerIndex Historical", colorRed,
    > styleLine );
    > 
    > 
    > 
    > 
    > -----Original Message-----
    > From: [email protected] [mailto:[EMAIL PROTECTED] 
    Behalf
    > Of Tomasz Janeczko
    > Sent: July 25, 2008 4:08 AM
    > To: [email protected]
    > Subject: [SPAM]Re: [amibroker] How to save Metrics in Composites for
    > Individual BTs
    > 
    > 
    > It will work OK.
    > Individual backtest *is* portfolio backtest but just portfolio 
    consisting of
    > one symbol at a time.
    > 
    > Note that one should select "Individual Backtest" (not "OLD" 
    backtest) from
    > AA->Backtest drop down.
    > 
    > One correction though
    > StaticVarSetText( "Symbol", Name() );
    > 
    > should be called only when NOT in portfolio mode
    > 
    > so
    > 
    > if( Status("action") == actionBacktest ) StaticVarSetText( "Symbol",
    > Name() );
    > 
    > // Demo trading system
    > Short = Cover = 0;
    > Buy = Cross( MACD(), Signal() );
    > Sell = Cross( Signal(), MACD() );
    > 
    > // Using the CBT to retrieve/save metrics
    > SetOption( "UseCustomBacktestProc", True );
    > if ( Status( "action" ) == actionPortfolio )
    > {
    > bo = GetBacktesterObject();
    > bo.PreProcess();
    > MyHistStat1 = Null;
    > for ( bar = 0; bar < BarCount; bar++ )
    > {
    > bo.ProcessTradeSignals( bar );
    > stats = bo.GetPerformanceStats( 0 );
    > MyHistStat1[ bar ] = stats.GetValue( "UlcerIndex" ); // any metric 
    can be
    > retrieved
    > }
    > bo.PostProcess();
    > AddToComposite( MyHistStat1, "~~~UI_" + StaticVarGetText( "Symbol" ) 
    +
    > "_HISTORICAL", "X", atcFlagEnableInPortfolio | atcFlagDefaults );
    > }
    > 
    > ----- Original Message -----
    > From: Paul Ho
    > To: [email protected]
    > Sent: Friday, July 25, 2008 4:45 AM
    > Subject: RE: [amibroker] How to save Metrics in Composites for 
    Individual
    > BTs
    > 
    > 
    > First of all. You use Status{"action") == actionPortfolio, 
    individual
    > backtest wont go through there.
    > 
    > 
    > 
    > From: [email protected] [mailto:[EMAIL PROTECTED] 
    On Behalf
    > Of Herman
    > Sent: Friday, 25 July 2008 9:31 AM
    > To: [email protected]
    > Subject: Re: [amibroker] How to save Metrics in Composites for 
    Individual
    > BTs
    > 
    > 
    > Thank you Tomasz, but this code still does not work. I changed the 
    StaticVar
    > to the Text type.
    > 
    > Can you help some more ... ? or does anyone else see the problem?
    > 
    > TIA,
    > Herman
    > 
    > StaticVarSetText( "Symbol", Name() );
    > // Demo trading system
    > Short = Cover = 0;
    > Buy = Cross( MACD(), Signal() );
    > Sell = Cross( Signal(), MACD() );
    > 
    > // Using the CBT to retrieve/save metrics
    > SetOption( "UseCustomBacktestProc", True );
    > if ( Status( "action" ) == actionPortfolio )
    > {
    > bo = GetBacktesterObject();
    > bo.PreProcess();
    > MyHistStat1 = Null;
    > for ( bar = 0; bar < BarCount; bar++ )
    > {
    > bo.ProcessTradeSignals( bar );
    > stats = bo.GetPerformanceStats( 0 );
    > MyHistStat1[ bar ] = stats.GetValue( "UlcerIndex" ); // any metric 
    can be
    > retrieved
    > }
    > bo.PostProcess();
    > AddToComposite( MyHistStat1, "~~~UI_" + StaticVarGetText( "Symbol" ) 
    +
    > "_HISTORICAL", "X", atcFlagEnableInPortfolio | atcFlagDefaults );
    > }
    > PlotForeign( "~~~UI_HISTORICAL", "UlcerIndex Historical", colorRed,
    > styleLine );
    > 
    > -----Original Message-----
    > From: [email protected] [mailto:[EMAIL PROTECTED] 
    Behalf
    > Of Tomasz Janeczko
    > Sent: July 24, 2008 3:00 PM
    > To: [email protected]
    > Subject: [SPAM]Re: [amibroker] How to save Metrics in Composites for
    > Individual BTs
    > 
    > 
    > The same code. The only distinction is that you need to run 
    INDIVIDUAL
    > backtest
    > and use Static variable to save name
    > 
    > StaticVarSet Text ("Symbol", Name() );
    > // Demo trading system
    > Short = Cover = 0;
    > Buy=Cross( MACD(), Signal() );
    > Sell=Cross( Signal(), MACD() );
    > 
    > // Using the CBT to retrieve/save metrics
    > SetOption("UseCustomBacktestProc", True );
    > if( Status("action") == actionPortfolio )
    > {
    > bo = GetBacktesterObject();
    > bo.PreProcess();
    > MyHistStat1 = Null;
    > 
    > for(bar=0; bar < BarCount; bar++)
    > {
    > bo.ProcessTradeSignals( bar );
    > stats = bo.GetPerformanceStats( 0 );
    > MyHistStat1[ bar ] = stats.GetValue("UlcerIndex"); // any metric 
    can be
    > retrieved
    > }
    > 
    > bo.PostProcess();
    > AddToComposite( MyHistStat1, "~~~UI_" + StaticVarGet Text 
    ("Symbol") +
    > "_HISTORICAL", "X", atcFlagEnableInPortfolio | atcFlagDefaults );
    > }
    > 
    > PlotForeign("~~~UI_HISTORICAL", "UlcerIndex Historical", colorRed,
    > styleLine );
    >




----------------------------------------------------------------------------
    I am using the free version of SPAMfighter for private users.
    It has removed 512 spam emails to date.
    Paying users do not have this message in their emails.
    Try SPAMfighter for free now!



   

Reply via email to