hi,
I can only suggest a way by writing your own
stopcode, so it is a bit complicated maybe. I would not know how to do this
using Applystop, you might be able to solve it using the ReEntryDelay
parameter but I wouldn't know how.
What you need to do is trick the backtester to sell
when an actual sell signal occurs, so at the cross defined by sell =
cross(ma(c,50),c) but use the sell price that follows from the 5% stop. This way
the backtester will think it still owns the stock while in reality you already
sold at the stop price. You will have to set SetOption("PriceBoundChecking",
False);
I wrote the code see below. Also a chart is added.
In the chart you see a buy above the green arrow. Three bars later the stop is
hit and the stock is sold at the price of the yellow circle. However, the
actuall sell defined by the cross occurs more than 4 months later. This is
where you tell the backtester it is sold. So the backtester thinks it is
sold 4 months later for the price shown at the stopline (or yellow
circle).
Now lets hope I didn't misunderstood your question
:)
rgds, Ed
p.s. didn't do a backtest check.
procedure sell_proc(Buy,Sell,stopPercentage) {
global BuyAdjusted; global BuyPriceAdjusted; global SellAdjusted; global SellPriceAdjusted; global longStopArray; global SellHelp; global SellPriceHelp;
BuyAdjusted = 0; BuyPriceAdjusted = 0; SellAdjusted = 0; SellPriceAdjusted = 0; longStopArray = Null; SellPriceHelp = 0; SellHelp = 0;
delay = 1; slip = 0.0;
for( i = 1; i < BarCount; i++ ) {
if ( Buy[ i ])
{
BuyAdjusted[
i ] = 1;
BuyPriceAdjusted[ i ] = BuyPrice[ i ] + slip;
longStopArray[ i ] = BuyPriceAdjusted[ i
] - BuyPriceAdjusted[ i ]/100*stopPercentage;
flag = 0;
for (j = i + delay; j <
BarCount; j++)
{
longStopArray[ j ] =
longStopArray[ i ];
if (L[ j ] < longStopArray[ j ]
AND flag ==
0)
{
flag
= 1;
sellPriceHelpVar
= Min(O[ j ],longStopArray[ j ]);
SellPriceHelp[
j ] = Min(O[ j ],longStopArray[ j ]);
SellHelp[
j ] = 1;
}
else if (Sell[ j ] AND flag == 0) {
SellAdjusted[
j ] = 1;
SellPriceAdjusted[
j ] = SellPrice[ j ] - slip;
i =
j;
break;
}
else if (Sell[ j ] AND flag == 1) {
SellAdjusted[
j ] = 1;
SellPriceAdjusted[
j ] = sellPriceHelpVar - slip;
i =
j;
break;
}
else if (j == BarCount - 1) {
i =
BarCount;
}
} }
}
}
SetOption("PriceBoundChecking", False); SetBarsRequired(10000,10000); SetOption("MaxOpenPositions", 3 ); SetTradeDelays(0,0,0,0); PositionSize = -100/3; Buy = Cross(C,MA(C,200));
Buy = Ref(Buy,-1); BuyPrice = O; Sell = Cross(MA(C,50),C); Sell = Ref(Sell,-1); SellPrice = O;
stopPercentage = 5; sell_proc(Buy,Sell,stopPercentage);
Buy = BuyAdjusted;
BuyPrice = BuyPriceAdjusted;
Sell = SellAdjusted;
SellPrice = SellPriceAdjusted;
SetChartOptions(0,
chartShowDates); Plot(C,"Last=",colorBlack,64);
PlotShapes(IIf(Buy,shapeUpArrow,shapeNone),colorGreen,0,L,-15); PlotShapes(IIf(Buy,shapeHollowUpArrow,shapeNone),colorWhite,0,L,-15); PlotShapes(IIf(Buy,shapeSmallCircle,shapeNone),colorWhite,0,BuyPrice,0);
PlotShapes(IIf(Sell,shapeDownArrow,shapeNone),colorRed,0,H,-15); PlotShapes(IIf(Sell,shapeHollowDownArrow,shapeNone),colorWhite,0,H,-15); PlotShapes(IIf(Sell,shapeSmallCircle,shapeNone),colorWhite,0,SellPrice,0);
PlotShapes(IIf(SellHelp,shapeSmallDownTriangle,shapeNone),colorRed,0,H,-15); PlotShapes(IIf(SellHelp,shapeHollowSmallDownTriangle,shapeNone),colorWhite,0,H,-15); PlotShapes(IIf(SellHelp,shapeCircle,shapeNone),colorYellow,0,SellPriceHelp,0);
Plot(LongStopArray,"longStopArray",colorWhite,1); Plot(MA(C,200),"MA(C,200)",colorYellow,1); Plot(MA(C,50),"MA(C,50)",colorAqua,1);
----- Original Message -----
Sent: Sunday, March 08, 2009 2:24
PM
Subject: [amibroker] Re: How to control
delaying "some" new buys?
Again ... Can anyone suggest a way to do this?
--- In amibroker@xxxxxxxxxps.com,
"onelkm" <LKMCD1@xxx> wrote: > > In the example below, I buy
3 stocks in a watch list based on the Buy condition. Let's say stock 1 stopped
out, so the next day the system buys a new stock, stock 1A, to replace it and
again holds 3 stocks. But, I want to only buy and replace stock 1 after stock
1 has met the sell condition, which could be several days later. Thus the
system would only hold 2 stocks for a period of time until the sell condition
is met. Is there a way to do this? > >
SetTradeDelays(1,1,1,1); > PositionSize = -100/3; > Buy =
Cross(C,MA(C,200)); > Sell = Cross(MA(C,50),C); >
ApplyStop(stopTypeLoss, stopModePercent, 5); > > Thanks in
advance > Larry >
__._,_.___
**** IMPORTANT PLEASE READ ****
This group is for the discussion between users only.
This is *NOT* technical support channel.
TO GET TECHNICAL SUPPORT send an e-mail directly to
SUPPORT {at} amibroker.com
TO SUBMIT SUGGESTIONS please use FEEDBACK CENTER at
http://www.amibroker.com/feedback/
(submissions sent via other channels won't be considered)
For NEW RELEASE ANNOUNCEMENTS and other news always check DEVLOG:
http://www.amibroker.com/devlog/
__,_._,___
|