SPX Trading Strategy for ThinkorSwim

Status
Not open for further replies.
1. I'm asking regarding the winrate reported in the top left corner. I'm curious how it's calculated because it seems that some entries will hit a reasonable stop loss before turning around and becoming profitable. It's currently showing me a 97% winrate, but I don't understand how that's possible. Does this study provide a stop loss as well, or is that for the user to determine?

2. I'm pointing out that if I choose "no" in options "do not cross before start," then the winrate statistic goes away completely and seems to not work.
Understood and the answer is the same. “ExitAt” option determines when to exit. If you select profitDeltaOrMACD, it will exit at a static delta from entry price that you define or when MACD dots change color. If you select MACDOnly, it will exit when MACD dots change color. If you select ATRorMACD, it will exit at an ATR target or MACD dots change color. We can add more options if proven to be good strategy. However, it will eventually exit and looks at entry price vs exit price to determine if it was a profitable trade. Default options are very tight at 1 point target

Can you share a screenshot of what your options are and your chart? I haven’t seen the script fail. May be there is an edge case you discovered..
 

New Indicator: Buy the Dip

Check out our Buy the Dip indicator and see how it can help you find profitable swing trading ideas. Scanner, watchlist columns, and add-ons are included.

Download the indicator

Join useThinkScript to post your question to a community of 21,000+ developers and traders.

Understood and the answer is the same. “ExitAt” option determines when to exit. If you select profitDeltaOrMACD, it will exit at a static delta from entry price that you define or when MACD dots change color. If you select MACDOnly, it will exit when MACD dots change color. If you select ATRorMACD, it will exit at an ATR target or MACD dots change color. We can add more options if proven to be good strategy. However, it will eventually exit and looks at entry price vs exit price to determine if it was a profitable trade. Default options are very tight at 1 point target

Can you share a screenshot of what your options are and your chart? I haven’t seen the script fail. May be there is an edge case you discovered..
1. Ok, so if I understand correctly, the exit, whether profit or loss happens with "exitat." I understand now, as I previously thought that was only a profit target exit.

2. See images. I hope it's not a user error on my part.
ynqHC0b.jpg

fVl6dH9.jpg
 
Nope, you discovered a bug. Here is a fix.

Python:
# SPX Strategy
# Strategy designed by Hypoluxa
# barbaros - v1  - 2021/02/25
# barbaros - v2  - 2021/02/25 - added warning arrows, alerts, statistics and non SPX trading option
# barbaros - v3  - 2021/02/26 - added SMA plots, chart type, and price plot
# barbaros - v4  - 2021/03/02 - added trade time limit and do not cross before start time
# barbaros - v5  - 2021/03/02 - added direction label
# barbaros - v6  - 2021/03/03 - added alerts, exit at profit delta, arrows for exiting position, and changed defaults to show all
# barbaros - v7  - 2021/03/03 - removed inputs for disabling arrows - this can be done in ToS already,
#                              added profit target line, ExitAt selection and ATR target
# barbaros - v8  - 2021/03/05 - added profit target label, changed the exit strategy to high/low instead of close
# barbaros - v9  - 2021/03/06 - added entry price label
# barbaros - v10 - 2021/03/11 - trying to fix before 9:40am EST crossing filter
# barbaros - v11 - 2021/03/11 - removed chart type overwriting
# barbaros - v12 - 2021/03/11 - fixed issue with disabling DoNotCrossBeforeStart

# Setup
# 10 Min chart
# Heikin Ashi candles
# SMA 3/9
# MACD Bollinger Bands (the one Ben has posted on here a while back) 8,16,36 and uncheck "show plot" on the BB upper, BB lower and BB mid line. You will only be using the zero line, MACD dots and MACD Line for entry purposes. The inputs of "b length" and "bb num dev" are irrelevant here since you will remove the the plots that I mentioned.
# ErgodicOsc 2,10,36 (changed the default negative to red)

# Option call logic:
# 1. The SMA's have to cross first.
# 2. For a call opportunity, you will then wait to see if the MACD dots cross above the MACD zero line. Its critical here to wait until one dot has cleared the zero line...you MUST see a gap....never enter with the dot on the line. Dots must be consistent as well...if its going up...then they must all be white...if a red dot populates between the time a white dot hits the zero line and the time one crosses clear....don't enter. I have a screenshot below showing this example - 13:00 a red dot appears.
# 3. The ErgodicOsc HAS to be green when the MACD dot crosses above the zero line. You can hold the trade most of the time until this turns from green to red....but I always set a sell limit just in case it whips back in the opposite direction.

# Option put logic:
# Obviously its the complete opposite of what I've described above for a call. BUT - the SMA's still have to cross first.

# Note:
# Historical price action testing shows that if the MACDBB crosses zerobase before 9:40 EST, do not take the trade. Also, there might be too much choppiness after 15:00 EST.

declare upper;

input AllowNonSPX = no;
input ShowLabels = yes;
input ShowStatistics = yes;
input ExitAt = {default "profitDeltaOrMACD", "MACDOnly", "ATRorMACD"};
input ProfitDelta = 1.0;
input ATRLength = 7.0;
input ATRMult = 0.5;
input LimitTime = yes;
input StartTime = 940;
input StopTime = 1500;
input DoNotCrossBeforeStart = yes;

input price = close;
input SMAFastLength = 3;
input SMASlowLength = 9;
input BBlength = 30;
input BBNum_Dev = 0.8;
input BBCrossInBars = 3;
input BBCrossDistance = 1.0;
input MACDfastLength = 8;
input MACDslowLength = 16;
input MACDLength = 36;
input ERGODICLongLength = 2;
input ERGODICShortLength = 10;
input ERGODICSignalLength = 36;
input ERGODICAverageType = {"SIMPLE", default "EXPONENTIAL", "WEIGHTED", "WILDERS", "HULL"};

# Check for 10min chart
Assert(AllowNonSPX or GetAggregationPeriod() == AggregationPeriod.TEN_MIN, "Incorrect Chart Time, use 10m");
Assert(AllowNonSPX or GetSymbol() == "SPX", "Incorrect Chart Time, use 10m");

# MACD
def MACD_Data = MACD(fastLength = MACDfastLength, slowLength = MACDslowLength, MACDLength = MACDLength);
def MACD_Direction = if MACD_Data > MACD_Data[1] then 1 else -1;
def MACD_CrossBar = if MACD_Data crosses above 0 within 1 bar or MACD_Data crosses below 0 within 1 bar then BarNumber() else MACD_CrossBar[1];
def MACD_CrossBarAgo = BarNumber() - MACD_CrossBar;

# Ergodic
def Ergodic_Data = ErgodicOsc("long length" = ERGODICLongLength, "short length" = ERGODICShortLength, "signal length" = ERGODICSignalLength, "average type" = ERGODICAverageType).ErgodicOsc;

# SMAs
def SMA_Fast = SimpleMovingAvg(price, SMAFastLength);
def SMA_Slow = SimpleMovingAvg(price, SMASlowLength);

# ATR for progit target
def atrDelta = ATR(ATRLength) * ATRMult;

# Time Limit
def isTradeTime = if LimitTime then SecondsFromTime(StartTime) >= 0 and SecondsTillTime(StopTime) >= 0 else yes;
def isNotCrossBeforeStart = if !DoNotCrossBeforeStart then yes
                            else if DoNotCrossBeforeStart and SecondsFromTime(StartTime) == 0 and MACD_CrossBarAgo == 1 then no
                            else if DoNotCrossBeforeStart and SecondsFromTime(StartTime) != 0 and MACD_CrossBar[1] != MACD_CrossBar then yes
                            else isNotCrossBeforeStart[1];

# Signals
def buySignal = isTradeTime and isNotCrossBeforeStart and SMA_Fast > SMA_Slow and Ergodic_Data > 0 and MACD_Direction == 1 and MACD_Data >= BBCrossDistance and MACD_Data crosses above 0 within BBCrossInBars bars;
def buyWarnSignal = isTradeTime and isNotCrossBeforeStart and SMA_Fast > SMA_Slow and Ergodic_Data > 0 and MACD_Direction == 1 and MACD_CrossBar[1] != MACD_CrossBar;

def sellSignal = isTradeTime and isNotCrossBeforeStart and SMA_Fast < SMA_Slow and Ergodic_Data < 0 and MACD_Direction == -1 and MACD_Data <= -BBCrossDistance and MACD_Data crosses below 0 within BBCrossInBars bars;
def sellWarnSignal = isTradeTime and isNotCrossBeforeStart and SMA_Fast < SMA_Slow and Ergodic_Data < 0 and MACD_Direction == -1 and MACD_CrossBar[1] != MACD_CrossBar;

# Plots
plot buy = buySignal and !buySignal[1];
buy.setPaintingStrategy(PaintingStrategy.BOOLEAN_ARROW_UP);
buy.setDefaultColor(Color.GREEN);
buy.setLineWeight(3);

plot buyWarn = buyWarnSignal and !buyWarnSignal[1];
buyWarn.setPaintingStrategy(PaintingStrategy.BOOLEAN_ARROW_UP);
buyWarn.setDefaultColor(Color.CYAN);
buyWarn.setLineWeight(1);

plot sell = sellSignal and !sellSignal[1];
sell.setPaintingStrategy(PaintingStrategy.BOOLEAN_ARROW_DOWN);
sell.setDefaultColor(Color.RED);
sell.setLineWeight(3);

plot sellWarn = sellWarnSignal and !sellWarnSignal[1];
sellWarn.setPaintingStrategy(PaintingStrategy.BOOLEAN_ARROW_DOWN);
sellWarn.setDefaultColor(Color.MAGENTA);
sellWarn.setLineWeight(1);

plot lastPrice = price;
lastPrice.setPaintingStrategy(PaintingStrategy.POINTS);
lastPrice.setDefaultColor(Color.GREEN);

plot fast = SMA_Fast;
fast.setPaintingStrategy(PaintingStrategy.LINE);
fast.setDefaultColor(Color.CYAN);
fast.setLineWeight(1);

plot slow = SMA_Slow;
slow.setPaintingStrategy(PaintingStrategy.LINE);
slow.setDefaultColor(Color.MAGENTA);
slow.setLineWeight(1);

# PnL
def entryPrice = if (buySignal and !buySignal[1]) or (sellSignal and !sellSignal[1]) then open[-1] else entryPrice[1];
def profitDeltaTarget = if ExitAt == ExitAt.profitDeltaOrMACD then ProfitDelta else if ExitAt == ExitAt.ATRorMACD then atrDelta else 0;
def profitTarget = if buySignal and !buySignal[1] then entryPrice + profitDeltaTarget
                   else if sellSignal and !sellSignal[1] then entryPrice - profitDeltaTarget
                   else profitTarget[1];
def orderDir = if BarNumber() == 1 then 0
               else if orderDir[1] == 0 and buySignal and !buySignal[1] then 1
               else if orderDir[1] == 1 and (MACD_Direction != 1 or (ExitAt != ExitAt.MACDOnly and high >= profitTarget)) then 0
               else if orderDir[1] == 0 and sellSignal and !sellSignal[1] then -1
               else if orderDir[1] == -1 and (MACD_Direction != -1 or (ExitAt != ExitAt.MACDOnly and low <= profitTarget)) then 0
               else orderDir[1];

def isOrder = if IsNaN(orderDir) then no else orderDir crosses 0;
def orderCount = CompoundValue(1, if IsNaN(isOrder) then 0 else if isOrder then orderCount[1] + 1 else orderCount[1], 0);

def orderWinners = if BarNumber() == 1 then 0
                    else if orderDir[1] == 1 and orderDir == 0 then
                        if high >= profitTarget[1] then orderWinners[1] + 1 else orderWinners[1]
                    else if orderDir[1] == -1 and orderDir == 0 then
                        if low <= profitTarget[1] then orderWinners[1] + 1 else orderWinners[1]
            else orderWinners[1];
def winRate = orderWinners / orderCount;

# Plot Exit Positions
plot buyExit = orderDir[1] == 1 and orderDir != 1;
buyExit.setPaintingStrategy(PaintingStrategy.BOOLEAN_ARROW_DOWN);
buyExit.setDefaultColor(Color.GREEN);
buyExit.setLineWeight(3);

plot sellExit = orderDir[1] == -1 and orderDir != -1;
sellExit.setPaintingStrategy(PaintingStrategy.BOOLEAN_ARROW_UP);
sellExit.setDefaultColor(Color.RED);
sellExit.setLineWeight(3);

plot profitTargetLevel = if orderDir != 0 or orderDir[1] != 0 then profitTarget else Double.NaN;
profitTargetLevel.setPaintingStrategy(PaintingStrategy.LINE);
profitTargetLevel.setDefaultColor(Color.GREEN);
profitTargetLevel.setLineWeight(3);

# Labels
AddLabel(ShowLabels, "SPX Strategy", Color.WHITE);
AddLabel(ShowLabels, if buy then "Buy"
                     else if sell then "Sell"
                     else if buyWarn or sellWarn then "Warn"
                     else if orderDir == 1 then "Long"
                     else if orderDir == -1 then "Short"
                     else "Neutral",
                     if buy then Color.GREEN
                     else if sell then Color.RED
                     else if buyWarn then Color.YELLOW
                     else if sellWarn then Color.LIGHT_RED
                     else if orderDir == 1 then Color.YELLOW
                     else if orderDir == -1 then Color.LIGHT_RED
                     else Color.GRAY
);
AddLabel(ShowLabels and orderDir != 0 and !isNaN(entryPrice), "Entry " + AsDollars(entryPrice), Color.GRAY);
AddLabel(ShowLabels and orderDir != 0 and !isNaN(profitTarget), "Target " + AsDollars(profitTarget), Color.GRAY);
AddLabel(ShowLabels and ShowStatistics, "" + orderCount + " Trades | " + AsPercent(winRate), if winRate > 0.5 then Color.GREEN else Color.RED);

# Alerts
Alert(buy, "Buy", Alert.BAR, Sound.Ring);
Alert(sell, "Sell", Alert.BAR, Sound.Ring);
Alert(buyWarn, "Buy Warning", Alert.BAR, Sound.Ding);
Alert(sellWarn, "Sell Warning", Alert.BAR, Sound.Ding);
Alert(buyExit, "Buy Exit", Alert.BAR, Sound.Ring);
Alert(sellExit, "Sell Exit", Alert.BAR, Sound.Ring);
 
Nope, you discovered a bug. Here is a fix.

Python:
# SPX Strategy
# Strategy designed by Hypoluxa
# barbaros - v1  - 2021/02/25
# barbaros - v2  - 2021/02/25 - added warning arrows, alerts, statistics and non SPX trading option
# barbaros - v3  - 2021/02/26 - added SMA plots, chart type, and price plot
# barbaros - v4  - 2021/03/02 - added trade time limit and do not cross before start time
# barbaros - v5  - 2021/03/02 - added direction label
# barbaros - v6  - 2021/03/03 - added alerts, exit at profit delta, arrows for exiting position, and changed defaults to show all
# barbaros - v7  - 2021/03/03 - removed inputs for disabling arrows - this can be done in ToS already,
#                              added profit target line, ExitAt selection and ATR target
# barbaros - v8  - 2021/03/05 - added profit target label, changed the exit strategy to high/low instead of close
# barbaros - v9  - 2021/03/06 - added entry price label
# barbaros - v10 - 2021/03/11 - trying to fix before 9:40am EST crossing filter
# barbaros - v11 - 2021/03/11 - removed chart type overwriting
# barbaros - v12 - 2021/03/11 - fixed issue with disabling DoNotCrossBeforeStart

# Setup
# 10 Min chart
# Heikin Ashi candles
# SMA 3/9
# MACD Bollinger Bands (the one Ben has posted on here a while back) 8,16,36 and uncheck "show plot" on the BB upper, BB lower and BB mid line. You will only be using the zero line, MACD dots and MACD Line for entry purposes. The inputs of "b length" and "bb num dev" are irrelevant here since you will remove the the plots that I mentioned.
# ErgodicOsc 2,10,36 (changed the default negative to red)

# Option call logic:
# 1. The SMA's have to cross first.
# 2. For a call opportunity, you will then wait to see if the MACD dots cross above the MACD zero line. Its critical here to wait until one dot has cleared the zero line...you MUST see a gap....never enter with the dot on the line. Dots must be consistent as well...if its going up...then they must all be white...if a red dot populates between the time a white dot hits the zero line and the time one crosses clear....don't enter. I have a screenshot below showing this example - 13:00 a red dot appears.
# 3. The ErgodicOsc HAS to be green when the MACD dot crosses above the zero line. You can hold the trade most of the time until this turns from green to red....but I always set a sell limit just in case it whips back in the opposite direction.

# Option put logic:
# Obviously its the complete opposite of what I've described above for a call. BUT - the SMA's still have to cross first.

# Note:
# Historical price action testing shows that if the MACDBB crosses zerobase before 9:40 EST, do not take the trade. Also, there might be too much choppiness after 15:00 EST.

declare upper;

input AllowNonSPX = no;
input ShowLabels = yes;
input ShowStatistics = yes;
input ExitAt = {default "profitDeltaOrMACD", "MACDOnly", "ATRorMACD"};
input ProfitDelta = 1.0;
input ATRLength = 7.0;
input ATRMult = 0.5;
input LimitTime = yes;
input StartTime = 940;
input StopTime = 1500;
input DoNotCrossBeforeStart = yes;

input price = close;
input SMAFastLength = 3;
input SMASlowLength = 9;
input BBlength = 30;
input BBNum_Dev = 0.8;
input BBCrossInBars = 3;
input BBCrossDistance = 1.0;
input MACDfastLength = 8;
input MACDslowLength = 16;
input MACDLength = 36;
input ERGODICLongLength = 2;
input ERGODICShortLength = 10;
input ERGODICSignalLength = 36;
input ERGODICAverageType = {"SIMPLE", default "EXPONENTIAL", "WEIGHTED", "WILDERS", "HULL"};

# Check for 10min chart
Assert(AllowNonSPX or GetAggregationPeriod() == AggregationPeriod.TEN_MIN, "Incorrect Chart Time, use 10m");
Assert(AllowNonSPX or GetSymbol() == "SPX", "Incorrect Chart Time, use 10m");

# MACD
def MACD_Data = MACD(fastLength = MACDfastLength, slowLength = MACDslowLength, MACDLength = MACDLength);
def MACD_Direction = if MACD_Data > MACD_Data[1] then 1 else -1;
def MACD_CrossBar = if MACD_Data crosses above 0 within 1 bar or MACD_Data crosses below 0 within 1 bar then BarNumber() else MACD_CrossBar[1];
def MACD_CrossBarAgo = BarNumber() - MACD_CrossBar;

# Ergodic
def Ergodic_Data = ErgodicOsc("long length" = ERGODICLongLength, "short length" = ERGODICShortLength, "signal length" = ERGODICSignalLength, "average type" = ERGODICAverageType).ErgodicOsc;

# SMAs
def SMA_Fast = SimpleMovingAvg(price, SMAFastLength);
def SMA_Slow = SimpleMovingAvg(price, SMASlowLength);

# ATR for progit target
def atrDelta = ATR(ATRLength) * ATRMult;

# Time Limit
def isTradeTime = if LimitTime then SecondsFromTime(StartTime) >= 0 and SecondsTillTime(StopTime) >= 0 else yes;
def isNotCrossBeforeStart = if !DoNotCrossBeforeStart then yes
                            else if DoNotCrossBeforeStart and SecondsFromTime(StartTime) == 0 and MACD_CrossBarAgo == 1 then no
                            else if DoNotCrossBeforeStart and SecondsFromTime(StartTime) != 0 and MACD_CrossBar[1] != MACD_CrossBar then yes
                            else isNotCrossBeforeStart[1];

# Signals
def buySignal = isTradeTime and isNotCrossBeforeStart and SMA_Fast > SMA_Slow and Ergodic_Data > 0 and MACD_Direction == 1 and MACD_Data >= BBCrossDistance and MACD_Data crosses above 0 within BBCrossInBars bars;
def buyWarnSignal = isTradeTime and isNotCrossBeforeStart and SMA_Fast > SMA_Slow and Ergodic_Data > 0 and MACD_Direction == 1 and MACD_CrossBar[1] != MACD_CrossBar;

def sellSignal = isTradeTime and isNotCrossBeforeStart and SMA_Fast < SMA_Slow and Ergodic_Data < 0 and MACD_Direction == -1 and MACD_Data <= -BBCrossDistance and MACD_Data crosses below 0 within BBCrossInBars bars;
def sellWarnSignal = isTradeTime and isNotCrossBeforeStart and SMA_Fast < SMA_Slow and Ergodic_Data < 0 and MACD_Direction == -1 and MACD_CrossBar[1] != MACD_CrossBar;

# Plots
plot buy = buySignal and !buySignal[1];
buy.setPaintingStrategy(PaintingStrategy.BOOLEAN_ARROW_UP);
buy.setDefaultColor(Color.GREEN);
buy.setLineWeight(3);

plot buyWarn = buyWarnSignal and !buyWarnSignal[1];
buyWarn.setPaintingStrategy(PaintingStrategy.BOOLEAN_ARROW_UP);
buyWarn.setDefaultColor(Color.CYAN);
buyWarn.setLineWeight(1);

plot sell = sellSignal and !sellSignal[1];
sell.setPaintingStrategy(PaintingStrategy.BOOLEAN_ARROW_DOWN);
sell.setDefaultColor(Color.RED);
sell.setLineWeight(3);

plot sellWarn = sellWarnSignal and !sellWarnSignal[1];
sellWarn.setPaintingStrategy(PaintingStrategy.BOOLEAN_ARROW_DOWN);
sellWarn.setDefaultColor(Color.MAGENTA);
sellWarn.setLineWeight(1);

plot lastPrice = price;
lastPrice.setPaintingStrategy(PaintingStrategy.POINTS);
lastPrice.setDefaultColor(Color.GREEN);

plot fast = SMA_Fast;
fast.setPaintingStrategy(PaintingStrategy.LINE);
fast.setDefaultColor(Color.CYAN);
fast.setLineWeight(1);

plot slow = SMA_Slow;
slow.setPaintingStrategy(PaintingStrategy.LINE);
slow.setDefaultColor(Color.MAGENTA);
slow.setLineWeight(1);

# PnL
def entryPrice = if (buySignal and !buySignal[1]) or (sellSignal and !sellSignal[1]) then open[-1] else entryPrice[1];
def profitDeltaTarget = if ExitAt == ExitAt.profitDeltaOrMACD then ProfitDelta else if ExitAt == ExitAt.ATRorMACD then atrDelta else 0;
def profitTarget = if buySignal and !buySignal[1] then entryPrice + profitDeltaTarget
                   else if sellSignal and !sellSignal[1] then entryPrice - profitDeltaTarget
                   else profitTarget[1];
def orderDir = if BarNumber() == 1 then 0
               else if orderDir[1] == 0 and buySignal and !buySignal[1] then 1
               else if orderDir[1] == 1 and (MACD_Direction != 1 or (ExitAt != ExitAt.MACDOnly and high >= profitTarget)) then 0
               else if orderDir[1] == 0 and sellSignal and !sellSignal[1] then -1
               else if orderDir[1] == -1 and (MACD_Direction != -1 or (ExitAt != ExitAt.MACDOnly and low <= profitTarget)) then 0
               else orderDir[1];

def isOrder = if IsNaN(orderDir) then no else orderDir crosses 0;
def orderCount = CompoundValue(1, if IsNaN(isOrder) then 0 else if isOrder then orderCount[1] + 1 else orderCount[1], 0);

def orderWinners = if BarNumber() == 1 then 0
                    else if orderDir[1] == 1 and orderDir == 0 then
                        if high >= profitTarget[1] then orderWinners[1] + 1 else orderWinners[1]
                    else if orderDir[1] == -1 and orderDir == 0 then
                        if low <= profitTarget[1] then orderWinners[1] + 1 else orderWinners[1]
            else orderWinners[1];
def winRate = orderWinners / orderCount;

# Plot Exit Positions
plot buyExit = orderDir[1] == 1 and orderDir != 1;
buyExit.setPaintingStrategy(PaintingStrategy.BOOLEAN_ARROW_DOWN);
buyExit.setDefaultColor(Color.GREEN);
buyExit.setLineWeight(3);

plot sellExit = orderDir[1] == -1 and orderDir != -1;
sellExit.setPaintingStrategy(PaintingStrategy.BOOLEAN_ARROW_UP);
sellExit.setDefaultColor(Color.RED);
sellExit.setLineWeight(3);

plot profitTargetLevel = if orderDir != 0 or orderDir[1] != 0 then profitTarget else Double.NaN;
profitTargetLevel.setPaintingStrategy(PaintingStrategy.LINE);
profitTargetLevel.setDefaultColor(Color.GREEN);
profitTargetLevel.setLineWeight(3);

# Labels
AddLabel(ShowLabels, "SPX Strategy", Color.WHITE);
AddLabel(ShowLabels, if buy then "Buy"
                     else if sell then "Sell"
                     else if buyWarn or sellWarn then "Warn"
                     else if orderDir == 1 then "Long"
                     else if orderDir == -1 then "Short"
                     else "Neutral",
                     if buy then Color.GREEN
                     else if sell then Color.RED
                     else if buyWarn then Color.YELLOW
                     else if sellWarn then Color.LIGHT_RED
                     else if orderDir == 1 then Color.YELLOW
                     else if orderDir == -1 then Color.LIGHT_RED
                     else Color.GRAY
);
AddLabel(ShowLabels and orderDir != 0 and !isNaN(entryPrice), "Entry " + AsDollars(entryPrice), Color.GRAY);
AddLabel(ShowLabels and orderDir != 0 and !isNaN(profitTarget), "Target " + AsDollars(profitTarget), Color.GRAY);
AddLabel(ShowLabels and ShowStatistics, "" + orderCount + " Trades | " + AsPercent(winRate), if winRate > 0.5 then Color.GREEN else Color.RED);

# Alerts
Alert(buy, "Buy", Alert.BAR, Sound.Ring);
Alert(sell, "Sell", Alert.BAR, Sound.Ring);
Alert(buyWarn, "Buy Warning", Alert.BAR, Sound.Ding);
Alert(sellWarn, "Sell Warning", Alert.BAR, Sound.Ding);
Alert(buyExit, "Buy Exit", Alert.BAR, Sound.Ring);
Alert(sellExit, "Sell Exit", Alert.BAR, Sound.Ring);
Perfect, label/statistics working on all options.
 
Does anyone have access to intraday data for SPX? Minute, five minute, or ten minute would work great. It looks like Barchart Premier members have access to this data if anyone is a member there. Reason I'm asking - it would be fairly easy to throw together some code to optimize the MACD settings. If anyone can provide the data I'm more than willing to put something together.
 
Does anyone have access to intraday data for SPX? Minute, five minute, or ten minute would work great. It looks like Barchart Premier members have access to this data if anyone is a member there. Reason I'm asking - it would be fairly easy to throw together some code to optimize the MACD settings. If anyone can provide the data I'm more than willing to put something together.
I would buy a month membership to get them if it will improve our efficiency. Explain more what you would do with the data.
 
I would buy a month membership to get them if it will improve our efficiency. Explain more what you would do with the data.
Basic outline of the plan would be to pull 10min closing price data and have the data separated by days since the trade isn't held overnight. A function would run through a range of input variables for calculating MACD parameters (fast/slow/MACD length) and using the MACD value determine if it crosses the zero-line at any point(s) during the day. If the zero-line is crossed stored data for a specific set of fast/slow/MACD length inputs would consist of if SPX moved more than 3 points prior to MACD changing direction and maximum SPX move prior to MACD changing direction. Complete data output after running through a set of fast/slow/MACD inputs would consist of the input variables, win rate (defined as SPX moving more than 3 points prior to MACD changing direction), average maximum SPX move, and number of occurrences. Plan would be to then throw all that data into Excel, add in some conditional formatting to visualize best win rate % and best average maximum move. Sorting the data by win rate and best average maximum move would help identify which combination of input variables produces the best results (i.e. ensure the sample size is high enough to inspire confidence).

Hopefully that makes sense. I could also throw in checks for the SMA cross and ErgodicOsc. For now though I'm going to search around to see if there have been any studies done to optimize MACD parameters. I'd be surprised if there hasn't been already, however I doubt for this specific method.
 
If someone can review this picture and answer questions... I am lil confused... @barbaros @Hypoluxa
Screen-Shot-2021-03-12-at-9-25-50-AM.png
Previous comments are correct. It is a "get ready to short" signal and not a sell signal. If you turn off the "LimitTime" feature and adjust "BBCrossInBars" to a larger number, you can get more signals. However, the default options are for conservative plays.
 
Previous comments are correct. It is a "get ready to short" signal and not a sell signal. If you turn off the "LimitTime" feature and adjust "BBCrossInBars" to a larger number, you can get more signals. However, the default options are for conservative plays.
Thanks will 10 be a good value?

To get in trade we still look for mac white dot above 0 for long. right? or if we see a buy arrow we get in? thanks!
 
Basic outline of the plan would be to pull 10min closing price data and have the data separated by days since the trade isn't held overnight. A function would run through a range of input variables for calculating MACD parameters (fast/slow/MACD length) and using the MACD value determine if it crosses the zero-line at any point(s) during the day. If the zero-line is crossed stored data for a specific set of fast/slow/MACD length inputs would consist of if SPX moved more than 3 points prior to MACD changing direction and maximum SPX move prior to MACD changing direction. Complete data output after running through a set of fast/slow/MACD inputs would consist of the input variables, win rate (defined as SPX moving more than 3 points prior to MACD changing direction), average maximum SPX move, and number of occurrences. Plan would be to then throw all that data into Excel, add in some conditional formatting to visualize best win rate % and best average maximum move. Sorting the data by win rate and best average maximum move would help identify which combination of input variables produces the best results (i.e. ensure the sample size is high enough to inspire confidence).

Hopefully that makes sense. I could also throw in checks for the SMA cross and ErgodicOsc. For now though I'm going to search around to see if there have been any studies done to optimize MACD parameters. I'd be surprised if there hasn't been already, however I doubt for this specific method.
Good deal! What's the best way to get in touch with you / email? I'd like to send the data directly to you and not post it. What time frame of data do you want? I don't remember how far back they go but for what we are doing it should be ok. 90 days? 180 days?

Let me know!
 
@barbaros and @Hypoluxa

Thanks again for all your efforts. Haven't been very active this week, but was looking at the 5 minute chart with this setup "as is". Noticed a few opportunities. With that in mind and knowing everything is scripted for 10 minute charting, was wondering if either of you thought about a 5 min setup script or an option to change the time frame?
Thanks!
 
@barbaros and @Hypoluxa

Thanks again for all your efforts. Haven't been very active this week, but was looking at the 5 minute chart with this setup "as is". Noticed a few opportunities. With that in mind and knowing everything is scripted for 10 minute charting, was wondering if either of you thought about a 5 min setup script or an option to change the time frame?
Thanks!
I have tried my best, numerous times, to get SPX to a lower time frame, 5 mins specifically and no luck with consistency.
see what you might can do for us, I ran out of patience trying. Lol
And if you find something, make sure you at least test it back to February 1st.
 
I have tried my best, numerous times, to get SPX to a lower time frame, 5 mins specifically and no luck with consistency.
see what you might can do for us, I ran out of patience trying. Lol
Thanks! Might be awhile as a newbie who doesn't script, but I'll certainly take a shot at it. Always willing to learn.
 
Thanks! Might be awhile as a newbie who doesn't script, but I'll certainly take a shot at it. Always willing to learn.
It’s very easy....all you need to do is open the settings for each of the indicators and start changing the numbers around. I’d start with one of the days this week where it was a bad or very short lived entry and make it to where it does NOT get you in the trade. I always tweak to safety first. Then see what it does in backtesting. You’ll never find perfection....but def get it to where it keeps the trade safe first. At least that’s always been my approach.
 
Status
Not open for further replies.

Ben's Swing Trading Strategy + Indicator

I wouldn't call this a course. My goal is zero fluff. I will jump right into my current watchlist, tell you the ThinkorSwim indicator that I'm using, and past trade setups to help you understand my swing trading strategy.

I'm Interested

Not the exact question you're looking for?

Start a new thread and receive assistance from our community.

87k+ Posts
306 Online
Create Post

The Market Trading Game Changer

Join 2,500+ subscribers inside the useThinkScript VIP Membership Club
  • Exclusive indicators
  • Proven strategies & setups
  • Private Discord community
  • ‘Buy The Dip’ signal alerts
  • Exclusive members-only content
  • Add-ons and resources
  • 1 full year of unlimited support

Frequently Asked Questions

What is useThinkScript?

useThinkScript is the #1 community of stock market investors using indicators and other tools to power their trading strategies. Traders of all skill levels use our forums to learn about scripting and indicators, help each other, and discover new ways to gain an edge in the markets.

How do I get started?

We get it. Our forum can be intimidating, if not overwhelming. With thousands of topics, tens of thousands of posts, our community has created an incredibly deep knowledge base for stock traders. No one can ever exhaust every resource provided on our site.

If you are new, or just looking for guidance, here are some helpful links to get you started.

What are the benefits of VIP Membership?
VIP members get exclusive access to these proven and tested premium indicators: Buy the Dip, Advanced Market Moves 2.0, Take Profit, and Volatility Trading Range. In addition, VIP members get access to over 50 VIP-only custom indicators, add-ons, and strategies, private VIP-only forums, private Discord channel to discuss trades and strategies in real-time, customer support, trade alerts, and much more. Learn all about VIP membership here.
How can I access the premium indicators?
To access the premium indicators, which are plug and play ready, sign up for VIP membership here.
Back
Top