[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

Got it, Amibroker doesn't what me to be redundant (LOL).

Thanks Tomasz, Thanks GP

--- In amibroker@xxxxxxxxxxxxxxx, "Tomasz Janeczko" <groups@xxx> 
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@xxx>
> 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/