vZone (Volumes Based Support/Resistance) For ThinkOrSwim

ApeX Predator

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: https://tos.mx/ke0f6ny 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. 
## Created on 07/13/21
## Created by: SuryaKiranC #
##
## 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.3 : Switched to highest Volume per Zone, so there are not only a sigle volume box per zone.
## V 1.2 : No changes to the logic But just hints and header updates, also added a tiny URL for the video. 
## 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
#hint: <b>vZoneStudy for Upper Chart.</b> \n <li> Suggestion, See the following Video</li> https://tinyurl.com/yzaxrf7e <li>Volume Based Support/Resistance for Intraday.</li>
#hint showEMACloud: <b>Helps find Reversal </b> <li>Select "No" if it is too loud on your charts.</li>
#hint audibleAlerts: <b>TOS Sounds for Condition </b> <li>Select "No" if it is too loud for you.</li>
#hint Extend: <b>Extend vZone Clouds from past session</b> <li>Select "No" if it is too loud for you.</li>
declare once_per_bar;

def Future = if GetSymbolPart(1) == "/YM:XCBT"  or # Reserved for any further work, not used at the moment other than display the label. 
                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"  or 
                GetSymbolPart(1) == "/VX:XCBF" then yes else no; 

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

input   showEMACloud = No;
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 > ema89 and ema5[1] <= ema89[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;
}

script Zone {
    def H ;
    def L ;

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

    if TF and !TF[1] and highest(volume) {
        H = high;
        L = low;

    } else {
        H = H[1];
        L = L[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 Zone1 and close < Z1L or Zone2 and close < Z2L or Zone3 and close < Z3L then 1 else 0;
def AboveVZ = if Zone1 and close > Z1H or Zone2 and close > Z2H or Zone3 and 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);


vZone_Labels

Shared Study Link: https://tos.mx/kribwZB Click here for --> Easiest way to load shared links

Ruby:
##vZone_Labels
##This is Companian Indicator for vZone, which 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.
##
# Version 1.0.2
#
# Created on 01/08/21
# Created by: SuryaKiranC ## Included rVolume label and Changed length as input.

#hint: <b>vZone_Labels Lower Study</b> \n Setup inputs as per your preferences \n <li>Replacement for Standard TOS Volume Bars, Disable VolumeSubgraph.</li>
#hint Length: <b>No of Bars for Average Calculation.</b> <li>Adjust as per your preference.</li>
#hint Barlength: <b>Near term No of Bars for Average Calculations.</b> <li>Adjust as per your preference.</li>
#hint ShowVolAvg: <b>Plot Vol Average across Volume Bars.</b> <li>Set "No" if this is not needed for you.</li>
#hint ShowPreMktVol: <b>Enable/Disable PreMkt Volume.</b> <li>Set "No" if this is not needed for you.</li>
#hint ShowZoneVol: <b>Enable/Disable Per Zone Volume.</b> <li>Set "No" if this is not needed for you.</li>
#hint ShowPostMktVol: <b>Enable/Disable PostMkt Volume.</b> <li>Set "No" if this is not needed for you.</li>

#hint ShowDayAvg: <b>Enable/Disable Average Volume of Days set in the Length above.</b> <li>Set "No" if this is not needed for you.</li>
#hint ShowTodayVolume: <b>Enable/Disable Today's Volume</b> <li>Set "No" if this is not needed for you.</li>
#hint ShowRvol: <b>Enable/Disable Relative Volume to Length Days</b> <li>Set "No" if this is not needed for you.</li>
#hint UnusualVolumePercent: <b>Define your own UnusualVolume, Typical Liquid Stock 110% and above.</b> <li>Set "No" if this is not needed for you.</li>
#hint ShowBarAvg: <b>Enable/Disable Average Bar volume, On Daily This is same as ShowDayAvg.</b> <li>Set "No" if this is not needed for you.</li>
#hint ShowCurrentBar: <b>Enable/Disable Current Bar Volume.</b> <li>Set "No" if this is not needed for you.</li>
#hint ShowPercentOfBarAvg: <b>Enable/Disable % if Volume, Compared to Days/Bar of Length </b> <li>Set "No" if this is not needed for you.</li>
#hint ShowBarsSell:  <b>Enable/Disable Sell Volume for length </b> <li>Set "No" if this is not needed for you.</li>
#hint Show6BarSell:  <b>Enable/Disable Sell Volume for Last 6 Bar </b> <li>Set "No" if this is not needed for you.</li>
#hint ShowSellVolume:<b>Enable/Disable Current Volume Sell Compared to length Bars </b> <li>Set "No" if this is not needed for you.</li>

#declare lower; # If you disable Volume subgraph and using as lower study uncomment this and comment the next one.
declare on_volume; #If you need to use only labels as a top study comment "Selling Volume" & "Buying Volume", along with this line with a "#" in-front of the line

DefineGlobalColor("Zone1", CreateColor(204, 255, 225));
DefineGlobalColor("Zone2", CreateColor(252, 220, 101));
DefineGlobalColor("Zone3", CreateColor(204, 204, 198));

input Length = 21;
input Barlength = 6;
input ShowVolAvg = Yes;

input  ShowPreMktVol = Yes;
input    ShowZoneVol = Yes;
input ShowPostMktVol = Yes;

def Zone1 = gettime() >= RegularTradingStart(GetYYYYMMDD()) and gettime() <= RegularTradingStart(GetYYYYMMDD()) + 90*60*1000;
def Zone2 = gettime()  > RegularTradingStart(GetYYYYMMDD()) + 90*60*1000 and gettime() <= RegularTradingEnd(GetYYYYMMDD())-120*60*1000;
def Zone3 = gettime()  > RegularTradingEnd(GetYYYYMMDD()) - 120*60*1000 and gettime() <= RegularTradingEnd(GetYYYYMMDD());

def startTime = 0930;
def   update1 = 1100;
def   update2 = 1400;
def   endTime = 1600;
def isNewDay = GetDay() == GetLastDay();
def yyyymmdd = GetYYYYMMDD();
def period = yyyymmdd;
def isPeriodRolled = CompoundValue(1, period != period[1], 1);
def sumVol = if isPeriodRolled then volume else CompoundValue(1, sumVol[1] + volume, volume);

######################### Current BAR ########################
def O = open;
def H = high;
def C = close;
def L = low;
def V = volume;
def Buying = V*(C-L)/(H-L);
def Selling = V*(H-C)/(H-L);

######################## 6BAR ################################
def HH6 = Average(high[1], Barlength);
def HC6 = Average(close[1], Barlength);
def HL6 = Average(low[1], Barlength);
def HV6 = Average(volume[1], Barlength);
def  Buy6 = HV6 * (HC6 - HL6) / (HH6 - HL6);
def Sell6 = HV6 * (HH6 - HC6) / (HH6 - HL6);

###################### 30BAR #################################
def HH30 = Average(high[1], Length);
def HC30 = Average(close[1], Length);
def HL30 = Average(low[1], Length);
def HV30 = Average(volume[1], Length);
def Buy30 = HV30 * (HC30 - HL30) / (HH30 - HL30);
def Sell30 = HV30 * (HH30 - HC30) / (HH30 - HL30);

###################### 6Bar Volume % #########################
def H6Vol = Round(Buy6, 0) + Round(Sell6, 0) ;
def H6buyPercent  = ( Round(Buy6, 0)  / H6Vol ) * 100;
def H6sellPercent = ( Round(Sell6, 0) / H6Vol ) * 100;

###################### 30Bar Volume %   ######################
def H30Vol = Round(Buy30, 0) + Round(Sell30, 0) ;
def H30buyPercent  = (Round(Buy30, 0)  / H30Vol) * 100;
def H30sellPercent = (Round(Sell30, 0) / H30Vol) * 100;

####################### Volume Stats #########################
def volDayAvg = Average(volume (Period = "DAY")[1],Length);
def DayVol = volume(period = "DAY");
def rVol = Round((DayVol / volDayAvg), 2);
def avgBars = Average(volume[1],Length);
def curVolume = volume;
def percentOfBars = Round((curVolume / avgBars) * 100, 0);
def SellVolPercent = Round((Selling / Volume) * 100, 0);

######################### Labels ##############################
input ShowDayAvg = yes;
input ShowTodayVolume = yes;
input ShowRvol = yes;
input UnusualVolumePercent = 110;
input ShowBarAvg = yes;
input ShowCurrentBar = yes;
input ShowPercentOfBarAvg = yes;

AddLabel(ShowDayAvg, Length+"D: " + Round(volDayAvg * .000001, 1) + " M ", Color.LIGHT_GRAY);
AddLabel(ShowTodayVolume, "D: " + Round(DayVol * .000001, 1) + " M ", (if rVol >= UnusualVolumePercent then Color.GREEN else if rVol >= 100 then Color.ORANGE else Color.LIGHT_GRAY));
AddLabel(ShowRvol,"rVol: " + rVol,(if rVol >= UnusualVolumePercent then Color.GREEN else if rVol >= 100 then Color.ORANGE else Color.WHITE));
AddLabel(ShowBarAvg, "30Bar: " + Round(avgBars * .001, 1) + " K ", Color.LIGHT_GRAY);
AddLabel(ShowCurrentBar, "CurBar: " + Round(curVolume * .001, 2) + " K ", (if percentOfBars >= UnusualVolumePercent then Color.GREEN else if percentOfBars >= 100 then Color.ORANGE else Color.LIGHT_GRAY));
AddLabel(ShowPercentOfBarAvg, percentOfBars + "%", (if percentOfBars >= UnusualVolumePercent then Color.GREEN else if percentOfBars >= 100 then Color.ORANGE else Color.WHITE) );

############################################ 30 Bar Stats ############################################
input ShowBarsSell = yes;
AddLabel(ShowBarsSell, length + "BarSell: " + Round(H30sellPercent, 0) + "% ", (if H30sellPercent > 55 then Color.RED else if H30sellPercent < 45 then Color.GREEN else Color.ORANGE));
############################################ 6 Bar Stats #############################################
input Show6BarSell = yes;
AddLabel(Show6BarSell, Barlength +"BarSell: " + Round(H6sellPercent, 0) + "% ", (if H6sellPercent > 55 then Color.RED else if H6sellPercent < 45 then Color.GREEN else Color.ORANGE));
############################################ Current Bar Stats ########################################
input ShowSellVolume = yes;
AddLabel(ShowSellVolume, "CurSell: " + Round(SellVolPercent, 0) + "% ", (if SellVolPercent > 51 then Color.RED else if SellVolPercent < 49 then Color.GREEN else Color.ORANGE));

##################### Selling Volume #####################
plot SVol = Selling;
SVol.SetPaintingStrategy(PaintingStrategy.HISTOGRAM);
SVol.SetDefaultColor(Color.DARK_ORANGE);
SVol.HideTitle();
SVol.HideBubble();
SVol.SetLineWeight(3);

##################### Buying Volume ######################
plot BVol = Buying;
BVol.SetPaintingStrategy(PaintingStrategy.HISTOGRAM);
BVol.SetDefaultColor(Color.LIGHT_GREEN);
BVol.HideTitle();
BVol.HideBubble();
BVol.SetLineWeight(3);

##################### Plots and Style ###################
plot Vol = volume;
plot VolAvg = Average(volume[1], Length);
VolAvg.SetHiding(!ShowVolAvg);
Vol.SetPaintingStrategy(PaintingStrategy.HISTOGRAM);
Vol.SetLineWeight(3);
Vol.DefineColor("Up", Color.UPTICK);
Vol.DefineColor("Down", Color.DOWNTICK);
Vol.AssignValueColor(if close > close[1] then Vol.color("Up") else if close < close[1] then Vol.color("Down") else GetColor(1));
VolAvg.SetDefaultColor(GetColor(8));

def PreMkt = RegularTradingStart (GetYYYYMMDD()) > GetTime();
def PreVol = if PreMkt and !PreMkt[1] then volume else if PreMkt then PreVol[1] + volume else PreVol[1];
AddLabel(if GetAggregationPeriod() > AggregationPeriod.THIRTY_MIN or !ShowPreMktVol then 0 else 1, "PreMktVol = " + Round(PreVol * .000001, 3) + "M ", Color.YELLOW);

def RTH1Zone = SecondsFromTime(startTime) >= 0 and SecondsTillTime(update1) > 0;
def RTH1ZoneVol = if RTH1Zone and !RTH1Zone[1] then volume else if RTH1Zone[1] then RTH1ZoneVol[1] + volume else RTH1ZoneVol[1];
AddLabel(if GetAggregationPeriod() > AggregationPeriod.THIRTY_MIN or !ShowZoneVol then 0 else 1, "Zone1Vol = " + Round(RTH1ZoneVol * .000001, 3) + "M ", GlobalColor("Zone1"));

def RTH2Zone = SecondsFromTime(update1) >= 0 and SecondsTillTime(update2) > 0;
def RTH2ZoneVol = if RTH2Zone and !RTH2Zone[1] then volume else if RTH2Zone[1] then RTH2ZoneVol[1] + volume else RTH2ZoneVol[1];
AddLabel(if GetAggregationPeriod() > AggregationPeriod.THIRTY_MIN or !ShowZoneVol then 0 else 1, "Zone2Vol = " + Round(RTH2ZoneVol * .000001, 3) + "M ", GlobalColor("Zone2"));

def RTH3Zone = SecondsFromTime(update2) >= 0 and SecondsTillTime(endTime) > 0;
def RTH3ZoneVol = if RTH3Zone and !RTH3Zone[1] then volume else if RTH3Zone[1] then RTH3ZoneVol[1] + volume else RTH3ZoneVol[1];
AddLabel(if GetAggregationPeriod() > AggregationPeriod.THIRTY_MIN or !ShowZoneVol then 0 else 1, "Zone3Vol = " + Round(RTH3ZoneVol * .000001, 3) + "M ", GlobalColor("Zone3"));

AddVerticalLine(if isNewDay and RTH1Zone == 0 and RTH1Zone[1] == 1 then yes else no, "             Zone 1  Mark", color = GlobalColor("Zone1"));
AddVerticalLine(if isNewDay and RTH2Zone == 0 and RTH2Zone[1] == 1 then yes else no, "             Zone 2  Mark", color = GlobalColor("Zone2"));
AddVerticalLine(if isNewDay and RTH3Zone == 0 and RTH3Zone[1] == 1 then yes else no, "             Zone 3  Mark", color = GlobalColor("Zone3"));

def PostMkt = RegularTradingEnd (GetYYYYMMDD()) < GetTime();
def PostVol = if PostMkt and !PostMkt[1] then volume else if PostMkt then PostVol[1] + volume else PostVol[1];
AddLabel(if GetAggregationPeriod() > AggregationPeriod.THIRTY_MIN or !ShowPostMktVol then 0 else 1, "PostMktVol = " + Round(PostVol * .000001, 3) + "M ", Color.YELLOW);
#End Volume RTH First 60 Mins

** For those of you curious what it looks like here is the image. Also the extream bottom Volume Indicator is still work in progress, I am using Standard deviation, instead of AVG volumes, any suggestion would be welcome. Note: the Standard deviation Volumes Study is not posted yet.

IJ65CLE.png
 
Last edited:
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.3 : Added 2 additional zones per request from @Ahmar824
##
## 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;
def ph3;
def pl3;
def ph4;
def pl4;
if volume > volVAR[1] {
    volumeHigh = high;
    volumeLow = low;
    volVAR = volume;
    ph = volumeHigh[1];
    pl = volumeLow[1];
    ph2 = ph[1];
    pl2 = pl[1];
    ph3 = ph2[1];
    pl3 = pl2[1];
    ph4 = ph3[1];
    pl4 = pl3[1];
} else {
    volumeHigh = volumeHigh[1];
    volumeLow = volumeLow[1];
    volVAR = volVAR[1];
    ph = ph[1];
    pl = pl[1];
    ph2 = ph2[1];
    pl2 = pl2[1];
    ph3 = ph3[1];
    pl3 = pl3[1];
    ph4 = ph4[1];
    pl4 = pl4[1];
}

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

# --- 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);

# --- Zone 4
plot previoush3 = ph3;
plot previousl3 = pl3;
AddCloud(previoush3,previousl3,Color.BLUE);

# --- Zone 5
plot previoush4 = ph4;
plot previousl4 = pl4;
AddCloud(previoush4,previousl4,Color.LIME);

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



One more image: Same SPY from above but 5m

ikLUy4R.jpg
 
Last edited:
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.
 
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
 
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
 
@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?
 
@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);
 
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);
 
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
 
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.
 
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 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.
 

Join useThinkScript to post your question to a community of 21,000+ developers and traders.

Similar threads

Not the exact question you're looking for?

Start a new thread and receive assistance from our community.

87k+ Posts
395 Online
Create Post

Similar threads

Similar threads

The Market Trading Game Changer

Join 2,500+ subscribers inside the useThinkScript VIP Membership Club
  • Exclusive indicators
  • Proven strategies & setups
  • Private Discord community
  • ‘Buy The Dip’ signal alerts
  • Exclusive members-only content
  • Add-ons and resources
  • 1 full year of unlimited support

Frequently Asked Questions

What is useThinkScript?

useThinkScript is the #1 community of stock market investors using indicators and other tools to power their trading strategies. Traders of all skill levels use our forums to learn about scripting and indicators, help each other, and discover new ways to gain an edge in the markets.

How do I get started?

We get it. Our forum can be intimidating, if not overwhelming. With thousands of topics, tens of thousands of posts, our community has created an incredibly deep knowledge base for stock traders. No one can ever exhaust every resource provided on our site.

If you are new, or just looking for guidance, here are some helpful links to get you started.

What are the benefits of VIP Membership?
VIP members get exclusive access to these proven and tested premium indicators: Buy the Dip, Advanced Market Moves 2.0, Take Profit, and Volatility Trading Range. In addition, VIP members get access to over 50 VIP-only custom indicators, add-ons, and strategies, private VIP-only forums, private Discord channel to discuss trades and strategies in real-time, customer support, trade alerts, and much more. Learn all about VIP membership here.
How can I access the premium indicators?
To access the premium indicators, which are plug and play ready, sign up for VIP membership here.
Back
Top