PureBytes Links
Trading Reference Links
|
Tomasz
I made the change that you suggested as follows. Subsequent to
running the backtest I get an error message on the "if(
openpos.IsOpen AND openpos.IsLong )".
/*====================================================================
==========
Global Settings
======================================================================
========*/
SetFormulaName("Testing a Creation of Trade Ledger"); /* name it for
backtest report identification */
SetBarsRequired(1000000,0); /* this ensures that the charts include
all bars AND NOT just those on screen */
SetOption("InitialEquity", 100000); /* starting capital */
SetOption("CommissionAmount",8); /* commissions AND cost */
SetOption("CommissionMode", 2); /* set commissions AND costs as $ per
trade */
SetTradeDelays( 1, 1, 1, 1);
SetOption("PriceBoundChecking", 1); /* trade only within the chart
bar's price range */
SetOption("UsePrevBarEquityForPosSizing", 1); /* set the use of last
bars equity for trade size */
SetOption("AllowPositionShrinking", True);
SetOption("MinShares", 100);
SetOption("AccountMargin", 100);
RoundLotSize = 1 ;
PositionSize = - 10; /* trade size will be 10% of available equity */
TradeDate = DateTime();
SetCustomBacktestProc("");
MaxBuys = 3; // Set no more than 4 buys per day
if( Status("action") == actionPortfolio )
{
bo = GetBacktesterObject();
bo.PreProcess();
for( i = 0; i < BarCount; i++ )
{
Symbol = " ";
TransType = "";
Rank = 0;
Shares = 0;
TransAmount = 0;
Reason = 0;
Price = 0;
cntBuys = 0;
Balance = bo.Equity;
// look at new signals and exclude signals if they exceed maxBuys
for( sig = bo.GetFirstSignal(i); sig; sig =
bo.GetNextSignal(i) )
{
// check for entry signal
if( sig.IsEntry() )
{
if( cntBuys > MaxBuys )
{
sig.PosSize = 0;
}
else
{
cntBuys = cntBuys + 1;
Symbol = sig.Symbol;
TransType = "Buy";
Rank = sig.PosScore;
Shares = round((bo.Equity / -
sig.PosSize)/sig.Price);
Price = sig.Price;
TransAmount = Shares * Price;
Balance = Balance -
TransAmount;
Reason = sig.Reason;
bo.RawTextOutput(
Symbol +
"\t" + TransType +
"\t" + DateTimeToStr(TradeDate[ i ]) +
"\t" + Price +
"\t" + Rank +
"\t" + "Shares " + Shares +
"\t" + "Amount " + TransAmount +
"\t" + "Balance " + Balance +
"\t" + "Reason " + Reason
);
}
}
else if (sig.IsExit() AND sig.Type == 2 )
{
// scan through open positions
// for( openpos = bo.GetFirstOpenPos();
openpos; openpos = bo.GetNextOpenPos() )
// {
openpos = bo.FindOpenPos(
sig.Symbol );
// check for entry signal and long
signal
if( openpos.IsOpen AND
openpos.IsLong )
// if(openpos.IsOpen AND
openpos.IsLong AND openpos.Symbol == sig.Symbol)
{
Symbol = sig.Symbol;
TransType = "Sell";
Rank = sig.PosScore;
Price = sig.Price;
TransAmount = Shares * Price;
Balance = Balance +
TransAmount;
Reason = sig.Reason;
bo.RawTextOutput(
Symbol +
"\t" + TransType +
"\t" + DateTimeToStr(TradeDate[ i ]) +
"\t" + Price +
"\t" + Rank +
"\t" + "Shares " + Shares +
"\t" + "Amount " + TransAmount +
"\t" + "Balance " + Balance +
"\t" + "Reason " + Reason
);
}
// }
}
}
bo.ProcessTradeSignals( i );
}
bo.PostProcess();
}
//fast = Optimize("fast", 12, 5, 20, 1 );
//slow = Optimize("slow", 26, 10, 25, 1 );
Buy=Cross(MACD(12,26),Signal(12,26));
Sell=Cross(Signal(12,26),MACD(12,26));
--- In amibroker@xxxxxxxxxxxxxxx, "Tomasz Janeczko" <groups@xxx>
wrote:
>
> Hello,
>
> Or.... use FindOpenPos without loop - which is faster/easier:
>
> openpos = bo.FindOpenPos( sig.Symbol );
>
> Best regards,
> Tomasz Janeczko
> amibroker.com
> ----- Original Message -----
> From: "gp_sydney" <gp.investment@xxx>
> To: <amibroker@xxxxxxxxxxxxxxx>
> Sent: Thursday, September 06, 2007 10:39 AM
> Subject: [amibroker] Re: Limiting Sell to Open Position in CBI
>
>
> > The way you're using the open position list is not correct. You
need
> > to match the open position symbol with the signal symbol to ensure
> > you're referencing the same open position stock as the sell signal
> > refers to. The way you have it now, as long as there is a single
long
> > position in the open position list, all sell signals will be
printed.
> >
> > Try changing the open position conditional statement to:
> >
> > if(openpos.IsOpen AND openpos.IsLong AND openpos.Symbol ==
sig.Symbol)
> >
> > You could also then put a "break" at the end of the following
code, as
> > once you have found a matching symbol you don't need to continue
with
> > the for loop.
> >
> > And, you shouldn't need to check "IsOpen" when traversing the open
> > position list. All trades in the open position list should be
open.
> >
> > Regards,
> > GP
> >
> >
> > --- In amibroker@xxxxxxxxxxxxxxx, "tipequity" <l3456@> wrote:
> >>
> >> Below is a code I am playing with. The final objective is to
have
> >> backtest report that keeps ledger of buys and sells similar to
> >> quicken. The buy side of the trades seems to work fine. On the
sell
> >> side it is selling with no open position. How can I limit the
sell to
> >> closing open positins. Many thanks in advance for you help and
> >> comments.
> >>
>
>> /*=================================================================
===
> >> ==========
> >> Global Settings
> >>
======================================================================
> >> ========*/
> >> SetFormulaName("Testing a Creation of Trade Ledger"); /* name it
for
> >> backtest report identification */
> >> SetBarsRequired(1000000,0); /* this ensures that the charts
include
> >> all bars AND NOT just those on screen */
> >> SetOption("InitialEquity", 100000); /* starting capital */
> >> SetOption("CommissionAmount",8); /* commissions AND cost */
> >> SetOption("CommissionMode", 2); /* set commissions AND costs as
$ per
> >> trade */
> >> SetTradeDelays( 1, 1, 1, 1);
> >> SetOption("PriceBoundChecking", 1); /* trade only within the
chart
> >> bar's price range */
> >> SetOption("UsePrevBarEquityForPosSizing", 1); /* set the use of
last
> >> bars equity for trade size */
> >> SetOption("AllowPositionShrinking", True);
> >> SetOption("MinShares", 100);
> >> SetOption("AccountMargin", 100);
> >> RoundLotSize = 1 ;
> >> PositionSize = - 10; /* trade size will be 10% of available
equity */
> >>
> >> TradeDate = DateTime();
> >>
> >> SetCustomBacktestProc("");
> >>
> >> MaxBuys = 3; // Set no more than 4 buys per day
> >>
> >> if( Status("action") == actionPortfolio )
> >> {
> >> bo = GetBacktesterObject();
> >> bo.PreProcess();
> >> for( i = 0; i < BarCount; i++ )
> >> {
> >> Symbol = " ";
> >> TransType = "";
> >> Rank = 0;
> >> Shares = 0;
> >> TransAmount = 0;
> >> Reason = 0;
> >> Price = 0;
> >> cntBuys = 0;
> >> Balance = bo.Equity;
> >> // look at new signals and exclude signals if they exceed
maxBuys
> >> for( sig = bo.GetFirstSignal(i); sig; sig =
> >> bo.GetNextSignal(i) )
> >> {
> >> // check for entry signal
> >> if( sig.IsEntry() )
> >> {
> >> if( cntBuys > MaxBuys )
> >> {
> >> sig.PosSize = 0;
> >> }
> >> else
> >> {
> >> cntBuys = cntBuys + 1;
> >> Symbol = sig.Symbol;
> >> TransType = "Buy";
> >> Rank = sig.PosScore;
> >> Shares = round((bo.Equity / -
> >> sig.PosSize)/sig.Price);
> >> Price = sig.Price;
> >> TransAmount = Shares * Price;
> >> Balance = Balance -
> >> TransAmount;
> >> Reason = sig.Reason;
> >>
> >>
> >> bo.RawTextOutput(
> >>
> >> Symbol +
> >>
> >> "\t" + TransType +
> >>
> >> "\t" + DateTimeToStr(TradeDate[ i ]) +
> >>
> >> "\t" + Price +
> >>
> >> "\t" + Rank +
> >>
> >> "\t" + "Shares " + Shares +
> >>
> >> "\t" + "Amount " + TransAmount +
> >>
> >> "\t" + "Balance " + Balance +
> >>
> >> "\t" + "Reason " + Reason
> >>
> >> );
> >> }
> >> }
> >> else if (sig.IsExit() AND sig.Type == 2 )
> >> {
> >> // scan through open positions
> >> for( openpos = bo.GetFirstOpenPos();
> >> openpos; openpos = bo.GetNextOpenPos() ) {
> >> // check for entry signal and long
> >> signal
> >> if( openpos.IsOpen AND
> >> openpos.IsLong )
> >> {
> >> Symbol = sig.Symbol;
> >> TransType = "Sell";
> >> Rank = sig.PosScore;
> >> Price = sig.Price;
> >> TransAmount = Shares * Price;
> >> Balance = Balance +
> >> TransAmount;
> >> Reason = sig.Reason;
> >>
> >> bo.RawTextOutput(
> >>
> >> Symbol +
> >>
> >> "\t" + TransType +
> >>
> >> "\t" + DateTimeToStr(TradeDate[ i ]) +
> >>
> >> "\t" + Price +
> >>
> >> "\t" + Rank +
> >>
> >> "\t" + "Shares " + Shares +
> >>
> >> "\t" + "Amount " + TransAmount +
> >>
> >> "\t" + "Balance " + Balance +
> >>
> >> "\t" + "Reason " + Reason
> >>
> >> );
> >> }
> >> }
> >> }
> >> }
> >> bo.ProcessTradeSignals( i );
> >> }
> >> bo.PostProcess();
> >> }
> >>
> >>
> >> //fast = Optimize("fast", 12, 5, 20, 1 );
> >> //slow = Optimize("slow", 26, 10, 25, 1 );
> >> Buy=Cross(MACD(12,26),Signal(12,26));
> >> Sell=Cross(Signal(12,26),MACD(12,26));
> >>
> >
> >
> >
> >
> > 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/
|