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

Re: [amibroker] Adding custom metrics



PureBytes Links

Trading Reference Links

Hi Thomas,
 
I have investigated the code you provided and compared it with Tomasz's. Here are my comments:
 
- As you mentioned, Tomasz's code cannot give the values at the beginning.
- While your code gives the correct values all the time, it changes the system results starting from the beginning. (Buy days are different from the system without the custom code at the beginning. They may also be different in the following days, I haven't checked.)
- My solution has been a combination of the two codes. Here it is:
 

trend = EMA(C,5) / EMA(C,21)*100-100;

AddToComposite

( trend, "~MyTrend_" + Name(), "X", atcFlagEnableInBacktest | atcFlagDefaults );

 

function FindValueAtDateTime( input, dt, Value )

{

found = -

1;

for ( i = 0; i < BarCount AND found == -1; i++ )

{

if ( dt[ i ] == Value )

found = i;

}

return IIf( found != -1, input[ found ], Null );

}

SetCustomBacktestProc

( "" );

if

( Status( "action" ) == actionPortfolio )

{

bo =

GetBacktesterObject();

bo.Backtest(

1);

dt =

DateTime();

for ( trade = bo.GetFirstTrade(); trade; trade = bo.GetNextTrade() )

{

TrendArray =

Foreign( "~MyTrend_" + trade.Symbol, "X" );

Trend = FindValueAtDateTime( TrendArray, dt, trade.EntryDateTime );

trade.AddCustomMetric(

"Trend", Trend );

}

bo.ListTrades();

}

Thank you again.
Ilhan 
2008/11/18 İlhan Ketrez <ketrezilhan@xxxxxxxxx>
Hello,
 
Nowadays I have few time for these issues. I will check and report back soon.
 
Thanks again.
Ilhan

On Mon, Nov 17, 2008 at 10:51 PM, Thomas Z. <tzg@xxxxxxxxxxxxxxxxxxx> wrote:
Hello,

yes, the code is shorter. However... you get different values at the
beginning of the testing period.

The CBI is aligned to the testing period. This means if you want for example
access a 250 day moving average and you start your backtest at the first
january you get the correct value of the moving about 1 full year later,
while in real trading you would have the correct value instantly at the
first day.

You can confirm this behaviour through a comparison of the indicator values
with different backtest start dates, even with higher indicator periods.
Sent: Monday, November 17, 2008 8:50 PM
To: amibroker@xxxxxxxxxxxxxxx
Subject: Re: [amibroker] Adding custom metrics

Hello Thomas,
 
Thank you very much for your close interest. I will also try your solution.
Today, I have found my answer in the group mail archive. I am sorry for
taking your time before completely investigating the solution in the
previous e-mails. Here's what I have found (it works- with one letter
correction as enrybar-entrybar):
 
----------------------------------------------------------------------------
--
/*Custom Backtesting*/
SetCustomBacktestProc("");

if (Status("action") == actionPortfolio){
    bo=GetBacktesterObject();
    bo.Backtest(1);
           dt = DateTime();
    bi = BarIndex();
 

    for (trade = bo.GetFirstTrade(); trade; trade = bo.GetNextTrade())
    {
        SetForeign( trade.Symbol ); // need to switch the symbol
                    
                     entrybar = LastValue( ValueWhen( dt ==
trade.EntryDateTime, bi ) );
        test= C[ enrybar ]; // we need scalar value
        test1= HHV(C,20) ;
        test1 = test1[ entrybar ]; // we need scalar value
        trade.AddCustomMetric("test",test);
        trade.AddCustomMetric("test1",test1);
    }

    bo.AddCustomMetric("Marker","Marker");
    bo.ListTrades();
  
}


Best regards,
Tomasz Janeczko
amibroker.com
----------------------------------------------------------------------------
--
Here is the link:
http://finance.groups.yahoo.com/group/amibroker/message/119866
 
Thank you again to everybody for sharing their knowloedge in the group.
 
Best regards,
Ilhan Ketrez
 

 
On Mon, Nov 17, 2008 at 8:30 PM, Thomas Z. <tzg@xxxxxxxxxxxxxxxxxxx> wrote:
Hi,

I have fixed your code:


Buy = Cross( C, MA( C, 10 ) );
Sell = Cross( MA( C, 10 ), C );

trend = EMA( C, 5 ) / EMA( C, 21 );
AddToComposite( C, "~MyTrend_" + Name(), "X", atcFlagEnableInBacktest |
atcFlagDefaults );


function FindValueAtDateTime( input, dt, Value )
{
   found = -1;

   for ( i = 0; i < BarCount AND found == -1; i++ )
   {
       if ( dt[ i ] == Value )
           found = i;
   }

   return IIf( found != -1, input[ found ], Null );
}

SetCustomBacktestProc( "" );

if ( Status( "action" ) == actionPortfolio )
{
   bo = GetBacktesterObject();
   bo.PreProcess();
   dt = DateTime();
   sc = 1;

   for ( i = 1; i < BarCount; i++ )
   {
       for ( sig = bo.GetFirstSignal( i ); sig; sig = bo.GetNextSignal( i )
)
       {
           if ( sig.IsEntry() )
           {
               //VarSet("trendd"+sc,Foreign("~MyTrend", "C"));
               sc = sc + 1;
           }
       }

       bo.ProcessTradeSignals( i );
   }

   tc = 1;

   for ( trade = bo.GetFirstTrade(); trade; trade = bo.GetNextTrade() )
   {
       TrendArray = Foreign( "~MyTrend_" + trade.Symbol, "C" );
       //tr = VarGet("trendd"+tc);
       Trend = FindValueAtDateTime( TrendArray, dt, trade.ExitDateTime );
       trade.AddCustomMetric( "Trend", Trend ); //tr should be here instead
of a
       tc = tc + 1;
   }

   bo.PostProcess();
}

Thomas
www.PatternExplorer.com



From: amibroker@xxxxxxxxxxxxxxx [mailto:amibroker@xxxxxxxxxxxxxxx] On Behalf
Of Ilhan Ketrez
Sent: Sunday, November 16, 2008 9:17 PM
To: amibroker@xxxxxxxxxxxxxxx
Subject: Re: [amibroker] Adding custom metrics

Hello,
 
I still couldn't achieve... Below please find a work summary and my code. I
will be glad to see your comments&help. Thanks in advance.
 
1- The operation is to examine the trades of a single ticker in depth.
2- Passing of one formula (trend) to composite is OK. I can see it appear in
tickers.
3- I desired to check Buy signals with a loop. And insert the values of the
composite to a static array buy VarSet. This should be added by date
sequence by the signals loop.
4- Then, get the new static array variables in the trades loop by varget and
add the custom metrics.
 
The problem is: Getting the composite array values into CB doesn't seem
possible.
Here is the code:
 
trend = EMA(C,5) / EMA(C,21);
AddToComposite
(C, "~MyTrend", "X", atcFlagEnableInBacktest| atcFlagDefaults );
SetCustomBacktestProc
("");
if
( Status("action") == actionPortfolio)
{
bo =
GetBacktesterObject();
bo.PreProcess();
//
sc =
1;
for (i = 1; i < BarCount; i++)
{
for (sig = bo.GetFirstSignal(i); sig; sig = bo.GetNextSignal(i))
{
if( sig.IsEntry() )
{
//VarSet("trendd"+sc,Foreign("~MyTrend", "C"));
a =
Foreign("~MyTrend", "C"); //for testing purpose
sc = sc +
1;
}
}
bo.ProcessTradeSignals(i);
}
tc =
1;
for( trade = bo.GetFirstTrade(); trade; trade = bo.GetNextTrade() )
{
//tr = VarGet("trendd"+tc);
trade.AddCustomMetric(
"Trend", a); //tr should be here instead of a
tc = tc +
1;
}
 bo.PostProcess();
}
System...
2008/11/16 İlhan Ketrez <ketrezilhan@xxxxxxxxx>
Hello,
 
Not complete yet but "AddToComposite" hint seems to be enough for me..
Thank you very much.
2008/11/16 Thomas Z. <tzg@xxxxxxxxxxxxxxxxxxx>

Hello,

it is be possible.

You have to store the CCI Value through AddToComposite for each symbol and
have to load it in the CBI through the foreign function.
Additionally you have to use a loop to iterate through all bars and all
closed trades to add the CCI value from the bar where the trade has been
closed.


Thomas
www.PatternExplorer.com


From: amibroker@xxxxxxxxxxxxxxx [mailto:amibroker@xxxxxxxxxxxxxxx] On Behalf
Of Ilhan Ketrez
Sent: Saturday, November 15, 2008 11:05 PM
To: amibroker@xxxxxxxxxxxxxxx
Subject: Re: [amibroker] Adding custom metrics

Still no replies.
 
I wonder if this is possible in Amibroker.
 
A yes/no response or a link to an example document can also be very helpful.
 
Thank you.


 
2008/11/14 İlhan Ketrez <ketrezilhan@xxxxxxxxx>
Thank you but it doesn't work that way, i.e. it doesn't give the entry CCI.
To clarify, I want to see the entry CCI values in the yellow areas of the
attached picture.
Could you please elaborate your response by providing an example?
 
Thank you very much.
On Fri, Nov 14, 2008 at 10:04 PM, Ara Kaloustian <ara1@xxxxxxxxxx> wrote:
Entry for "CCI" should be just "CCI"  - not "trade.CCI"
 
----- Original Message -----
From: İlhan Ketrez
To: amibroker@xxxxxxxxxxxxxxx
Sent: Friday, November 14, 2008 12:00 PM
Subject: [amibroker] Adding custom metrics

Dear friends,
 
Regarding the addition of custom metrics to the backtest report, to simplify
my question please find below a script from the AB documentation. Simply, I
want to add, for example, CCI value, RSI value and various entry bar
conditions instead of Initial risk or R multiple below.
 
In other words, just like trade.score gives entry score, I want to add
"trade.cci" as entry cci to the backtest report.
 
Thank you in advance for your help.
 
Best regards,
Ilhan
 
SetCustomBacktestProc("");
MaxLossPercentStop = 10; // 10% max. loss stop
/* Now custom-backtest procedure follows */
if
( Status("action") == actionPortfolio )
{
bo =
GetBacktesterObject();
bo.Backtest(
1); // run default backtest procedure
SumProfitPerRisk =
0;
NumTrades =
0;
// iterate through closed trades first
for( trade = bo.GetFirstTrade(); trade; trade = bo.GetNextTrade() )
{
// risk is calculated as the maximum value we can loose per trade
// in this example we are using max. loss stop
// it means we can not lose more than (MaxLoss%) of invested amount
// hence ris
Risk = ( MaxLossPercentStop /
100 ) * trade.GetEntryValue();
RMultiple = trade.GetProfit()/Risk;
trade.AddCustomMetric(
"Initial risk $", Risk );
trade.AddCustomMetric(
"R-Multiple", RMultiple );
trade.AddCustomMetric(
"Trend", trend );
SumProfitPerRisk = SumProfitPerRisk + RMultiple;
NumTrades++;
}
expectancy3 = SumProfitPerRisk / NumTrades;
bo.AddCustomMetric(
"Expectancy (per risk)", expectancy3 );
bo.ListTrades();
}




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

**** 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






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

**** 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/



__._,_.___

**** 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

*********************************




Your email settings: Individual Email|Traditional
Change settings via the Web (Yahoo! ID required)
Change settings via email: Switch delivery to Daily Digest | Switch to Fully Featured
Visit Your Group | Yahoo! Groups Terms of Use | Unsubscribe

__,_._,___