// This source code is subject to the terms of the Mozilla Public License 2.
0 at
https://mozilla.org/MPL/2.0/
// © meomeo105
// Gann Swing Chart version 3.0
// MT5 version : www.mql5.com/en/market/product/112401
//@version=5
indicator('Gann Swing [Multi Layer]', shorttitle='GSC[ML]', overlay=true,
max_lines_count=500, max_boxes_count = 500, max_labels_count = 500)
DefaultGannMLSetting = "[Gann][SGann][Color][ChoCh Gann][ChoCh SGann]"
showF1GannML = input.bool(true,"", group = DefaultGannMLSetting,inline =
"showF1GannML")
showSF1GannML = input.bool(true,"F1", group = DefaultGannMLSetting,inline =
"showF1GannML")
colorF1GannML = input.color(color.aqua, '', group = DefaultGannMLSetting,inline =
"showF1GannML")
showChoChF1GannML = input.bool(false,"", group = DefaultGannMLSetting,inline =
"showF1GannML")
showChoChSF1GannML = input.bool(true,"", group = DefaultGannMLSetting,inline =
"showF1GannML")
showF2GannML = input.bool(true,"", group = DefaultGannMLSetting,inline =
"showF2GannML")
showSF2GannML = input.bool(true,"F2", group = DefaultGannMLSetting,inline =
"showF2GannML")
colorF2GannML = input.color(color.yellow, '', group = DefaultGannMLSetting,inline =
"showF2GannML")
showChoChF2GannML = input.bool(true,"", group = DefaultGannMLSetting,inline =
"showF2GannML")
showChoChSF2GannML = input.bool(true,"", group = DefaultGannMLSetting,inline =
"showF2GannML")
showF3GannML = input.bool(true,"", group = DefaultGannMLSetting,inline =
"showF3GannML")
showSF3GannML = input.bool(true,"F3", group = DefaultGannMLSetting,inline =
"showF3GannML")
colorF3GannML = input.color(color.purple, '', group = DefaultGannMLSetting,inline =
"showF3GannML")
showChoChF3GannML = input.bool(true,"", group = DefaultGannMLSetting,inline =
"showF3GannML")
showChoChSF3GannML = input.bool(true,"", group = DefaultGannMLSetting,inline =
"showF3GannML")
f_CalculateF0(_pointX,_pointY,arrayX0,arrayY0)=>
array.unshift(arrayX0,_pointX)
array.unshift(arrayY0,_pointY)
[1]
f_CalculateFn1(_pointX,_pointY,arrayXn,arrayYn,arrayXFn1,arrayYFn1)=>
//_resultdraw 2:Tiếp tục 1:Đảo chiều
int _resultdraw = 0
//OSB pha dinh/day
if((array.get(arrayYFn1,0) >= array.get(arrayYFn1,1) and array.get(arrayYn,0)
< array.get(arrayYFn1,1)) or (array.get(arrayYFn1,0) <= array.get(arrayYFn1,1) and
array.get(arrayYn,0) > array.get(arrayYFn1,1)))
array.unshift(arrayXFn1,_pointX)
array.unshift(arrayYFn1,_pointY)
_resultdraw := 1
//Dao chieu sang giam
else if(array.get(arrayYFn1,0) >= array.get(arrayYFn1,1) and
(array.get(arrayYn,0) < array.get(arrayYn,1) and array.get(arrayYn,0) <
array.get(arrayYn,2) and array.get(arrayYn,1) < array.get(arrayYn,3)) and
array.get(arrayYn,2) < array.get(arrayYn,3))
array.unshift(arrayXFn1,_pointX)
array.unshift(arrayYFn1,_pointY)
_resultdraw := 1
//Dao chieu sang tang
else if(array.get(arrayYFn1,0) <= array.get(arrayYFn1,1) and
(array.get(arrayYn,0) > array.get(arrayYn,1) and array.get(arrayYn,0) >
array.get(arrayYn,2) and array.get(arrayYn,1) > array.get(arrayYn,3)) and
array.get(arrayYn,2) > array.get(arrayYn,3))
array.unshift(arrayXFn1,_pointX)
array.unshift(arrayYFn1,_pointY)
_resultdraw := 1
else if(array.get(arrayYFn1,0) >= array.get(arrayYFn1,1) and _pointY >=
array.get(arrayYFn1,0) and (_pointY >= array.get(arrayYFn1,0) or
(array.get(arrayYn,0) > array.get(arrayYn,2) and array.get(arrayYn,2) >
array.get(arrayYn,1)) or (array.get(arrayYn,0) > array.get(arrayYn,1) and
array.get(arrayYn,1) > array.get(arrayYn,2) and array.get(arrayYn,2) >
array.get(arrayYn,3))))
array.set(arrayXFn1, 0, _pointX)
array.set(arrayYFn1, 0, _pointY)
_resultdraw := 2
else if(array.get(arrayYFn1,0) <= array.get(arrayYFn1,1) and _pointY <=
array.get(arrayYFn1,0) and (_pointY <= array.get(arrayYFn1,0) or
(array.get(arrayYn,0) < array.get(arrayYn,2) and array.get(arrayYn,2) <
array.get(arrayYn,1)) or (array.get(arrayYn,0) < array.get(arrayYn,1) and
array.get(arrayYn,1) < array.get(arrayYn,2) and array.get(arrayYn,2) <
array.get(arrayYn,3))))
array.set(arrayXFn1, 0, _pointX)
array.set(arrayYFn1, 0, _pointY)
_resultdraw := 2
[_resultdraw]
f_CalculateSFn1(_pointX,_pointY,_arrayMark,_mIdxMark,arraySXFn1,arraySYFn1)=>
int _resultdraw = 0
if(array.get(_arrayMark,_mIdxMark) == 0)
if((array.get(arraySYFn1,0) >= array.get(arraySYFn1,1) and _pointY >=
array.get(arraySYFn1,0)) or (array.get(arraySYFn1,0) <= array.get(arraySYFn1,1) and
_pointY <= array.get(arraySYFn1,0)))
array.set(arraySXFn1, 0, _pointX)
array.set(arraySYFn1, 0, _pointY)
_resultdraw := 2
else if((array.get(arraySYFn1,0) >= array.get(arraySYFn1,1) and _pointY
< array.get(arraySYFn1,1)) or (array.get(arraySYFn1,0) <= array.get(arraySYFn1,1)
and _pointY > array.get(arraySYFn1,1)))
array.unshift(arraySXFn1,_pointX)
array.unshift(arraySYFn1,_pointY)
_resultdraw := 1
else if((array.get(arraySYFn1,0) >= array.get(arraySYFn1,1) and _pointY
< array.get(arraySYFn1,0) and _pointY > array.get(arraySYFn1,1)) or
(array.get(arraySYFn1,0) <= array.get(arraySYFn1,1) and _pointY >
array.get(arraySYFn1,0) and _pointY < array.get(arraySYFn1,1)))
array.unshift(arraySXFn1,_pointX)
array.unshift(arraySYFn1,_pointY)
array.set(_arrayMark,_mIdxMark,_pointY)
_resultdraw := 1
else if(array.get(_arrayMark,_mIdxMark) > 0)
if((array.get(arraySYFn1,0) >= array.get(arraySYFn1,1) and _pointY <
array.get(arraySYFn1,1)) or (array.get(arraySYFn1,0) <= array.get(arraySYFn1,1) and
_pointY > array.get(arraySYFn1,1)))
array.unshift(arraySXFn1,_pointX)
array.unshift(arraySYFn1,_pointY)
array.set(_arrayMark,_mIdxMark,0)
_resultdraw := 1
else if((array.get(arraySYFn1,0) >= array.get(arraySYFn1,1) and _pointY
> array.get(arraySYFn1,2)) or (array.get(arraySYFn1,0) <= array.get(arraySYFn1,1)
and _pointY < array.get(arraySYFn1,2)))
array.set(arraySXFn1, 0, _pointX)
array.set(arraySYFn1, 0, _pointY)
array.set(_arrayMark,_mIdxMark,0)
_resultdraw := 2
else if((array.get(arraySYFn1,0) >= array.get(arraySYFn1,1) and _pointY
<= array.get(arraySYFn1,2) and _pointY >= array.get(arraySYFn1,0)) or
(array.get(arraySYFn1,0) <= array.get(arraySYFn1,1) and _pointY >=
array.get(arraySYFn1,2) and _pointY <= array.get(arraySYFn1,0)))
array.set(arraySXFn1, 0, _pointX)
array.set(arraySYFn1, 0, _pointY)
array.set(_arrayMark,_mIdxMark,_pointY)
_resultdraw := 2
[_resultdraw]
f_CalculateRemoveDuplicateLine(arrayLine,arraySLine)=>
if(array.size(arraySLine) > 1 and array.size(arrayLine) >1)
if(line.get_y1(array.get(arraySLine,1)) ==
line.get_y1(array.get(arrayLine,1)) and line.get_y2(array.get(arraySLine,1)) ==
line.get_y2(array.get(arrayLine,1))and line.get_x1(array.get(arraySLine,1)) ==
line.get_x1(array.get(arrayLine,1)) and line.get_x2(array.get(arraySLine,1)) ==
line.get_x2(array.get(arrayLine,1)))
line.delete(array.get(arrayLine,1))
array.remove(arrayLine,1)
f_CalculateChoCh(arraySXFn1,arraySYFn1) =>
int _X = 0
float _Y = 0
// ChoCh Trường hợp chữ N ngược, chữ N
if((array.get(arraySYFn1,3) > array.get(arraySYFn1,2) and
array.get(arraySYFn1,3) < array.get(arraySYFn1,1) and array.get(arraySYFn1,0) <
array.get(arraySYFn1,2)) or (array.get(arraySYFn1,3) < array.get(arraySYFn1,2) and
array.get(arraySYFn1,3) > array.get(arraySYFn1,1) and array.get(arraySYFn1,0) >
array.get(arraySYFn1,2)))
_X := array.get(arraySXFn1,2)
_Y := array.get(arraySYFn1,2)
[_X,_Y]
f_CalculateDrawF(_drawF,_showSF,arrayLine,arrayX,arrayY,showChoCh,arrayMChoCh,idxCh
oCh,_color) =>
if(_drawF > 0)
if(_drawF == 1)
array.unshift(arrayLine,line.new(array.get(arrayX,1),array.get(arrayY,1),array.get(
arrayX,0),array.get(arrayY,0), color = _color,xloc = xloc.bar_time,width = 1,style
= line.style_dotted))
else if(_drawF == 2 and array.size(arrayLine) >0)
line.set_xy2(array.get(arrayLine,0),array.get(arrayX,0),array.get(arrayY,0))
[XChoCh,YChoCh] = f_CalculateChoCh(arrayX,arrayY)
if(showChoCh and YChoCh >0 and array.get(arrayMChoCh,idxChoCh) !=
YChoCh)
array.set(arrayMChoCh,idxChoCh,YChoCh)
line.new(XChoCh,YChoCh,time,YChoCh, color = _color,xloc =
xloc.bar_time,width = 1,style = line.style_dotted)
f_CalculateDrawSF(_drawSF,arrayLine,arraySLine,arraySX,arraySY,showChoCh,arrayMChoC
h,idxChoCh,_color) =>
if(_drawSF > 0)
if(_drawSF == 1)
array.unshift(arraySLine,line.new(array.get(arraySX,1),array.get(arraySY,1),array.g
et(arraySX,0),array.get(arraySY,0), color = _color,xloc = xloc.bar_time,width = 1))
else if(_drawSF == 2 and array.size(arraySLine) >0)
line.set_xy2(array.get(arraySLine,0),array.get(arraySX,0),array.get(arraySY,0))
f_CalculateRemoveDuplicateLine(arrayLine,arraySLine)
[XChoChS,YChoChS] = f_CalculateChoCh(arraySX,arraySY)
if(showChoCh and YChoChS >0 and array.get(arrayMChoCh,idxChoCh) !=
YChoChS)
array.set(arrayMChoCh,idxChoCh,YChoChS)
line.new(XChoChS,YChoChS,time,YChoChS, color = _color,xloc =
xloc.bar_time,width = 1,style = line.style_dashed)
var arrayMarkGannML = array.new_float(3,0)
var arrayMarkChoChGannML = array.new_float(6,0)
var arrayXF0GannML = array.new_int(5,time)
var arrayYF0GannML = array.new_float(5,close)
var arrayXF1GannML = array.new_int(5,time)
var arrayYF1GannML = array.new_float(5,close)
var arrayLineF1GannML = array.new_line()
var arraySXF1GannML = array.new_int(5,time)
var arraySYF1GannML = array.new_float(5,close)
var arraySLineF1GannML = array.new_line()
var arrayXF2GannML = array.new_int(5,time)
var arrayYF2GannML = array.new_float(5,close)
var arrayLineF2GannML = array.new_line()
var arraySXF2GannML = array.new_int(5,time)
var arraySYF2GannML = array.new_float(5,close)
var arraySLineF2GannML = array.new_line()
var arrayXF3GannML = array.new_int(5,time)
var arrayYF3GannML = array.new_float(5,close)
var arrayLineF3GannML = array.new_line()
var arraySXF3GannML = array.new_int(5,time)
var arraySYF3GannML = array.new_float(5,close)
var arraySLineF3GannML = array.new_line()
f_CalculateAndDrawFn1(_pointX,_pointY) =>
//F0 : Song cua nen
array.unshift(arrayXF0GannML,_pointX)
array.unshift(arrayYF0GannML,_pointY)
//F1,F2,...: Song cua song theo Gann
if(showF1GannML or showF2GannML or showF3GannML or showSF1GannML or
showSF2GannML or showSF3GannML)
[drawF1] =
f_CalculateFn1(_pointX,_pointY,arrayXF0GannML,arrayYF0GannML,arrayXF1GannML,arrayYF
1GannML)
f_CalculateDrawF(showF1GannML?
drawF1:0,showSF1GannML,arrayLineF1GannML,arrayXF1GannML,arrayYF1GannML,showChoChF1G
annML,arrayMarkChoChGannML,0,colorF1GannML)
if(drawF1 > 0 and (showF2GannML or showF3GannML or showSF1GannML or
showSF2GannML or showSF3GannML))
[drawSF1] =
f_CalculateSFn1(_pointX,_pointY,arrayMarkGannML,0,arraySXF1GannML,arraySYF1GannML)
f_CalculateDrawSF(showSF1GannML?
drawSF1:0,arrayLineF1GannML,arraySLineF1GannML,arraySXF1GannML,arraySYF1GannML,show
ChoChSF1GannML,arrayMarkChoChGannML,1,colorF1GannML)
if(drawSF1 > 0 and (showF2GannML or showF3GannML or showSF2GannML
or showSF3GannML))
[drawF2] =
f_CalculateFn1(_pointX,_pointY,arraySXF1GannML,arraySYF1GannML,arrayXF2GannML,array
YF2GannML)
f_CalculateDrawF(showF2GannML?
drawF2:0,showSF2GannML,arrayLineF2GannML,arrayXF2GannML,arrayYF2GannML,showChoChF2G
annML,arrayMarkChoChGannML,2,colorF2GannML)
if(drawF2 > 0 and (showF3GannML or showSF2GannML or
showSF3GannML))
[drawSF2] =
f_CalculateSFn1(_pointX,_pointY,arrayMarkGannML,1,arraySXF2GannML,arraySYF2GannML)
f_CalculateDrawSF(showSF2GannML?
drawSF2:0,arrayLineF2GannML,arraySLineF2GannML,arraySXF2GannML,arraySYF2GannML,show
ChoChSF2GannML,arrayMarkChoChGannML,3,colorF2GannML)
if(drawSF2 > 0 and (showF3GannML or showSF3GannML))
[drawF3] =
f_CalculateFn1(_pointX,_pointY,arraySXF2GannML,arraySYF2GannML,arrayXF3GannML,array
YF3GannML)
f_CalculateDrawF(showF3GannML?
drawF3:0,showSF3GannML,arrayLineF3GannML,arrayXF3GannML,arrayYF3GannML,showChoChF3G
annML,arrayMarkChoChGannML,4,colorF3GannML)
if(drawF3 > 0 and (showSF3GannML))
[drawSF3] =
f_CalculateSFn1(_pointX,_pointY,arrayMarkGannML,2,arraySXF3GannML,arraySYF3GannML)
f_CalculateDrawSF(showSF3GannML?
drawSF3:0,arrayLineF3GannML,arraySLineF3GannML,arraySXF3GannML,arraySYF3GannML,show
ChoChSF3GannML,arrayMarkChoChGannML,5,colorF3GannML)
f_CalculateAndDraw(_pointX,_pointY1,_pointY2) =>
if((array.get(arrayYF0GannML,0) > _pointY1 and array.get(arrayYF0GannML,0) >
_pointY2) or (array.get(arrayYF0GannML,0) < _pointY1 and
array.get(arrayYF0GannML,0) < _pointY2))
f_CalculateAndDrawFn1(time,array.get(arrayYF0GannML,1))
f_CalculateAndDrawFn1(time,_pointY1)
f_CalculateAndDrawFn1(time,_pointY2)
highPrev = high
lowPrev = low
if(barstate.isconfirmed)
if(high > highPrev[1] and low > lowPrev[1])
f_CalculateAndDraw(time,low,high)
else if(high < highPrev[1] and low < lowPrev[1])
f_CalculateAndDraw(time,high,low)
else if((high >= highPrev[1] and low < lowPrev[1]) or (high > highPrev[1] and
low <= lowPrev[1]))
if(close > open)
f_CalculateAndDraw(time,low,high)
else
f_CalculateAndDraw(time,high,low)
else if(high[0] <= highPrev[1] and low[0] >= lowPrev[1])
highPrev := highPrev[1]
lowPrev := lowPrev[1]