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

[amibroker] Re: Adding a Custom Metric to Backtest Report



PureBytes Links

Trading Reference Links

Ozzy,

A) As you've now found, negative numbers imply the percentage of 
equity to apply to each trade.

B) A number is stored in machine language as one or more bytes 
(depending on the language and operating system), where each byte is 
made up of 8 bits - binary digits - each of which can hold either a 1 
or a zero. A "flag" is just programmer-speak meaning something is 
turned on vs. turned off. So, a bit flag (perhaps more commonly known 
as a bit field) is simply a number whose individual bits are treated 
as flags.

The last argument of AddToComposite is an example of a bit field. 
Each of the valid flags (all increasing powers of 2) map to exactly 1 
bit of a binary number. Adding the values togeather gives a new 
number, but does not clobber the state the previous flags.

e.g.
atcFlagDeleteValues = 1 = 2 to the power of 0 = 0001 in binary. 
atcFlagCompositeGroup = 2 = 2 to the power of 1 = 0010 in binary
atcFlagTimeStamp = 4 = 2 to the power of 2 = 0100 in binary
etc.

Now if you wanted to set all the flags above, you would simply add 
the values 1 + 2 + 4 = 7 = 0111 in binary. Notice that the numerical 
value 7 is not of any particular significance, it is the individual 
bit settings (i.e. the flags) that are of interest.

We could just as easily have declared separate boolean variables for 
each flag. But, a boolean variable typically takes up more space in 
memory than a single bit (e.g. maybe a byte, depends on 
language/platform). So, we can stuff 8 flags into a single byte 
whereas each boolean variable might be a byte itself; 1 byte for a 
bit field vs. 8 bytes for separate booleans translates to 7 bytes of 
memory savings.

Note that when dealing with bit fields, the bitwise OR operator "|" 
is equivalent to addition. So;
1 + 2 is equivalent to
atcFlagDeleteValues + atcFlagCompositeGroup is equivalent to
atcFlagDeleteValues | atcFlagCompositeGroup

Stylistically, I prefer using the defined constants and the "|" 
operator since it is auto-documenting that you are manipulating a bit 
field and which flags it is that you are manipulating.

Given a bit field, it is easy to determine whether an individual flag 
is set or not by using the bitwise AND operation "&" against the bit 
field and the flag of interest.

e.g.
atcFlags = atcFlagDeleteValues | atcFlagCompositeGroup;
if (atcFlags & atcFlagCompositeGroup) {
  // atcFlagCompositeGroup is turned on
}

C) If you wanted to use AddToComposite, you would need to create a 
composite (whose name was derived from the symbol name) for each 
symbol upon which a Buy occured. Then in your custom backtest code, 
you could refer to the foreign composite by reconstructing the 
composite name from the trade's symbol name.

The example below illustrates all of A), B) and C) from above.

WARNING: If you run this example against a large watchlist, you will 
end up with many composite symbols (e.g. ~FlagsIBM) in your symbol 
tree! Static variables are probably the better way to go, unless you 
want to perform some kind of analysis on the composite symbols.

Mike

//--------------------------------------------------------------------
----
// SIMPLE TRADING SYSTEM BASED ON VARIOUS CONDITIONS
//--------------------------------------------------------------------
----\

Flag1 = 1; // 2 ^ 0 = 1
Flag2 = 2; // 2 ^ 1 = 2
Flag3 = 4; // 2 ^ 2 = 4
Flag4 = 8; // 2 ^ 3 = 8

FastMA       =    MA( C, 10 );
SlowMA       =    MA( C, 20 );

Condition1   = Cross( FastMA, SlowMA );
Condition2   = Cross( SlowMA, FastMA );
Condition3   = Cross( C,      SlowMA );
Condition4   = Cross( SlowMA, C     );

Buy = Sell = Short = Cover = 0;
PositionSize = -10;

for ( a = 1; a < 5; a++ )
{
    Suffix        = NumToStr( a, 1.0, 0 );
    Condition     = VarGet( "Condition" + Suffix );
    Flag          = VarGet( "Flag" + Suffix ); // Or just set to: 2 ^ 
a
    Buy           = Buy OR Condition;
    AddToComposite( IIf( Condition, Flag, 0 ), "~Flags" + Name
(), "X", atcFlagDefaults | atcFlagEnableInBacktest | 
atcFlagEnableInExplore );
}

Buy = ExRemSpan( Buy, 12 );
Sell = Ref( Buy, -12 );

//--------------------------------------------------------------------
-------
// WANT TO ADD THE CUSTOM COLUMN, "CONDITION" TO BACKTEST REPORT
//--------------------------------------------------------------------
-------

SetCustomBacktestProc( "" );

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

    bo.Backtest( 1 ); // run default backtest procedure

    // iterate through closed trades first

    for ( trade = bo.GetFirstTrade(); trade; trade = bo.GetNextTrade
() )
    {
        trade.AddCustomMetric( "Condition", LastValue( ValueWhen( 
DateTimeConvert( 0, trade.EntryDateTime ) == DateNum(), Foreign
( "~Flags" + trade.Symbol, "X", 0 ) ) ) );
    }

    bo.ListTrades();
}



--- In amibroker@xxxxxxxxxxxxxxx, "ozzyapeman" <zoopfree@xxx> wrote:
>
> Oops on (A)...I see the negative value definitions for PositionSize.
> 
> Still puzzling over (B) and (C)
> 
> 
> --- In amibroker@xxxxxxxxxxxxxxx, "ozzyapeman" <zoopfree@> wrote:
> >
> > Mike, thanks a bunch! That's amazingly helpful!
> > 
> > I will take some time to wrap my head around your code. Didn't 
realize
> > my own code was so buggy.
> > 
> > For now, just a few follow-up questions (for you, or anyone who 
is kind
> > enough to chime in):
> > 
> >   A.
> > I looked up PosistionSize in the help manual, and did not see any
> > reference to negative numbers. What does PositionSize = -10 mean?
> > 
> > B.
> > While I do want to only track the first condition that is true, 
in (2)
> > you mention that if I wanted to track ALL conditions, I should 
use a bit
> > flag.  Not sure what you mean by that.  Could you please give me 
an
> > example of that in this line, as I might also want an alternative
> > version that does track all conditions:
> > 
> > PositionScore = IIf( Condition AND NOT PositionScore, a, 
PositionScore
> > );
> > 
> > 
> > C.
> > I agree that using values that the backtester needs could prove
> > dangerous. That's why I also posted an example using 
AddToComposite. I
> > realize that code also had the same bugs you pointed out earlier. 
But
> > what about my use of AddToComposite. If I subsituted ATC instead 
of
> > position score...is the following the correct use? I can't seem to
> > recall the values from the composite symbol when I get to the 
backtester
> > portion of the code. Condition column remains blank in the report:
> > 
> > //----------------------------------------------------------------
----
> > 
> > // SIMPLE TRADING SYSTEM BASED ON VARIOUS CONDITIONS
> > //----------------------------------------------------------------
----
> > 
> > 
> > FastMA = MA( C, 10 );
> > SlowMA = MA( C, 200 );
> > 
> > Condition1 = Cross( FastMA, SlowMA );
> > Condition2 = Cross( SlowMA, FastMA );
> > Condition3 = Cross( C, SlowMA );
> > Condition4 = Cross( SlowMA, C );
> > 
> > Buy = Sell = Short = Cover =  0;
> > PositionSize = -10;
> > 
> > for ( a = 1; a < 5; a++ )
> > {
> > Condition = VarGet( "Condition" + NumToStr( a, 1.0, 0 ) );
> > 
> > Buy = Buy OR Condition;
> > 
> > // Use Composite symbol to store the Condition numbers whenever a
> > Condition is True.
> > AddToComposite( IIf(Condition, a, 0), "~Condition", "V", 
1+2+8+16);  // 
> > 1+2+8+16 enables all ATC in all AA procedures
> > }
> > 
> > Buy = ExRemSpan(Buy, 12);
> > Sell = Ref(Buy, -12);
> > 
> > //----------------------------------------------------------------
----
> > 
> > // WANT TO ADD THE CUSTOM COLUMN, "CONDITION" TO BACKTEST REPORT
> > //----------------------------------------------------------------
----
> > 
> > 
> > SetCustomBacktestProc( "" );
> > 
> > if ( Status( "action" ) == actionPortfolio )
> > {
> > bo = GetBacktesterObject();
> > 
> > bo.Backtest( 1 ); // run default backtest procedure
> > 
> > // iterate through closed trades first
> > 
> > for ( trade = bo.GetFirstTrade(); trade; trade = bo.GetNextTrade
() )
> > {
> > trade.AddCustomMetric("Condition", Foreign("~Condition", "V") );
> > 
> > bo.ListTrades();
> > }
> > }
> > 
> > 
> > 
> > --- In amibroker@xxxxxxxxxxxxxxx, "Mike" <sfclimbers@> wrote:
> > >
> > > Ozzy,
> > >
> > > Your immediate problem is that you are refering to the 
MarginDeposit
> > > *variable* in your backtester code, when what you actually want 
to do
> > > is refer to the MarginDeposit *property* of the trade object.
> > >
> > > However, using MarginDeposit or PointValue, do not seem to 
work. So I
> > > would suggest not going with option e) of Thomasz's note unless
> > > overloading the Score property (which maps to PositionScore
> > > variable). I have provided an example below taking that 
approach,
> > > though I do not encourage it since PostionScore is used by the
> > > backtester when deciding which trades to take (in other words, 
don't
> > > mess with values that the backtester needs!).
> > >
> > > A few other observations:
> > >
> > > 1) Your Buy logic appears buggy. As written, Buy will always be 
set
> > > to the value returned by Condition4 (i.e. you clobber the Buy 
value
> > > at each iteration of the loop, so the last iteration will always
> > > win). I suspect that you want an OR operation here to Buy 
whenever
> > > any of the conditions are met.
> > >
> > > 2) Same problem with your MarginDeposit calculation; It is
> > > destructive. If you want to keep the *first* condition that was 
true,
> > > do as is provided in the example. If you want to keep the *last*
> > > condition that was true, remove the "AND NOT PositionScore" 
clause.
> > > If you want to track *all* conditions, you'll need to use a bit 
flag.
> > >
> > > 3) Given that your Sell condition is a function of Buy, there 
is no
> > > need to keep recalculating it within the loop. Wait 'till Buy 
has
> > > finished being defined, then calculate Sell once after the fact.
> > >
> > > 4) If I understand your Sell intent correctly (i.e. hold for 12 
days
> > > then sell), there is a better way to do it. See ExRemSpan usage 
in
> > > example below.
> > >
> > > Mike
> > >
> > > //--------------------------------------------------------------
------
> > > ----
> > > // SIMPLE TRADING SYSTEM BASED ON VARIOUS CONDITIONS
> > > //--------------------------------------------------------------
------
> > > ----
> > >
> > > FastMA       =    MA( C, 10 );
> > > SlowMA       =    MA( C, 200 );
> > >
> > > Condition1   = Cross( FastMA, SlowMA );
> > > Condition2   = Cross( SlowMA, FastMA );
> > > Condition3   = Cross( C,      SlowMA );
> > > Condition4   = Cross( SlowMA, C     );
> > >
> > > Buy = Sell = Short = Cover = PositionScore = 0;
> > > PositionSize = -10;
> > >
> > > for ( a = 1; a < 5; a++ )
> > > {
> > >     Condition     = VarGet( "Condition" + NumToStr( a, 1.0, 
0 ) );
> > >     Buy           = Buy OR Condition;
> > >     PositionScore = IIf( Condition AND NOT PositionScore, a,
> > > PositionScore );  // Reserved variable "PositionScore" is used 
to
> > > store the
> > >     // Condition numbers whenever a Condition is True.
> > > }
> > >
> > > Buy = ExRemSpan(Buy, 12);
> > > Sell = Ref(Buy, -12);
> > >
> > > //--------------------------------------------------------------
------
> > > -------
> > > // WANT TO ADD THE CUSTOM COLUMN, "CONDITION" TO BACKTEST REPORT
> > > //--------------------------------------------------------------
------
> > > -------
> > >
> > > SetCustomBacktestProc( "" );
> > >
> > > if ( Status( "action" ) == actionPortfolio )
> > > {
> > >     bo = GetBacktesterObject();
> > >
> > >     bo.Backtest( 1 ); // run default backtest procedure
> > >
> > >     // iterate through closed trades first
> > >
> > >     for ( trade = bo.GetFirstTrade(); trade; trade = 
bo.GetNextTrade
> > > () )
> > >     {
> > >         trade.AddCustomMetric( "Condition", trade.Score  );
> > >     }
> > >
> > >     bo.ListTrades();
> > > }
> > >
> > > --- In amibroker@xxxxxxxxxxxxxxx, "ozzyapeman" zoopfree@ wrote:
> > > >
> > > > Taking the suggestion from Tomasz, I use the reserved variable
> > > > "MarginDeposit" to store my condition numbers, which I then 
feed
> > > back
> > > > into the custom backtester. In my mind, the following code 
should
> > > do the
> > > > trick. I don't get any syntax errors and I can't see any flaw 
in
> > > logic.
> > > > Yet my "Condition" column in the backtest report contains no 
values.
> > > >
> > > > In the code below, shouldn't the MarginDeposit array contain 
all
> > > values
> > > > of "a" for each Buy? If not, why not, and what would be the 
right
> > > > approach? Been pulling my hair out for a couple of days on 
this
> > > problem.
> > > > And I know it has to be something simple:
> > > >
> > > >
> > > >
> > > > //------------------------------------------------------------
------
> > > ----\
> > > > --
> > > > // SIMPLE TRADING SYSTEM BASED ON VARIOUS CONDITIONS
> > > > //------------------------------------------------------------
------
> > > ----\
> > > > --
> > > >
> > > > FastMA       =    MA( C, 10 );
> > > > SlowMA       =    MA( C, 20 );
> > > >
> > > > Condition1   = Cross(FastMA, SlowMA);
> > > > Condition2   = Cross(SlowMA, FastMA);
> > > > Condition3   = Cross(C,      SlowMA);
> > > > Condition4   = Cross(SlowMA, C     );
> > > >
> > > >
> > > > for(a = 1; a < 5; a++)
> > > > {
> > > > Condition     = VarGet( "Condition" + NumToStr( a, 1.0, 0 ) );
> > > >
> > > > Buy           = Condition;
> > > > MarginDeposit = IIf(Condition, a, 0);    // Reserved variable
> > > > "MarginDeposit" is used to store the
> > > >                                           // Condition numbers
> > > whenever a
> > > > Condition is True.
> > > >
> > > > Sell          = BarsSince(Buy) > 12;
> > > > }
> > > >
> > > >
> > > > //------------------------------------------------------------
------
> > > ----\
> > > > -----
> > > > // WANT TO ADD THE CUSTOM COLUMN, "CONDITION" TO BACKTEST 
REPORT
> > > > //------------------------------------------------------------
------
> > > ----\
> > > > -----
> > > >
> > > > SetCustomBacktestProc("");
> > > >
> > > > if( Status("action") == actionPortfolio )
> > > > {
> > > >      bo = GetBacktesterObject();
> > > >
> > > >      bo.Backtest(1); // run default backtest procedure
> > > >
> > > >     // iterate through closed trades first
> > > >     for( trade = bo.GetFirstTrade(); trade; trade = 
bo.GetNextTrade
> > > () )
> > > >     {
> > > >         trade.AddCustomMetric("Condition", MarginDeposit  );
> > > >     }
> > > >
> > > >      bo.ListTrades();
> > > > }
> > > >
> > > >
> > > >
> > > >
> > > >
> > > >
> > > >
> > > >
> > > >
> > > >
> > > > --- In amibroker@xxxxxxxxxxxxxxx, "ozzyapeman" <zoopfree@> 
wrote:
> > > > >
> > > > > Thanks Tomasz. That's helpful. I had forgotten that we can 
use
> > > one of
> > > > > the setoptions to store and recall data.
> > > > >
> > > > > One last key question (for anyone). And I feel like a klutz 
asking
> > > > > something so simple, given that I've been doing AFL now for 
six
> > > > months.
> > > > > But sometimes these simple things can be elusive.
> > > > >
> > > > > How do I flag each "a" value every time there is a Buy, 
without
> > > going
> > > > > into a Barcount loop? I find that Barcount loops always 
slow down
> > > my
> > > > > AFLs.
> > > > >
> > > > > I can't just do:
> > > > >
> > > > > if(Buy)        {then do something}
> > > > >
> > > > > since if() does not work with arrays.
> > > > >
> > > > > Is there any way around this, so that I can dynamically 
pass "a"
> > > > values
> > > > > into a setoption or static var? Or is this simply a case 
where a
> > > > > Barcount loop *must* be used?
> > > > >
> > > > >
> > > > >
> > > > >
> > > > //------------------------------------------------------------
------
> > > ----\
> > > > \
> > > > > --
> > > > > // SIMPLE TRADING SYSTEM BASED ON VARIOUS CONDITIONS
> > > > >
> > > > //------------------------------------------------------------
------
> > > ----\
> > > > \
> > > > > --
> > > > >
> > > > > FastMA       =    MA( C, 10 );
> > > > > SlowMA       =    MA( C, 20 );
> > > > >
> > > > > Condition1   = Cross(FastMA, SlowMA);
> > > > > Condition2   = Cross(SlowMA, FastMA);
> > > > > Condition3   = Cross(C,      SlowMA);
> > > > > Condition4   = Cross(SlowMA, C     );
> > > > >
> > > > > for(a = 1; a < 5; a++)
> > > > > {
> > > > > Condition    = VarGet( "Condition" + NumToStr( a, 1.0, 
0 ) );
> > > > > Buy          = Condition;
> > > > > Sell         = BarsSince(Buy) > 12;
> > > > > }
> > > > >
> > > > >
> > > > >
> > > > //------------------------------------------------------------
------
> > > ----\
> > > > \
> > > > > -----
> > > > > // WANT TO ADD THE CUSTOM COLUMN, "CONDITION" TO BACKTEST 
REPORT
> > > > >
> > > > //------------------------------------------------------------
------
> > > ----\
> > > > \
> > > > > -----
> > > > >
> > > > > SetCustomBacktestProc("");
> > > > >
> > > > > if( Status("action") == actionPortfolio )
> > > > > {
> > > > >      bo = GetBacktesterObject();
> > > > >
> > > > >      bo.Backtest(1); // run default backtest procedure
> > > > >
> > > > >     // iterate through closed trades first
> > > > >     for( trade = bo.GetFirstTrade(); trade; trade =
> > > bo.GetNextTrade()
> > > > )
> > > > >     {
> > > > >         trade.AddCustomMetric("Condition", a  );
> > > > >     }
> > > > >
> > > > >      bo.ListTrades();
> > > > > }
> > > > >
> > > > >
> > > > > --- In amibroker@xxxxxxxxxxxxxxx, "Tomasz Janeczko" groups@ 
wrote:
> > > > > >
> > > > > > You need to pass that in either
> > > > > > a) series (set) of static variables
> > > > > > or
> > > > > > b) addtocomposite/foreign
> > > > > > or
> > > > > > c) files (fopen/fputs/fgets/fclose)
> > > > > > or
> > > > > > d) unused trade/position variable (can be for example
> > > margindeposit
> > > > if
> > > > > you don't use it).
> > > > > >
> > > > > > Best regards,
> > > > > > Tomasz Janeczko
> > > > > > amibroker.com
> > > > > > ----- Original Message -----
> > > > > > From: "ozzyapeman" zoopfree@
> > > > > > To: amibroker@xxxxxxxxxxxxxxx
> > > > > > Sent: Friday, December 26, 2008 5:50 PM
> > > > > > Subject: [amibroker] Re: Adding a Custom Metric to 
Backtest
> > > Report
> > > > > >
> > > > > >
> > > > > > > Thanks Mike. I eventually figured as much.
> > > > > > >
> > > > > > > Still trying to figure out a way to dynamically pass the
> > > correct
> > > > "a"
> > > > > > > value to the backtester.
> > > > > > >
> > > > > > > Any ideas on a general approach to this? I need to 
somehow
> > > collect
> > > > > an
> > > > > > > "a" value each time there is a Buy, and store those 
somewhere
> > > so
> > > > > they
> > > > > > > can be read back by the custom backtester code.
> > > > > > >
> > > > > > >
> > > > > > > --- In amibroker@xxxxxxxxxxxxxxx, "Mike" sfclimbers@ 
wrote:
> > > > > > >>
> > > > > > >> Hi,
> > > > > > >>
> > > > > > >> Note that your loop will iterate until 'a' equals 5, 
at which
> > > > point
> > > > > > >> the looping will terminate. In your backtest code, you 
are
> > > > > referring
> > > > > > >> to the value of 'a' which we've just established will 
always
> > > be
> > > > 5.
> > > > > > >> The custom backtest code is run *after* the rest of the
> > > script
> > > > code
> > > > > > >> has been run for all symbols.
> > > > > > >>
> > > > > > >> Mike
> > > > > > >>
> > > > > > >> --- In amibroker@xxxxxxxxxxxxxxx, "ozzyapeman" 
<zoopfree@>
> > > wrote:
> > > > > > >> >
> > > > > > >> > Thank you for pointing out that specific example. 
That
> > > helps me
> > > > > add
> > > > > > >> the
> > > > > > >> > column to the backtest report.
> > > > > > >> >
> > > > > > >> > But I am still at a loss in feeding back the
> > > actual "Condition"
> > > > > > >> value to
> > > > > > >> > the custom metric. If I was building that custom 
metric
> > > from
> > > > > other
> > > > > > >> > metrics already in the report, it would be easy (and 
I have
> > > > done
> > > > > so
> > > > > > >> in
> > > > > > >> > the past).
> > > > > > >> >
> > > > > > >> > But how do I pass back the value of an actual 
variable
> > > from my
> > > > > > >> trading
> > > > > > >> > AFL, each time a Buy is true?
> > > > > > >> >
> > > > > > >> > This is what I now have, but the Condition column 
always
> > > shows
> > > > > "5"
> > > > > > >> in
> > > > > > >> > the backtest report :
> > > > > > >> >
> > > > > > >> >
> > > > > > >> >
> > > > > //----------------------------------------------------------
------
> > > --
> > > > > > >> ----\
> > > > > > >> > --
> > > > > > >> > // SIMPLE TRADING SYSTEM BASED ON VARIOUS CONDITIONS
> > > > > > >> >
> > > > > //----------------------------------------------------------
------
> > > --
> > > > > > >> ----\
> > > > > > >> > --
> > > > > > >> >
> > > > > > >> > FastMA       =    MA( C, 10 );
> > > > > > >> > SlowMA       =    MA( C, 20 );
> > > > > > >> >
> > > > > > >> > Condition1   = Cross(FastMA, SlowMA);
> > > > > > >> > Condition2   = Cross(SlowMA, FastMA);
> > > > > > >> > Condition3   = Cross(C,      SlowMA);
> > > > > > >> > Condition4   = Cross(SlowMA, C     );
> > > > > > >> >
> > > > > > >> > for(a = 1; a < 5; a++)
> > > > > > >> > {
> > > > > > >> > Condition    = VarGet( "Condition" + NumToStr( a, 
1.0,
> > > 0 ) );
> > > > > > >> > Buy          = Condition;
> > > > > > >> > Sell         = BarsSince(Buy) > 12;
> > > > > > >> > }
> > > > > > >> >
> > > > > > >> >
> > > > > > >> >
> > > > > //----------------------------------------------------------
------
> > > --
> > > > > > >> ----\
> > > > > > >> > -----
> > > > > > >> > // WANT TO ADD THE CUSTOM COLUMN, "CONDITION" TO 
BACKTEST
> > > > REPORT
> > > > > > >> >
> > > > > //----------------------------------------------------------
------
> > > --
> > > > > > >> ----\
> > > > > > >> > -----
> > > > > > >> >
> > > > > > >> > SetCustomBacktestProc("");
> > > > > > >> >
> > > > > > >> > if( Status("action") == actionPortfolio )
> > > > > > >> > {
> > > > > > >> >      bo = GetBacktesterObject();
> > > > > > >> >
> > > > > > >> >      bo.Backtest(1); // run default backtest 
procedure
> > > > > > >> >
> > > > > > >> >     // iterate through closed trades first
> > > > > > >> >     for( trade = bo.GetFirstTrade(); trade; trade =
> > > > > bo.GetNextTrade
> > > > > > >> () )
> > > > > > >> >     {
> > > > > > >> >         trade.AddCustomMetric("Condition", a  );
> > > > > > >> >     }
> > > > > > >> >
> > > > > > >> >      bo.ListTrades();
> > > > > > >> > }
> > > > > > >> >
> > > > > > >> >
> > > > > > >> >
> > > > > > >> >
> > > > > > >> >
> > > > > > >> > --- In amibroker@xxxxxxxxxxxxxxx, "Tomasz Janeczko"
> > > <groups@>
> > > > > wrote:
> > > > > > >> > >
> > > > > > >> > > Everything is explained with examples in the 
User's Guide
> > > > > > >> > > http://www.amibroker.com/guide/a_custommetrics.html
> > > > > > >> > >
> > > > > > >> > > See example 3.
> > > > > > >> > > ============
> > > > > > >> > >
> > > > > > >> > > Best regards,
> > > > > > >> > > Tomasz Janeczko
> > > > > > >> > > amibroker.com
> > > > > > >> > >   ----- Original Message -----
> > > > > > >> > >   From: ozzyapeman
> > > > > > >> > >   To: amibroker@xxxxxxxxxxxxxxx
> > > > > > >> > >   Sent: Friday, December 26, 2008 1:26 AM
> > > > > > >> > >   Subject: [amibroker] Adding a Custom Metric to 
Backtest
> > > > > Report
> > > > > > >> > >
> > > > > > >> > >
> > > > > > >> > >   I have been able to add custom metrics to the
> > > Optimization
> > > > > > >> Reports,
> > > > > > >> > but for some reason can't add a column to the Trade 
List
> > > > Backtest
> > > > > > >> > report. Hoping someone might be able to chime in 
here, as
> > > the
> > > > > custom
> > > > > > >> > backtester confuses me.
> > > > > > >> > >
> > > > > > >> > >   What I want to do is fairly simple. In my actual
> > > trading
> > > > > > >> system, I
> > > > > > >> > cycle through hundreds of possible conditions per 
bar. If
> > > any
> > > > one
> > > > > > >> > condition is true, then I Buy. I want to add a custom
> > > metric to
> > > > > the
> > > > > > >> > backtest report that lists which condition generated 
the
> > > Buy
> > > > > signal.
> > > > > > >> > >
> > > > > > >> > >   For the sake of debugging, below is a very 
simplified
> > > AFL
> > > > > (not
> > > > > > >> my
> > > > > > >> > actual system). I simply want to feedback the 
condition
> > > number
> > > > > into
> > > > > > >> the
> > > > > > >> > backtester. But it does not work. If I add an 
optimize
> > > > statement
> > > > > at
> > > > > > >> the
> > > > > > >> > top, it will add the custom metric to the 
Optimization
> > > report.
> > > > > But
> > > > > > >> even
> > > > > > >> > then that column does not reflect correct values.
> > > > > > >> > >
> > > > > > >> > >   So how do I add the column to the Backtest 
report? I
> > > would
> > > > > have
> > > > > > >> > thought the below code would do the trick. And how 
do I
> > > > feedback
> > > > > the
> > > > > > >> > correct values? Perhaps I need to FPUT each 
condition,
> > > during
> > > > the
> > > > > > >> loop,
> > > > > > >> > to an external file, then FGET the file for every 
trade in
> > > the
> > > > > > >> > backtester? That might work, but feels inefficient:
> > > > > > >> > >
> > > > > > >> > >
> > > > > > >> > >
> > > > > > >> >
> > > > > //----------------------------------------------------------
------
> > > --
> > > > > > >> ----\
> > > > > > >> > --
> > > > > > >> > >   // SIMPLE TRADING SYSTEM BASED ON VARIOUS 
CONDITIONS
> > > > > > >> > >
> > > > > > >> >
> > > > > //----------------------------------------------------------
------
> > > --
> > > > > > >> ----\
> > > > > > >> > --
> > > > > > >> > >
> > > > > > >> > >   FastMA       =    MA( C, 10 );
> > > > > > >> > >   SlowMA       =    MA( C, 20 );
> > > > > > >> > >
> > > > > > >> > >   Condition1   = Cross(FastMA, SlowMA);
> > > > > > >> > >   Condition2   = Cross(SlowMA, FastMA);
> > > > > > >> > >   Condition3   = Cross(C,      SlowMA);
> > > > > > >> > >   Condition4   = Cross(SlowMA, C     );
> > > > > > >> > >
> > > > > > >> > >   for(a = 1; a < 5; a++)
> > > > > > >> > >   {
> > > > > > >> > >   Condition    = VarGet( "Condition" + NumToStr( 
a, 1.0,
> > > 0 )
> > > > );
> > > > > > >> > >   Buy          = Condition;
> > > > > > >> > >   Sell         = BarsSince(Buy) > 12;
> > > > > > >> > >   }
> > > > > > >> > >
> > > > > > >> > >
> > > > > > >> > >
> > > > > > >> >
> > > > > //----------------------------------------------------------
------
> > > --
> > > > > > >> ----\
> > > > > > >> > -----
> > > > > > >> > >   // WANT TO ADD THE CUSTOM COLUMN, "CONDITION" TO
> > > BACKTEST
> > > > > REPORT
> > > > > > >> > >
> > > > > > >> >
> > > > > //----------------------------------------------------------
------
> > > --
> > > > > > >> ----\
> > > > > > >> > -----
> > > > > > >> > >
> > > > > > >> > >   SetCustomBacktestProc( "" );
> > > > > > >> > >
> > > > > > >> > >   if ( Status( "action" ) == actionPortfolio )
> > > > > > >> > >   {
> > > > > > >> > >   bo = GetBacktesterObject();
> > > > > > >> > >   bo.Backtest( 
1 );                                    //
> > > > Call
> > > > > > >> > Backtest but set NoTradeLists to true
> > > > > > >> > >   bo.AddCustomMetric( "Condition", a,
> > > 0,0,0 );         // Add
> > > > > the
> > > > > > >> > custom metric
> > > > > > >> > >   bo.ListTrades
> > > ();                                     // Now
> > > > > > >> generate
> > > > > > >> > the backtest report with custom metric
> > > > > > >> > >   }
> > > > > > >> > >
> > > > > > >> >
> > > > > > >>
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > > ------------------------------------
> > > > > > >
> > > > > > > **** IMPORTANT ****
> > > > > > > This group is for the discussion between users only.
> > > > > > > This is *NOT* technical support channel.
> > > > > > >
> > > > > > > *********************
> > > > > > > TO GET TECHNICAL 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
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > >
> > > > >
> > > >
> > >
> >
>



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

**** IMPORTANT ****
This group is for the discussion between users only.
This is *NOT* technical support channel.

*********************
TO GET TECHNICAL 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/