vZone (Volumes Based Support/Resistance)

SuryaKiranC

Well-known member
Yet another Support/Resistance Indicator for DayTrading, but with a twist, We use high/low of High Volume Bar, in three different Zones of the Day.
With out further delay, Uploading the code here, will come back and edit this line with more appropriate description.

huge thanks to @cos251 for helping me with Coding this, Reviewing and Testing it.

Link to Video: https://www.screencast.com/users/Ma...10/media/f1702bb2-2090-463a-8ad2-59639c1166cd

vZone Extend On/Off
Shared Study Link: http://tos.mx/yA5VXad Click here for --> Easiest way to load shared links
Ruby:
## vZoneSTUDY.ts
## This Indicator is based on the Following concept and, I suggest watch the video before you start to use this.
##
## https://www.screencast.com/users/MarketGauge/folders/DATE1010/media/f1702bb2-2090-463a-8ad2-59639c1166cd
## This is to Plot Support/Resistance based on High Volume Candle in three different time zones for the day.
##
## Removing the header Credit credits and description is not permitted, any modification needs to be shared.
## A big thanks to @COS251 for helping me with Coding this, Reviewing and Testing it.
##
## V 1.1 : Just added the ability to disable the vZones, automatically, extending from previous in to current session.
##  Note : It is available as an option, should somebody prefer the extension. Set "Extend" to your needs accordingly.
## V 1.0 : Split Day in to three Zones and Find the highest Volume Candle for each zone and plot Support/Resistance.
##        :     Zone 1 : 09:30 - 11:00
##        :     Zone 2 : 11:00 - 14:00
##        :     Zone 3 : 14:00 - 16:00
##        :     vZones are Plotted on 15m and lower charts.
##        :  Plots EMA Cloud to assist with identifying reversals, Keeping EMA Clouds for all Timeframes


declare upper;
declare once_per_bar;

def Future = if GetSymbolPart(1) == "/YM:XCBT" or GetSymbolPart(1) == "/ES:XCME" or GetSymbolPart(1) == "/NQ:XCME" or GetSymbolPart(1) == "/RTY:XCME" or GetSymbolPart(1) == "/EMD:XCME" or GetSymbolPart(1) == "/NKD:XCME" or GetSymbolPart(1) == “/DX:XICE" or GetSymbolPart(1) == "/6E:XCME" or  GetSymbolPart(1) == "/6A:XCME" or GetSymbolPart(1) == "/ZB:XCBT" or GetSymbolPart(1) == "/ZN:XCBT" or GetSymbolPart(1) == "/CL:XNYM" or GetSymbolPart(1) == "/NG:XNYM" or GetSymbolPart(1) == "/GC:XCEC" or GetSymbolPart(1) == "/SI:XCEC" or  GetSymbolPart(1) == "/HG:XCEC” or GetSymbolPart(1) == "/6B:XCME" or GetSymbolPart(1) == "/ZC:XCBT" or GetSymbolPart(1) == "/ZS:XCBT" or GetSymbolPart(1) == "/CC:XICE" or GetSymbolPart(1) == "/KC:XICE" or GetSymbolPart(1) == ”/CT:XICE" or GetSymbolPart(1) == "/ZW:XCBT" or GetSymbolPart(1) == "/SB:XICE" or GetSymbolPart(1) == "/LE:XCME" or GetSymbolPart(1) == "/HO:XNYM" or GetSymbolPart(1) == "/HE:XCME" or GetSymbolPart(1) == "/OJ:XICE" then yes else no;

AddLabel(if Future then yes else no, "Future", Color.YELLOW);

input   showEMACloud = Yes;
input  audibleAlerts = Yes;
input Extend = {default "No", "Yes"};

def Today = GetYYYYMMDD();
def StartTime = 0930;
def   Update1 = 1100;
def   Update2 = 1400;
def   EndTime = 1600;

def Zone1 = SecondsFromTime(StartTime) >= 0 and SecondsTillTime(Update1) >= 0;
def Zone2 =   SecondsFromTime(Update1) >= 0 and SecondsTillTime(Update2) >= 0;
def Zone3 =   SecondsFromTime(Update2) >= 0 and SecondsTillTime(EndTime) >= 0;

DefineGlobalColor("Zone1", CreateColor(204, 255, 225));
DefineGlobalColor("Zone2", CreateColor(252, 220, 101));
DefineGlobalColor("Zone3", CreateColor(204, 204, 198));
DefineGlobalColor( "EMA1+", CreateColor(201, 255, 234));
DefineGlobalColor( "EMA1-", CreateColor(255, 105, 105));
DefineGlobalColor( "EMA2+", CreateColor(125, 176, 130));
DefineGlobalColor( "EMA2-", CreateColor(194, 152, 227));
DefineGlobalColor( "EMA3+", CreateColor(161, 217, 247));
DefineGlobalColor( "EMA3-", CreateColor(255, 255, 112));

def  ema1low = 5;
def ema1high = 13;
def  ema2low = 34;
def ema2high = 51;
def  ema3low = 72;
def ema3high = 89;

def  ema5 = if showEMACloud then ExpAverage(close,  ema1low) else Double.NaN;
def ema13 = if showEMACloud then ExpAverage(close, ema1high) else Double.NaN;
def ema34 = if showEMACloud then ExpAverage(close,  ema2low) else Double.NaN;
def ema51 = if showEMACloud then ExpAverage(close, ema2high) else Double.NaN;
def ema72 = if showEMACloud then ExpAverage(close,  ema3low) else Double.NaN;
def ema89 = if showEMACloud then ExpAverage(close, ema3high) else Double.NaN;

AddCloud( ema5, ema13, GlobalColor("EMA1+"), GlobalColor("EMA1-"));
AddCloud(ema34, ema51, GlobalColor("EMA2+"), GlobalColor("EMA2-"));
AddCloud(ema72, ema89, GlobalColor("EMA3+"), GlobalColor("EMA3-"));

def CrossAbove = if showEMACloud and ema5 > ema13 and ema5[1] <= ema13[1] then 1 else 0;
def CrossBelow = if showEMACloud and ema5 < ema13 and ema5[1] >= ema13[1] then 1 else 0;

Alert(showEMACloud and audibleAlerts and CrossAbove, "Buy", Alert.BAR, Sound.Ding);
Alert(showEMACloud and audibleAlerts and CrossBelow, "Sell", Alert.BAR, Sound.Ring);

################################################################
##########         Booleans Set for Plot Use           #########
################################################################
def afterStart;
def beforeEnd;
def openPrice;
if GetAggregationPeriod() <= AggregationPeriod.FIFTEEN_MIN {
    afterStart = GetTime() > RegularTradingStart(GetYYYYMMDD());
    beforeEnd = GetTime() < RegularTradingEnd(GetYYYYMMDD());
    openPrice = DailyOpen();
} else {
    afterStart = Double.NaN;
    beforeEnd = Double.NaN;
    openPrice = Double.NaN;
}

plot DailyO = if openPrice then openPrice else Double.NaN;

script Zone {
    def H ;
    def L ;
    def V ;

    input CountIn = 0930;
    input CountOut = 1100;
    def TF = SecondsFromTime(CountIn) >= 0 and SecondsTillTime(CountOut) >= 0;

    if TF and !TF[1] {
        H = high;
        L = low;
        V = volume;
    } else if TF and volume > V[1] {
        H = high;
        L = low;
        V = volume;
    } else {
        H = H[1];
        L = L[1];
        V = V[1];
    }
    plot VZH = H;
    plot VZL = L;
    VZH.Hide();
    VZL.Hide();
}

def Z1H;
def Z1L;
def Z2H;
def Z2L;
def Z3H;
def Z3L;

switch (Extend){

Case "Yes":
 Z1H = Zone(CountIn = StartTime, CountOut = Update1).VZH;
 Z2H = Zone(CountIn =   Update1, CountOut = Update2).VZH;
 Z3H = Zone(CountIn =   Update2, CountOut = EndTime).VZH;

 Z1L = Zone(CountIn = StartTime, CountOut = Update1).VZL;
 Z2L = Zone(CountIn =   Update1, CountOut = Update2).VZL;
 Z3L = Zone(CountIn =   Update2, CountOut = EndTime).VZL;

Case "No":
 Z1H = if today != today[1] then Double.NaN else Zone(CountIn = StartTime, CountOut = Update1).VZH;
 Z2H = if today and  !Zone2 then Double.NaN else Zone(CountIn =   Update1, CountOut = Update2).VZH;
 Z3H = if today and  !Zone3 then Double.NaN else Zone(CountIn =   Update2, CountOut = EndTime).VZH;

 Z1L = if today != today[1] then Double.NaN else Zone(CountIn = StartTime, CountOut = Update1).VZL;
 Z2L = if today and  !Zone2 then Double.NaN else Zone(CountIn =   Update1, CountOut = Update2).VZL;
 Z3L = if today and  !Zone3 then Double.NaN else Zone(CountIn =   Update2, CountOut = EndTime).VZL;
}

def BelowVZ = if close < Z1L or close < Z2L or close < Z3L then 1 else 0;
def AboveVZ = if close > Z1H or close > Z2H or close > Z3H then 1 else 0;

AddLabel(if (GetAggregationPeriod() > AggregationPeriod.FIFTEEN_MIN) then yes else no, "vBox Zones on 5/10/15M Charts Only", Color.RED);

AddCloud(if afterStart and beforeEnd then Z1H else Double.NaN, if afterStart and beforeEnd then Z1L else Double.NaN, GlobalColor("Zone1"), GlobalColor("Zone1"));
AddCloud(if    Update1 and beforeEnd then Z2H else Double.NaN, if    Update1 and beforeEnd then Z2L else Double.NaN, GlobalColor("Zone2"), GlobalColor("Zone2"));
AddCloud(if    Update2 and beforeEnd then Z3H else Double.NaN, if    Update2 and beforeEnd then Z3L else Double.NaN, GlobalColor("Zone3"), GlobalColor("Zone3"));

Alert(audibleAlerts and AboveVZ, "Above High VolumeBar Caution Long", Alert.BAR, Sound.Ding);
Alert(audibleAlerts and BelowVZ, "Below High VolumeBar Look for Reversal", Alert.BAR, Sound.Ring);
 
Last edited by a moderator:

cos251

Well-known member
Beautiful!

Nice work @SuryaKiranC - such a clean indicator!

Very powerful indicator! MSFT Levels today. From breakout to resistance.

HdQY7Ff.jpg



***** Alternate version of vZone w/ no time restrictions. Just looking for highest volume bar and tracking previous 2 highest bars.

xBXMMrJ.jpg



Ruby:
## vZoneNoTime.ts
## This Indicator is based on the Following concept and, I suggest watch the video before you start to use this.
##
## https://www.screencast.com/users/MarketGauge/folders/DATE1010/media/f1702bb2-2090-463a-8ad2-59639c1166cd
## This is to Plot Support/Resistance based on High Volume Candle in three different time zones for the day.
##
## Removing the header Credit credits and description is not permitted, any modification needs to be shared.
## A big thanks to @COS251 for helping me with Coding this, Reviewing and Testing it.
##
## V 1.2 : Removed time restriction - alternate version (@cos251)
##
## V 1.1 : Just added the ability to disable the vZones, automatically, extending from previous in to current session.
##  Note : It is available as an option, should somebody prefer the extension. Set "Extend" to your needs accordingly.
## V 1.0 : Split Day in to three Zones and Find the highest Volume Candle for each zone and plot Support/Resistance.
##        :     Zone 1 : 09:30 - 11:00
##        :     Zone 2 : 11:00 - 14:00
##        :     Zone 3 : 14:00 - 16:00
##        :     vZones are Plotted on 15m and lower charts.
##        :  Plots EMA Cloud to assist with identifying reversals, Keeping EMA Clouds for all Timeframes




def volumeHigh;
def volumeLow;
def volVAR;
def ph;
def pl;
def ph2;
def pl2;
if volume > volVAR[1] {
    volumeHigh = high;
    volumeLow = low;
    volVAR = volume;
    ph = volumeHigh[1];
    pl = volumeLow[1];
    ph2 = ph[1];
    pl2 = pl[1];
} else {
    volumeHigh = volumeHigh[1];
    volumeLow = volumeLow[1];
    volVAR = volVAR[1];
    ph = ph[1];
    pl = pl[1];
    ph2 = ph2[1];
    pl2 = pl2[1];
}

# --- Zone 1
plot h = volumeHigh;
plot l = volumeLow;
AddCloud(h,  l, Color.GRAY,Color.PINK);

# --- Zone 2
plot previoush = ph;
plot previousl = pl;
AddCloud(previoush,previousl,Color.PINK);

# --- Zone 3
plot previoush2 = ph2;
plot previousl2 = pl2;
AddCloud(previoush2,previousl2,Color.MAGENTA);

# --- Labels
AddLabel(yes,"Zone 1",Color.GRAY);
AddLabel(yes,"Zone 2",Color.PINK);
AddLabel(yes,"Zone 3",Color.MAGENTA);

One more image: Same SPY from above but 5m

ikLUy4R.jpg
 
Last edited:

SuryaKiranC

Well-known member
what are the different color zones represent, time or how much volume?
Each Zone Represents the different range of the time and we find the Highest Volume candles in each time range and plot the Hi/Low as support & Resistance for the zone. Trying to find Reversals using EMA cloud. Please watch the video to understand how the use the setup. Video and additional description is found in the Description section of the code.
 

SuryaKiranC

Well-known member
Thank you! Try using this indicator on range chart. Let me know what you think
The Zones are coded for Time Based charts, although doing something like this for a Tick based chart is not a bad idea, Would you be able to define criteria what should I split the zones into?

-S
 

Ahmar824

Member
well
The Zones are coded for Time Based charts, although doing something like this for a Tick based chart is not a bad idea, Would you be able to define criteria what should I split the zones into?

-S
well I would take the full day. 8.30am to market close
 

nitrous

Member
VIP
@SuryaKiranC One suggestion, can we draw dotted lines or anything that identify the 3 zones for the day?

Also, folks in CST, do we need to change the times for the zones?
 

TradeUp

Member
2019 Donor
@SuryaKiranC One suggestion, can we draw dotted lines or anything that identify the 3 zones for the day?

Also, folks in CST, do we need to change the times for the zones?
I'm using this indicator for the times. You can adjust it as you please:

declare upper;



declare once_per_bar;
input nine = 1000;
AddVerticalLine(SecondsFromTime(nine)[1] < 0 && SecondsFromTime(nine) >= 0, nine, Color.GRAY, Curve.SHORT_DASH);

input ninethirty = 1030;
AddVerticalLine(SecondsFromTime(ninethirty)[1] < 0 && SecondsFromTime(ninethirty) >= 0, ninethirty, Color.GRAY, Curve.SHORT_DASH);

input ten = 1100;
AddVerticalLine(SecondsFromTime(ten)[1] < 0 && SecondsFromTime(ten) >= 0, ten, Color.GRAY, Curve.SHORT_DASH);

input tenthirty = 1130;
AddVerticalLine(SecondsFromTime(tenthirty)[1] < 0 && SecondsFromTime(tenthirty) >= 0, tenthirty, Color.GRAY, Curve.SHORT_DASH);

input eleven = 1200;
AddVerticalLine(SecondsFromTime(eleven)[1] < 0 && SecondsFromTime(eleven) >= 0, eleven, Color.GRAY, Curve.SHORT_DASH);

input eleventhirty = 1230;
AddVerticalLine(SecondsFromTime(eleventhirty)[1] < 0 && SecondsFromTime(eleventhirty) >= 0, eleventhirty, Color.GRAY, Curve.SHORT_DASH);

input twelve = 1300;
AddVerticalLine(SecondsFromTime(twelve)[1] < 0 && SecondsFromTime(twelve) >= 0, twelve, Color.GRAY, Curve.SHORT_DASH);

input twelvethirty = 1330;
AddVerticalLine(SecondsFromTime(twelvethirty)[1] < 0 && SecondsFromTime(twelvethirty) >= 0, twelvethirty, Color.GRAY, Curve.SHORT_DASH);


input one = 1400;
AddVerticalLine(SecondsFromTime(one)[1] < 0 && SecondsFromTime(one) >= 0, one, Color.GRAY, Curve.SHORT_DASH);

input onethirty = 1430;
AddVerticalLine(SecondsFromTime(onethirty)[1] < 0 && SecondsFromTime(onethirty) >= 0, onethirty, Color.GRAY, Curve.SHORT_DASH);

input two = 1500;
AddVerticalLine(SecondsFromTime(two)[1] < 0 && SecondsFromTime(two) >= 0, two, Color.GRAY, Curve.SHORT_DASH);

input twothirty = 1530;
AddVerticalLine(SecondsFromTime(twothirty)[1] < 0 && SecondsFromTime(twothirty) >= 0, twothirty, Color.GRAY, Curve.SHORT_DASH);
 

nitrous

Member
VIP
I'm using this indicator for the times. You can adjust it as you please:

declare upper;



declare once_per_bar;
input nine = 1000;
AddVerticalLine(SecondsFromTime(nine)[1] < 0 && SecondsFromTime(nine) >= 0, nine, Color.GRAY, Curve.SHORT_DASH);

input ninethirty = 1030;
AddVerticalLine(SecondsFromTime(ninethirty)[1] < 0 && SecondsFromTime(ninethirty) >= 0, ninethirty, Color.GRAY, Curve.SHORT_DASH);

input ten = 1100;
AddVerticalLine(SecondsFromTime(ten)[1] < 0 && SecondsFromTime(ten) >= 0, ten, Color.GRAY, Curve.SHORT_DASH);

input tenthirty = 1130;
AddVerticalLine(SecondsFromTime(tenthirty)[1] < 0 && SecondsFromTime(tenthirty) >= 0, tenthirty, Color.GRAY, Curve.SHORT_DASH);

input eleven = 1200;
AddVerticalLine(SecondsFromTime(eleven)[1] < 0 && SecondsFromTime(eleven) >= 0, eleven, Color.GRAY, Curve.SHORT_DASH);

input eleventhirty = 1230;
AddVerticalLine(SecondsFromTime(eleventhirty)[1] < 0 && SecondsFromTime(eleventhirty) >= 0, eleventhirty, Color.GRAY, Curve.SHORT_DASH);

input twelve = 1300;
AddVerticalLine(SecondsFromTime(twelve)[1] < 0 && SecondsFromTime(twelve) >= 0, twelve, Color.GRAY, Curve.SHORT_DASH);

input twelvethirty = 1330;
AddVerticalLine(SecondsFromTime(twelvethirty)[1] < 0 && SecondsFromTime(twelvethirty) >= 0, twelvethirty, Color.GRAY, Curve.SHORT_DASH);


input one = 1400;
AddVerticalLine(SecondsFromTime(one)[1] < 0 && SecondsFromTime(one) >= 0, one, Color.GRAY, Curve.SHORT_DASH);

input onethirty = 1430;
AddVerticalLine(SecondsFromTime(onethirty)[1] < 0 && SecondsFromTime(onethirty) >= 0, onethirty, Color.GRAY, Curve.SHORT_DASH);

input two = 1500;
AddVerticalLine(SecondsFromTime(two)[1] < 0 && SecondsFromTime(two) >= 0, two, Color.GRAY, Curve.SHORT_DASH);

input twothirty = 1530;
AddVerticalLine(SecondsFromTime(twothirty)[1] < 0 && SecondsFromTime(twothirty) >= 0, twothirty, Color.GRAY, Curve.SHORT_DASH);
Thanks, trying to figure out why it wont draw a dashed line when I change the following inputs:

input nine = 800;
AddVerticalLine(SecondsFromTime(nine)[1] < 0 && SecondsFromTime(nine) >= 0, nine, Color.GRAY, Curve.SHORT_DASH);

input ninethirty = 830;
AddVerticalLine(SecondsFromTime(ninethirty)[1] < 0 && SecondsFromTime(ninethirty) >= 0, ninethirty, Color.GRAY, Curve.SHORT_DASH);
 

TradeUp

Member
2019 Donor
Thanks, trying to figure out why it wont draw a dashed line when I change the following inputs:

input nine = 800;
AddVerticalLine(SecondsFromTime(nine)[1] < 0 && SecondsFromTime(nine) >= 0, nine, Color.GRAY, Curve.SHORT_DASH);

input ninethirty = 830;
AddVerticalLine(SecondsFromTime(ninethirty)[1] < 0 && SecondsFromTime(ninethirty) >= 0, ninethirty, Color.GRAY, Curve.SHORT_DASH);
Here are the settings that I have it set at.

dwqpNpC.png
 

nitrous

Member
VIP
Here are the settings that I have it set at.

dwqpNpC.png
Thanks.

Would you know why my zones for TSLA last Friday dont look right?

According to the video, the zones should be drawn from the start of the each zone period, all the way to the close of the day.

Mine for some reason, start all the way from the start of the day for zone2 and zone 3.
 

TradeUp

Member
2019 Donor
Thanks.

Would you know why my zones for TSLA last Friday dont look right?

According to the video, the zones should be drawn from the start of the each zone period, all the way to the close of the day.

Mine for some reason, start all the way from the start of the day for zone2 and zone 3.
Mine looks the same as yours. I guess because this indicator also includes a zone for premarket? The intraday zones look right to me. It's supposed to take the highest volume of each zone and project it forward. Maybe @SuryaKiranC has a better explanation. Sorry I can't be anymore help.
 

SuryaKiranC

Well-known member
@SuryaKiranC One suggestion, can we draw dotted lines or anything that identify the 3 zones for the day?

Also, folks in CST, do we need to change the times for the zones?

Zone Start and end time declarations are EST and are perfectly fine to use, regardless of your location and your TOS/system TimeZones(EST/CST/PST). I am in PST and my system settings are PST.

From the ScreenShot you posted on TSLA, The vZone 2 and 3 are extended from previous session to today. I am working on a code to make this as a choice. As an, keep the previous session cloud extended in to today or not. Will update the code in original posting once verified.
 

Similar threads

Top