[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[amibroker] Re: How to save Metrics in Composites for Individual BTs



PureBytes Links

Trading Reference Links

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 amibroker@xxxxxxxxxxxxxxx, "Herman" <psytek@xxx> 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: amibroker@xxxxxxxxxxxxxxx [mailto:amibroker@xxxxxxxxxxxxxxx]On 
Behalf
> Of Tomasz Janeczko
> Sent: July 25, 2008 5:49 AM
> To: amibroker@xxxxxxxxxxxxxxx
> 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: amibroker@xxxxxxxxxxxxxxx
> 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: amibroker@xxxxxxxxxxxxxxx [mailto:amibroker@xxxxxxxxxxxxxxx]On 
Behalf
> Of Tomasz Janeczko
> Sent: July 25, 2008 4:08 AM
> To: amibroker@xxxxxxxxxxxxxxx
> 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: amibroker@xxxxxxxxxxxxxxx
> 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: amibroker@xxxxxxxxxxxxxxx [mailto:amibroker@xxxxxxxxxxxxxxx] 
On Behalf
> Of Herman
> Sent: Friday, 25 July 2008 9:31 AM
> To: amibroker@xxxxxxxxxxxxxxx
> 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: amibroker@xxxxxxxxxxxxxxx [mailto:amibroker@xxxxxxxxxxxxxxx]On 
Behalf
> Of Tomasz Janeczko
> Sent: July 24, 2008 3:00 PM
> To: amibroker@xxxxxxxxxxxxxxx
> 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 );
>



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

Please note that this group is for discussion between users only.

To get support from AmiBroker please send an e-mail directly to 
SUPPORT {at} amibroker.com

For NEW RELEASE ANNOUNCEMENTS and other news always check DEVLOG:
http://www.amibroker.com/devlog/

For other support material please check also:
http://www.amibroker.com/support.html
Yahoo! Groups Links

<*> To visit your group on the web, go to:
    http://groups.yahoo.com/group/amibroker/

<*> Your email settings:
    Individual Email | Traditional

<*> To change settings online go to:
    http://groups.yahoo.com/group/amibroker/join
    (Yahoo! ID required)

<*> To change settings via email:
    mailto:amibroker-digest@xxxxxxxxxxxxxxx 
    mailto:amibroker-fullfeatured@xxxxxxxxxxxxxxx

<*> To unsubscribe from this group, send an email to:
    amibroker-unsubscribe@xxxxxxxxxxxxxxx

<*> Your use of Yahoo! Groups is subject to:
    http://docs.yahoo.com/info/terms/