0% found this document useful (0 votes)
16 views9 pages

4 EMA Crossover Trading Strategy

The document is a Pine Script code for a trading indicator called '4 EMA Crossover' that plots four exponential moving averages (EMAs) on a chart. It includes various input options for moving average lengths, pivot point calculation methods, and display settings. The script defines functions for calculating pivot points based on different methodologies, including Traditional, Fibonacci, Woodie, Classic, Demark, and Camarilla.

Uploaded by

sailesh ranka
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)
16 views9 pages

4 EMA Crossover Trading Strategy

The document is a Pine Script code for a trading indicator called '4 EMA Crossover' that plots four exponential moving averages (EMAs) on a chart. It includes various input options for moving average lengths, pivot point calculation methods, and display settings. The script defines functions for calculating pivot points based on different methodologies, including Traditional, Fibonacci, Woodie, Classic, Demark, and Camarilla.

Uploaded by

sailesh ranka
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

//@version=5

indicator("4 EMA Crossover" , overlay=true)

len1 = [Link](8, minval=1, title="MA1")


len2 = [Link](13, minval=1, title="MA2")
len3 = [Link](21, minval=1, title="MA3")
len4 = [Link](55, minval=1, title="MA4")

ma1 = [Link](close, len1)


ma2 = [Link](close, len2)
ma3 = [Link](close, len3)
ma4 = [Link](close, len4)

longCondition3 = false
shortCondition3 = false

plot(ma1, title="MA1", color=[Link])


plot(ma2, title="MA2", color=[Link])
plot(ma3, title="MA3", color=[Link])
plot(ma4, title="MA4", color=[Link])

p_last = 0.0
AUTO = "Auto"
DAILY = "Daily"
WEEKLY = "Weekly"
MONTHLY = "Monthly"
QUARTERLY = "Quarterly"
YEARLY = "Yearly"
BIYEARLY = "Biyearly"
TRIYEARLY = "Triyearly"
QUINQUENNIALLY = "Quinquennially"
DECENNIALLY = "Decennially"

TRADITIONAL = "Traditional"
FIBONACCI = "Fibonacci"
WOODIE = "Woodie"
CLASSIC = "Classic"
DEMARK = "DM"
CAMARILLA = "Camarilla"

kind = [Link](title="Type", defval="Traditional", options=[TRADITIONAL,


FIBONACCI, WOODIE, CLASSIC, DEMARK, CAMARILLA])
pivot_time_frame = [Link](title="Pivots Timeframe", defval=AUTO,
options=[AUTO, DAILY, WEEKLY, MONTHLY, QUARTERLY, YEARLY, BIYEARLY, TRIYEARLY,
QUINQUENNIALLY, DECENNIALLY])
look_back = [Link](title="Number of Pivots Back", defval=15, minval=1,
maxval=5000)
is_daily_based = [Link](title="Use Daily-based Values", defval=true,
tooltip="When this option is unchecked, Pivot Points will use intraday data while
calculating on intraday charts. If Extended Hours are displayed on the chart, they
will be taken into account during the pivot level calculation. If intraday OHLC
values are different from daily-based values (normal for stocks), the pivot levels
will also differ.")
show_labels = [Link](title="Show Labels", defval=true, group="labels")
show_prices = [Link](title="Show Prices", defval=true, group="labels")
position_labels = [Link]("Left", "Labels Position", options=["Left",
"Right"], group="labels")
line_width = [Link](title="Line Width", defval=1, minval=1, maxval=100,
group="levels")

var DEF_COLOR = #FB8C00


var arr_time = array.new_int()
var p = array.new_float()
p_color = [Link](DEF_COLOR, "P ", inline="P", group="levels")
p_show = [Link](true, "", inline="P", group="levels")
var r1 = array.new_float()
var s1 = array.new_float()
s1_color = [Link](DEF_COLOR, "S1", inline="S1/R1" , group="levels")
s1_show = [Link](true, "", inline="S1/R1", group="levels")
r1_color = [Link](DEF_COLOR, " R1", inline="S1/R1",
group="levels")
r1_show = [Link](true, "", inline="S1/R1", group="levels")
var r2 = array.new_float()
var s2 = array.new_float()
s2_color = [Link](DEF_COLOR, "S2", inline="S2/R2", group="levels")
s2_show = [Link](true, "", inline="S2/R2", group="levels")
r2_color = [Link](DEF_COLOR, " R2", inline="S2/R2",
group="levels")
r2_show = [Link](true, "", inline="S2/R2", group="levels")
var r3 = array.new_float()
var s3 = array.new_float()
s3_color = [Link](DEF_COLOR, "S3", inline="S3/R3", group="levels")
s3_show = [Link](true, "", inline="S3/R3", group="levels")
r3_color = [Link](DEF_COLOR, " R3", inline="S3/R3",
group="levels")
r3_show = [Link](true, "", inline="S3/R3", group="levels")
var r4 = array.new_float()
var s4 = array.new_float()
s4_color = [Link](DEF_COLOR, "S4", inline="S4/R4", group="levels")
s4_show = [Link](true, "", inline="S4/R4", group="levels")
r4_color = [Link](DEF_COLOR, " R4", inline="S4/R4",
group="levels")
r4_show = [Link](true, "", inline="S4/R4", group="levels")
var r5 = array.new_float()
var s5 = array.new_float()
s5_color = [Link](DEF_COLOR, "S5", inline="S5/R5", group="levels")
s5_show = [Link](true, "", inline="S5/R5", group="levels")
r5_color = [Link](DEF_COLOR, " R5", inline="S5/R5",
group="levels")
r5_show = [Link](true, "", inline="S5/R5", group="levels")
pivotX_open = float(na)
pivotX_open := nz(pivotX_open[1], open)
pivotX_high = float(na)
pivotX_high := nz(pivotX_high[1], high)
pivotX_low = float(na)
pivotX_low := nz(pivotX_low[1], low)
pivotX_prev_open = float(na)
pivotX_prev_open := nz(pivotX_prev_open[1])
pivotX_prev_high = float(na)
pivotX_prev_high := nz(pivotX_prev_high[1])
pivotX_prev_low = float(na)
pivotX_prev_low := nz(pivotX_prev_low[1])
pivotX_prev_close = float(na)
pivotX_prev_close := nz(pivotX_prev_close[1])

get_pivot_resolution() =>
resolution = "M"
if pivot_time_frame == AUTO
if [Link]
resolution := [Link] <= 15 ? "D" : "W"
else if [Link] or [Link]
resolution := "12M"
else if pivot_time_frame == DAILY
resolution := "D"
else if pivot_time_frame == WEEKLY
resolution := "W"
else if pivot_time_frame == MONTHLY
resolution := "M"
else if pivot_time_frame == QUARTERLY
resolution := "3M"
else if pivot_time_frame == YEARLY or pivot_time_frame == BIYEARLY or
pivot_time_frame == TRIYEARLY or pivot_time_frame == QUINQUENNIALLY or
pivot_time_frame == DECENNIALLY
resolution := "12M"
resolution

var lines = array.new_line()


var labels = array.new_label()

draw_line(i, pivot, col) =>


if [Link](arr_time) > 1
[Link](lines, [Link]([Link](arr_time, i), [Link](pivot, i),
[Link](arr_time, i + 1), [Link](pivot, i), color=col, xloc=xloc.bar_time,
width=line_width))

draw_label(i, y, txt, txt_color) =>


if (show_labels or show_prices) and not na(y)
display_text = (show_labels ? txt : "") + (show_prices ? [Link]("
({0})", math.round_to_mintick(y)) : "")
label_style = position_labels == "Left" ? label.style_label_right :
label.style_label_left
x = position_labels == "Left" ? [Link](arr_time, i) :
[Link](arr_time, i + 1)
[Link](labels, [Link](x = x, y=y, text=display_text,
textcolor=txt_color, style=label_style, color=#00000000, xloc=xloc.bar_time))

traditional() =>
pivotX_Median = (pivotX_prev_high + pivotX_prev_low + pivotX_prev_close) / 3
[Link](p, pivotX_Median)
[Link](r1, pivotX_Median * 2 - pivotX_prev_low)
[Link](s1, pivotX_Median * 2 - pivotX_prev_high)
[Link](r2, pivotX_Median + 1 * (pivotX_prev_high - pivotX_prev_low))
[Link](s2, pivotX_Median - 1 * (pivotX_prev_high - pivotX_prev_low))
[Link](r3, pivotX_Median * 2 + (pivotX_prev_high - 2 * pivotX_prev_low))
[Link](s3, pivotX_Median * 2 - (2 * pivotX_prev_high - pivotX_prev_low))
[Link](r4, pivotX_Median * 3 + (pivotX_prev_high - 3 * pivotX_prev_low))
[Link](s4, pivotX_Median * 3 - (3 * pivotX_prev_high - pivotX_prev_low))
[Link](r5, pivotX_Median * 4 + (pivotX_prev_high - 4 * pivotX_prev_low))
[Link](s5, pivotX_Median * 4 - (4 * pivotX_prev_high - pivotX_prev_low))
fibonacci() =>
pivotX_Median = (pivotX_prev_high + pivotX_prev_low + pivotX_prev_close) / 3
pivot_range = pivotX_prev_high - pivotX_prev_low
[Link](p, pivotX_Median)
[Link](r1, pivotX_Median + 0.382 * pivot_range)
[Link](s1, pivotX_Median - 0.382 * pivot_range)
[Link](r2, pivotX_Median + 0.618 * pivot_range)
[Link](s2, pivotX_Median - 0.618 * pivot_range)
[Link](r3, pivotX_Median + 1 * pivot_range)
[Link](s3, pivotX_Median - 1 * pivot_range)

woodie() =>
pivotX_Woodie_Median = (pivotX_prev_high + pivotX_prev_low + pivotX_open * 2)/4
pivot_range = pivotX_prev_high - pivotX_prev_low
[Link](p, pivotX_Woodie_Median)
[Link](r1, pivotX_Woodie_Median * 2 - pivotX_prev_low)
[Link](s1, pivotX_Woodie_Median * 2 - pivotX_prev_high)
[Link](r2, pivotX_Woodie_Median + 1 * pivot_range)
[Link](s2, pivotX_Woodie_Median - 1 * pivot_range)

pivot_point_r3 = pivotX_prev_high + 2 * (pivotX_Woodie_Median -


pivotX_prev_low)
pivot_point_s3 = pivotX_prev_low - 2 * (pivotX_prev_high -
pivotX_Woodie_Median)
[Link](r3, pivot_point_r3)
[Link](s3, pivot_point_s3)
[Link](r4, pivot_point_r3 + pivot_range)
[Link](s4, pivot_point_s3 - pivot_range)

classic() =>
pivotX_Median = (pivotX_prev_high + pivotX_prev_low + pivotX_prev_close)/3
pivot_range = pivotX_prev_high - pivotX_prev_low
[Link](p, pivotX_Median)
[Link](r1, pivotX_Median * 2 - pivotX_prev_low)
[Link](s1, pivotX_Median * 2 - pivotX_prev_high)
[Link](r2, pivotX_Median + 1 * pivot_range)
[Link](s2, pivotX_Median - 1 * pivot_range)
[Link](r3, pivotX_Median + 2 * pivot_range)
[Link](s3, pivotX_Median - 2 * pivot_range)
[Link](r4, pivotX_Median + 3 * pivot_range)
[Link](s4, pivotX_Median - 3 * pivot_range)

demark() =>
pivotX_Demark_X = pivotX_prev_high + pivotX_prev_low * 2 + pivotX_prev_close
if pivotX_prev_close == pivotX_prev_open
pivotX_Demark_X := pivotX_prev_high + pivotX_prev_low + pivotX_prev_close *
2
if pivotX_prev_close > pivotX_prev_open
pivotX_Demark_X := pivotX_prev_high * 2 + pivotX_prev_low +
pivotX_prev_close
[Link](p, pivotX_Demark_X / 4)
[Link](r1, pivotX_Demark_X / 2 - pivotX_prev_low)
[Link](s1, pivotX_Demark_X / 2 - pivotX_prev_high)

camarilla() =>
pivotX_Median = (pivotX_prev_high + pivotX_prev_low + pivotX_prev_close) / 3
pivot_range = pivotX_prev_high - pivotX_prev_low
[Link](p, pivotX_Median)
[Link](r1, pivotX_prev_close + pivot_range * 1.1 / 12.0)
[Link](s1, pivotX_prev_close - pivot_range * 1.1 / 12.0)
[Link](r2, pivotX_prev_close + pivot_range * 1.1 / 6.0)
[Link](s2, pivotX_prev_close - pivot_range * 1.1 / 6.0)
[Link](r3, pivotX_prev_close + pivot_range * 1.1 / 4.0)
[Link](s3, pivotX_prev_close - pivot_range * 1.1 / 4.0)
[Link](r4, pivotX_prev_close + pivot_range * 1.1 / 2.0)
[Link](s4, pivotX_prev_close - pivot_range * 1.1 / 2.0)
r5_val = pivotX_prev_high / pivotX_prev_low * pivotX_prev_close
[Link](r5, r5_val)
[Link](s5, 2 * pivotX_prev_close - r5_val)

calc_pivot() =>
if kind == TRADITIONAL
traditional()
else if kind == FIBONACCI
fibonacci()
else if kind == WOODIE
woodie()
else if kind == CLASSIC
classic()
else if kind == DEMARK
demark()
else if kind == CAMARILLA
camarilla()

resolution = get_pivot_resolution()

SIMPLE_DIVISOR = -1
custom_years_divisor = switch pivot_time_frame
BIYEARLY => 2
TRIYEARLY => 3
QUINQUENNIALLY => 5
DECENNIALLY => 10
=> SIMPLE_DIVISOR

calc_high(prev, curr) =>


if na(prev) or na(curr)
nz(prev, nz(curr, na))
else
[Link](prev, curr)

calc_low(prev, curr) =>


if not na(prev) and not na(curr)
[Link](prev, curr)
else
nz(prev, nz(curr, na))

calc_OHLC_for_pivot(custom_years_divisor) =>
if custom_years_divisor == SIMPLE_DIVISOR
[open, high, low, close, open[1], high[1], low[1], close[1], time[1],
time_close]
else
var prev_sec_open = float(na)
var prev_sec_high = float(na)
var prev_sec_low = float(na)
var prev_sec_close = float(na)
var prev_sec_time = int(na)
var curr_sec_open = float(na)
var curr_sec_high = float(na)
var curr_sec_low = float(na)
var curr_sec_close = float(na)
if year(time_close) % custom_years_divisor == 0
curr_sec_open := open
curr_sec_high := high
curr_sec_low := low
curr_sec_close := close
prev_sec_high := high[1]
prev_sec_low := low[1]
prev_sec_close := close[1]
prev_sec_time := time[1]
for i = 2 to custom_years_divisor
prev_sec_open := nz(open[i], prev_sec_open)
prev_sec_high := calc_high(prev_sec_high, high[i])
prev_sec_low := calc_low(prev_sec_low, low[i])
prev_sec_time := nz(time[i], prev_sec_time)
[curr_sec_open, curr_sec_high, curr_sec_low, curr_sec_close, prev_sec_open,
prev_sec_high, prev_sec_low, prev_sec_close, prev_sec_time, time_close]

[sec_open, sec_high, sec_low, sec_close, prev_sec_open, prev_sec_high,


prev_sec_low, prev_sec_close, prev_sec_time, sec_time] =
[Link]([Link], resolution,
calc_OHLC_for_pivot(custom_years_divisor), lookahead = barmerge.lookahead_on)
sec_open_gaps_on = [Link]([Link], resolution, open, gaps =
barmerge.gaps_on, lookahead = barmerge.lookahead_on)

is_change_years = custom_years_divisor > 0 and [Link](time(resolution)) and


year(time_close) % custom_years_divisor == 0

var is_change = false


var uses_current_bar = [Link] and kind == WOODIE
var change_time = int(na)
is_time_change = ([Link](time(resolution)) and custom_years_divisor ==
SIMPLE_DIVISOR) or is_change_years
if is_time_change
change_time := time

var start_time = time


var was_last_premarket = false
var start_calculate_in_premarket = false

is_last_premarket = [Link] and [Link] and time_close >


sec_time and not was_last_premarket

if is_last_premarket
was_last_premarket := true
start_calculate_in_premarket := true
if [Link]
was_last_premarket := false

without_time_change = [Link] and [Link](arr_time) == 0


is_can_calc_pivot = (not uses_current_bar and is_time_change and [Link])
or ([Link](sec_open) and not start_calculate_in_premarket) or is_last_premarket
or (uses_current_bar and not na(sec_open_gaps_on)) or without_time_change
enough_bars_for_calculate = prev_sec_time >= start_time or is_daily_based

if is_can_calc_pivot and enough_bars_for_calculate


if [Link](arr_time) == 0 and is_daily_based
pivotX_prev_open := prev_sec_open[1]
pivotX_prev_high := prev_sec_high[1]
pivotX_prev_low := prev_sec_low[1]
pivotX_prev_close := prev_sec_close[1]
pivotX_open := sec_open[1]
pivotX_high := sec_high[1]
pivotX_low := sec_low[1]
[Link](arr_time, start_time)
calc_pivot()

if is_daily_based
if is_last_premarket
pivotX_prev_open := sec_open
pivotX_prev_high := sec_high
pivotX_prev_low := sec_low
pivotX_prev_close := sec_close
pivotX_open := open
pivotX_high := high
pivotX_low := low
else
pivotX_prev_open := prev_sec_open
pivotX_prev_high := prev_sec_high
pivotX_prev_low := prev_sec_low
pivotX_prev_close := prev_sec_close
pivotX_open := sec_open
pivotX_high := sec_high
pivotX_low := sec_low
else
pivotX_prev_high := pivotX_high
pivotX_prev_low := pivotX_low
pivotX_prev_open := pivotX_open
pivotX_prev_close := close[1]
pivotX_open := open
pivotX_high := high
pivotX_low := low

if [Link] and not is_change and [Link](arr_time) > 0 and not


without_time_change
[Link](arr_time, [Link](arr_time) - 1, change_time)
else if without_time_change
[Link](arr_time, start_time)
else
[Link](arr_time, nz(change_time, time))

calc_pivot()

if [Link](arr_time) > look_back


if [Link](arr_time) > 0
[Link](arr_time)
if [Link](p) > 0 and p_show
[Link](p)
if [Link](r1) > 0 and r1_show
[Link](r1)
if [Link](s1) > 0 and s1_show
[Link](s1)
if [Link](r2) > 0 and r2_show
[Link](r2)
if [Link](s2) > 0 and s2_show
[Link](s2)
if [Link](r3) > 0 and r3_show
[Link](r3)
if [Link](s3) > 0 and s3_show
[Link](s3)
if [Link](r4) > 0 and r4_show
[Link](r4)
if [Link](s4) > 0 and s4_show
[Link](s4)
if [Link](r5) > 0 and r5_show
[Link](r5)
if [Link](s5) > 0 and s5_show
[Link](s5)
is_change := true
else if not is_daily_based
pivotX_high := [Link](pivotX_high, high)
pivotX_low := [Link](pivotX_low, low)

if [Link] and not is_daily_based and [Link](arr_time) == 0


[Link]("Not enough intraday data to calculate Pivot Points. Lower the
Pivots Timeframe or turn on the 'Use Daily-based Values' option in the indicator
settings.")

if [Link] and [Link](arr_time) > 0 and is_change


is_change := false
if custom_years_divisor > 0
last_pivot_time = [Link](arr_time, [Link](arr_time) - 1)
pivot_timeframe = [Link](12 * custom_years_divisor) + "M"
estimate_pivot_time = last_pivot_time +
timeframe.in_seconds(pivot_timeframe) * 1000
[Link](arr_time, estimate_pivot_time)
else
[Link](arr_time, time_close(resolution))

for i = 0 to [Link](lines) - 1
if [Link](lines) > 0
[Link]([Link](lines))
if [Link](labels) > 0
[Link]([Link](labels))

for i = 0 to [Link](arr_time) - 2
if [Link](p) > 0 and p_show
draw_line(i, p, p_color)
draw_label(i, [Link](p, i), "P", p_color)

p_last := [Link](p) > 2 ? [Link](p,[Link](p)-1) : 0.0


longCond = bool(na)
shortCond = bool(na)
longCond := ma1 > ma4 and ma2 > ma4 and ma3 > ma4
shortCond := ma1 < ma4 and ma2 < ma4 and ma3 < ma4

vwapval = [Link](hlc3)
longCondition2 = close > vwapval
shortCondition2 = close < vwapval

if [Link](arr_time) > 1
if close[0] > p_last and close[0] < p_last*(1.04)
longCondition3 := true
shortCondition3 := false

if close[0] < p_last and close[0] > p_last*(0.96)


longCondition3 := false
shortCondition3 := true

plot(p_last, title="plast", color=[Link])

CondIni = 0
CondIni := longCond ? 1 : shortCond ? -1 : CondIni[1]
longCondition1 = longCond and CondIni[1] == -1
shortCondition1 = shortCond and CondIni[1] == 1

plotshape(longCondition1 and longCondition2 and longCondition3, title="Buy Signal",


text="B", textcolor=[Link], style=[Link], size=[Link],
location=[Link], color=[Link], transp=0)
plotshape(shortCondition1 and shortCondition2 and shortCondition3, title="Short
Signal", text="S", textcolor=[Link], style=[Link], size=[Link],
location=[Link], color=[Link], transp=0)
//alertcondition(longCondition, title='EMA Cross UP', message='EMA Cross UP')
//alertcondition(shortCondition, title='EMA Cross DOWN', message='EMA Cross DOWN')

You might also like