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

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



PureBytes Links

Trading Reference Links

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@xxxxxxxxxx>
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@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
> 
> 
> 
> 
>


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/