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

[amibroker] Re: Portfolio backtest in forex



PureBytes Links

Trading Reference Links

Ilhan, 

think you are on to something important in the way Amibroker handles 
forex trading today. However, after having done some tests on my own, 
I think the code below should be modified to use the currency being 
traded (first symbol) versus USD instead of "base" (second symbol) in 
a currency pair.

so, when trading EURCHF, the line: 

md = 1000 * Foreign("USDCHF","Close",True);

would become

md = 1000 * Foreign("EURUSD","Close",True);

would you (or anybody else who might want to chime in) agree?

best regards
Jens Tiedemann



--- In amibroker@xxxxxxxxxxxxxxx, "Ýlhan Ketrez" <ilhanketrez@xxx> 
wrote:
>
> Hello Grant,
> 
> I am not sure whether it can be called offense or not but I really 
felt like
> a child and I really liked it :) Please do not take this expression 
as an
> offensiveness towards you and thank you very much for your kindness 
of
> expressing your excuses.
> 
> Coming back to the business, following simple code is enough for me 
in
> EURCHF. Only two lines of code do the job for me. It can also be 
easily
> adapted to the other pairs.
> 
> In your codes, as I understand, you perform this adaptation by 
decomposing
> the pairs by code. I will also examine these in depth, when I have 
time.
> 
> Since there are limited pairs, I prefer to write the codes by
> 
> 1- A maincode.afl (includes if name() = eurusd #include 
eurusd.afl   type
> codes and scale in/out codes
> 2- A general setting.afl
> 3- n pieces of eurusd.afl, eurchf.afl... files
> 
> Hence, examining the codes becomes easier and I can write different 
codes
> for different pairs.
> 
> As you may see, I am new to custom backtester and didn't know this 
process
> is that easy.
> On previous days, I was surprised that Amibroker standard backtest 
module
> cannot perform the backtest just like standard forex accounts and I 
had a
> problem. Today, I am still suprised that it cannot perform and I 
don't have
> a problem. Thank you very much for your kind help again.
> 
> Best regards,
> Ilhan
> 
> 
> 
> SetOption("UseCustomBacktestProc", True );
> if( Status("action") == actionPortfolio )
> {
> bo = GetBacktesterObject();
> bo.PreProcess();
> for( bar = 0; bar < BarCount; bar++ )
> {
> 
> for( sig = bo.GetFirstSignal( bar ); sig; sig = bo.GetNextSignal( 
bar ) )
> {
> md = 1000 * Foreign("USDCHF","Close",True);
> sig.MarginDeposit = md[bar];
> 
> }
> bo.ProcessTradeSignals( bar );
> }
> bo.PostProcess();
> }
> 
> 
> 
> 01.07.2008 tarihinde Grant Noble <gruntus@xxx> yazmýþ:
> >
> > Sorry if I offended you (sleep deprivation you know..). Let me 
know how it
> > goes for you. Happy to
> > help out more. Regards, GRANT
> >
> > Ýlhan Ketrez wrote:
> > > Dear Grant,
> > >
> > > Thank you for making me feel like a child :)
> > >
> > > And thank you for your detailed e-mail. It seems useful but I 
don't have
> > > enough time now to examine in depth.
> > >
> > > As you mentioned, I need to make some modifications I guess. I 
will post
> > > here as soon as I make it work for me.
> > >
> > > Bes regards,
> > > Ilhan Ketrez
> > >
> > >
> > > 01.07.2008 tarihinde *Grant Noble* <gruntus@xxx
> > > <mailto:gruntus@...>> yazmýþ:
> > >
> > >     Quit your whining. It took me the best part of 2 years to 
get
> > >     accurate profit & margin calculations.
> > >     It didn't help that there was a bug in fx profit 
calculations
> > >     involving leverage but Thomasz fixed
> > >     that a few releases ago (ta :)). Along the way I realised 
that not
> > >     all brokers calculate margin the
> > >     same way - my broker actually has three different 
calculations
> > >     depending on the type of stop used.
> > >     Some base margin on CCY1, some on CCY2. Also margin, as a 
symbol
> > >     information property, is defined
> > >     statically whereas I needed to define it dynamically at 
order time
> > >     based on entry price. Therefore I
> > >     needed CBT code which I was able to create with the help of 
another
> > >     participant on this forum (g'day
> > >     Aron). You too will probably need something like this. 
Amibroker
> > >     support is tip-top but working out
> > >     how to set backtest preferences for your broker is your job.
> > >
> > >     I'll attach some code I use. I #include it in all my 
systems. Note
> > >     that is uses ATC so you'll have
> > >     to retrieve this data within your system code. Note also 
that this
> > >     code is partially obsolete (since
> > >     that bug was sorted out). Will it do exactly what you want? 
Probably
> > >     not, you'll need to tweak
> > >     depending upon your use. I need to do more work on it but 
I've been
> > >     busy with twin babies. Hope it
> > >     helps. G
> > >
> > >     /*
> > >            Grant's FX preferences
> > >     */
> > >     SetOption("FuturesMode",
> > >     True);                                         // = use
> > >     MarginDeposit and PointValue in calculations
> > >     SetOption("InitialEquity", 10000
> > >     );                                             // Initial 
equity $
> > >     SetOption("MaxOpenPositions", 4
> > >     );                                      // Max number of 
positions
> > >     SetOption("CommissionMode",
> > >     3);                                         // 3 = $ per
> > share/contract
> > >     SetOption("CommissionAmount",
> > >     0);                                               // 
Commission
> > amount
> > >     SetOption("AccountMargin",
> > >     100);                                                // 
Account
> > >     margin, 100 = no margin
> > >     SetOption("PriceBoundChecking", True
> > >     );                                 // Price to stay in bar 
range ?
> > >     SetOption("UsePrevBarEquityForPosSizing", True );       // 
Use last
> > >     known bar for position sizing ?
> > >     SetOption("ActivateStopsImmediately", 
False);                   //
> > >     Intraday stops ?
> > >     SetOption("Allowsamebarexit",
> > >     True);                                    // Allow same bar 
exit for
> > >     profit stops ?
> > >     SetOption("Allowpositionshrinking", 
True);                      //
> > >     Take partial trades if equity available ?
> > >
> > SetOption
("InterestRate",0);                                                   
 //
> > >     Set interest rate earned for free cash, zero to evaluate 
system
> > >     SetOption("UseCustomBacktestProc", 
True);                       //
> > >     Use Custom backtest for reporting ?
> > >     SetOption("MinShares",
> > >     
1);                                                              //
> > >     Min number shares one
> > >     SetOption("MinPosValue",
> > >     0);                                                    // 
Min
> > >     position value to make trade worthwhile, 0 = no limit
> > >
> > SetTradeDelays
(0,0,0,0);                                                            
    //
> > >     Trade delays applied by the backtester
> > >
> > >     lotsize =  StrToNum( ParamList("Lot 
size", "100000|10000|1000", 0)
> > >     );           // default lot 100000
> > >     leverage = Param("Leverage rate", 50, 1, 100,
> > >     
1);                                                       // default
> > >     leverage 50:1
> > >     base = ParamList("Base currency","AUD|CAD|CHF|EUR|GBP|USD",
> > >     0);         // default base currency AUD
> > >
> > >     ccy2 = StrRight( Name(), 3
> > >     );                                                   // eg. 
EURJPY
> > >     gives JPY
> > >     TickSize = IIf( ccy2 == "JPY", 0.01, 
0.0001 );                  //
> > >     the minimum price move of symbol
> > >     RoundLotSize =
> > >     1;
> > >     // whole contracts only
> > >     contracts =
> > >
> > 
1;                                                                    
              //
> > >     contracts to acquire
> > >     SetPositionSize( contracts, spsShares
> > >     );                                // spsShares = size 
expressed in
> > >     shares/contracts
> > >
> > >     fxRate = IIf( ccy2 == base, 1, Ref( Foreign( StrFormat( 
ccy2 + base
> > >     ), "Close" ), -1 ) ); // eg.
> > >     close of JPYAUD yesterday
> > >     pv = lotsize * fxRate;                  // the amount of 
profit
> > >     generated by one contract for a one point increase
> > >     in price
> > >     md = pv * Close * 1 / leverage; // the amount of money 
required to
> > >     open single contract position [IG
> > >     margin - no stop]
> > >
> > >     // note: ATC code produces future leak warning when code is 
Checked
> > >     by editor..
> > >     AddToComposite( pv, "~spec_" + Name(), "O", 
atcFlagDeleteValues +
> > >     atcFlagCompositeGroup +
> > >     atcFlagEnableInExplore + atcFlagEnableInBacktest ); // 
store daily
> > >     point value in composite
> > >     AddToComposite( md, "~spec_" + Name(), "C", 
atcFlagCompositeGroup +
> > >     atcFlagEnableInExplore +
> > >     atcFlagEnableInBacktest ); // store daily margin deposit in 
composite
> > >
> > >     SetCustomBacktestProc(""); // no external backtest procedure
> > >     if ( Status("action") == actionPortfolio) {
> > >            bo = GetBacktesterObject();     // get backtester 
object
> > >            //
> > >            // set correct MarginDeposit & PointValue on entry 
signal days
> > >            //
> > >            bo.PreProcess();                                // do
> > >     pre-processing (always required)
> > >            for (i = 1; i < BarCount; i++)          // loop 
through all
> > bars
> > >            {
> > >                    for (sig = bo.GetFirstSignal(i); sig; sig =
> > >     bo.GetNextSignal(i)) // loop through all signals at
> > >     this bar
> > >                    {
> > >                    if( sig.IsEntry() ) // is it an entry signal
> > >     (buy/short) ?
> > >                             {
> > >                                    pv = Foreign( "~spec_" + 
sig.Symbol,
> > >     "O" );             // entry day point value
> > >                                    md = Foreign( "~spec_" + 
sig.Symbol,
> > >     "C" );             // entry day margin deposit
> > >                                    _TRACE( StrFormat( "Ticker=" 
+
> > >     sig.Symbol + "  PointValue=%1.0f  pv=%1.0f  MarginDeposit=%
1.0f
> > >     md=%1.0f", sig.PointValue, pv[i], sig.MarginDeposit, md
[i] ) );
> > >                                    sig.PointValue =
> > >     pv[i];                 // set symbol PointValue
> > >                                    sig.MarginDeposit =
> > >     md[i];              // set symbol MarginDeposit
> > >                            }
> > >                    }
> > >                    bo.ProcessTradeSignals(i); // process trades 
at bar
> > >     (always required)
> > >            }
> > >            bo.PostProcess(); // do post-processing (always 
required)
> > >     }
> > >     //
> > >
> > >     Ýlhan Ketrez wrote:
> > >      > Dear friends,
> > >      >
> > >      > Before registering the mailgroup, I was quite frustated 
regarding
> > the
> > >      > customer support for Amibroker. Now I observe that 
Tomasz is very
> > >     busy
> > >      > with the new technological developements of the software 
and
> > >     replies the
> > >      > related questions mostly. I appreciate his great effort 
and
> > magical
> > >      > software.
> > >      >
> > >      > In my recent e-mails, I believe that I emphasize an 
important
> > point
> > >      > about forex backtesting in Amibroker. Currently, I see 
that it is
> > >      > impossible to truly backtest multiple forex pairs with 
the
> > standard
> > >      > backtester interface. Below, I am trying to explain in 
detail.
> > >      >
> > >      > - For EURUSD and XXXUSD pairs everything is OK.
> > >      > - When the second unit is not USD, problem arises. I'm 
taking the
> > >     EURJPY
> > >      > as my example. Brokers calculate the profit-loss of 
these trades
> > >     in JPY
> > >      > (using the pointvalue * pricechange formula) and then 
converts to
> > >     USD,
> > >      > using the USDJPY pair as you know.
> > >      > - In Amibroker, when we set the currency as JPY and 
indicate
> > >     USDJPY in
> > >      > the settings, it calculates the profit-losses correctly.
> > >      > - In this case, it takes also the margin deposit scalar 
in JPY.
> > >      > - Hence, all the traded contract quantities increase to 
extreme
> > >     values
> > >      > and all the backtest becomes incorrect.
> > >      >
> > >      > How can we (do you) overcome this hindrance?
> > >      >
> > >      > Thanks in advance and best regards,
> > >      > Ilhan
> > >      >
> > >      >
> > >      >
> > >      >
> > >      >
> > >      >
> > >      > ---------- Yönlendirilmiþ ileti ----------
> > >      > Kimden: *Ýlhan Ketrez* <ilhanketrez@xxx
> > >     <mailto:ilhanketrez@...>
> > >      > <mailto:ilhanketrez@... <mailto:ilhanketrez@...>>>
> > >      > Tarih: 27 Haziran 2008 Cuma 15:28
> > >      > Konu: Re: [amibroker] Portfolio backtest in forex
> > >      > Kime: amibroker@xxxxxxxxxxxxxxx
> > >     <mailto:amibroker@xxxxxxxxxxxxxxx> 
<mailto:amibroker@xxxxxxxxxxxxxxx
> > >     <mailto:amibroker@xxxxxxxxxxxxxxx>>
> > >      >
> > >      >
> > >      >
> > >      > Thanks Tomasz,
> > >      >
> > >      > Curreny setting in the symbol information window is OK.
> > >      >
> > >      > The settings in the Tools->Preferences->Currencies 
windos are
> > >     also OK.
> > >      >
> > >      > When we change the currency, the currency of the margin 
deposit
> > also
> > >      > changes. That is the problem.
> > >      > In forex accounts all of the margins are (Say) 1000 USD.
> > >      > Hence, in the current situation it becomes 1000 CHF. 
(Small
> > Problem,
> > >      > average in last years is around 1.4)
> > >      > If the pair is USDJPY, it becomes 1000 JPY. (Greater 
problem
> > >     average in
> > >      > last years is around 110)
> > >      >
> > >      > As a result, almost all of the results become 
insignificant,
> > starting
> > >      > with exposure, total profit/loss calculations.
> > >      >
> > >      >
> > >      > Please note that, unit profit-loss calculation is 
correct. Infact
> > >      > everything else seem to be correct.
> > >      >
> > >      > I understand the need for setting the margindeposit 
currency to
> > the
> > >      > active currency to make trade in different markets.
> > >      >
> > >      > One temporary solution can be making an approach by 
adjusting the
> > >      > position size accordingly But the real, exact solution 
can only be
> > >      > achieved by defining a seperate currency setting for the 
margin
> > >     deposit.
> > >      >
> > >      > I am waiting for your comments.
> > >      >
> > >      > Best regards,
> > >      > Ilhan
> > >      >
> > >      >
> > >      > 2008/6/27, Tomasz Janeczko <groups@xxx
> > >     <mailto:groups@...>
> > >      > <mailto:groups@... <mailto:groups@...>>>:
> > >      >
> > >      >     Hello,
> > >      >
> > >      >     You need to define CURRENCY (symbol->information) 
for that
> > >     pair to
> > >      >     match the deposit currency.
> > >      >     You also need to setup currency tables in
> > >     Tools->Preferences->Currencies
> > >      >
> > >      >     Best regards,
> > >      >     Tomasz Janeczko
> > >      >     amibroker.com <http://amibroker.com> 
<http://amibroker.com/>
> > >      >
> > >      >         ----- Original Message -----
> > >      >         *From:* Ýlhan Ketrez <mailto:ilhanketrez@...
> > >     <mailto:ilhanketrez@...>>
> > >      >         *To:* amibroker@xxxxxxxxxxxxxxx
> > >     <mailto:amibroker@xxxxxxxxxxxxxxx> 
<mailto:amibroker@xxxxxxxxxxxxxxx
> > >     <mailto:amibroker@xxxxxxxxxxxxxxx>>
> > >      >         *Sent:* Thursday, June 26, 2008 4:24 PM
> > >      >         *Subject:* [amibroker] Portfolio backtest in 
forex
> > >      >
> > >      >
> > >      >         Hello,
> > >      >
> > >      >         While the currency for the margin deposit is not 
USD, how
> > >     can we
> > >      >         perform a correct portfolio backtest in XXXYYY 
where YYY
> > >     is not
> > >      >         USD such as EURCHF?
> > >      >
> > >      >         Thanks in advance.
> > >      >         Ilhan
> > >      >
> > >      >
> > >      >
> > >      >
> > >      >
> > >      >
> > >      >
> > >      >
> > >
> > ------------------------------------------------------------------
------
> > >      >
> > >      >
> > >      > No virus found in this incoming message.
> > >      > Checked by AVG.
> > >      > Version: 8.0.101 / Virus Database: 270.4.3/1527 - 
Release Date:
> > >     6/30/2008 6:07 PM
> > >
> > >     ------------------------------------
> > >
> > >     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 <http://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
> > >
> > >
> > >        mailto:amibroker-fullfeatured@xxxxxxxxxxxxxxx
> > >     <mailto:amibroker-fullfeatured@xxxxxxxxxxxxxxx>
> > >
> > >
> > >
> > >
> > >
> > >
> > > ----------------------------------------------------------------
--------
> > >
> > >
> > > No virus found in this incoming message.
> > > Checked by AVG.
> > > Version: 8.0.101 / Virus Database: 270.4.3/1527 - Release Date: 
6/30/2008
> > 6:07 PM
> >
> > ------------------------------------
> >
> > 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
> >
> >
> >
> >
>



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

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/