nice. i usually close at EODImpressive short entry and short exit signals from yesterday 3:30pm and today 10:40am
nice. i usually close at EODImpressive short entry and short exit signals from yesterday 3:30pm and today 10:40am
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.
@babouin77 or @DDW - Can you point me to the right script that has the LE, LX, SE, SX with the arrow as you have shown in the above screenshot? Thanks!nice. i usually close at EOD
The warning arrow for the entry signal is nice to have, is it possible to have a warning arrow for the exit signal?nice. i usually close at EOD
# 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
# 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 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"};
input ShowWarnArrows = yes;
input ShowCloseArrows = yes;
input ShowLabels = yes;
input ShowStatistics = yes;
input ExitAtProfitDelta = yes;
input ProfitDelta = 1.0;
input LimitTime = yes;
input StartTime = 940;
input EndTime = 1500;
input DoNotCrossBeforeStart = yes;
input AllowNonSPX = no;
# 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;
# 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);
# Time Limit
def isTradeTime = if LimitTime then SecondsFromTime(StartTime) >= 0 and SecondsTillTime(EndTime) >= 0 else yes;
def isNotCrossBeforeStart = if DoNotCrossBeforeStart and SecondsFromTime(StartTime) == 0 then !((MACD_Data crosses above 0 within 2 bars) or (MACD_Data crosses below 0 within 2 bars)) else yes;
# 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_Data crosses above 0 within BBCrossInBars bars;
#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_Data crosses below 0 within BBCrossInBars bars;
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_Data crosses below 0 within BBCrossInBars bars;
# Plots
plot buy = buySignal and !buySignal[1];
buy.setPaintingStrategy(PaintingStrategy.BOOLEAN_ARROW_UP);
buy.setDefaultColor(Color.GREEN);
buy.setLineWeight(3);
plot buyWarn = if ShowWarnArrows then buyWarnSignal and !buyWarnSignal[1] else Double.NaN;
buyWarn.setPaintingStrategy(PaintingStrategy.BOOLEAN_ARROW_UP);
buyWarn.setDefaultColor(Color.CYAN);
buyWarn.setLineWeight(1);
buyWarn.setHiding(!ShowWarnArrows);
plot sell = sellSignal and !sellSignal[1];
sell.setPaintingStrategy(PaintingStrategy.BOOLEAN_ARROW_DOWN);
sell.setDefaultColor(Color.RED);
sell.setLineWeight(3);
plot sellWarn = if ShowWarnArrows then sellWarnSignal and !sellWarnSignal[1] else Double.NaN;
sellWarn.setPaintingStrategy(PaintingStrategy.BOOLEAN_ARROW_DOWN);
sellWarn.setDefaultColor(Color.MAGENTA);
sellWarn.setLineWeight(1);
sellWarn.setHiding(!ShowWarnArrows);
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);
SetChartType(ChartType.HEIKIN_ASHI);
# PnL
def entryPrice = if (buySignal and !buySignal[1]) or (sellSignal and !sellSignal[1]) then close else entryPrice[1];
def profitTarget = if buySignal and !buySignal[1] then entryPrice + ProfitDelta else if sellSignal and !sellSignal[1] then entryPrice - ProfitDelta 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 (ExitAtProfitDelta and close crosses above 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 (ExitAtProfitDelta and close crosses below 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 close >= profitTarget[1] then orderWinners[1] + 1 else orderWinners[1]
else if orderDir[1] == -1 and orderDir == 0 then
if close <= profitTarget[1] then orderWinners[1] + 1 else orderWinners[1]
else orderWinners[1];
def winRate = orderWinners / orderCount;
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 ShowStatistics, "" + orderCount + " Trades | " + AsPercent(winRate), if winRate > 0.5 then Color.GREEN else Color.RED);
# Plot Exit Positions
plot buyExit = orderDir[1] == 1 and orderDir != 1;
buyExit.setPaintingStrategy(PaintingStrategy.BOOLEAN_ARROW_DOWN);
buyExit.setDefaultColor(Color.GREEN);
buyExit.setLineWeight(3);
buyExit.setHiding(!ShowCloseArrows);
plot sellExit = orderDir[1] == -1 and orderDir != -1;
sellExit.setPaintingStrategy(PaintingStrategy.BOOLEAN_ARROW_UP);
sellExit.setDefaultColor(Color.RED);
sellExit.setLineWeight(3);
sellExit.setHiding(!ShowCloseArrows);
# 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);
Thanks very much. So many things to learn.If there is a small exclamation mark on the left top of the chart, click it, it will show you what is not right.
profit delta is just an addition to the entry price right? so for example if we have an entry price of 3850 and we have profit delta of 5 then the profit target is 3855?? right? either that or MACD turns whichever comes first... am I reading this correcT?@DDW Good idea. Here is v6. For longs, there will be a green reversed arrow and shorts reversed red arrow to exit. Notice the 2 new options. You can either exit with either MACDBB or profit target, or with only MACDBB.
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 # 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 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"}; input ShowWarnArrows = yes; input ShowCloseArrows = yes; input ShowLabels = yes; input ShowStatistics = yes; input ExitAtProfitDelta = yes; input ProfitDelta = 1.0; input LimitTime = yes; input StartTime = 940; input EndTime = 1500; input DoNotCrossBeforeStart = yes; input AllowNonSPX = no; # 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; # 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); # Time Limit def isTradeTime = if LimitTime then SecondsFromTime(StartTime) >= 0 and SecondsTillTime(EndTime) >= 0 else yes; def isNotCrossBeforeStart = if DoNotCrossBeforeStart and SecondsFromTime(StartTime) == 0 then !((MACD_Data crosses above 0 within 2 bars) or (MACD_Data crosses below 0 within 2 bars)) else yes; # 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_Data crosses above 0 within BBCrossInBars bars; #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_Data crosses below 0 within BBCrossInBars bars; 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_Data crosses below 0 within BBCrossInBars bars; # Plots plot buy = buySignal and !buySignal[1]; buy.setPaintingStrategy(PaintingStrategy.BOOLEAN_ARROW_UP); buy.setDefaultColor(Color.GREEN); buy.setLineWeight(3); plot buyWarn = if ShowWarnArrows then buyWarnSignal and !buyWarnSignal[1] else Double.NaN; buyWarn.setPaintingStrategy(PaintingStrategy.BOOLEAN_ARROW_UP); buyWarn.setDefaultColor(Color.CYAN); buyWarn.setLineWeight(1); buyWarn.setHiding(!ShowWarnArrows); plot sell = sellSignal and !sellSignal[1]; sell.setPaintingStrategy(PaintingStrategy.BOOLEAN_ARROW_DOWN); sell.setDefaultColor(Color.RED); sell.setLineWeight(3); plot sellWarn = if ShowWarnArrows then sellWarnSignal and !sellWarnSignal[1] else Double.NaN; sellWarn.setPaintingStrategy(PaintingStrategy.BOOLEAN_ARROW_DOWN); sellWarn.setDefaultColor(Color.MAGENTA); sellWarn.setLineWeight(1); sellWarn.setHiding(!ShowWarnArrows); 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); SetChartType(ChartType.HEIKIN_ASHI); # PnL def entryPrice = if (buySignal and !buySignal[1]) or (sellSignal and !sellSignal[1]) then close else entryPrice[1]; def profitTarget = if buySignal and !buySignal[1] then entryPrice + ProfitDelta else if sellSignal and !sellSignal[1] then entryPrice - ProfitDelta 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 (ExitAtProfitDelta and close crosses above 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 (ExitAtProfitDelta and close crosses below 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 close >= profitTarget[1] then orderWinners[1] + 1 else orderWinners[1] else if orderDir[1] == -1 and orderDir == 0 then if close <= profitTarget[1] then orderWinners[1] + 1 else orderWinners[1] else orderWinners[1]; def winRate = orderWinners / orderCount; 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 ShowStatistics, "" + orderCount + " Trades | " + AsPercent(winRate), if winRate > 0.5 then Color.GREEN else Color.RED); # Plot Exit Positions plot buyExit = orderDir[1] == 1 and orderDir != 1; buyExit.setPaintingStrategy(PaintingStrategy.BOOLEAN_ARROW_DOWN); buyExit.setDefaultColor(Color.GREEN); buyExit.setLineWeight(3); buyExit.setHiding(!ShowCloseArrows); plot sellExit = orderDir[1] == -1 and orderDir != -1; sellExit.setPaintingStrategy(PaintingStrategy.BOOLEAN_ARROW_UP); sellExit.setDefaultColor(Color.RED); sellExit.setLineWeight(3); sellExit.setHiding(!ShowCloseArrows); # 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);
Correct is long position it is added and short position it is subtracted. I'm also considering making it ATR based.profit delta is just an addition to the entry price right? so for example if we have an entry price of 3850 and we have profit delta of 5 then the profit target is 3855?? right? either that or MACD turns whichever comes first... am I reading this correcT?
i think that would be a killer...Correct is long position it is added and short position it is subtracted. I'm also considering making it ATR based.
@barbaros - I added this as a strategy but it is not showing any signals on the chart. I am using 10D 10M TF.@DDW Good idea. Here is v6. For longs, there will be a green reversed arrow and shorts reversed red arrow to exit. Notice the 2 new options. You can either exit with either MACDBB or profit target, or with only MACDBB.
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 # 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 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"}; input ShowWarnArrows = yes; input ShowCloseArrows = yes; input ShowLabels = yes; input ShowStatistics = yes; input ExitAtProfitDelta = yes; input ProfitDelta = 1.0; input LimitTime = yes; input StartTime = 940; input EndTime = 1500; input DoNotCrossBeforeStart = yes; input AllowNonSPX = no; # 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; # 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); # Time Limit def isTradeTime = if LimitTime then SecondsFromTime(StartTime) >= 0 and SecondsTillTime(EndTime) >= 0 else yes; def isNotCrossBeforeStart = if DoNotCrossBeforeStart and SecondsFromTime(StartTime) == 0 then !((MACD_Data crosses above 0 within 2 bars) or (MACD_Data crosses below 0 within 2 bars)) else yes; # 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_Data crosses above 0 within BBCrossInBars bars; #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_Data crosses below 0 within BBCrossInBars bars; 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_Data crosses below 0 within BBCrossInBars bars; # Plots plot buy = buySignal and !buySignal[1]; buy.setPaintingStrategy(PaintingStrategy.BOOLEAN_ARROW_UP); buy.setDefaultColor(Color.GREEN); buy.setLineWeight(3); plot buyWarn = if ShowWarnArrows then buyWarnSignal and !buyWarnSignal[1] else Double.NaN; buyWarn.setPaintingStrategy(PaintingStrategy.BOOLEAN_ARROW_UP); buyWarn.setDefaultColor(Color.CYAN); buyWarn.setLineWeight(1); buyWarn.setHiding(!ShowWarnArrows); plot sell = sellSignal and !sellSignal[1]; sell.setPaintingStrategy(PaintingStrategy.BOOLEAN_ARROW_DOWN); sell.setDefaultColor(Color.RED); sell.setLineWeight(3); plot sellWarn = if ShowWarnArrows then sellWarnSignal and !sellWarnSignal[1] else Double.NaN; sellWarn.setPaintingStrategy(PaintingStrategy.BOOLEAN_ARROW_DOWN); sellWarn.setDefaultColor(Color.MAGENTA); sellWarn.setLineWeight(1); sellWarn.setHiding(!ShowWarnArrows); 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); SetChartType(ChartType.HEIKIN_ASHI); # PnL def entryPrice = if (buySignal and !buySignal[1]) or (sellSignal and !sellSignal[1]) then close else entryPrice[1]; def profitTarget = if buySignal and !buySignal[1] then entryPrice + ProfitDelta else if sellSignal and !sellSignal[1] then entryPrice - ProfitDelta 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 (ExitAtProfitDelta and close crosses above 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 (ExitAtProfitDelta and close crosses below 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 close >= profitTarget[1] then orderWinners[1] + 1 else orderWinners[1] else if orderDir[1] == -1 and orderDir == 0 then if close <= profitTarget[1] then orderWinners[1] + 1 else orderWinners[1] else orderWinners[1]; def winRate = orderWinners / orderCount; 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 ShowStatistics, "" + orderCount + " Trades | " + AsPercent(winRate), if winRate > 0.5 then Color.GREEN else Color.RED); # Plot Exit Positions plot buyExit = orderDir[1] == 1 and orderDir != 1; buyExit.setPaintingStrategy(PaintingStrategy.BOOLEAN_ARROW_DOWN); buyExit.setDefaultColor(Color.GREEN); buyExit.setLineWeight(3); buyExit.setHiding(!ShowCloseArrows); plot sellExit = orderDir[1] == -1 and orderDir != -1; sellExit.setPaintingStrategy(PaintingStrategy.BOOLEAN_ARROW_UP); sellExit.setDefaultColor(Color.RED); sellExit.setLineWeight(3); sellExit.setHiding(!ShowCloseArrows); # 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);
I am having the same issue. I've tried it as a study and as a strategy.add it as a study not strategy
@babouin77 - I was trying it on /ES. It seems it works only for SPX.add it as a study not strategy
Turn on AllowNonSPX to use it on other tickers.@babouin77 - I was trying it on /ES. It seems it works only for SPX.
Thanks - It worked!Turn on AllowNonSPX to use it on other tickers.
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.
Join useThinkScript to post your question to a community of 21,000+ developers and traders.
Start a new thread and receive assistance from our community.
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.
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.