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

[amibroker] Custom Backtester Question



PureBytes Links

Trading Reference Links

Need some help with CBT.

In the following CBT code, I want to buy on First of Month with delay =1, MaxOpenPos of 3 and Worst1 of 6.  This works fine.

On other than First of Month, want to test the following:
      (1) Is it best to sell a ticker and not replace if ranking
          for the ticker falls to below Worst2 which is 10, or,
      (2) Is it best to replace ticker (on other than first of month)
          when ranking for the ticker falls to below Worst2.

I can not get CBT to work for (1) and (2).  See below.

Numbers (1) and (2) can be tested separately. In the end, want primary buys to be on first of month with delay of 1 and to only take action on any other day of the month if held ticker's ranking drops below Worst2 of 10.  This means that one will see few buys and few sells on other than the first of the month.

Here is the example CBT code:

// Rotation_with_MidLevelCBT.afl

// An example using Mid Level CBT

MaxOpenPos = 3;//Optimize("MaxOpenPos",3,3,26,1);
Worst1 = 6;// WorstRankHeld for 1st of month only 
Worst2 = 10;//Optimize("Worst2",15,6,26,1);// WorstRankHeld for rest of month 

BuyPrice = SellPrice = ShortPrice = CoverPrice = Close;

Delay = 1;
SetTradeDelays( Delay, Delay, Delay, Delay );

SetOption("MaxOpenPositions", MaxOpenPos  ); 
SetOption("WorstRankHeld", Worst2 ); 
EnableRotationalTrading( True ); 
PositionSize = -100/GetOption("MaxOpenPositions");

firstofmonth = Month() != Ref( Month(), -1 );
firstofmonth2 = Ref(firstofmonth,-Delay);// Need for Mid Level Backtester

Rank = 1/RSI(14); 
PositionScore = rank;
//PositionScore = IIf( firstofmonth, Rank, scoreNoRotate );

//  THIS IS MID LEVEL BACKTESTER
//    Want to buy on First of Month with delay =1, MaxOpenPos of 3
//    and Worst1 of 6.
//    On other than First of Month, want to test the following:
//      (1) Is it best to sell a ticker and not replace if ranking
//          for the ticker falls to below Worst2 which is 10, or,
//      (2) Is it best to replace ticker (on other than first of month)
//          when ranking for the ticker falls to below Worst2.

//      Note: Numbers (1) and (2) can be tested separately. In the end,
//      want most (90+ percent) of the buys to be on first of month
//      with delay of 1 and to only take action on any other day of
//      the month if held ticker's ranking drops below Worst2 of 10.
//      This means that one will see few buys and few sells on other
//      than the first of the month.

SetOption("UseCustomBacktestProc", True );
//SetOption("UseCustomBacktestProc", False );

// FirstOfMonth with MaxOpenPos of 3 and Worst1 of 6.
// This section of code works just fine.
if( Status("action") == actionPortfolio ) 
{ 
   bo = GetBacktesterObject(); 
   bo.PreProcess(); 

   for( bar = 0; bar < BarCount; bar++ ) 
   { 
    if( firstofmonth2[ bar ] ) 
    { 
      TopSymbols = ""; 
      for( i = 0, sig = bo.GetFirstSignal( bar ); 
           sig AND i < Worst1; 
           sig = bo.GetNextSignal( bar ), i++ ) 
      { 
       TopSymbols += sig.Symbol + ","; 
      } 

     _TRACE("Top " + Worst1 + " Symbols: " + TopSymbols ); 

     for( pos = bo.GetFirstOpenPos(); pos; pos = bo.GetNextOpenPos() ) 
      { 
         if( NOT StrFind( TopSymbols, pos.Symbol + "," ) ) 
          { 
            _TRACE("Exiting position not found in top list: " + pos.Symbol ); 
             // exit the position 
            bo.ExitTrade( bar, pos.Symbol, pos.GetPrice( bar, "C" ), 9 ); // modify price field if needed here 
          } 

      } 
    } 


// On other than FirstOfMonth, want to sell a ticker if ranking falls below
// worst2 of 10 and not replace it until next FirstOfMonth. THE FOLLOWING
// DOES NOT WORK AS IT ROTATES INTO THE NEXT TICKER RATHER THAN JUST
// SELLING THE TICKER.
    if( NOT firstofmonth2[ bar ] ) 
    { 
      TopSymbols = ""; 
      for( i = 0, sig = bo.GetFirstSignal( bar ); 
           sig AND i < Worst1; 
           sig = bo.GetNextSignal( bar ), i++ ) 
      { 
       TopSymbols += sig.Symbol + ","; 
      } 

     _TRACE("Top " + Worst2 + " Symbols: " + TopSymbols ); 

     for( pos = bo.GetFirstOpenPos(); pos; pos = bo.GetNextOpenPos() ) 
      { 
         if( NOT StrFind( TopSymbols, pos.Symbol + "," ) ) 
          { 
            _TRACE("Exiting position not found in top list: " + pos.Symbol ); 
             // exit the position, but do NOT replace position
            bo.ExitTrade( bar, pos.Symbol, pos.GetPrice( bar, "C" ), 8 ); // modify price field if needed here 
          } 

      } 
    } 

/* Alternative code for second CBT code section above    
// On other than FirstOfMonth, want to sell a ticker if ranking falls below
// worst2 of 10 and replace. THE FOLLOWING WORKS BUT IT SCREWS UP THE BUY DATES.
// STILL WANT THE PRIMARY BUYS TO BE ON THE FIRST OF THE MONTH WHICH DOES NOT
// HAPPEN WITH THE FOLLOWING CODE.

    if( NOT firstofmonth2[ bar ] ) 
    { 
      TopSymbols = ""; 
      for( i = 0, sig = bo.GetFirstSignal( bar ); 
           sig AND i < Worst1; 
           sig = bo.GetNextSignal( bar ), i++ ) 
      { 
       TopSymbols += sig.Symbol + ","; 
      } 

     _TRACE("Top " + Worst2 + " Symbols: " + TopSymbols ); 

     for( pos = bo.GetFirstOpenPos(); pos; pos = bo.GetNextOpenPos() ) 
      { 
         if( NOT StrFind( TopSymbols, pos.Symbol + "," ) ) 
          { 
            _TRACE("Exiting position not found in top list: " + pos.Symbol ); 
             // exit the position, but do NOT replace position
            bo.ExitTrade( bar, pos.Symbol, pos.GetPrice( bar, "C" ), 8 ); // modify price field if needed here 
          } 

      } 
    } 

*/
     bo.ProcessTradeSignals( bar ); 
    } 
    bo.PostProcess(); 
}

// The End

Thanks in advance for the help.



------------------------------------

**** IMPORTANT PLEASE READ ****
This group is for the discussion between users only.
This is *NOT* technical support channel.

TO GET TECHNICAL SUPPORT send an e-mail directly to 
SUPPORT {at} amibroker.com

TO SUBMIT SUGGESTIONS please use FEEDBACK CENTER at
http://www.amibroker.com/feedback/
(submissions sent via other channels won't be considered)

For NEW RELEASE ANNOUNCEMENTS and other news always check DEVLOG:
http://www.amibroker.com/devlog/

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/