[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 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@xxx> 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

<*> 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/