hi,

I attach some code that might be interesting to some and illustrates what I was 
saying about problems when using signals based on a cross. It is based on an 
idea I got from an other poster on this board who wrote some code that tracks 
local tops and bottoms. A breakout of these lines triggers a buy or short. When 
you backtest this code on the oil and/or natural gas future you will see that 
this system is highly profitable. However, because it uses the cross price when 
the signal takes place it is impossible to execute such a system in the 
practice. Many signals you will get but also many you will miss because when 
the cross takes place the cross price is history and to execute the trade the 
price will have to fall back.

regads, Ed

p.s. this code has nothing to do with pyramiding

 



  ----- Original Message ----- 
  From: Edward Pottasch 
  To: [email protected] 
  Sent: Friday, July 03, 2009 1:02 PM
  Subject: Re: [amibroker] Re: pyramiding - problems with code






  the code is just an example and I believe I used your setup system:

  Buy = ( Cross( MA( C, 10 ), MA( C, 50 ) ) ) * timearray;
  Buy = Ref(Buy,-1); BuyPrice = O;

  in this case you use the Close price in the Buy statement. In real time 
systems the Close price is equal to the Last price. So within the timeframe you 
use (e.g. 1 minute bars) a signal may appear and disappear within the bar. You 
are only interested in the true close price of that bar. This is known only at 
the end of the bar. That's why when adding Buy = Ref(Buy,-1); you shift the Buy 
array 1 element forward and use the signal of the previous bar and you enter at 
the open. This way you avoid entering a trade of which the signal disappears 
later in the bar.

  Another reason is that I myself use it for my real time system is that 
trading a cross is often not realistic in the practice unless you enter a trade 
using Market (MKT) orders. For instance if you let the High cross a certain 
level you avoid getting multiple signals and also the signal will not disappear 
but often this is exacly the time that the price is running away from you and 
often you will not be able to enter the trade at the cross price. So I stopped 
fooling myself with these 20000% per year results and wait for the bar to 
finish and enter at the open of the next bar.

  regards, Ed



    ----- Original Message ----- 
    From: gborrageiro 
    To: [email protected] 
    Sent: Friday, July 03, 2009 12:31 PM
    Subject: [amibroker] Re: pyramiding - problems with code


    hi Edward,

    Why do you utilize the buy and short price from the previous bar?
    Buy = Ref( Buy, -1 );
    Short = Ref( Short, -1 );

    thx

    --- In [email protected], "Edward Pottasch" <empotta...@...> wrote:
    >
    > do you ever read replies?
    > 
    > 
    > ----- Original Message ----- 
    > From: gborrageiro 
    > To: [email protected] 
    > Sent: Thursday, June 25, 2009 6:36 PM
    > Subject: [amibroker] pyramiding - problems with code
    > 
    > 
    > 
    > 
    > 
    > hi,
    > 
    > I am testing some scaling out strategies and can't get the backtester to 
go short. There's a prob with my code somewhere but I just can't see where. 
    > 
    > Your help would be appreciated! thanks
    > 
    > SetTradeDelays( 0, 0, 0, 0 );
    > BuyPrice = Avg;
    > ShortPrice = Avg;
    > SetOption( "FuturesMode", True );
    > SetOption( "InitialEquity", 100000 );
    > 
    > fast = ema(avg,10);
    > slow = ema(avg,100);
    > 
    > Buy = Cross( fast, slow ) ;
    > Short = Cross( slow, fast ) ;
    > Sell = 0;
    > Cover = 0;
    > 
    > FirstProfitTarget = 0.02; 
    > TrailingStop = 0.06; 
    > StopLoss = 0.02;
    > 
    > priceatbuy = 0;
    > highsincebuy = 0;
    > priceatshort = 0;
    > lowsinceshort = 0;
    > 
    > exit = 0;
    > 
    > for ( i = 0; i < BarCount; i++ )
    > {
    > if ( priceatbuy == 0 AND Buy[ i ] )
    > {
    > priceatbuy = BuyPrice[ i ];
    > }
    > 
    > if ( priceatshort == 0 AND Short[ i ] )
    > {
    > priceatshort = ShortPrice[ i ];
    > }
    > 
    > if ( priceatbuy > 0 )
    > {
    > highsincebuy = Max( High[ i ], highsincebuy );
    > 
    > if ( exit == 0 AND
    > High[ i ] >= ( 1 + FirstProfitTarget * 0.01 ) * priceatbuy )
    > {
    > // first profit target hit - scale-out
    > exit = 1;
    > Buy[ i ] = sigScaleOut;
    > }
    > 
    > if ( Low[ i ] <= ( 1 - TrailingStop * 0.01 ) * highsincebuy )
    > {
    > // trailing stop hit - exit
    > exit = 2;
    > SellPrice[ i ] = Min( Avg[ i ], ( 1 - TrailingStop * 0.01 ) * 
highsincebuy );
    > }
    > 
    > if ( Low[ i ] <= ( 1 - StopLoss * 0.01 ) * priceatbuy )
    > {
    > // Stop Loss hit - exit
    > exit = 3;
    > SellPrice[ i ] = Min( Avg[ i ], ( 1 - StopLoss * 0.01 ) * priceatbuy );
    > }
    > 
    > if ( exit >= 2 )
    > {
    > Buy[ i ] = 0;
    > Sell[ i ] = exit + 1; // mark appropriate exit code
    > exit = 0;
    > priceatbuy = 0; // reset price
    > highsincebuy = 0;
    > }
    > }
    > 
    > if ( priceatshort > 0 )
    > {
    > lowsinceshort = Min( Low[ i ], lowsinceshort );
    > 
    > if ( exit == 0 AND
    > Low[ i ] <= ( 1 - FirstProfitTarget * 0.01 ) * priceatshort )
    > {
    > // first profit target hit - scale-out
    > exit = 1;
    > Short[ i ] = sigScaleOut;
    > 
    > }
    > 
    > if ( High[ i ] >= ( 1 + TrailingStop * 0.01 ) * lowsinceshort )
    > {
    > // trailing stop hit - exit
    > exit = 2;
    > CoverPrice[ i ] = Max( Avg[ i ], ( 1 + TrailingStop * 0.01 ) * 
lowsinceshort );
    > }
    > 
    > if ( High[ i ] >= ( 1 + StopLoss * 0.01 ) * priceatshort )
    > {
    > // Stop Loss hit - exit
    > exit = 3;
    > CoverPrice[ i ] = Max( Avg[ i ], ( 1 + StopLoss * 0.01 ) * priceatshort );
    > }
    > 
    > if ( exit >= 2 )
    > {
    > Short[ i ] = 0;
    > Cover[ i ] = exit + 1; // mark appropriate exit code
    > exit = 0;
    > priceatshort = 0; // reset price
    > lowsinceshort = 0;
    > }
    > }
    > }
    > 
    > SetPositionSize( 2, spsShares );
    > 
    > SetPositionSize( 50, spsPercentOfPosition * ( Buy == sigScaleOut ) ); // 
scale out 50% of position
    > //SetPositionSize( 50, spsPercentOfEquity );
    >




  

Reply via email to