Hi - You might try using SetBarsRequired at
the end of your code to limit how far the backtester looks back, have never
tried it so I don't know if it would work or not. Perhaps the easiest way would
be to trim the signals you don't want, e.g.
Buy = whatever;
Buy = IIF( DateNum < Status( "RangeFromDate" ),
0, Buy );
Steve
----- Original Message -----
Sent: Thursday, September 04, 2008 5:43
PM
Subject: [amibroker] Backtester does not
respect date range!
This is a weird problem. It has become apparent to me
that the backtester is not adhering to the specified date range.
For
example, I have a simple Forex test system that Buys on the first bar, and
sells when there is 100 pips profit, or 5 days have elapsed (loss). Then it
re-enters the trade on the next available bar. So there should be a Buy at the
very first bar. But when I backtest on a date range like 6/21/2007
- 7/21/2007, the first Buy occurs on 6/26/2007, instead of 6/21.
It was very basic AFL and I could not find any flaw in logic. So
someone advised me to install Debug View and add trace statements.
What I found is that the backtest engine is going all the way back to
the begining of my actual database (April 1998) and applying the AFL, but only
showing me results post 6/21/2007. The "phantom" Buys and Sells that occur
prior to 6/21/2007 makes the backtester think it is already in a trade when it
officially starts on 6/21. And it's only when the "phantom" Sell occurs on
6/26 that it shows the first official Buy on that date in the backtester trade
report.
How could this be?
Any help much
appreciated.
Below is the code with all the backtester settings. Please
ignore the trace statements. They are only for debugging. As you can see, the
code is very basic, (for testing purposes only):
/////////////////////////////////////////////////////////////////////////////////////// //
//
SIMPLE TEST SYSTEM: // // BUY AT FIRST BAR, THEN SELL AT
100 PIPS PROFIT OR AFTER 7200 ONE-MINUTE BARS (5 DAYS). //
RE-ENTER ON THE NEXT BAR AFTER A
SELL. // //////////////////////////////////////////////////////////////////////////////////////
//
----------------------------------------------------------------------- //
Variables //
-----------------------------------------------------------------------
Profit
=
0.0100; bars
= 7200; maxContractsPerPair =
1; maxPairsTraded =
1;
Slippage
= 0.0002;
//
----------------------------------------------------------------------- //
BackTester Settings //
-----------------------------------------------------------------------
tradeDelay
= 1;
SetBarsRequired(10000,
10000);
// Ensures that the charts include all bars AND NOT just
those on screen SetOption("AccountMargin",
100);
// Account margin, 100 = no
margin SetOption("ActivateStopsImmediately",
False); // Intraday stops
? SetOption("AllowPositionShrinking",
False); // Take
partial trades if equity available ? SetOption("AllowSameBarExit",
True);
// Allow same bar exit for profit stops ?
SetOption("CommissionAmount",
4.00); // Commission amount SetOption("CommissionMode",
3);
// 3 = $ per
share/contract SetOption("FuturesMode",
1);
// = use MarginDeposit and PointValue in
calculations SetOption("InitialEquity",
100000);
// Initial equity
$ SetOption("InterestRate",0);
// Set interest rate earned for free cash, zero to
evaluate system SetOption("MaxOpenPositions", maxPairsTraded *
maxContractsPerPair); SetOption("MinPosValue",
0);
// Min position value to make trade worthwhile, 0 = no
limit SetOption("MinShares",
1);
// Min number
shares SetOption("PriceBoundChecking", False
); // Price to stay in bar range
? SetOption("ReverseSignalForcesExit",
False); SetOption("UsePrevBarEquityForPosSizing", True ); // Use last known bar for position sizing
? SetTradeDelays(tradeDelay, tradeDelay, tradeDelay,
tradeDelay); SetPositionSize(1, spsShares);
if (maxContractsPerPair
> 1) SetBacktestMode(backtestRegularRawMulti);
// In AmiBroker, make sure that Symbol Information is properly
set up for each pair, esp. currency field. // Also, under AmiBroker main
menu, make sure to set Tools --> Preferences -->
Currencies for each pair
RoundLotSize =
1; MarginDeposit = 2000; PointValue = 100000;
//
----------------------------------------------------------------------- //
Trading System Formula //
-----------------------------------------------------------------------
BuyPrice
= Open + Slippage; ShortPrice = Open -
Slippage; SellPrice = Open - Slippage; CoverPrice = Open +
Slippage;
// Set up some variables to give us
info on current position wasLong = reachedProfitLevel = buySignal =
sellSignal = barToExitLong = 0;
// Set up variables
for our entry values, as our stops will test against the initial entry
prices valueAtBuy = Null; profitLevel = Null;
// Number of open contracts longContractCount =
0;
// Debugging arrays dateArray =
DateNum(); timeArray = TimeNum();
for (i = 0; i <
(BarCount-TradeDelay); i++) { // Remember if
a position is currently open, so we do not re-enter in the same direction on
the same bar wasLong = longContractCount >
0;
// Check for conditions to exit a
long trade if (longContractCount > 0)
{ reachedProfitLevel = C[i] >
profitLevel;
if
(reachedProfitLevel)
{ _TRACE("bar=" + i + " " +
StrFormat("%06.0f",dateArray[i]) + " " + StrFormat("%06.0f",timeArray[i]) + "
reached long ProfitLevel");
sellSignal[i] = 3; // 3 = profit : this behavior emulates
the Equity(1)
functionality
longContractCount = 0; }
// Sell at loss else if ( i ==
barToExitLong) {
_TRACE("bar=" + i + " " + StrFormat("%06.0f",dateArray[i]) + " " +
StrFormat("%06.0f",timeArray[i]) + " reached
barToExitLong"); sellSignal[i] = 2; // 2 = max loss : this behavior emulates the Equity(1)
functionality longContractCount =
0; } } // Long entry if ( NOT wasLong )
{ _TRACE("bar=" + i + " " +
StrFormat("%06.0f",dateArray[i]) + " " + StrFormat("%06.0f",timeArray[i]) + "
not was long"); buySignal[i] = 1;
longContractCount = 1; valueAtBuy =
BuyPrice[i+tradeDelay]; profitLevel = valueAtBuy +
Profit; barToExitLong = i + bars; //
5 days later } }
// This logic
is needed to workaround strange undocumented backtester behavior when the
sell/cover arrays are non-boolean. Sell = sellSignal !=
0; Buy = buySignal;
__._,_.___
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
__,_._,___
|