• LIMITED TIME ONLY: Take $40 off VIP with code: BTD40.

how to change offset after market close for plotted line

greco26

Active member
I've been working on this for days and can't figure it out. The script plots lines at the prior day's high and low so that during RTH, I can see if intraday price is near the prior high/low. On another version of this study, I also have the week and month as well but I kept the code small for this post. Simple enough.

Assume today is Tuesday. What I want to do is once Tuesday's trading day is over (but is still the same day), I want to shift the plotted lines from Monday's close to today's closed bar (Tuesday). Then at Wednesday's open. the plotted lines should shift back to Tuesday's hi/lo.

I tried to create dynamic offsets but TOS doesn't like that. I tried to modify the code to add a variable to shift the plots forward after RTH but TOS doesn't like that. I've tried several other ways and can't figure out how to get it to work. Any advise would be awesome! @halcyonguy

Code:
# prevday_levels_onalldays_01
# halcyonguy
# 21-08-12
#
# find high, low, opens
# draw a horizontal line across the chart, at the price levels.
# can change the offset , to look at older periods.
# bubbles on the right, identify the lines.
#  the bubbles list the offset.

# Modifications by Tim G
#Sept 14, 2021
#Sept 26, 2021
#Nov 8, 2021


input showbubbles = yes;
input show1d  = yes;
input offset = 1;

# place bubbles after last bar, to id the lines

def futurebar = 3;
def x = (!IsNaN(close[futurebar]) and IsNaN(close[futurebar - 1]));


### 1d timeframe ###

def tf1d = AggregationPeriod.DAY;
def valid1d = GetAggregationPeriod() <= AggregationPeriod.DAY;
def h1d;
def l1d;
def l1dago;
def o1d;
def o1dc;
def c1d;


if valid1d and show1d {
    h1d = high (period = tf1d)[offset]; ;
    l1d = low  (period = tf1d) [offset];
    l1dago = low  (period = tf1d)[1];
    o1d = open (period = tf1d);
    o1dc =  open (period = tf1d);
    c1d = close(period = tf1d);


} else {
    h1d = Double.NaN;
    l1d = Double.NaN;
    l1dago = Double.NaN;
    o1d = Double.NaN;
    o1dc = Double.NaN;
    c1d = Double.NaN;
}


def bn1d = HighestAll(if open == o1dc then BarNumber()-1 else Double.NaN);

plot daylow = if BarNumber() < bn1d then Double.NaN else HighestAll( if (!IsNaN(close) and IsNaN(close[-1])) then l1d else double.nan);
plot daylow2 = if BarNumber() < bn1d then Double.NaN else HighestAll( if (!IsNaN(close) and IsNaN(close[-1]))then l1d else double.nan);
plot dayhigh = if BarNumber() < bn1d then Double.NaN else HighestAll( if (!IsNaN(close) and IsNaN(close[-1]))then h1d else double.nan);

plot dayhigh2 = if BarNumber() < bn1d then Double.NaN else HighestAll( if (!IsNaN(close) and IsNaN(close[-1]))then h1d else double.nan);

dayhigh.SetDefaultColor(Color.YELLOW);
dayhigh.SetStyle(Curve.SHORT_DASH);
dayhigh.SetLineWeight(1);
dayhigh2.SetDefaultColor(Color.CYAN);
dayhigh2.SetLineWeight(1);

daylow.SetDefaultColor(Color.YELLOW);
daylow.SetStyle(Curve.SHORT_DASH);
daylow.SetLineWeight(1);
daylow2.SetDefaultColor(Color.CYAN);
daylow2.SetLineWeight(1);

AddChartBubble(showbubbles and x, daylow, "D[" + offset + "]", Color.MAGENTA, yes);
AddChartBubble(showbubbles and x, dayhigh, "D[" + offset + "]", Color.GREEN, yes);
 

halcyonguy

Well-known member
VIP
Lifetime
@halcyonguy Any chance you know how to do this?
maybe, i'm confused by this.
...from a 'close' to a high/low,
then back to a high/low... not back to a close?
are lines always from a high and low?


...shift the plotted lines from Monday's close to today's closed bar (Tuesday). Then at Wednesday's open. the plotted lines should shift back to Tuesday's hi/lo.
 

greco26

Active member
Sorry, I see what you mean and I did make that confusing. The lines will always be the high and low of the day (or the prior day). Not the close price. When I referenced 'close' I meant the close of RTH. Sorry about that...
 

halcyonguy

Well-known member
VIP
Lifetime
Sorry, I see what you mean and I did make that confusing. The lines will always be the high and low of the day (or the prior day). Not the close price. When I referenced 'close' I meant the close of RTH. Sorry about that...
thanks for explaining. i will look at this this weekend.
 

greco26

Active member
What I've been trying to figure out is how to change these values so that I can shift the line plots forward after the market has closed for the day but the highest all part keep messing me up.

Code:
def bn1d = HighestAll(if open == o1d then BarNumber()-1  else double.nan);
plot daylow = if BarNumber() < bn1d then Double.NaN else HighestAll( if (!IsNaN(close) and IsNaN(close[-1])) then l1d else double.nan);
 

SleepyZ

Well-known member
VIP
Lifetime
What I've been trying to figure out is how to change these values so that I can shift the line plots forward after the market has closed for the day but the highest all part keep messing me up.

Code:
def bn1d = HighestAll(if open == o1d then BarNumber()-1  else double.nan);
plot daylow = if BarNumber() < bn1d then Double.NaN else HighestAll( if (!IsNaN(close) and IsNaN(close[-1])) then l1d else double.nan);

See if this helps. It uses the def RTH in the sethiding function to show previous days high/low until post market hours on the current day and then uses the current days high/low. In testing this in ONDemand, it required me to use 1630 instead of 1600 to determine post market. It works, but hopefully in realtime it will work with 1600.

Edit: Had a chance to test this during the trading day today and I think this version works the way you wanted. You can choose to eliminate the future lines plots at the input hidenextdaylines.

The first image below is during RTHs and shows the previous day's high/low and the difference between hidenextdaylines and not below.

Capture1.jpg

The second image is post market and automatically plots the high/low of the current day. This will remain through the RTH the next as it becomes the previous day.
Capture2.jpg
Ruby:
def ymd      = GetYYYYMMDD();
def candles  = !IsNaN(close);
def capture  = candles and ymd != ymd[1];
def dayCount = CompoundValue(1, if capture then dayCount[1] + 1 else dayCount[1], 0);
def thisDay  = (HighestAll(dayCount) - dayCount) ;
input hidenextdaylines = no;

def rth = HighestAll(if IsNaN(close[-1]) and !IsNaN(close) and SecondsFromTime(0100) >= 0  and SecondsFromTime(1600) < 0 then 1 else 0);

plot xdh = if hidenextdaylines and IsNaN(close[1]) or thisDay > 0 then Double.NaN else DailyHighLow(displace = 0);
xdh.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);
xdh.SetHiding(rth == 1);

plot xpdh = if hidenextdaylines and IsNaN(close[1]) or thisDay > 0 then Double.NaN else DailyHighLow();
xpdh.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);
xpdh.SetHiding(rth == 0);

plot xdl = if hidenextdaylines and IsNaN(close[1]) or thisDay > 0 then Double.NaN else DailyHighLow(displace = 0).DailyLow;
xdl.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);
xdl.SetHiding(rth == 1);

plot xpdl = if hidenextdaylines and IsNaN(close[1]) or thisDay > 0 then Double.NaN else DailyHighLow().DailyLow;
xpdl.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);
xpdl.SetHiding(rth == 0);
 
Last edited:

greco26

Active member
Awesome, this looks great. I modified it a bit to plot the lines across the chart and doubled everything for a candy cane line look. Fancy stuff! :) Hopefully my mods won't mess up the code but I think it should be fine. I'll see tomorrow and let you know. Thank you again! And thank you @halcyonguy too!!


Code:
def ymd      = GetYYYYMMDD();
def candles  = !IsNaN(close);
def capture  = candles and ymd != ymd[1];
def dayCount = CompoundValue(1, if capture then dayCount[1] + 1 else dayCount[1], 0);
def thisDay  = (HighestAll(dayCount) - dayCount) ;
input hidenextdaylines = no;

def rth = HighestAll(if IsNaN(close[-1]) and !IsNaN(close) and SecondsFromTime(0100) >= 0  and SecondsFromTime(1600) < 0 then 1 else 0);

### 1d timeframe ###



def bn1d = HighestAll(if open == OPEN then BarNumber()  else double.nan);

plot xdh1 = if BarNumber() < bn1d then Double.NaN else highestall(if hidenextdaylines and IsNaN(close[1]) or thisDay > 0 then Double.NaN else DAILYHIGHLOW(DISPLACE = 0));
xdh1.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);
xdh1.SetHiding(rth == 1);
xdh1.SetDefaultColor(Color.YELLOW);
xdh1.SetStyle(Curve.SHORT_DASH);
xdh1.SetLineWeight(1);
plot xdhB = if BarNumber() < bn1d then Double.NaN else highestall(if hidenextdaylines and IsNaN(close[1]) or thisDay > 0 then Double.NaN else DailyHighLow());
xdhB.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);
xdhB.SetHiding(rth == 0);
xdhB.SetDefaultColor(Color.YELLOW);
xdhB.SetStyle(Curve.SHORT_DASH);
xdhB.SetLineWeight(1);

plot xdh2 = if BarNumber() < bn1d then Double.NaN else highestall(if hidenextdaylines and IsNaN(close[1]) or thisDay > 0 then Double.NaN else DAILYHIGHLOW(DISPLACE = 0));
xdh2.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);
xdh2.SetHiding(rth == 1);
xdh2.SetDefaultColor(Color.CYAN);
xdh2.SetLineWeight(1);
plot xdh2B = if BarNumber() < bn1d then Double.NaN else highestall(if hidenextdaylines and IsNaN(close[1]) or thisDay > 0 then Double.NaN else DailyHighLow());
xdh2B.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);
xdh2B.SetHiding(rth == 0);
xdh2B.SetDefaultColor(Color.CYAN);
xdh2B.SetLineWeight(1);


plot xdL1 = if BarNumber() < bn1d then Double.NaN else highestall(if hidenextdaylines and IsNaN(close[1]) or thisDay > 0 then Double.NaN else DAILYHIGHLOW(DISPLACE = 0).DAILYLOW);
xdL1.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);
xdL1.SetHiding(rth == 1);
xdL1.SetDefaultColor(Color.YELLOW);
xdL1.SetStyle(Curve.SHORT_DASH);
xdL1.SetLineWeight(1);
plot xdLB = if BarNumber() < bn1d then Double.NaN else highestall(if hidenextdaylines and IsNaN(close[1]) or thisDay > 0 then Double.NaN else DailyHighLow().DAILYLOW);
xdLB.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);
xdLB.SetHiding(rth == 0);
xdLB.SetDefaultColor(Color.YELLOW);
xdLB.SetStyle(Curve.SHORT_DASH);
xdLB.SetLineWeight(1);

plot xdL2 = if BarNumber() < bn1d then Double.NaN else highestall(if hidenextdaylines and IsNaN(close[1]) or thisDay > 0 then Double.NaN else DAILYHIGHLOW(DISPLACE = 0).DAILYLOW);
xdL2.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);
xdL2.SetHiding(rth == 1);
xdL2.SetDefaultColor(Color.CYAN);
xdL2.SetLineWeight(1);
plot xdhLB = if BarNumber() < bn1d then Double.NaN else highestall(if hidenextdaylines and IsNaN(close[1]) or thisDay > 0 then Double.NaN else DailyHighLow().DAILYLOW);
xdhLB.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);
xdhLB.SetHiding(rth == 0);
xdhLB.SetDefaultColor(Color.CYAN);
xdhLB.SetLineWeight(1);
 

greco26

Active member
I guess I messes something up in my code. The plotted lines shifted to today's high and low after market opened instead of staying on yesterday's high and low. Any thoughts on what I did wrong?
 

SleepyZ

Well-known member
VIP
Lifetime
I guess I messes something up in my code. The plotted lines shifted to today's high and low after market opened instead of staying on yesterday's high and low. Any thoughts on what I did wrong?

The part of my code using RTH to set hiding does not work on Daily and Above Charts. However, here is a workaround that you may want to try. It uses an intraday chart (the images below are a 1hr chart) with the following code and a multitime candle overlay set at DAY. Both studies are in the same lower panel and the show price graph is unchecked in general settings. This allows the use of the intraday timeframe to determine when the trading session ends as you want with only psuedo daily candles showing.

The first image is the previous day's high/low extended over the current daily candle. The second image is the auto movement of the lines after the current day's trading session.

The last code below is the multi-timeframe candle overlay code shown in the image.

Capture.jpg
Capture.jpg
Ruby:
def ymd      = GetYYYYMMDD();
def candles  = !IsNaN(close);
def capture  = candles and ymd != ymd[1];
def dayCount = CompoundValue(1, if capture then dayCount[1] + 1 else dayCount[1], 0);
def thisDay  = (HighestAll(dayCount) - dayCount) ;
input hidenextdaylines = no;

#Exended Dailyhighlow Lines-------------------------------------------------------------
def dhext = if isnan(DailyHighLow(displace = 0)) then dhext[1] else DailyHighLow(displace = 0);
def dhpext= if isnan(DailyHighLow(displace = 0)) then dhpext[1] else dailyhighlow();
def dlext = if isnan(DailyHighLow(displace = 0)) then dlext[1] else DailyHighLow(displace = 0).DailyLow;
def dlpext= if isnan(DailyHighLow(displace = 0)) then dlpext[1] else DailyHighLow().DailyLow;

#RTH Used to Hide Dailyhighlow lines----------------------------------------------------
def rth = HighestAll(if IsNaN(close[-1]) and !IsNaN(close) and SecondsFromTime(0100) >= 0  and SecondsFromTime(1600) < 0 then 1 else 0);
#---------------------------------------------------------------------------------------

plot xdh = if hidenextdaylines and IsNaN(close[1]) or thisDay > 0 then Double.NaN else dhext;
xdh.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);
xdh.SetHiding(rth == 1);

plot xpdh = if hidenextdaylines and IsNaN(close[1]) or thisDay > 0 then Double.NaN else dhpext;
xpdh.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);
xpdh.SetHiding(rth == 0);

plot xdl = if hidenextdaylines and IsNaN(close[1]) or thisDay > 0 then Double.NaN else dlext;
xdl.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);
xdl.SetHiding(rth == 1);

plot xpdl = if hidenextdaylines and IsNaN(close[1]) or thisDay > 0 then Double.NaN else dlpext;
xpdl.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);
xpdl.SetHiding(rth == 0);

Multi_timeframe candle overlay
Ruby:
input showcloud = yes;
input agg  = AggregationPeriod.hour;

plot o = open(period = agg);
plot c = close(period = agg);
plot h  = high(period = agg);
plot l   = low(period = agg);
h.AssignValueColor(if o > c then Color.RED else Color.GREEN);
l.AssignValueColor(if o > c then Color.RED else Color.GREEN);
o.setdefaultColor(color.white);
c.setdefaultColor(color.yellow);
o.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);
c.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);
h.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);
l.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);

AddCloud(if showcloud and o > c then o else double.nan, c, Color.LIGHT_RED, color2 = Color.LIGHT_red);
AddCloud(if showcloud then h else Double.NaN, if o>o then o else c, Color.gray, color2 = Color.gray);
AddCloud(if showcloud and o < c then c else double.nan, o, Color.LIGHT_green, color2 = Color.LIGHT_green);
AddCloud(if showcloud then if o > c then c else o else double.nan, l, Color.gray, color2 = Color.gray);
def dn = if h < h[1] and l<= l[1]
         then 1
         else if dn[1] == 1 and l < l[1] and c[1] > c
         then 1
         else 0;
def up = if h >= h[1] and l > l[1]
         then 1
         else if up[1] == 1 and h > h[1] and c > c[1]
         then 1
         else 0;
input pricecolor = no;
AssignPriceColor(if pricecolor
                 then if up == 1
                      then Color.GREEN
                      else if dn == 1
                      then Color.RED
                      else Color.YELLOW
                 else Color.CURRENT);
 

greco26

Active member
Oh wooooowww! This is so awesome. It really is amazing what you guys think of and how you’re able to code it. I love learning stuff like this. Thank you so much.
 
Last edited by a moderator:

Similar threads

Top