hi Marlin,
BuyAdjusted I define myself, see example. Probably
this can be done with arrays only but I have done it in the past like this so I
use this example. I defined Sell with a number 5 but 1 can be used as
well.
See example and chart. This code enters on the
limit. As a limit I take the low of the day on which I get the signal. I enter
the next bar. If the price goes below the low then the trade is entered.
If the price does not go below the low the a "void" trade is created (in the
chart I show an open circle). The trade is entered at the open but the exit is
on the same price also on the open. This way the money will be reserved for this
trade and will simulate that your money sits in the market waiting fro this
trade and is not used for another trade,
rgds, Ed
procedure
sellAtLimit_proc(Buy,BuyPrice,buyLimit,sellLimit) {
global Sell; global SellPrice; global BuyAdjusted; global BuyPriceAdjusted;
// initialise arrays SellPrice = 0; Sell = 0; BuyAdjusted =
0; BuyPriceAdjusted = 0;
for (i = 1; i
< BarCount; i++) {
// case where it is
likely to enter a long position
if (Buy[ i ] == 1
AND Low[ i ] < buyLimit[ i ]) {
// buy at limit BuyAdjusted[
i ] = 1;
if (Open[ i ] < buyLimit[ i ]) {
BuyPriceAdjusted[ i ]
= Open[ i ];
} else {
BuyPriceAdjusted[ i ]
= buyLimit[ i ];
}
// find a
sell position + sellprice for (j = i; j < BarCount; j++) {
if (O[ j ] > sellLimit[ j ]) {
Sell[ j ] = 1;
SellPrice[ j ] = O[ j ];
i =
j;
break;
} else if (O[ j ] < sellLimit[ j ]
AND H[ j ] > sellLimit[ j ]) {
Sell[ j ] = 1;
SellPrice[ j ] = sellLimit[ j
];
i =
j;
break;
} else if (j == BarCount - 1) {
i =
BarCount;
}
}
} else if (Buy[ i ] == 1 AND Low[ i ] >= buyLimit[ i ]) {
// enter and
exit at the same price and time ("VOID" trade)
BuyAdjusted[ i ] = 1; BuyPriceAdjusted[ i ] =
Open[ i ];
Sell[ i ] = 1; SellPrice[ i ] = Open[ i ];
}
}
} // end
procedure
SetBarsRequired(10000,10000); SetOption("MaxOpenPositions", 100 ); PositionSize = -5; SetTradeDelays(0,0,0,0); PositionScore = Random();
pds = 10; mav = MA(C,pds);
Buy = StochK(pds) < 15;; Buy = Ref(Buy,-1); BuyPrice = O;
buyLimit = Ref(L,-1); sellLimit = Ref(mav,-1);
sellAtLimit_proc(Buy,BuyPrice,buyLimit,sellLimit); Buy = BuyAdjusted; BuyPrice = BuyPriceAdjusted;
SetChartOptions(0, chartShowDates); GraphXSpace = 5; Plot(C,"C",1,64); Plot(sellLimit,"SellLimit",colorGold,styleThick);
PlotShapes(IIf((Buy AND !Sell),shapeUpTriangle,0),colorWhite, layer = 0, yposition = BuyPrice, offset = 0 ); PlotShapes(IIf((Sell AND
!Buy),shapeDownTriangle,0),colorYellow, layer =
0, yposition =
SellPrice, offset =
0 ); PlotShapes(IIf((Buy AND Sell),shapeHollowCircle,0),colorAqua, layer = 0, yposition = BuyPrice, offset = 0 );
----- Original Message -----
Sent: Thursday, July 26, 2007 10:10
PM
Subject: [amibroker] Re: Custom Backtest
Software
Ed,
Cute trick.. I understand in principle, but I need a little
clarification on your code. If you could answer these
questions.
Are the BuyAdjusted and BuyPriceAdjusted vectors special
variables that get used by the backtester?
Why did you set Sell to
5 instead of 1?
My exit is when today's close > 10 day moving
average. I can't see how placing that in the (>>> exit code here)
would work since it will only execute during a buy? help?
You have
already cleared up some mystery for me.
Thanks ed for your
help redlion (marlin)
--- In amibroker@xxxxxxxxxps.com,
"Edward Pottasch" <empottasch@...> wrote: > >
hi, > > you will not need the CBI for this. The trick here is to
select your signals as you normally do. However, if the limit is not hit
you want to exit at the same bar at the same price. The backtester will
now only charge commission. The backtester now reserves this amount of
money for this trade however it will not buy anything. > > As an
example I show a snapshot of how you can do this, Ed > > >
> // case where it is likely to enter a long position > } else if
(Buy[ i ] == 1 AND Low[ i ] < buyLimit[ i ]) { > >
>>>>> exit code here > > // case where limit is
not reached, creat a "VOID" trade > } else if (Buy[ i ] == 1 AND Low[ i
] >= buyLimit[ i ]) { > > // enter and exit at the same price
and time ("VOID" trade) > BuyAdjusted[ i ] = 1; >
BuyPriceAdjusted[ i ] = Open[ i ]; > > Sell[ i ] = 5; >
SellPrice[ i ] = Open[ i ]; > > } > > > -----
Original Message ----- > From: redliontrader > To: amibroker@xxxxxxxxxps.com
> Sent: Wednesday, July 25, 2007 12:58 AM > Subject: [amibroker]
Custom Backtest Software > > > Attempting to work my way
up the learning curve. I am trying to > implement a system that scans
through a list of stock, finds the 10 > best trades for the day and
then enters limit orders at 2% below the > current day's close for
those 10 trades. > > I want to be able to backtest my system. I
don't think the standard > portfolio testing will work because my
system uses limit orders to buy. > So they may fill or may not fill.
I can't quite get my head around > the backtesting object to get
started. > > Any help would be appreciated. > >
RLT >
__._,_.___
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
SPONSORED LINKS
__,_._,___
|