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

Re: [amibroker] Re: Low Level CBT Executing Sales before Buys



PureBytes Links

Trading Reference Links

Hello,

That's similar thing: you should simply write two loops. One loop,
will go through open position list and check only those positions
that have too large size and need to be scaled down.
Once this is made you run similar loop again, this time only
processing positions that are too small - scaling them up.

If you need any more complex thing - you always can apply
the same multi-stage processing scheme.

Best regards,
Tomasz Janeczko
amibroker.com
----- Original Message ----- 
From: "vlanschot" <vlanschot@xxxxxxxxx>
To: <amibroker@xxxxxxxxxxxxxxx>
Sent: Monday, October 08, 2007 1:26 PM
Subject: [amibroker] Re: Low Level CBT Executing Sales before Buys


> Thank you Tomasz,
> 
> Nobody doubts the flexibility of the CBT, and you show another 
> example of its power. 
> 
> I should have been clearer, so allow me to follow up with a question: 
> can this be done also for ScaleTrades? This relates to specifically 
> my application: I'm mostly using rebalancing trades, i.e. by applying 
> your "bo.ScaleTrade"-code in the Knowledge Centre:
> 
> http://www.amibroker.com/kb/2006/03/06/re-balancing-open-positions/
> 
> How would this work here, since I'm always in the "Open Positions" 
> loop "only" to correct my holdings/weights, i.e. how can I first 
> execute all the ScaleOuts (generate cash), and then divide the cash 
> over the ScaleIns? In a general sense, are there ways to control the 
> cash flows in a portfolio (preferably at the individual security 
> level) when one applies ScaleTrades to rebalance weights?
> 
> 
> Sorry for taking the original query into this direction.
> 
> Thx,
> 
> PS
> 
> --- In amibroker@xxxxxxxxxxxxxxx, "Tomasz Janeczko" <groups@xxx> 
> wrote:
>>
>> Hello,
>> 
>> Of course you can.
>> You can do *everything* you need with CBT.  I can not stress it 
> more.
>> 
>> The order in which trades are executed is the order in which you 
> call EnterTrade/ExitTrade functions.
>> So if you call ExitTrade for TradeA before EnterTrade for TradeB
>> it will be excuted EXACTLY in this order (first TradeA will be 
> exited and cash returned
>> to the account and then TradeB will be entered).
>> 
>> So it is very easy and straightforward. Just call 
> EnterTrade/ExitTrade as you would normally place orders
>> and they are executed exactly in that order.
>> 
>> You are NOT limited to perform operations in signal order (signals 
> are sorted by position score
>> entry signals first, but you are NOT limited to execute them in 
> that order).
>> 
>> Actually this is what default built-in backtester routine does.
>> It performs several loops.
>> First loop iterates through signals to see if there are any pending 
> EXITS matching open positions
>> and EXITS them. Then It goes through signal list AGAIN and checks 
> entry signals.
>> 
>> So to answer your question you need to write 2 loops !
>> 
>> for( sig = bo.GetFirstSignal(i); sig; sig = bo.GetNextSignal(i) ) 
>> { 
>> // THIS LOOP PROCESSES EXIT SIGNALS 
>> OpenPos = bo.FindOpenPos( sig.Symbol ); 
>> if( Sig.IsExit() AND OpenPos ) 
>> { 
>>    bo.ExitTrade( i, OpenPos.symbol,  sig.Price, 1); 
>> } 
>> } 
>> 
>> for( sig = bo.GetFirstSignal(i); sig; sig = bo.GetNextSignal(i) ) 
>> { 
>> // THIS LOOP PROCESSES ENTRY  SIGNALS 
>> if( sig.IsEntry() ) 
>> { 
>>   bo.EnterTrade( i, sig.Symbol,  True, sig.Price, sig.PosSize, 
> sig.PosScore, RoundLotSize = 1); 
>> 
>>   ...... 
>> } 
>> } 
>> //// 
>> Best regards,
>> Tomasz Janeczko
>> amibroker.com
>> ----- Original Message ----- 
>> From: "vlanschot" <vlanschot@xxx>
>> To: <amibroker@xxxxxxxxxxxxxxx>
>> Sent: Monday, October 08, 2007 9:50 AM
>> Subject: [amibroker] Re: Low Level CBT Executing Sales before Buys
>> 
>> 
>> > TJ may possibly correct me on this (if so, than hopefully with 
>> > example code), but as far as I know you cannot (if that is your 
>> > intention) prioritize the sales/shorts to be executed first(in a 
>> > seperate loop as it were, and thereby generate cash) before you 
>> > execute the buys/longs.
>> > 
>> > PS
>> > --- In amibroker@xxxxxxxxxxxxxxx, "tipequity" <l3456@> wrote:
>> >>
>> >> Can someone point out a way that the code below would execute 
> sales 
>> >> before buys. TIA Cam
>> >> 
>> >> SetBacktestMode( backtestRegularRaw ); 
>> >> SetCustomBacktestProc(""); 
>> >> MaxBuys = 3; 
>> >> if( Status("action") == actionPortfolio )
>> >> { 
>> >> bo = GetBacktesterObject(); 
>> >> bo.PreProcess(); 
>> >> MaxHoldingPer = 14;
>> >> TradeDate = DateTime(); 
>> >>    for( i = 0; i < BarCount; i++ ) 
>> >>   { 
>> >> cntBuys = 0; 
>> >> for( OP = bo.GetFirstOpenPos(); OP; OP = 
>> >> bo.GetNextOpenPos() )
>> >> { 
>> >> if ( OP.BarsInTrade >= MaxHoldingPer) 
>> >> bo.ExitTrade( i, OP.Symbol, 
>> >> OP.GetPrice(i, "C"), 1);
>> >> }
>> >> for( sig = bo.GetFirstSignal(i); sig; sig = 
>> >> bo.GetNextSignal(i) )
>> >> { 
>> >> OpenPos = bo.FindOpenPos( sig.Symbol );
>> >> 
>> >> if( Sig.IsExit() AND OpenPos )
>> >> {
>> >> bo.ExitTrade( i, OpenPos.symbol, 
>> >> sig.Price, 1); 
>> >> bo.RawTextOutput(
>> >> DateTimeToStr(TradeDate[ i ])+ " Sell "+sig.symbol()+" 
>> >> Cash "+bo.cash); 
>> >> }
>> >> // look at new signals AND Exclude signals if they 
>> >> exceed maxBuys 
>> >> if( sig.IsEntry() ) 
>> >> { 
>> >> bo.RawTextOutput(
>> >> DateTimeToStr(TradeDate[ i ])+ " BuySig "+sig.symbol()+" 
>> >> Cash "+bo.cash); 
>> >> if( cntBuys > MaxBuys )
>> >> {   
>> >> bo.RawTextOutput(
>> >> DateTimeToStr(TradeDate[ i ])+ " Rejected BuySig "+sig.symbol
>> >> ()); 
>> >> 
>> >> } 
>> >> else if( IsNull(OpenPos))
>> >> { 
>> >> bo.RawTextOutput(
>> >> DateTimeToStr(TradeDate[ i ])+ " Buy "+sig.symbol()+" 
>> >> Cash "+bo.cash); 
>> >> cntBuys = cntBuys + 1;
>> >> bo.EnterTrade( i, sig.Symbol, 
>> >> True, sig.Price, sig.PosSize, sig.PosScore, RoundLotSize = 1);
>> >> bo.RawTextOutput(
>> >> DateTimeToStr(TradeDate[ i ])+ " Buy2 "+sig.symbol()+" 
>> >> Cash "+bo.cash); 
>> >> } 
>> >>    } 
>> >> } 
>> >> bo.HandleStops(i);
>> >> bo.UpdateStats(i,1);
>> >> bo.UpdateStats(i,2);
>> >>   } 
>> >>    bo.PostProcess(); 
>> >> }
>> >>
>> > 
>> > 
>> > 
>> > 
>> > 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/