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 [email protected], "Ýlhan Ketrez" <[EMAIL PROTECTED]> 
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 <[EMAIL PROTECTED]> 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* <[EMAIL PROTECTED]
> > > <mailto:[EMAIL PROTECTED]>> 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* <[EMAIL PROTECTED]
> > >     <mailto:[EMAIL PROTECTED]>
> > >      > <mailto:[EMAIL PROTECTED] <mailto:[EMAIL PROTECTED]>>>
> > >      > Tarih: 27 Haziran 2008 Cuma 15:28
> > >      > Konu: Re: [amibroker] Portfolio backtest in forex
> > >      > Kime: [email protected]
> > >     <mailto:[email protected]> 
<mailto:[email protected]
> > >     <mailto:[email protected]>>
> > >      >
> > >      >
> > >      >
> > >      > 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 <[EMAIL PROTECTED]
> > >     <mailto:[EMAIL PROTECTED]>
> > >      > <mailto:[EMAIL PROTECTED] <mailto:[EMAIL PROTECTED]>>>:
> > >      >
> > >      >     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:[EMAIL PROTECTED]
> > >     <mailto:[EMAIL PROTECTED]>>
> > >      >         *To:* [email protected]
> > >     <mailto:[email protected]> 
<mailto:[email protected]
> > >     <mailto:[email protected]>>
> > >      >         *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:[EMAIL PROTECTED]
> > >     <mailto:[EMAIL PROTECTED]>
> > >
> > >
> > >
> > >
> > >
> > >
> > > ----------------------------------------------------------------
--------
> > >
> > >
> > > 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
> >
> >
> >
> >
>


Reply via email to