0% found this document useful (0 votes)
35 views

Pinescript

This document outlines a trading indicator script that combines a momentum-based ZigZag, EMA, and BO-HMA for technical analysis. It allows users to select different momentum indicators and adjust parameters for various trading strategies, including scalping and intraday trading. The script includes conditions for generating buy and sell signals based on momentum direction and moving averages, along with alert functionalities for trade execution.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
35 views

Pinescript

This document outlines a trading indicator script that combines a momentum-based ZigZag, EMA, and BO-HMA for technical analysis. It allows users to select different momentum indicators and adjust parameters for various trading strategies, including scalping and intraday trading. The script includes conditions for generating buy and sell signals based on momentum direction and moving averages, along with alert functionalities for trade execution.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 5

//@version=5

indicator('Momentum-based ZigZag + EMA + BO-HMA', overlay=true, max_labels_count =


500)

use_ema = input(true, "Use EMA Filter",group="EMA")


esrc = input(close,"Source",group="EMA")
elen = input(200,"Length",group="EMA")

var int momentum_direction = 0


color_zigzag_lines = input(true, title='Color ZigZag lines to show force
direction', group="Momentum-based ZigZag")
momentum_select = input.string(title='Select Momentum Indicator:', defval='QQE',
options=['MACD', 'MovingAverage', 'QQE'], group="Momentum-based ZigZag")

// ZigZag function {
zigzag(_momentum_direction) =>
zz_goingup = _momentum_direction == 1
zz_goingdown = _momentum_direction == -1
var float zz_peak = na
var float zz_bottom = na
zz_peak := high > zz_peak[1] and zz_goingup or zz_goingdown[1] and zz_goingup ?
high : nz(zz_peak[1])
zz_bottom := low < zz_bottom[1] and zz_goingdown or zz_goingup[1] and
zz_goingdown ? low : nz(zz_bottom[1])
zigzag = zz_goingup and zz_goingdown[1] ? zz_bottom[1] : zz_goingup[1] and
zz_goingdown ? zz_peak[1] : na
zigzag
// } End of ZigZag function
ema = ta.ema(esrc,elen)
plot(ema, "EMA")
// MACD {
fast_length = input.int(title='Fast Length', defval=12, group='if MACD Selected',
inline='macd')
slow_length = input.int(title='Slow Length', defval=26, group='if MACD Selected',
inline='macd')
src = input.source(title='Source', defval=close, group='if MACD Selected',
inline='macd')
signal_length = input.int(title='Signal Smoothing', minval=1, maxval=50, defval=9,
group='if MACD Selected', inline='macd')
sma_source = input.string(title='Oscillator MA Type', defval='EMA', options=['SMA',
'EMA'], group='if MACD Selected', inline='macd')
sma_signal = input.string(title='Signal Line MA Type', defval='EMA',
options=['SMA', 'EMA'], group='if MACD Selected', inline='macd')

fast_ma = sma_source == 'SMA' ? ta.sma(src, fast_length) : ta.ema(src, fast_length)


slow_ma = sma_source == 'SMA' ? ta.sma(src, slow_length) : ta.ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal == 'SMA' ? ta.sma(macd, signal_length) : ta.ema(macd,
signal_length)

macdUP = ta.crossover(macd, signal)


macdDOWN = ta.crossunder(macd, signal)
// } End of MACD

// Moving Averages {
smoothing_type = input.string(title='Average type', defval='SMA', options=['EMA',
'SMA', 'WMA', 'VWMA', 'HMA', 'RMA', 'DEMA'], inline='movingaverage', group='if
Moving Average selected')
ma_length = input.int(20, title='Length', inline='movingaverage', group='if Moving
Average selected')
moving_average(_series, _length, _smoothing) =>
_smoothing == 'EMA' ? ta.ema(_series, _length) : _smoothing == 'SMA' ?
ta.sma(_series, _length) : _smoothing == 'WMA' ? ta.wma(_series, _length) :
_smoothing == 'VWMA' ? ta.vwma(_series, _length) : _smoothing == 'HMA' ?
ta.hma(_series, _length) : _smoothing == 'RMA' ? ta.rma(_series, _length) :
_smoothing == 'DEMA' ? 2 * ta.ema(_series, _length) - ta.ema(ta.ema(_series,
_length), _length) : ta.ema(_series, _length)
movingaverage = moving_average(close, ma_length, smoothing_type)
maUP = movingaverage > movingaverage[1] and movingaverage[2] > movingaverage[1]
maDOWN = movingaverage < movingaverage[1] and movingaverage[2] < movingaverage[1]
// } End of Moving Averages

// QQE {
RSI_Period = input.int(14, title='RSI Length', inline='qqe', group='if QQE
selected')
qqeslow = input.float(4.238, title='QQE Factor', inline='qqe', group='if QQE
selected')
SFslow = input.int(5, title='RSI Smoothing', inline='qqe', group='if QQE selected')
ThreshHold = input.int(10, title='Thresh-hold', inline='qqe', group='if QQE
selected')
rsi_currenttf = ta.rsi(close, RSI_Period)

qqenew(_qqefactor, _smoothingfactor, _rsi, _threshold, _RSI_Period) =>


RSI_Period = _RSI_Period
SF = _smoothingfactor
QQE = _qqefactor
ThreshHold = _threshold
Wilders_Period = RSI_Period * 2 - 1
Rsi = _rsi
RsiMa = ta.ema(Rsi, SF)
AtrRsi = math.abs(RsiMa[1] - RsiMa)
MaAtrRsi = ta.ema(AtrRsi, Wilders_Period)
dar = ta.ema(MaAtrRsi, Wilders_Period) * QQE
longband = 0.0
shortband = 0.0
trend = 0
DeltaFastAtrRsi = dar
RSIndex = RsiMa
newshortband = RSIndex + DeltaFastAtrRsi
newlongband = RSIndex - DeltaFastAtrRsi
longband := RSIndex[1] > longband[1] and RSIndex > longband[1] ?
math.max(longband[1], newlongband) : newlongband
shortband := RSIndex[1] < shortband[1] and RSIndex < shortband[1] ?
math.min(shortband[1], newshortband) : newshortband
QQExlong = 0
QQExlong := nz(QQExlong[1])
QQExshort = 0
QQExshort := nz(QQExshort[1])
qqe_goingup = ta.barssince(QQExlong == 1) < ta.barssince(QQExshort == 1)
qqe_goingdown = ta.barssince(QQExlong == 1) > ta.barssince(QQExshort == 1)
var float last_qqe_high = high
var float last_qqe_low = low
last_qqe_high := high > last_qqe_high[1] and qqe_goingup or qqe_goingdown[1]
and qqe_goingup ? high : nz(last_qqe_high[1])
last_qqe_low := low < last_qqe_low[1] and qqe_goingdown or qqe_goingup[1] and
qqe_goingdown ? low : nz(last_qqe_low[1])
trend := ta.crossover(RSIndex, shortband[1]) or ta.crossover(high,
last_qqe_high) ? 1 : ta.crossunder(RSIndex, longband[1]) or ta.crossunder(low,
last_qqe_low) ? -1 : nz(trend[1], 1)
FastAtrRsiTL = trend == 1 ? longband : shortband
// Find all the QQE Crosses
QQExlong := trend == 1 and trend[1] == -1 ? QQExlong + 1 : 0
QQExshort := trend == -1 and trend[1] == 1 ? QQExshort + 1 : 0
qqeLong = QQExlong == 1 ? FastAtrRsiTL[1] - 50 : na
qqeShort = QQExshort == 1 ? FastAtrRsiTL[1] - 50 : na
qqenew = qqeLong ? 1 : qqeShort ? -1 : na
qqenew

qqeUP = qqenew(qqeslow, SFslow, rsi_currenttf, ThreshHold, RSI_Period) == 1


qqeDOWN = qqenew(qqeslow, SFslow, rsi_currenttf, ThreshHold, RSI_Period) == -1
// } End of QQE

momentumUP = momentum_select == 'MACD' ? macdUP : momentum_select ==


'MovingAverage' ? maUP : momentum_select == 'QQE' ? qqeUP : qqeUP

momentumDOWN = momentum_select == 'MACD' ? macdDOWN : momentum_select ==


'MovingAverage' ? maDOWN : momentum_select == 'QQE' ? qqeDOWN : qqeDOWN

momentum_direction := momentumUP ? 1 : momentumDOWN ? -1 :


nz(momentum_direction[1])

// { Force detection
rsi5 = ta.rsi(close, 5)
ob = 80
os = 20
barssince_momentumUP = ta.barssince(momentumUP)
barssince_momentumDOWN = ta.barssince(momentumDOWN)
momentum_DOWN_was_force_up = momentumDOWN and (barssince_momentumUP >=
ta.barssince(rsi5 > ob))[1]
momentum_UP_was_force_down = momentumUP and (barssince_momentumDOWN >=
ta.barssince(rsi5 < os))[1]
zzcolor_rsi5 = momentum_DOWN_was_force_up ? color.lime : momentum_UP_was_force_down
? color.red : color.black
// } End of Force detection

ZigZag = zigzag(momentum_direction)
plot(ZigZag, linewidth=5, color=color_zigzag_lines ? zzcolor_rsi5 : color.black,
title='ZIGZAG', style=plot.style_line, transp=0)

// indicator(title="HMA Breakout - Shyam", shorttitle="BO-HMA", overlay=true)

bool bcn = false


bool scn = false
var int hma1 = 10
var int hma2 = 20
var int hma3 = 100
use_hma = input(true, "Use BO-HMA Filter", group="BO-HMA")
t_type = input.string("Scalping","Trade Type",options = ["Scalping","Intraday"],
group="BO-HMA")

if t_type == "Scalping"
hma1 := 10
hma2 := 20
hma3 := 100
if t_type == "Intraday"
hma1 := 20
hma2 := 50
hma3 := 100

ma1 = ta.hma(close,hma1)
ma2 = ta.hma(close,hma2)
ma3 = ta.hma(close,hma3)
l_avg = math.avg(ma1,ma2,ma3)
l_col = color.gray

//---------------------------- Buy Condition ----------------------------//

if ma3<ma2 and ma3<ma1 and ma1>ma2


bcn := true
l_col := color.rgb(7, 249, 15)

//---------------------------- Sell Condition ----------------------------//

if ma3>ma2 and ma3>ma1 and ma2>ma1


scn := true
l_col :=color.rgb(247, 8, 8)

plot(ma3,color = l_col,linewidth = 2)

goshort1 = momentumDOWN and (not momentum_DOWN_was_force_up)


golong1 = momentumUP and (not momentum_UP_was_force_down)

var co = 0
if golong1
co:=1
if goshort1
co:=-1
// GoShort = momentumDOWN and (not momentum_DOWN_was_force_up) and scn and co==-1
// GoLong = momentumUP and (not momentum_UP_was_force_down) and bcn and co==1

GoShort = (use_hma?scn:true) and co==-1


GoLong = (use_hma?bcn:true) and co==1
// plot(co)
if GoShort
co:=0
if GoLong
co:=0
if golong1[1] and co==1
co:=0
if goshort1[1] and co==-1
co:=0

if GoShort and (use_ema ? high<ema : true)


label.new(bar_index, ZigZag, style=label.style_label_down, color=color.red,
text=str.tostring('SHORT\n\npivot high: \n' + str.tostring(ZigZag)))
if GoLong and (use_ema ? low>ema : true)
label.new(bar_index, ZigZag, style=label.style_label_up, color=color.lime,
text=str.tostring('LONG\n\npivot low: \n' + str.tostring(ZigZag)))
var float stoploss_long = low
var float stoploss_short = high

pl = ta.valuewhen(momentumUP, ZigZag, 0)
ph = ta.valuewhen(momentumDOWN, ZigZag, 0)

if GoLong
stoploss_long := low < pl ? low : pl
stoploss_long
if GoShort
stoploss_short := high > ph ? high : ph
stoploss_short

TakeProfitLevel=input(200)

if GoLong
alertsyntax_golong = 'long slprice=' + str.tostring(stoploss_long) + ' tp=' +
str.tostring(TakeProfitLevel)
alert(message=alertsyntax_golong, freq=alert.freq_once_per_bar_close)
alertcondition(GoLong, "Momentum-based ZigZag + EMA : BUY")
if GoShort
alertsyntax_goshort = 'short slprice=' + str.tostring(stoploss_short) + ' tp='
+ str.tostring(TakeProfitLevel)
alert(message=alertsyntax_goshort, freq=alert.freq_once_per_bar_close)
alertcondition(GoShort, "Momentum-based ZigZag + EMA : SELL")

You might also like