Premium Linear Regression - The Quant Science
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © thequantscience

// ██████╗ ██████╗ ███████╗███╗   ███╗██╗██╗   ██╗███╗   ███╗    ██╗     ██╗███╗   ██╗███████╗ █████╗ ██████╗     ██████╗ ███████╗ ██████╗ 
// ██╔══██╗██╔══██╗██╔════╝████╗ ████║██║██║   ██║████╗ ████║    ██║     ██║████╗  ██║██╔════╝██╔══██╗██╔══██╗    ██╔══██╗██╔════╝██╔════╝ 
// ██████╔╝██████╔╝█████╗  ██╔████╔██║██║██║   ██║██╔████╔██║    ██║     ██║██╔██╗ ██║█████╗  ███████║██████╔╝    ██████╔╝█████╗  ██║  ███╗
// ██╔═══╝ ██╔══██╗██╔══╝  ██║╚██╔╝██║██║██║   ██║██║╚██╔╝██║    ██║     ██║██║╚██╗██║██╔══╝  ██╔══██║██╔══██╗    ██╔══██╗██╔══╝  ██║   ██║
// ██║     ██║  ██║███████╗██║ ╚═╝ ██║██║╚██████╔╝██║ ╚═╝ ██║    ███████╗██║██║ ╚████║███████╗██║  ██║██║  ██║    ██║  ██║███████╗╚██████╔╝
// ╚═╝     ╚═╝  ╚═╝╚══════╝╚═╝     ╚═╝╚═╝ ╚═════╝ ╚═╝     ╚═╝    ╚══════╝╚═╝╚═╝  ╚═══╝╚══════╝╚═╝  ╚═╝╚═╝  ╚═╝    ╚═╝  ╚═╝╚══════╝ ╚═════╝                                                                                                                                 

//@version=5
indicator("Premium Linear Regression - The Quant Science", overlay = true)

// ################################################################################################################################################

startDate   = input.int(title="Date: ",  defval=1,     minval=1,     maxval=31,   inline = 'Start',   group = "START DATE PERIOD")
startMonth  = input.int(title="Month: ", defval=1,     minval=1,     maxval=12,   inline = 'Start',   group = "START DATE PERIOD")
startYear   = input.int(title="Year: ",  defval=2018,  minval=1800,  maxval=2100, inline = 'Start',   group = "START DATE PERIOD")

// ################################################################################################################################################

endDate     = input.int(title="Date: ",    defval=31,    minval=1,     maxval=31,   inline = 'End',   group = "END DATE PERIOD")
endMonth    = input.int(title="Month: ",   defval=12,    minval=1,     maxval=12,   inline = 'End',   group = "END DATE PERIOD")
endYear     = input.int(title="Year: ",    defval=2023,  minval=1800,  maxval=2100, inline = 'End',   group = "END DATE PERIOD")

// ################################################################################################################################################

inDateRange = (time >= timestamp(syminfo.timezone, startYear, startMonth, startDate, 0, 0)) and (time < timestamp(syminfo.timezone, endYear, endMonth, endDate, 0, 0))

// ################################################################################################################################################

len = input.int(200, minval=1, title="Length:", inline = "s", group = "Lenght & Source")
src = input.source(close, title="Source:", inline = "s", group = "Lenght & Source")

// ################################################################################################################################################

out_linreg = ta.linreg(src, len, 0)
tf_linreg  = input.timeframe(title="Timeframe:", defval="1D", group = "Timeframe Configuration")

// ################################################################################################################################################

colorlinreg1 = input.color(defval = #00ff00,   inline = "x", title = "Up:",     group = "COLOR CONFIGURATION")
colorlinreg2 = input.color(defval = #ff0000 ,  inline = "x", title = "Down:",   group = "COLOR CONFIGURATION")

colorlinreg3 = input.color(defval = color.rgb(231, 231, 231, 98), inline = "y", title = "Background:",  group = "COLOR CONFIGURATION")

// ################################################################################################################################################

linreg = request.security(syminfo.tickerid, tf_linreg, out_linreg, gaps=barmerge.gaps_on)

// ################################################################################################################################################

var float close_up      = 0 
var float close_down    = 0 

var float storage_up    = 0 
var float storage_down  = 0 

var int count_up        = 0 
var int count_down      = 0 

if close > linreg and inDateRange
    close_up   := close - linreg 
    storage_up += close_up
    count_up   += 1

if close < linreg and inDateRange
    close_down   := linreg - close 
    storage_down += close_down
    count_down   += 1 

avg_up   = storage_up / count_up
avg_down = storage_down / count_down

checkingline_up   = linreg + avg_up
checkingline_down = linreg - avg_down

// ################################################################################################################################################

colorgreen = linreg <= close 
colorred   = linreg >= close 
linreg_color  = colorred ? #ff0000 : colorgreen ? #00ff00 : na

plot(linreg, color = linreg_color, linewidth = 2)
plot(checkingline_up,   color = colorlinreg1, style = plot.style_circles)
plot(checkingline_down, color = colorlinreg2, style = plot.style_circles)

// ################################################################################################################################################
