Hi Coders,
This is an improved version of a Volume Price Level indicator I proposed lately, combined with the work of Nicolas on ZigZag.
https://www.prorealcode.com/prorealtime-indicators/multi-fractals-zigzag-highlow/
https://www.prorealcode.com/prorealtime-indicators/volume-by-price-levels-v2-extended/
It allows us to
▀ ▀ = MaxVol level
▼▼ or ▲▲= MinVol Levels above or under the MaxVol level
I am captive to read from you what would be the best way to optimize a strategy
Please feel free to give to this code some enhancements or correct it if you see errors.
Enjoy
Chris
//The main goal of this indicator is to identify strengh and weekness in the distribution of volume per price
//and to identify future support and resistance in the next ZIG ZAG sequence
//
//VolumebypricelevelsV2Extended by Kris75
//VolumeByPrice HighLowBreakdown (mods by Kris75)
//PRC_multi-fractals-zigzag-highlow | indicator
//PRC_Bull&Bear Volume on Price | indicator
//05.07.2018
//Nicolas @ www.prorealcode.com
//Sharing ProRealTime knowledge
r=100
g=100
b=100
r1=200
g1=200
b1=200
//---major zigzag points
if lastpoint <= 0 then
if close[cp] >= highest[2*cp+1](close) then
NewPeak = 1
HighCp = high[cp]
Higher = close[cp]
HigherBarIndex = barindex[cp]
else
NewPeak = 0
endif
endif
if NewPeak then
NewHigherBarIndex = HigherBarIndex
LastLowerBarIndex = NewLowerBarIndex
NewHigher = higher
LastLower = NewLower
LagAfterSignal = abs(barindex-NewHigherBarIndex)
lastpoint=1
drawsegment (lastLowerBarindex,lastlower,HigherBarIndex,NewHigher) coloured (0,0,200)
drawsegment (NewHigherBarIndex,lastlower,NewHigherBarIndex,NewHigher) coloured (r1,g1,b1)
drawtext("▼", NewHigherBarIndex,HighCp) coloured(255,0,0)
//// calculation of MinInf MinSup Max
StartBarindex = LastLowerBarIndex
EndBarindex = NewHigherBarIndex
StartBarindex = max(1,StartBarindex)
EndBarindex = max(1,EndBarindex)
LastLowerBarIndex = max(1,LastLowerBarIndex)
NewHigherBarIndex = max(1,NewHigherBarIndex)
StartBarSignalIndex = max(1,StartBarSignalIndex)
StartBarSignalIndex = LagAfterSignal + (EndBarindex-StartBarindex) // calculation of the real Barindex when we get the Newpeak / Newdown information : we will need it to calculate the global volume during a sequence.
hh=NewHigher
ll=LastLower
div = (hh-ll)/NbOfDiv // thickness of the horizontal bar
i=0
//////// Fibo
fullrange = abs(hh-ll)
fibo100 = hh
fibo0 = ll
fibo236 = ll+(fullrange*0.236)
fibo382 = ll+(fullrange*0.382)
fibo500 = ll+fullrange/2
fibo618 = ll+(fullrange*0.618)
fibo764 = ll+(fullrange*0.764)
// extensions++
fibo1236 = hh +(fullrange*0.236)
fibo1382 = hh +(fullrange*0.382)
fibo1500 = hh +fullrange/2
fibo1618 = hh +(fullrange*0.618)
fibo1764 = hh +(fullrange*0.764)
fibo200 = hh + fullrange
// extensions--
fibo0236 = ll - (fullrange*0.236)
fibo0382 = ll - (fullrange*0.382)
fibo0500 = ll - fullrange/2
fibo0618 = ll - (fullrange*0.618)
fibo0764 = ll - (fullrange*0.764)
fibo00 = ll - fullrange
///support - resistance
lrangeminInf = 0
hrangeminInf = 0
lrangeminSup = 0
hrangeminSup = 0
lrangemax = 0
hrangemax = 0
MaxVol = 0
NumBarVol = 0
NumBarMaxVol = 0
NumBarMinVolSup = 0
NumBarMinVolInf = 0
volsum = summation [StartBarSignalIndex](volume)-summation [LagAfterSignal](volume)
while i<NbOfDiv do
lrange=ll+div*i
hrange=lrange+div
volbull=0
volbear=0
NumBarVol = i+1
for q = StartBarSignalIndex downto LagAfterSignal do
if close[q]>=lrange and close[q]<=hrange then
if close[q]>open[q] then
volbull=volbull+volume[q]
else
volbear=volbear+volume[q]
endif
endif
next
////bullbar = round((volbull*StartBar)/volsum)*scalefactor
////bearbar = round((volbear*StartBar)/volsum)*scalefactor
volbar = ((volbear+volbull)/volsum)*abs(StartBarSignalIndex-LagAfterSignal)*scalefactor
if i=0 then
lrangemax = lrange
hrangemax = hrange
MaxVol = volbar
NumBarMaxVol = NumBarVoL
lrangeminSup = lrange
hrangeminSup = hrange
MinVolSup = VolBar
NumBarMinVolSup = NumBarVol
lrangeminInf = lrange
hrangeminInf = hrange
MinVolInf = VolBar
NumBarMinVolInf = NumBarVol
endif
if volbar > MaxVol then
lrangemax = lrange
hrangemax = hrange
MaxVol = volbar
NumBarMaxVol = NumBarVol
if MinVolSup < MinVolInf then
lrangeminInf = lrangeminSup
hrangeminInf = hrangeminSup
MinVolInf = MinVolSup
NumBarMinVolInf = NumBarMinVolSup
endif
lrangeminSup = lrange
hrangeminSup = hrange
MinVolSup = VolBar
NumBarMinVolSup = NumBarVol
elsif volbar < MaxVol then
if volbar < MinVolSup then
lrangeminSup = lrange
hrangeminSup = hrange
MinVolSup = VolBar
NumBarMinVolSup = NumBarVol
endif
else
lrangeminInf = lrangeminInf
hrangeminInf = hrangeminInf
MinVolInf = MinVolInf
NumBarMinVolInf = NumBarMinVolInf
endif
drawrectangle(StartbarIndex,lrange,StartbarIndex+volbar,hrange) coloured(46,139,87,255)
i=i+1
wend
MaxVolumLevel = (lrangemax + hrangemax)/2
MinVolumSupLevel = (lrangeminSup + hrangeminSup)/2
MinVolumInfLevel = (lrangeminInf + hrangeminInf)/2
// option drawing the support and resistance line
if LineExtension then
DRAWHLINE((lrangemax + hrangemax)/2)coloured(0,255,0)
endif
// option checking the support and resistance line calculation
if NumbarVerif then
drawtext("#NumBarMaxVol#",StartbarIndex-1,MaxVolumLevel,Dialog,standard,10) coloured(255,0,0)
drawtext("#NumBarMinVolSup#",StartbarIndex-1,MinVolumSupLevel,Dialog,standard,10) coloured(255,0,0)
drawtext("#NumBarMinVolInf#",StartbarIndex-1,MinVolumInfLevel,Dialog,standard,10) coloured(255,0,0)
endif
//
drawtext("▼▼",StartbarIndex+2,MinVolumInfLevel,Dialog,standard,10) coloured(0,0,255)// MinInf
drawtext("▲▲",StartbarIndex+2,MinVolumSupLevel,Dialog,standard,10) coloured(0,0,255)// MinSup
drawtext("■■",StartbarIndex+2,MaxVolumLevel,Dialog,standard,10) coloured(255,0,0) // Max
// Fibo
drawsegment(StartbarIndex,fibo100,EndbarIndex,fibo100) coloured(r1,g1,b1)
drawtext("100 -",EndbarIndex-2,fibo100,Dialog,Standard,10) coloured(r,g,b)
drawsegment(EndbarIndex+1,fibo236,EndbarIndex,fibo236) coloured(r1,g1,b1)
drawtext("23.6",EndbarIndex-2,fibo236,Dialog,Standard,10) coloured(r,g,b)
drawsegment(EndbarIndex+1,fibo382,EndbarIndex,fibo382) coloured(r1,g1,b1)
drawtext("38.2",EndbarIndex-2,fibo382,Dialog,Standard,10) coloured(r,g,b)
drawsegment(EndbarIndex+1,fibo500,EndbarIndex,fibo500) coloured(r1,g1,b1)
drawtext("50",EndbarIndex-2,fibo500,Dialog,Standard,10) coloured(r,g,b)
drawsegment(EndbarIndex+1,fibo618,EndbarIndex,fibo618) coloured(r1,g1,b1)
drawtext("61.8",EndbarIndex-2,fibo618,Dialog,Standard,10) coloured(r,g,b)
drawsegment(EndbarIndex+1,fibo764,EndbarIndex,fibo764) coloured(r1,g1,b1)
drawtext("76.4",EndbarIndex-2,fibo764,Dialog,Standard,10) coloured(r,g,b)
drawsegment(StartbarIndex,fibo0,EndbarIndex,fibo0) coloured(r1,g1,b1)
drawtext("0",EndbarIndex-2,fibo0,Dialog,Standard,10) coloured(r,g,b)
// option extending Fibonacci lines to create potential takeprofits
if FiboExtension then
drawsegment (EndbarIndex,fibo200,EndbarIndex,fibo00) coloured (r1,g1,b1)
// Extensions++
drawsegment(EndbarIndex+1,fibo1236,EndbarIndex,fibo1236) coloured(0,255,0)
drawtext("+23.6",EndbarIndex-2,fibo1236,Dialog,Standard,10) coloured(0,255,0)
drawsegment(EndbarIndex+1,fibo1382,EndbarIndex,fibo1382) coloured(0,255,0)
drawtext("+38.2",EndbarIndex-2,fibo1382,Dialog,Standard,10) coloured(0,255,0)
drawsegment(EndbarIndex+1,fibo1500,EndbarIndex,fibo1500) coloured(0,255,0)
drawtext("+50",EndbarIndex-2,fibo1500,Dialog,Standard,10) coloured(0,255,0)
drawsegment(EndbarIndex+1,fibo1618,EndbarIndex,fibo1618) coloured(0,255,0)
drawtext("+61.8",EndbarIndex-2,fibo1618,Dialog,Standard,10) coloured(0,255,0)
drawsegment(EndbarIndex+1,fibo1764,EndbarIndex,fibo1764) coloured(0,255,0)
drawtext("+76.4",EndbarIndex-2,fibo1764,Dialog,Standard,10) coloured(0,255,0)
drawsegment(EndbarIndex+1,fibo200,EndbarIndex,fibo200) coloured(0,255,0)
drawtext("200",EndbarIndex-2,fibo200,Dialog,Standard,10) coloured(0,255,0)
// Extensions --
drawsegment(EndbarIndex+1,fibo0236,EndbarIndex,fibo0236) coloured(255,0,0)
drawtext("-23.6",EndbarIndex-2,fibo0236,Dialog,Standard,10) coloured(255,0,0)
drawsegment(EndbarIndex+1,fibo0382,EndbarIndex,fibo0382) coloured(255,0,0)
drawtext("-38.2",EndbarIndex-2,fibo0382,Dialog,Standard,10) coloured(255,0,0)
drawsegment(EndbarIndex+1,fibo0500,EndbarIndex,fibo0500) coloured(255,0,0)
drawtext("-50",EndbarIndex-2,fibo0500,Dialog,Standard,10) coloured(255,0,0)
drawsegment(EndbarIndex+1,fibo0618,EndbarIndex,fibo0618) coloured(255,0,0)
drawtext("-61.8",EndbarIndex-2,fibo0618,Dialog,Standard,10) coloured(255,0,0)
drawsegment(EndbarIndex+1,fibo0764,EndbarIndex,fibo0764) coloured(255,0,0)
drawtext("-76.4",EndbarIndex-2,fibo0764,Dialog,Standard,10) coloured(255,0,0)
drawsegment(EndbarIndex+1,fibo00,EndbarIndex,fibo00) coloured(255,0,0)
drawtext("-200",EndbarIndex-2,fibo00,Dialog,Standard,10) coloured(255,0,0)
endif
endif
////// ZigZag for ProOrder
if lastpoint>=0 then
if close[cp] <= lowest[2*cp+1](close) then
NewDown = 1
Lower = close[cp]
LowCp = Low[cp]
LowerBarIndex = barindex[cp]
else
NewDown = 0
endif
endif
if NewDown then
NewLowerBarIndex=LowerBarIndex
LastHigherBarIndex = NewHigherBarIndex
Newlower = lower
LastHigher = NewHigher
LagAfterSignal = abs(barindex-NewLowerBarIndex)
lastpoint = -1
drawsegment (LastHigherBarIndex,lasthigher,NewLowerBarIndex,NewLower) coloured (0,0,255)
drawsegment (LastLowerBarIndex,Newlower,LastLowerBarIndex,Lasthigher) coloured (r1,g1,b1)
drawtext("▲", LowerBarIndex, LowCp) coloured (255,0,0)
//// calculation MinInf MinSup Max
EndBarindex = NewLowerBarIndex
StartBarindex = LastHigherBarIndex
StartBarindex = max(1,StartBarindex)
Endbarindex = max(1,Endbarindex)
StartBarSignalIndex = max(1,StartBarSignalIndex)
StartBarSignalIndex = LagAfterSignal + (EndBarindex-StartBarindex) // calculation of the real Barindex when we get the Newpeak / Newdown information : we will need it to calculate the global volume during a sequence.
hh=Lasthigher
ll=Newlower
div = (hh-ll)/NbOfDiv // thickness of the horizontal bar
i=0
///Fibo
fullrange = abs(hh-ll)
fibo100 = ll
fibo0 = hh
fibo236 = hh-(fullrange*0.236)
fibo382 = hh-(fullrange*0.382)
fibo500 = hh-fullrange/2
fibo618 = hh-(fullrange*0.618)
fibo764 = hh-(fullrange*0.764)
// extensions--
fibo0236 = ll - (fullrange*0.236)
fibo0382 = ll - (fullrange*0.382)
fibo0500 = ll - fullrange/2
fibo0618 = ll - (fullrange*0.618)
fibo0764 = ll - (fullrange*0.764)
fibo00 = ll - fullrange
// extensions++
fibo1236 = hh +(fullrange*0.236)
fibo1382 = hh +(fullrange*0.382)
fibo1500 = hh +fullrange/2
fibo1618 = hh +(fullrange*0.618)
fibo1764 = hh +(fullrange*0.764)
fibo200 = hh + fullrange
//////////////
volsum = summation [StartBarSignalIndex](volume)-summation [LagAfterSignal](volume)
while i<NbOfDiv do
lrange=ll+div*i
hrange=lrange+div
volbull=0
volbear=0
NumBarVol = i+1
for q = StartBarSignalIndex downto LagAfterSignal do
if close[q]>=lrange and close[q]<=hrange then
if close[q]>open[q] then
volbull=volbull+volume[q]
else
volbear=volbear+volume[q]
endif
endif
next
//bullbar = round((volbull*StartBar)/volsum)*scalefactor
//bearbar = round((volbear*StartBar)/volsum)*scalefactor
volbar = (volbear+volbull)/volsum *abs(StartBarSignalIndex-LagAfterSignal)*scalefactor // /scalefactor
if i=0 then
lrangemax = lrange
hrangemax = hrange
MaxVol = volbar
NumBarMaxVol = NumBarVoL
lrangeminSup = lrange
hrangeminSup = hrange
MinVolSup = VolBar
NumBarMinVolSup = NumBarVol
lrangeminInf = lrange
hrangeminInf = hrange
MinVolInf = VolBar
NumBarMinVolInf = NumBarVol
endif
if volbar > MaxVol then
lrangemax = lrange
hrangemax = hrange
MaxVol = volbar
if MinVolSup < MinVolInf then
lrangeminInf = lrangeminSup
hrangeminInf = hrangeminSup
MinVolInf = MinVolSup
NumBarMinVolInf = NumBarMinVolSup
endif
lrangeminSup = lrange
hrangeminSup = hrange
MinVolSup = VolBar
NumBarMinVolSup = NumBarVol
elsif volbar < MaxVol then
if volbar < MinVolSup then
lrangeminSup = lrange
hrangeminSup = hrange
MinVolSup = VolBar
NumBarMinVolSup = NumBarVol
endif
else
lrangeminInf = lrangeminInf
hrangeminInf = hrangeminInf
MinVolInf = MinVolInf
NumBarMinVolInf = NumBarMinVolInf
endif
drawrectangle(StartbarIndex,lrange,StartbarIndex+volbar,hrange) coloured(46,139,87,255)
i=i+1
wend
MaxVolumLevel = (lrangemax + hrangemax)/2
MinVolumSupLevel = (lrangeminSup + hrangeminSup)/2
MinVolumInfLevel = (lrangeminInf + hrangeminInf)/2
if LineExtension then
DRAWHLINE((lrangemax + hrangemax)/2)coloured(255,0,0)
endif
//
if NumbarVerif then
drawtext("#NumBarMaxVol#",StartbarIndex-1,MaxVolumLevel,Dialog,standard,10) coloured(255,0,0)
drawtext("#NumBarMinVolSup#",StartbarIndex-1,MinVolumSupLevel,Dialog,standard,10) coloured(255,0,0)
drawtext("#NumBarMinVolInf#",StartbarIndex-1,MinVolumInfLevel,Dialog,standard,10) coloured(255,0,0)
endif
//
drawtext("▼▼",StartbarIndex+2,MinVolumInfLevel,Dialog,standard,10) coloured(0,0,255)// MinInf
drawtext("▲▲",StartbarIndex+2,MinVolumSupLevel,Dialog,standard,10) coloured(0,0,255)// MinSup
drawtext("■■",StartbarIndex+2,MaxVolumLevel,Dialog,standard,10) coloured(255,0,0) // Max
//Fibo
drawsegment(StartbarIndex,fibo100,EndbarIndex,fibo100) coloured(r1,g1,b1)
drawtext("100",EndbarIndex-2,fibo100,Dialog,Standard,10) coloured(r,g,b)
drawsegment(EndbarIndex+1,fibo236,EndbarIndex,fibo236) coloured(r1,g1,b1)
drawtext("23.6",EndbarIndex-2,fibo236,Dialog,Standard,10) coloured(r,g,b)
drawsegment(EndbarIndex+1,fibo382,EndbarIndex,fibo382) coloured(r1,g1,b1)
drawtext("38.2",EndbarIndex-2,fibo382,Dialog,Standard,10) coloured(r,g,b)
drawsegment(EndbarIndex+1,fibo500,EndbarIndex,fibo500) coloured(r1,g1,b1)
drawtext("50",EndbarIndex-2,fibo500,Dialog,Standard,10) coloured(r,g,b)
drawsegment(EndbarIndex+1,fibo618,EndbarIndex,fibo618) coloured(r1,g1,b1)
drawtext("61.8",EndbarIndex-2,fibo618,Dialog,Standard,10) coloured(r,g,b)
drawsegment(EndbarIndex+1,fibo764,EndbarIndex,fibo764) coloured(r1,g1,b1)
drawtext("76.4",EndbarIndex-2,fibo764,Dialog,Standard,10) coloured(r,g,b)
drawsegment(StartbarIndex,fibo0,EndbarIndex,fibo0) coloured(r1,g1,b1)
drawtext("0",EndbarIndex-2,fibo0,Dialog,Standard,10) coloured(r,g,b)
If FiboExtension then
// Extensions++
drawsegment (EndbarIndex,fibo200,EndbarIndex,fibo00) coloured (r1,g1,b1)
drawsegment(EndbarIndex+1,fibo1236,EndbarIndex,fibo1236) coloured(0,255,0)
drawtext("+23.6",EndbarIndex-2,fibo1236,Dialog,Standard,10) coloured(0,255,0)
drawsegment(EndbarIndex+1,fibo1382,EndbarIndex,fibo1382) coloured(0,255,0)
drawtext("+38.2",EndbarIndex-2,fibo1382,Dialog,Standard,10) coloured(0,255,0)
drawsegment(EndbarIndex+1,fibo1500,EndbarIndex,fibo1500) coloured(0,255,0)
drawtext("+50",EndbarIndex-2,fibo1500,Dialog,Standard,10) coloured(0,255,0)
drawsegment(EndbarIndex+1,fibo1618,EndbarIndex,fibo1618) coloured(0,255,0)
drawtext("+61.8",EndbarIndex-2,fibo1618,Dialog,Standard,10) coloured(0,255,0)
drawsegment(EndbarIndex+1,fibo1764,EndbarIndex,fibo1764) coloured(0,255,0)
drawtext("+76.4",EndbarIndex-2,fibo1764,Dialog,Standard,10) coloured(0,255,0)
drawsegment(EndbarIndex+1,fibo200,EndbarIndex,fibo200) coloured(0,255,0)
drawtext("200",EndbarIndex-2,fibo200,Dialog,Standard,10) coloured(0,255,0)
// Extensions --
drawsegment(EndbarIndex+1,fibo0236,EndbarIndex,fibo0236) coloured(255,0,0)
drawtext("-23.6",EndbarIndex-2,fibo0236,Dialog,Standard,10) coloured(255,0,0)
drawsegment(EndbarIndex+1,fibo0382,EndbarIndex,fibo0382) coloured(255,0,0)
drawtext("-38.2",EndbarIndex-2,fibo0382,Dialog,Standard,10) coloured(255,0,0)
drawsegment(EndbarIndex+1,fibo0500,EndbarIndex,fibo0500) coloured(255,0,0)
drawtext("-50",EndbarIndex-2,fibo0500,Dialog,Standard,10) coloured(255,0,0)
drawsegment(EndbarIndex+1,fibo0618,EndbarIndex,fibo0618) coloured(255,0,0)
drawtext("-61.8",EndbarIndex-2,fibo0618,Dialog,Standard,10) coloured(255,0,0)
drawsegment(EndbarIndex+1,fibo0764,EndbarIndex,fibo0764) coloured(255,0,0)
drawtext("-76.4",EndbarIndex-2,fibo0764,Dialog,Standard,10) coloured(255,0,0)
drawsegment(EndbarIndex+1,fibo00,EndbarIndex,fibo00) coloured(255,0,0)
drawtext("-200",EndbarIndex-2,fibo00,Dialog,Standard,10) coloured(255,0,0)
endif
endif
return
//Rest of the code of Nicolas if you want to create intermadiate ZigZag
////---mino zigzag points
//if high[round(cp/2)] >= highest[cp+1](high) then
//LNewPeak = 1
//else
//LNewPeak = 0
//endif
//
//if low[round(cp/2)] <= lowest[cp+1](low) then
//NewDownL = -1
//else
//NewDownL = 0
//endif
//
//if LNewPeak = 1 then
//LNewHigher = high[round(cp/2)]
//NewPeakigherBarIndex = barindex[round(cp/2)]
//endif
//
//if NewDownL = -1 then
//LBOTy = low[round(cp/2)]
//LBOTx = barindex[round(cp/2)]
//endif
//
//if LNewPeak>0 then
//DRAWTEXT("º",NewPeakigherBarIndex,LNewHigher+ATR/2,Dialog,Bold,20) coloured(200,0,0)
//endif
//if NewDownL<0 then
//DRAWTEXT("º",LBOTx,LBOTy-ATR/2,Dialog,Bold,20) coloured(0,200,0)
//endif