[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[amibroker] Re: Limiting Sell to Open Position in CBI



PureBytes Links

Trading Reference Links

The redundancy is not the problem. It's unnecessary but will still
work. The problem is as in the second part of Tomasz's comment, not
checking the returned object value and then trying to use a null
object. That's the same reason the original for loop had "openPos" as
the termination/continuation condition, so you stop at the end of the
list.

Regards,
GP


--- In amibroker@xxxxxxxxxxxxxxx, "tipequity" <l3456@xxx> wrote:
>
> Got it, Amibroker doesn't what me to be redundant (LOL).
> 
> Thanks Tomasz, Thanks GP
> 
> --- In amibroker@xxxxxxxxxxxxxxx, "Tomasz Janeczko" <groups@> 
> wrote:
> >
> > Open Position is open by definition. There is no sense in checking 
> if it is open.
> > What you should check is the pointer you are getting because there 
> may be no
> > matching open position for given symbol
> > 
> > openpos = bo.FindOpenPos(  sig.Symbol );
> > 
> > if( openpos )
> > {
> >  // open position for given symbol actually exists!
> >  // so you can process it
> > }
> > else
> > {
> >  // open position for given symbol does NOT exist
> >  // don't do anything
> > }
> > 
> > Best regards,
> > Tomasz Janeczko
> > amibroker.com
> > ----- Original Message ----- 
> > From: "tipequity" <l3456@>
> > To: <amibroker@xxxxxxxxxxxxxxx>
> > Sent: Thursday, September 06, 2007 4:48 PM
> > Subject: [amibroker] Re: Limiting Sell to Open Position in CBI
> > 
> > 
> > > 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@> 
> > > 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@>
> > >> 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
> > > 
> > > 
> > > 
> > > 
> > >
> >
>




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/