Rotation Strategy / Context question
Author: wmrgrove
Creation Date: 1/2/2013 3:48 PM

#### wmrgrove

#1
I have a question on adding a buy rule to a rotation strategy. When using a data-series versus the actual coded buy-rule I get very different results. Attached is a basic roation strat where I added ;

DataSeries ATRnorm = ATRP.Series(Bars,80) -ATRP.Series(Bars,10) ; after the protected override void Execute()line

then ran the backtest with ; ( one of these enabled )

// if( ATRnorm [bar] > 0 ) or

// if( ATRP.Series(Bars,80)[bar] -ATRP.Series(Bars,10)[bar] > 0 )

Is the reason for different results a "context" issue, and will the actual coded 2nd line function correctly?

Can you tell me what is actually happening when the dataseries is used?

Thanks for any help! Strat code here;

CODE:

#### Eugene

#2
QUOTE:

It's generally a mistake to pass "bar+N" where N > 1; the "bar" here should not exceed "bar+1".
QUOTE:
Attached is a basic roation strat where I added ;

DataSeries ATRnorm = ATRP.Series(Bars,80) -ATRP.Series(Bars,10) ; after the protected override void Execute()line

Where you added this line is the culprit. The DataSeries will always be equal to the DataSeries for the charted (clicked) symbol. So yes, this is a context issue.

If you want to add this extra rule for checking it on a by symbol basis before making an entry, expand the holder class and assign the value:

CODE:

#### wmrgrove

#3
Eugene, thanks for the reply and Happy New Year to you and yours! Bill

#### Eugene

#4
You're welcome Bill.

#### crazyjava

#5
I'd like to continue the question since I am developing rotation strategy based on the sample code similar to the above.
There are several things really puzzled me.
1. If you write such a rotation strategy code and run on a portfolio with 10 stocks, the above code will be executed 10 times.
To test this, add the following line before the loop starts.
CODE:

I have to do the following to work around this and it is ugly.
CODE:

How to get around this in a nicer way?

2. Now the Context issue. Because the code will always select the first stock (data set) as its first default context, if the first stock has much less date/year coverage, it is really hard to get the remaining data sets data lined up from the earliest dates possible to present. I illustrate here:
S1 - First Stock. E.g. 1/1/2008 to present
S2 - 1/1/2006 to present
S3 - 1/1/2002 to present
SPY - 1/1/2001 to present (the longest dates coverage).
If you synchronize data, you will get the rest symbols starts from 1/1/2008.
If you SetContext("SPY", false);
Every time you RestoreConext(), it goes back to the context of S1. Because you need call it when But and Sell positions. The logic getting really messy. To create a dummy data set and put it as a first stock may work but not elegant.

For Rotation Strategy, it would be ideal have a way to stop auto run through the portfolio (or stop run at the first stock), and have a way to Set Default Context other than on the first stock.

For the above example, the rotation strategy can set default context on SPY (the longest coverage). The code can check at a given bar, if a symbol has data.

Let me know if you have a solution. Thanks.

#### crazyjava

#6
I think I found the answer. I should select one symbol, e.g. SPY, and run the code. Then the code will not run 10 times (MSB mode?). In addition, the default context will be SPY. I definitely should read more on the forum and learn. Thanks.

#### Eugene

#7
FAQ | Strategies and WealthScript > "A Rotation strategy isn't working like it should."

#### crazyjava

#8
Thanks Eugene. It's well written there.

#### Carova

#9
What is the proper way to define a complete DataSeries in a Rotation script? Is something like this possible? Would it be cached correctly?

Thanks!
Vince

CODE:

#10

#### Carova

#11
Simple - ease of coding. Using "roc[bar]" instead of "ROC.Series(Bars.Close, Period)[bar]" makes little difference if only one item is being used. But if a relatively large number of items/locations need to be coded the simplified form is to be preferred to improve readability and comprehension.

Vince

#### Eugene

#12
I can't agree with that. A few lines higher or lower won't make a difference to me. As long as the series is being assigned within Set*/RestoreContext, of course.

On the surface it looks like the placement might work (except the error i.e. "New" vs "new") but you should verify it for yourself.

#### Carova

#13
I will verify, but I was wondering what needed to be done to ensure that the series will be cached properly?

Vince

#### Cone

#14
Indicator caching is part of the indicator construction. You don't have to worry about it. You can delete 2 statements and just use this one -

CODE:

#### Eugene

#15
Re:
CODE:

...from which he essentially is trying to walk away (see post #1) ;)

#### Carova

#16
It appears that the structure that I suggested works correctly, including proper caching.

Thanks for the help!

Vince

#### Carova

#17
I seem to be doing something wrong. I am looping through my positions and attempting to see how long the positions are being held.

CODE:

But it appears that the BarsHeld is not incrementing as expected.

QUOTE:
12/6/2002 12:00:00 AM
496
12/13/2002 12:00:00 AM
496
...
13
5/25/2012 12:00:00 AM
13
6/1/2012 12:00:00 AM
13

What am I doing incorrectly?

Vince

#### Eugene

#18
Vince,

Please review the QuickRef for BarsHeld and you'll know what's going on here (and it's not rotation specific).

What will work is something like this:
CODE: