Pinescript / Pine Script - Find number of weekends between two times & day of year

448 Views Asked by At

I have two "times" (unix timestamps * 1000) and would like to have the number of weekends between them algorithmically.

At first I thought of counting all the days that aren't dayofweek 7 (saturday) or 0 (sunday), but the for loop & while loop didn't work instantly (+ 86400000 = one day).

Also the week number isn't enough either, because the second "time" can directly be the first bar of the new week, and that doesn't work with the week number, despite UTC.

I don't want to show it - no session stuff is correct here, just the number.

The goal is actually to project the same amount of time into the future, but the weekends cause problems.

1

There are 1 best solutions below

1
On
//@version=5
indicator("Number of weekends & Day of year", overlay=true)

// functions
is_leap_year(y) =>
    is_leap = false
    
    if y % 100 == 0
        is_leap := y % 400 == 0
    else
        is_leap := y % 4 == 0

day_of_year(y, m, d) =>
    k = is_leap_year(y) ? 1 : 2
    
    n = int((275 * m) / 9.0) - k * int((m + 9) / 12.0) + d - 30

ymd(y, n) => // date from year & doy
    k = is_leap_year(y) ? 1 : 2

    m = int((9 * (k + n)) / 275.0 + 0.98)
    m := n < 32 ? 1 : m

    d = n - int((275 * m) / 9.0) + k * int((m + 9) / 12.0) + 30
    
    [y, m, d]

weekends_between(start, end) =>
    runner = start
    count_weekends = 0
    
    while runner < end    
        if dayofweek(runner) == 7
            count_weekends := count_weekends + 1
    
        runner := runner + 86400000
        
    count_weekends

// definition dates
start = timestamp(2022, 03, 21, 10, 30, 0)
end = timestamp(2022, 04, 04, 10, 30, 0)

// weekends
runner = start
days = 0
week_ends = 0

while runner < end
    days := days + 1
    
    if dayofweek(runner) == 7
        week_ends := week_ends + 1

    runner := runner + 86400000 // one day

// day of year
is_leap = is_leap_year(year)

doy_1 = day_of_year(str.tonumber(str.format("{0,date,y}", start)), str.tonumber(str.format("{0,date,MM}", start)), str.tonumber(str.format("{0,date,d}", start)))
doy_2 = day_of_year(str.tonumber(str.format("{0,date,y}", end)), str.tonumber(str.format("{0,date,MM}", end)), str.tonumber(str.format("{0,date,d}", end)))

// fazit:

// diff of (doy_2 - doy_1) equals days
// week_ends gives number of weekends