Skip to content

Instantly share code, notes, and snippets.

@alexcrownjr
Created August 3, 2020 12:05
Show Gist options
  • Save alexcrownjr/35510e0991253e74930c9126e59e13f1 to your computer and use it in GitHub Desktop.
Save alexcrownjr/35510e0991253e74930c9126e59e13f1 to your computer and use it in GitHub Desktop.
//@version=3
//
study("Traders Dynamic Index Indicator Alert v1.3 by JustUncleL", shorttitle="TDIALT")
//
// author: JustUncleL
// date: 1-Mar-2016
//
// Original code @author LazyBear for basic TDI indicator.
// If you use this code in its orignal/modified form, do drop me a note.
//
// Description:
// This is a Trend following system utilising the Traders Dynamic Index (TDI),
// Price Action Channel (PAC) and Heikin Ashi candles.
// About 6months ago I came across the use of TDI in "E.A.S.Y. Method" that I found in
// forexfactory forums: http://www.forexfactory.com/attachment.php?attachmentid=686629&d=1303831008
// and I was able to set up a chart based on the specifications by using Kurbelklaus scripts.
// However, I found that the alerts were being generated one or two bars too late,
// so I was not successful using it with Binary Options. Later I found a variation of the
// method in the forums which generates alerts a bit earlier, so this indicator is a
// variation of that early detection version.
// The indicator can optionally use Heikin Ashi candles only for all it's calculations,
// I would recommend viewing the chart with normal Heikin Ashi candles, these
// smooth out the trends and makes them more visible.
//
// I found that this metod it works OK with currency pairs or commodities.
// It also seems to work well with 5min+ timeframe charts,
// and I would suggest expiry of 2 to 6 candles.
//
// ALERT GENERATION:
// =================
//
// The TDI (Traders Dynamic Index)
// -------------------------------
// Volatility Band VB(34), color: Blue, buffer: UpZone, DnZone
// Relative Strength Index RSI(13)
// RSI PRICE LINE (2), color: Green, buffer: mab
// RSI TRADE SIGNAL LINE (7), color: Red, buffer: mbb
// MARKET BASE LINE MID VB(34), color: Orange, buffer: mid
//
// Indicator SignalLevels:
// -----------------------
// RSI_OversoldLevel : 22 (normally: 32)
// RSI_OverboughtLevel : 78 (normally: 68)
//
// Alert Conditions:
// -----------------
// Strong Buy (yellow): HIGH>PAC upper && BULL Candle && Candle High>PAC High && RSI>TRADE SIGNAL LINE && RSI>RSI_OversoldLevel &&
// && RSI<RSI_OverboughtLevel && TRADE SIGNAL LINE> MARKET BASE LINE
// Medium Buy (aqua): HIGH>PAC upper && BULL Candle && Candle High>PAC High && RSI>TRADE SIGNAL LINE && RSI>RSI_OversoldLevel
// && RSI<RSI_OverboughtLevel && RSI> MARKET BASE LINE && TRADE SIGNAL LINE< MARKET BASE LINE
// Weak Buy (blue): HIGH>PAC upper && BULL Candle && Candle High>PAC High && RSI>TRADE SIGNAL LINE && RSI>RSI_OversoldLevel
// && RSI<RSI_OverboughtLevel && TRADE SIGNAL LINE<MARKET BASE LINE && RSI< MARKET BASE LINE
//
// Strong Sell (fuchsia): LOW<PAC lower && BEAR Candle && Candle Low>PAC Low && RSI<TRADE SIGNAL LINE && RSI>RSI_OversoldLevel
// && RSI<RSI_OverboughtLevel && TRADE SIGNAL LINE< MARKET BASE LINE
// Medium Sell (purple): LOW<PAC lower && BEAR Candle && Candle Low>PAC Low && RSI<TRADE SIGNAL LINE && RSI>RSI_OversoldLevel
// && RSI<RSI_OverboughtLevel && RSI< MARKET BASE LINE && TRADE SIGNAL LINE> MARKET BASE LINE
// Weak Sell (black): LOW<PAC lower && BEAR Candle && Candle Low>PAC Low && RSI<TRADE SIGNAL LINE && RSI>RSI_OversoldLevel
// && RSI<RSI_OverboughtLevel && TRADE SIGNAL LINE> MARKET BASE LINE && RSI> MARKET BASE LINE
//
// HIGH LEVEL FILTER (Overbought): RSI>=RSI_OverboughtLevel or MACD Histogram not green
// LOW LEVEL FILTER (Oversold): RSI<=RSI_OversoldLevel or MACD Histogram not red
//
// Hints on How to use:
// --------------------
// - When a Medium or Strong alert is generated and MACD histogram colour matches the direction
// of the alert, then place trade in direction of alert candle and MACD.
// - Use the multi-Hull MA's for trend direction confirmation.
// - Best positions occur near the MACD(8,16,1) Histogram crossing the zero line.
// - The optional coloured Dots along the bottom of the indicator represent the first alert
// of this type that was generated in this sequence.
// - It is advisable to trade in the direction of the main trend as indicated the HULL MA red cloud:
// if red cloud underneath PAC then BULLISH trend, if red cloud above PAC then BEARISH trend.
// - Selecting the HeiKin Ashi candles does affect the MACD and MA caculations, so if you select
// normal candles the result chart will change. Although the TDI calculations and alerts will stay the
// same.
// - When using the Heikin Ashi candles, a good buy entry is indicated by long top wick and no bottom wick
// for bull (green) candles and good sell entry is indicated by long bottom wick and no top wick for
// bear (red) candles.
// - When the MACD histogram is flat and close to zero line,
// this indicates a ranging market, do NOT trade when this occurs.
// - When the PAC channel on the main chart is spread apart widely, this is an indication
// of extreme volitity and choppy chart, do NOT try to trade during these periods.
// A choppy chart is also indicated by Heikin Ashi candles with long wicks on both sides
// of the candles.
// - You can specify what strength level Alerts are generated (default 2):
// Level (1) means only generate Strong Alerts only.
// Level (2) means generate Strong and Medium Alerts.
// Level (3) means generate Strong, Medium and Weak Alerts.
//
// Modifications:
// --------------
// 1.3 7-Aug-2017
// - Modified Alertcondition code so that it only signals on the last completed alerted
// candle. This should prevent some false alerts and multiple alerts being generated.
// When setting alarms I suggest using Frequency "Once per bar (on condition)" to get
// the earliest signal possible.
// - Added optional alert long/short spikes that only occur on the first Long or Short
// signals.
// 1.2 5-Aug-2017:
// - Added new alerts for Buy and Sell (Long and Short) signals seperately.
// - Upgraded to version 3 Pinescript.
// - Added work around patch for opaque bar colouring issue.
//
// 1.1 - Modified code so when viewing Top chart with Heikin Ashi candles, calculations
// are still based on standard candles, unless Heikin Ashi calculation option selected.
//
// 0.2 - Simplified MACD direction calculation to use just rising/falling.
// 0.1 - Oroginal Version
// References:
// -----------
// Traders Dynamic Index [LazyBear]
// KK_Traders Dynamic Index_Bar Highlighting by Kurbelklaus
// KK_Price Action Channel (TDI BH) by Kurbelklaus
// http://www.forexfactory.com/attachment.php?attachmentid=686629&d=1303831008
// http://www.forexstrategiesresources.com/trading-system-metatrader-4-iv/504-traders-dynamic-index-how-to-use/
// http://www.forexfactory.com/showthread.php?t=460148
// http://www.forexstrategiesresources.com/scalping-forex-strategies-ii/205-scalping-with-tdi-real-macd-stochrainbow/
//
lengthrsi=input(13)
lengthband=input(34)
lengthrsipl=input(2)
lengthtradesl=input(7)
lenH = input(5, minval=1, title="Price Action Channel Length")
lenL = lenH
rsiOSL= input(22, minval=0,maxval=49,title="RSI Oversold Level")
rsiOBL= input(78, minval=51,maxval=100,title="RSI Overbought Level")
strength = input(2,minval=1,maxval=3,step=1,title="Strength Level: (1)Strong (2)Medium (3)All")
sgb = input(false, title="Check Box To Turn Bars Gray")
sbr = input(true, title="Highlight TDI Alert Bars")
sal = input(true, title="Show Alert Condition Status")
uha = input(false, title="Use Heikin Ashi Candles for Calculations")
sspikes = input(false, title="Show Spike LONG and SHORT Signals")
//
// Constants colours that include fully non-transparent option.
blue100 = #0000FFFF
aqua100 = #00FFFFFF
fuchsia100 = #FF00FFFF
purple100 = #800080FF
gray100 = #808080FF
gold100 = #FFD700FF
white100 = #FFFFFFFF
black100 = #000000FF
gold = #FFD700
// Use only Heikinashi Candles for all calculations or use Standard Candles for calculations.
srcClose = uha ? security(heikinashi(tickerid), period, close) : security(ticker, period, close)
srcOpen = uha ? security(heikinashi(tickerid), period, open) : security(ticker, period, open)
srcHigh = uha ? security(heikinashi(tickerid), period, high) : security(ticker, period, high)
srcLow = uha ?security(heikinashi(tickerid), period, low) : security(ticker, period, low)
//
r=rsi(srcClose, lengthrsi)
ma=sma(r,lengthband)
offs=(1.6185 * stdev(r, lengthband))
upZone=ma+offs
dnZone=ma-offs
mid=(upZone+dnZone)/2
mab=sma(r, lengthrsipl)
mbb=sma(r, lengthtradesl)
//
hline(rsiOSL, color=red, linewidth=1)
hline(50, color=black, linewidth=1)
hline(rsiOBL, color=lime, linewidth=1)
// Plot the TDI
upl=plot(upZone, color=blue, title="VB Channel High",linewidth=2)
dnl=plot(dnZone, color=blue, title="VB Channel Low",linewidth=2)
midl=plot(mid, color=orange, linewidth=2, title="MBL")
mabl=plot(mab, color=green, linewidth=2, title="RSI PL")
mbbl=plot(mbb, color=red, linewidth=2, title="TSL Signal")
//
//create RSI TSL cloud to indicate trend direction.
fill(mabl,mbbl, color=mab>mbb?green:red,transp=90)
// Calculate Price Action Channel (PAC)
smmaH = 0.0
smmaL = 0.0
smmaH := na(smmaH[1]) ? sma(srcHigh, lenH) : (smmaH[1] * (lenH - 1) + srcHigh) / lenH
smmaL := na(smmaL[1]) ? sma(srcLow, lenL) : (smmaL[1] * (lenL - 1) + srcLow) / lenL
//
umacd = input(false,title="Use MACD Filtering")
fastMA = input(title="MACD Fast MA Length", type = integer, defval = 8, minval = 2)
slowMA = input(title="MACD Slow MA Length", type = integer, defval = 16, minval = 7)
signal = input(title="MACD Signal Length",type=integer,defval=1,minval=1)
//
//
[currMacd,_,_] = macd(srcClose[0], fastMA, slowMA, signal)
macdH = currMacd > 0 ? rising(currMacd,2) ? green : red : falling(currMacd, 2) ? red : green
//
// Bar - Highlighting based on indication strength
long= (not umacd or macdH==green) and mab > mbb and mab < rsiOBL and mab > rsiOSL and srcHigh > smmaH and srcClose > srcOpen ?
mbb > mid ? 1 : mab>mid and mbb<mid ? 2 : mab<mid and mbb<mid ? 3 : 0: 0
short= (not umacd or macdH==red) and mab < mbb and mab <rsiOBL and mab > rsiOSL and srcLow < smmaL and srcClose < srcOpen ?
mbb < mid ? 1 : mab<mid and mbb>mid ? 2 :mab>mid and mbb>mid ? 3 : 0 : 0
//
// Find the right Bar colour if enabled.
bcolor = not sbr? na : long==1? gold100: long==2 and strength>1? aqua100:long==3 and strength>2? blue100:
short==1? fuchsia100: short==2 and strength>1? purple100:short==3 and strength>2? black100 :
sgb ? gray100 : na
//
barcolor(color=bcolor,title="Bars Colours")
//
//
// create alerts only once per sequence type.
//
long_ = (long>0 and long!=long[1] and long<=strength)
short_ = (short>0 and short!=short[1] and short<=strength)
c_alert = long_ or short_
alertcondition(c_alert[1] and barstate.isnew, title="TDIALT Alert", message="TDIALT Alert")
alertcondition(long_[1] and barstate.isnew, title="TDIALT Long Alert", message="TDIALT Long")
alertcondition(short_[1] and barstate.isnew, title="TDIALT Short Alert", message="TDIALT Short")
// Single Alert Strategy
stateLong = 0
stateShort = 0
stateLong_ = nz(stateLong[1])
stateShort_ = nz(stateShort[1])
//Count the long signals before next short
if (long[1]>0 and long[1]<=strength)
stateLong_ := stateLong_>0 ? stateLong_+1 : 1
stateShort_:= 0
//Count the short signals before next long.
if (short[1]>0 and short[1]<=strength)
stateShort_ := stateShort_>0 ? stateShort_+1 : 1
stateLong_ := 0
//create spikes, hide them by setting transp=100
plot( sspikes?stateLong_==1? 100 : 0:na, color=blue, title="LONG",transp=50)
plot( sspikes?stateShort_==1? 100 :0:na, color=red, title="SHORT",transp=50)
//keep current state counts.
stateLong := stateLong_>0? stateLong_+1 : 0
stateShort := stateShort_>0? stateShort_+1 : 0
//
// show dot only when alert condition is met and bar closed.
plotshape(sal and c_alert[1],title= "Alert Indicator", location=location.bottom,
color=long[1]==1? gold: long[1]==2?aqua:long[1]==3?blue:short[1]==1?fuchsia:
short[1]==2?purple:short[1]==3? black : na, transp=0, style=shape.circle,offset=-1)
//
//EOF
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment