Mean Reversion Strategy - Nick Radge for ThinkorSwim

Zachc

Zachc

Member
VIP
Warehouse
Nick recently shared a new strategy in his newsletter which you can sign up for here Trade Long Term Registration. This strategy is a Mean Reversion short term trade that seems to work pretty well in longer-term choppy markets. It was developed to complement a long term trend following strategy to smooth out some of the rough points during these sideways markets which trend following strategies have a difficult time in.

Let's dive into the strategy as Nick describes it in his newsletter.

1. Define the upward trend of the stock using a 100-day simple moving average. If the stock is above that average then it's deemed to be bullish.

2. Look for a pullback in that trend using a 2-day RSI. When that falls below 10, the stock is considered heavily oversold.

3. Rank any candidates using Rate of Change and select the top 5. (Not factored into the backtest but should be used if you are trading live)

4. Calculate the Average True Range (ATR) for the prior 10 days. Subtract this from the current low and place a LIMIT buy order at that level for tomorrow.

5. If the LIMIT buy level is met, then await for the first higher close.

6. Exit the position on the following open.

Example Trade



Back Test and Parameters

20 random securities
20 Years of data
100 shares per trade
10000 Starting Capital

Basic Strategy exit with Higher High Key Stats



P/L and Return Distribution



I also wanted to see what the effect of just using the RSI Cross under 70 would do and while it did extend the trade time a little longer it introduced a lot of extra volatility into the strategy which invalidates its original purpose.


Ruby:
## Mean Reversion Strategy - Nick Radge
#Coded in thinkScript by - Zach Corum
#Coded for the useThinkscript community www.usethinkscript.com

#Basic Guide
#When a stock is trending higher look for a heavily oversold point. Once an oversold level is #attained, place a buy order below the market for the following day. If that order is filled, await #the first higher close then exit the position on the next open.


input PortfolioSize = 10000;
input TradeSizePct = .05;
input TurnOnPsize = {default "Off", "On"};
input size = 100;
input MovingAverage = 100;
input ExitStrat = {default "Next Higher Close", "RSI Cross"};
input RSIl = 2;
input RSIOver = 10;
input ATRl = 10;

#Position Sizing
def pSize = PortfolioSize;
def sizeP = PortfolioSize * TradeSizePct;
def tSize = If (TurnOnPsize, sizeP / open[-1], size);

def bullbear = SimpleMovingAvg(length = MovingAverage) < close;
def pullBack = RSI(length = RSIl, "over sold" = RSIOver);
def ATR = close - ATR(ATRl);
def ATRentry = ATR >= low[-1] and ATR <= high[-1];

plot entry = pullBack < RSIOver and bullbear and ATRentry ;
plot CloseHigh = !entry[1] and close > close[1] and close > close[2];
plot movAvg = SimpleMovingAvg(length = MovingAverage);
plot exit = If (ExitStrat, pullBack crosses below RSI(2).overbought, !entry and CloseHigh);
#plot exit = RSI(length = 2, "over bought" = 70) crosses below 70;

entry.SetPaintingStrategy(paintingStrategy = PaintingStrategy.BOOLEAN_POINTS);
entry.SetLineWeight(4);
entry.SetDefaultColor(color = Color.BLUE);
Closehigh.SetPaintingStrategy(paintingStrategy = PaintingStrategy.BOOLEAN_ARROW_DOWN);
Closehigh.SetLineWeight(4);
Closehigh.SetDefaultColor(color = Color.LIME);

AddOrder(OrderType.BUY_TO_OPEN, entry and bullbear, ATR, tSize, tickcolor = Color.DARK_ORANGE, arrowcolor = Color.DARK_ORANGE);
AddOrder(type = OrderType.SELL_TO_CLOSE, exit, tickcolor = Color.GRAY, arrowcolor = Color.GRAY, name = "LongEX");
 
Last edited:
Zachc

Zachc

Member
VIP
Warehouse
Bug
Ruby:
plot CloseHigh = close > close[1] and close > close[2];
There was a possibility for a close signal to be on the same candle as an order entry which would close you out of the trade the day after entry.
To mitigate that I changed the line above and moved it below plot entry

New Code
Ruby:
plot CloseHigh = !entry[1] and close > close[1] and close > close[2];
 

Top