[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

When using performance metrics as a PositionScore, we should use the
individual equity, not the portfolio equity (~~~Equity). So the code
could be something like the code below. Disclaimer: I'm at my day job
and cannot test this code right now.

MACDx   = MACD(12, 26);
MACDsig = Signal(12, 26, 9);
 
Buy  = Cross(MACDx, MACDsig);
Sell = Cross(MACDsig, MACDx);

eq = Equity();

metricUI  = getUI(eq, 250);
metricMDD = getMDD(eq, 250);
PositionScore = 100 / (metricUI * metricMDD);
SetOption("MaxOpenPositions", 5 );
PositionSize = -100/5;

 
// compute the ulcer index over the last Length bars
function getUI(CurEq, Length)
{
       MaxEq  = HHV(CurEq, Length);
       CurDD  = IIf(CurEq < MaxEq, 100 * (MaxEq - CurEq) / MaxEq, 0);
       SqrDD  = CurDD ^ 2;
       SumDD  = Sum(SqrDD, Length);
       UI     = sqrt(SumDD / Length);
       return UI;
}

// compute the maximum drawdown over the last Length bars
function getMDD(CurEq, Length)
{
       MaxEq  = HHV(CurEq, Length);
       CurDD  = IIf(CurEq < MaxEq, 100 * (MaxEq - CurEq) / MaxEq, 0);
       MaxDD  = HHV(CurDD, Length);
       return MaxDD;
}


--- In amibroker@xxxxxxxxxxxxxxx, Fred Tonetti <ftonetti@xxx> wrote:
>
> . and if you are wanting the performance metrics as arrays over some
shorter
> length then the backtest period and you aren't wanting to do it in
the CBI
> the while you're waiting for it to be available as a built in AFL
function
> you can fill in the rest of this . Both TJ in an earlier post and
the DOC
> have the formulas for the rest of the performance metrics .
> 
> MACDx   = MACD(12, 26);
> 
> MACDsig = Signal(12, 26, 9);
> 
>  
> 
> Plot (MACDx,   "MACD", colorRed);
> 
> Plot (MACDsig, "Sig",  colorWhite);
> 
>  
> 
> Buy  = Cross(MACDx, MACDsig);
> 
> Sell = Cross(MACDsig, MACDx);
> 
>  
> 
> function getMetric(Metric, Length)
> 
> {
> 
>        Metric = StrToUpper(Metric);
> 
>        BIR    = IIf(Status("BarInRange") > 0, 1, Null);
> 
>        CurEq  = Foreign("~~~EQUITY", "C", 1);
> 
>        MaxEq  = HHV(CurEq, Length);
> 
>        CurDD  = IIf(CurEq < MaxEq, 100 * (MaxEq - CurEq) / MaxEq, 0);
> 
>        MaxDD  = HHV(CurDD, Length);
> 
>        SqrDD  = CurDD ^ 2;
> 
>        SumDD  = Sum(SqrDD, Length);
> 
>        UI     = sqrt(SumDD / Length);
> 
>        if (Metric == "CDD")
> 
>               Value = CurDD;
> 
>        else if (Metric == "MDD")
> 
>               Value = MaxDD;
> 
>        else if (Metric == "UI")
> 
>               Value = UI;
> 
>        else
> 
>               Value = Null;
> 
>        return Value;
> 
> }
> 
>  
> 
> Plot(getMetric("UI", 20), "UI", colorYellow, styleLeftAxisScale);
> 
>  
> 
>  
> 
>   _____  
> 
> From: amibroker@xxxxxxxxxxxxxxx [mailto:amibroker@xxxxxxxxxxxxxxx]
On Behalf
> Of Paul Ho
> Sent: Monday, July 28, 2008 11:59 PM
> To: amibroker@xxxxxxxxxxxxxxx
> Subject: RE: [amibroker] Re: How to save Metrics in Composites for
> Individual BTs
> 
>  
> 
> Herman
> I really can't see the difficulty to achieve any of these, see my reply
> below. 
> 
> ________________________________
> 
> From: amibroker@xxxxxxxxx <mailto:amibroker%40yahoogroups.com> ps.com
> [mailto:amibroker@xxxxxxxxx <mailto:amibroker%40yahoogroups.com> ps.com]
> On Behalf Of Herman
> Sent: Tuesday, 29 July 2008 11:32 AM
> To: amibroker@xxxxxxxxx <mailto:amibroker%40yahoogroups.com> ps.com
> Subject: RE: [amibroker] Re: How to save Metrics in Composites for
> Individual BTs
> 
> 
> 
> Hello Fred,
> 
> Putting technical problems and limitations aside it is clear to me
> that having access to period-based performance metrics is critical in
> trading. 
> 
> [I don't see a lot of technical difficulty. See my previous post on
ONE way
> to do this. There probably a few other ways to do it I can think of.]
> 
> Since the Equity curve is based on system performance it makes
common sense
> that performance metrics will lead on the Equity. Most performance
metrics
> can't be extracted from the equity curve; they are lost at that
> summary-stage. For example, DrawDown is the result of advanced system
> failure; it might very well have been possible to detect the upcoming
> failure (DD) by looking at some very basic metrics. Simply looking
at the
> number of winning trades or profit/trade, might have alerted us.
Using more
> sophisticated metrics, like a period based UPI Indicator, we might
have seen
> a very clear and gradual system failure. All this is especialy true for
> faster trading systems where metrics become very smooth indicators.
> 
> To look at metrics for the entire duration of the backtest may come
> in handy during development however during real trading it is
useless. It is
> simply due to a reluctance to break with tradition (a problem for most
> traders) that we don't have period-based performance indicators
today. They
> are long overdue. Sure, they they are 'doable' in AmiBroker, but how
many
> users would be able to write such code? In my opinion not more that
1%. To
> develop systems efficiently we need basic afl tools; no one wants to
spend
> two months learning OLE only to find out that it doesn't fill the
> requirement or is to complicated for the user. Same for the CBT, who
wants
> to spend two months learning it just to test and idea that may or
may not
> work? Time is precious...we want to trade, not become professional
> programmers.
> 
> [firstly it doesn't take 2 months, probably wont even be 2 weeks.
Secondly
> it doesn't have to involve OLE as far as I can gather, though OLE is
clearly
> useful in other area that I am finding out for myself. Thirdly,
trading is a
> lifetime persue, not a five minute flash in the pan. While only
Tomasz will
> know fully, I suspect, do what you say as a "simple" function
outside CBT
> would involve storing heaps of unnecessary data, Who is then paying
for the
> penalty of that?. Inside CBT its relatively simple to create. But
you will
> still need to learn CBT. By the way, Is there any other software out
there
> that can do this sort of things. And in AB it is readily available, with
> just a few lines. What is the problem?]
> 
> 
> A few common applications for metric indicators are:
> 
> 1) When trading a number of different systems one wants to know
> early when a system starts to fail. How else can one make a timely
switch?
> Just like you may want to trade funds with a rotational system you
want to
> rotate the trading systems themselves.
> 2) It is very common for trading systems to fade in and out of
> performance. To detect when a trading system fails and to switch to
another
> system requires, again, monitoring system performance metrics. imo,
There is
> just no other way around it.
> 3) And of course we want to know when a ticker loses its character
> and stops working. Here again performance metrics might be the best
way to
> detect ticker failure. 
> 
> A function like getPerformanceMetric ( MetricName, LookBackPeriod)
> would find wide application. Most people think right away of portfolio
> trading however performance metrics should be calculated for individual
> stocks, they will lose their meaning if derived from portfolio results.
> 
> I am not saying that it is easy to design such indicators, perhaps
> it is extremely difficult. But that doesn't remove the need for them.
> 
> Just my two cents worth :-)
> Best regards,
> herman
> 
> [a lot of what you have asked for can be readily derived from the equity
> curve, without even going through CBT, while the rest is a just a
few lines
> in CBT, plus a function or two outside. Recently I helped somebody
code the
> UI for individual stocks, 5 lines of AFL, that's all. I just wonder
if this
> is a mountain, or a mole hill]
> 
> -----Original Message-----
> From: amibroker@xxxxxxxxx <mailto:amibroker%40yahoogroups.com> ps.com
> [mailto:amibroker@xxxxxxxxx <mailto:amibroker%40yahoogroups.com>
ps.com]On
> Behalf Of Fred Tonetti
> Sent: July 28, 2008 12:44 PM
> To: amibroker@xxxxxxxxx <mailto:amibroker%40yahoogroups.com> ps.com
> Subject: [SPAM]RE: [amibroker] Re: How to save Metrics in
> Composites for Individual BTs
> 
> 
> 
> Al,
> 
> What you are looking for in AB is I believe
> a little more difficult then or at least as time consuming as you
think it
> is .
> 
> Share ? . Code ?
> 
> LOL . I thought I did in that post . 
> 
> Ok . Kidding aside . Assuming that 
> 
> - AB is running 
> 
> - AA has the AFL you want to run ( This doesn't
> mean the formula editor as the FE and AA aren't coupled )
> 
> - AA Settings for ApplyTo / Range etc are as you
> want then
> 
> This VBS code would run a BackTest and
> export the Trade List to a File
> 
> Dim oAB
> 
> Dim oAA
> 
> Set oAB = CreateObject("Broker.Application")
> 
> Set oAA = oAB.Analysis
> 
> oAA.Backtest(0)
> 
> oAA.Export("Dummy.csv") 
> 
> The code above should be saved in a .vbs
> filetype ( name of your choosing ) and then simply double clicking
it will
> produce the file.
> 
> This could easily be changed to running an
> optimize which will produce all the performance metrics in the AA
results
> which could then be exported by changing . 
> 
> oAA.Backtest(0)
> 
> to .
> 
> oAA.Optimize(0)
> 
> Ideally the optimize above would be a one
> step optimize if you will just to produce the performance metrics
related to
> the backtest .
> 
> With a little more work i.e. a loop to set
> the beginning and ending dates one could get performance metrics
externally
> for whatever lookback length one wanted one after the other .
> 
> 
> ________________________________
> 
> From: amibroker@xxxxxxxxx <mailto:amibroker%40yahoogroups.com> ps.com
> [mailto:amibroker@xxxxxxxxx <mailto:amibroker%40yahoogroups.com>
ps.com] On
> Behalf Of Al Venosa`
> Sent: Monday, July 28, 2008 12:17 PM
> To: amibroker@xxxxxxxxx <mailto:amibroker%40yahoogroups.com> ps.com
> Subject: Re: [amibroker] Re: How to save Metrics in
> Composites for Individual BTs
> 
> Dear TJ and Fred: 
> 
> Thank you for these suggestions. However, what I am asking
> for is a simple AFL function in which we can specify the lookback
period for
> the metric in question, nothing more. To observe the difference, you can
> simply substitute an MA() for the required function, as shown below.
When
> you view the graph, you will see, I think, what I am talking about. 
> 
> Plot(C,"",1,128); 
> Plot(MA(C,50),"FixedLookBack",colorRed,1); // the requested
> solution 
> Plot(MA(C,BarIndex()),"ExistingNow",colorBlue,1); // TJ's
> and Fred's solution. 
> 
> I believe what TJ has suggested, if I am interpreting it
> correctly, is that I would be running a backtest for each bar in a loop,
> which would be complex and very slow. Maybe I'm asking the same
thing. If
> so, tell me, and I'll desist. An alternative solution is to use the Walk
> Forward Individual Backtester to implement a system that uses
performance
> metrics as position score. 
> 
> BTW, Fred, are you willing to share the complete working
> code for your 2-line export?
> 
> Thank you. 
> 
> Al V.
> 
> On 7/28/08, Tomasz Janeczko
> <groups@xxxxxxxxxx <mailto:groups%40amibroker.com> com
> <mailto:groups@xxxxxxxxx. <mailto:groups%40amibroker.com> com> > wrote:
> 
> Hello,
> 
> It is doable with custom backtester and not
> so complicated.
> 
> As described in detail here:
> 
> http://www.amibroke
<http://www.amibroker.com/guide/a_custommetrics.html>
> r.com/guide/a_custommetrics.html
> <http://www.amibroke
<http://www.amibroker.com/guide/a_custommetrics.html>
> r.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` <mailto:avcinci@xxxxx. <mailto:avcinci%40gmail.com>
com> 
> 
> To: amibroker@xxxxxxxxx <mailto:amibroker%40yahoogroups.com> ps.com
> <mailto:amibroker@xxxxxxxxx <mailto:amibroker%40yahoogroups.com>
ps.com> 
> 
> 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
> <ftonetti@xxxxxxxxxx <mailto:ftonetti%40optonline.net> net
> <mailto:ftonetti@xxxxxxxxx. <mailto:ftonetti%40optonline.net> net> >
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:
> amibroker@xxxxxxxxx <mailto:amibroker%40yahoogroups.com> ps.com
> <mailto:amibroker@xxxxxxxxx <mailto:amibroker%40yahoogroups.com> ps.com>
> [mailto:amibroker@xxxxxxxxx <mailto:amibroker%40yahoogroups.com> ps.com
> <mailto:amibroker@xxxxxxxxx <mailto:amibroker%40yahoogroups.com>
ps.com> ]
> On
> Behalf Of Al Venosa
> Sent: Sunday, July 27, 2008 11:29 AM
> To: amibroker@xxxxxxxxx <mailto:amibroker%40yahoogroups.com> ps.com
> <mailto:amibroker@xxxxxxxxx <mailto:amibroker%40yahoogroups.com>
ps.com> 
> 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 amibroker@xxxxxxxxx <mailto:amibroker%40yahoogroups.com> ps.com
> <mailto:amibroker%40yahoogroups.com> , "Herman" <psytek@> 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@xxxxxxxxx <mailto:amibroker%40yahoogroups.com> ps.com
> <mailto:amibroker%40yahoogroups.com> [mailto:amibroker@xxxxxxxxx
> <mailto:amibroker%40yahoogroups.com> ps.com
> <mailto:amibroker%40yahoogroups.com> ]On 
> Behalf
> > Of Tomasz Janeczko
> > Sent: July 25, 2008 5:49 AM
> > To: amibroker@xxxxxxxxx <mailto:amibroker%40yahoogroups.com> ps.com
> <mailto:amibroker%40yahoogroups.com> 
> > 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@xxxxxxxxx <mailto:amibroker%40yahoogroups.com> ps.com
> <mailto:amibroker%40yahoogroups.com> 
> > 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@xxxxxxxxx <mailto:amibroker%40yahoogroups.com> ps.com
> <mailto:amibroker%40yahoogroups.com> [mailto:amibroker@xxxxxxxxx
> <mailto:amibroker%40yahoogroups.com> ps.com
> <mailto:amibroker%40yahoogroups.com> ]On 
> Behalf
> > Of Tomasz Janeczko
> > Sent: July 25, 2008 4:08 AM
> > To: amibroker@xxxxxxxxx <mailto:amibroker%40yahoogroups.com> ps.com
> <mailto:amibroker%40yahoogroups.com> 
> > 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@xxxxxxxxx <mailto:amibroker%40yahoogroups.com> ps.com
> <mailto:amibroker%40yahoogroups.com> 
> > 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@xxxxxxxxx <mailto:amibroker%40yahoogroups.com> ps.com
> <mailto:amibroker%40yahoogroups.com> [mailto:amibroker@xxxxxxxxx
> <mailto:amibroker%40yahoogroups.com> ps.com
> <mailto:amibroker%40yahoogroups.com> ] 
> On Behalf
> > Of Herman
> > Sent: Friday, 25 July 2008 9:31 AM
> > To: amibroker@xxxxxxxxx <mailto:amibroker%40yahoogroups.com> ps.com
> <mailto:amibroker%40yahoogroups.com> 
> > 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@xxxxxxxxx <mailto:amibroker%40yahoogroups.com> ps.com
> <mailto:amibroker%40yahoogroups.com> [mailto:amibroker@xxxxxxxxx
> <mailto:amibroker%40yahoogroups.com> ps.com
> <mailto:amibroker%40yahoogroups.com> ]On 
> Behalf
> > Of Tomasz Janeczko
> > Sent: July 24, 2008 3:00 PM
> > To: amibroker@xxxxxxxxx <mailto:amibroker%40yahoogroups.com> ps.com
> <mailto:amibroker%40yahoogroups.com> 
> > 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 <http://www.spamfigh <http://www.spamfighter.com/len>
> ter.com/len>
> for free now!
> 
> 
> 
> 
> 
> 
> ________________________________
> 
> 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 <http://www.spamfigh <http://www.spamfighter.com/len>
> ter.com/len> for free
> now!
> 
> 
> 
> 
> 
>  
> 
> 
>   _____  
> 
> I am using the free version of SPAMfighter for private users.
> It has removed 513 spam emails to date.
> Paying users do not have this message in their emails.
> Try SPAMfighter <http://www.spamfighter.com/len>  for free now!
>



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

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/