[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

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@xxxxxxxxxxxxxxx, Fred Tonetti <ftonetti@xxx> 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@xxxxxxxxxxxxxxx [mailto:amibroker@xxxxxxxxxxxxxxx] 
On Behalf
> Of brian_z111
> Sent: Tuesday, July 29, 2008 9:22 AM
> To: amibroker@xxxxxxxxxxxxxxx
> 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@xxxxxxxxx <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@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@ <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@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@ <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@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 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/