Yes, I can't help wondering sometimes what backtesting
wheel Tomasz
has invented, just out of curiousity, but I think the neurons would
protest a great deal if I took that task too seriously.
I doubt if I will take it any further - not at the moment BUT
- IMO a lot of the metrics don't have any value so for my own use I
wouldn't need to bother with them so I am only considering the
metrics that are more elemental.
- I assume that a lot of the difficulty with backtesting logic would
come from scaling in/out, multiple signals, open trade equity and
equity allocation.
- I am assuming Herman doesn't need to worry about open trade values.
- I doubt whether portfolio allocation would come into what he is
trying to do either i.e. use metrics as progressive indicators.
In short I am talking about a stripped down pseudo backtester rather
than a backtester per se (as you say I will go use AB's backtester
when I need one).
If you strip away all of the BS from backtesting/metrics it is a
pretty simple proposition in the end.
brian_z
--- In amibroker@xxxxxxxxxps.com,
Fred Tonetti <ftonetti@xx.>
wrote:
>
> Be sure to clue the rest of us in when you come up with a way to
generate
> performance metrics without the help of a "backtester" whether
that
be AB's
> or one that you write yourself the latter of which seems to be what
you've
> attempted . I've been down this road in writing the precursor /
pilot of
> portfolio trading capabilities in AB prior to those features /
functions
> being available in AB. IMHO this is not someplace you even want to
consider
> going. There's no reason to ignore the fact that the backtester
exists .
> That takes the size of the problem from something that fits in a
breadbox to
> something that can't be housed in the typical aircraft carrier .
Better to
> use the tools that exist and build on them .
>
>
>
> _____
>
> From: amibroker@xxxxxxxxxps.com
[mailto:amibroker@xxxxxxxxxps.com]
On Behalf
> Of brian_z111
> Sent: Tuesday, July 29, 2008 9:22 AM
> To: amibroker@xxxxxxxxxps.com
> Subject: [amibroker] Re: How to save Metrics in Composites for
Individual
> BTs
>
>
>
> Anyone?
>
> Notwithstanding that Tomasz could do this stuff for us (if and when
> he comes back from his lovely holiday) it is fun to look at the
> concepts involved and figure how we can do it ourselves, with what
we
> have already.
>
> I haven't read the various code solutions closely but I have been
> following along at a distance (all the way back to Fred's earlier
> PerformanceMetric code).
> Although I havent had a need for it I assumed that this stuff could
> be done with array programming OR maybe a loop or two (on the fly -
> no need to run the backtester).
>
> My proposition is that all metrics can be derived from the trade
> series (as %) and the time in trade i.e. the core metrics.
>
> So if the trade series % is stored in an array then the array can
be
> used to produce the eq curve OR the metrics, on the fly, as
required.
>
> (I can't remember if this is what Fred did before - it was pretty
> close to it - anyway - I think this is a slightly different concept
> applied to the same problem).
>
> Simplified Example (in pidgin pseudocode):
>
> - this basic example only gives the closed trade metrics
>
> - for ease of discussion I am mentally referencing EOD data bar by
bar
>
> - two symbols in a watchlist AAA, BBB
>
> buy = whatever;
> sell = whatever;
>
> sellvalue = etc;//code required
>
> trade% = sellvalue/buyvalue;//needs to be expressed as growthfactor
> i.e. 3% win == 1.03, 3%loss == 0.97 etc
>
> arrayAAA = if(no sell,1,trade%); //runs on symbol AAA
> arrayBBB = if(no sell,1,trade%);//run on symbol BBB
>
> We would end up with two arrays:
>
> arrayAAA == 1,1,1.10,1,1,1 etc//exited trade with 10% win on bar 3
> arrayAAA == 1,1,1.07,1,1,1 etc//exited trade with 7% win on bar 3
>
> the above arrays can easily be used to produce other arrays with
W/L
> ratios etc, including for any lookback (as per Tomasz's example b).
>
> To produce an eq curve (individual OR portfolio):
>
> combined trade% is the product of arrayAAA and arrayBBB
>
> arrayAAA == 1,1,1.10,1,1,1
> arrayAAA == 1,1,1.07,1,1,1
> combinedtrade%== 1,1,1.177,1,1,1//bar by bar product of above
two
> arrays
>
> EquityCurveArray = Initial Equity * combinedtrade%;
>
> example:
>
> InitialEquity = 100;
>
> 100 * 1 *1 * 1.177 * 1 * 1 * 1 ==
> EquityCurveArray == 100,100, 117.70,117.70,117.70,117.70 etc
>
> which is the same even if the two trades exit on separate bars.
>
> 100 *1.10 * 1.07 = 117.70;
>
> Note that the value of 1 is used to denote 'no trade' so it doesn't
> affect equity.
>
> All of the metrics required, on the fly, can be calculated using
> lookback periods for the combinedtrade% array (it is like an array
> that is the carrier of the trade series) AND/OR calculating equity
on
> the fly AND the code already posted OR some new relatively simple
> array code.
>
> The only thing we can't do is get a standard dev of the trade
series
> because we can't write them into an array without all of the no
> trades (like a static variable except a static array).
>
> If StDev of the trade series were could we calcuate every single
> metric directly without the need for the eq curve?
>
> I think so but I haven't checked to be certain about it (certainly
> every worthwhile one because a lot of them are old rubbish).
>
> Time in trade is only needed if we want to work out percentage
gains
> relative to time?
>
> It doesn't allow for the instances where a new buy signal is
> generated on an individual equity when we are already in a trade,
OR
> scaling in or out BUT it is only at the basic conceptual stage -
> perhaps it lends itself to more sophisticated calcs if required.
>
> BTW
>
> I don't think AB or Tomasz is dumb - only that the trading
community
> in general, IMO, is bizarrely obsessive about eq curve
> analysis/metrics.
>
> brian_z
>
> --- In amibroker@xxxxxxxxx <mailto:amibroker%40yahoogroups.com>
ps.com,
> "Tomasz Janeczko" <groups@>
> wrote:
> >
> > Hello,
> >
> > Yes, there are generally 3 different metrics "areas" in
terms of
> computational complexity:
> >
> > a) metrics derived directly from Equity (CAR, Drawdowns, UPI,
> Sharpe, Std error, etc)
> > - they can be easily calculated directly from Equity data
> (~~~EQUITY) as shown in the
> > code that Fred posted below.
> > There is no computational difference between calculating them on
> portfolio or individual
> > symbol basis.
> >
> > b) metrics NOT derived from equity (number of winners,
winner/loser
> ratio, expectancy, etc)
> > - these metrics needs actual backtest to be performed to get the
> TRADE LIST and
> > perform calculations based on trade list.
> > Performing backtest on SINGLE security is done by Equity()
function
> and
> > single-security metric "indicators" are possible with the
same
> > computational complexity as Equity() function has.
With "possible"
> I mean that I could implement that
> > if there is enough demand.
> >
> > c) same as b) BUT for Portfolio-level backtest. Again you need a
> trade list to calculate them.
> > No matter which approach is used, full-blown portfolio backtest
for
> specified "lookback period"
> > is required. It is too complex to be done on-the-fly in real
time.
> Hence proposed solution of using
> > CBI to generate stats and then refer to them using Foreign()
> function.
> >
> >
> > Best regards,
> > Tomasz Janeczko
> > amibroker.com
> > ----- Original Message -----
> > From: Fred Tonetti
> > To: amibroker@xxxxxxxxx <mailto:amibroker%40yahoogroups.com>
ps.com
> > Sent: Tuesday, July 29, 2008 6:16 AM
> > Subject: RE: [amibroker] Re: How to save Metrics in Composites
> for Individual BTs
> >
> >
> > . 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@xxxxxxxxx <mailto:amibroker%40yahoogroups.com>
ps.com
> [mailto:amibroker@yahoogrou <mailto:amibroker%40yahoogroups.com>
ps.com] On
> Behalf Of Paul Ho
> > Sent: Monday, July 28, 2008 11:59 PM
> > To: amibroker@xxxxxxxxx <mailto:amibroker%40yahoogroups.com>
ps.com
> > 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@yahoogrou <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@yahoogrou <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@yahoogrou <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@ <mailto:groups@> > 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@>
> >
> > To: amibroker@xxxxxxxxx <mailto:amibroker%40yahoogroups.com>
ps.com
> > <mailto:amibroker@yahoogrou <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@ <mailto:ftonetti@> > 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@yahoogrou <mailto:amibroker%40yahoogroups.com>
ps.com>
> > [mailto:amibroker@yahoogrou <mailto:amibroker%40yahoogroups.com>
ps.com
> <mailto:amibroker@yahoogrou <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@yahoogrou <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@yahoogrou <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@yahoogrou <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@yahoogrou <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@yahoogrou <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.