OPEN-SOURCE SCRIPT
Midpoint Levels day/week/month/high/low /close

//version=5
indicator("Midpoint Levels + Previous Week Close", overlay=true)
// === Inputs for Day Midpoint ===
showDay = input.bool(true, "Show Day Midpoint")
dayColor = input.color(color.orange, "Day Midpoint Color")
dayWidth = input.int(1, "Day Line Thickness", minval=1, maxval=5)
dayStyleOpt = input.string("Solid", "Day Line Style", options=["Solid", "Dashed", "Dotted"])
dayStyle = dayStyleOpt == "Dashed" ? line.style_dashed : dayStyleOpt == "Dotted" ? line.style_dotted : line.style_solid
// === Inputs for Week Midpoint ===
showWeek = input.bool(true, "Show Week Midpoint")
weekColor = input.color(color.blue, "Week Midpoint Color")
weekWidth = input.int(1, "Week Line Thickness", minval=1, maxval=5)
weekStyleOpt = input.string("Solid", "Week Line Style", options=["Solid", "Dashed", "Dotted"])
weekStyle = weekStyleOpt == "Dashed" ? line.style_dashed : weekStyleOpt == "Dotted" ? line.style_dotted : line.style_solid
// === Inputs for Month Midpoint ===
showMonth = input.bool(true, "Show Month Midpoint")
monthColor = input.color(color.purple, "Month Midpoint Color")
monthWidth = input.int(1, "Month Line Thickness", minval=1, maxval=5)
monthStyleOpt = input.string("Solid", "Month Line Style", options=["Solid", "Dashed", "Dotted"])
monthStyle = monthStyleOpt == "Dashed" ? line.style_dashed : monthStyleOpt == "Dotted" ? line.style_dotted : line.style_solid
// === Inputs for Previous Week Close ===
showWeekClose = input.bool(true, "Show Previous Week Close")
prevWeekCloseColor = input.color(color.red, "Previous Week Close Color")
prevWeekCloseWidth = input.int(1, "Week Close Line Thickness", minval=1, maxval=5)
weekCloseStyleOpt = input.string("Solid", "Week Close Line Style", options=["Solid", "Dashed", "Dotted"])
weekCloseStyle = weekCloseStyleOpt == "Dashed" ? line.style_dashed : weekCloseStyleOpt == "Dotted" ? line.style_dotted : line.style_solid
// === Fetch Previous Highs, Lows, Closes
prevDayHigh = request.security(syminfo.tickerid, "D", high[1], lookahead=barmerge.lookahead_on)
prevDayLow = request.security(syminfo.tickerid, "D", low[1], lookahead=barmerge.lookahead_on)
prevWeekHigh = request.security(syminfo.tickerid, "W", high[1], lookahead=barmerge.lookahead_on)
prevWeekLow = request.security(syminfo.tickerid, "W", low[1], lookahead=barmerge.lookahead_on)
prevMonthHigh = request.security(syminfo.tickerid, "M", high[1], lookahead=barmerge.lookahead_on)
prevMonthLow = request.security(syminfo.tickerid, "M", low[1], lookahead=barmerge.lookahead_on)
prevWeekClose = request.security(syminfo.tickerid, "W", close[1], lookahead=barmerge.lookahead_on)
// === Calculate Midpoints
dayMid = (prevDayHigh + prevDayLow) / 2
weekMid = (prevWeekHigh + prevWeekLow) / 2
monthMid = (prevMonthHigh + prevMonthLow) / 2
// === Detect new time periods
newDay = ta.change(time("D"))
newWeek = ta.change(time("W"))
newMonth = ta.change(time("M"))
// === Line variables
var line dayLine = na
var line weekLine = na
var line monthLine = na
var line weekCloseLine = na
// === Create/Update Lines Conditionally
if newDay and showDay
if not na(dayLine)
line.delete(dayLine)
dayLine := line.new(bar_index, dayMid, bar_index + 1, dayMid,color=dayColor, width=dayWidth, style=dayStyle, extend=extend.right)
if newWeek
if not na(weekLine)
line.delete(weekLine)
if showWeek
weekLine := line.new(bar_index, weekMid, bar_index + 1, weekMid,color=weekColor, width=weekWidth, style=weekStyle, extend=extend.right)
if not na(weekCloseLine)
line.delete(weekCloseLine)
if showWeekClose
weekCloseLine := line.new(bar_index, prevWeekClose, bar_index + 1, prevWeekClose,color=prevWeekCloseColor, width=prevWeekCloseWidth, style=weekCloseStyle, extend=extend.right)
if newMonth and showMonth
if not na(monthLine)
line.delete(monthLine)
monthLine := line.new(bar_index, monthMid, bar_index + 1, monthMid,color=monthColor, width=monthWidth, style=monthStyle, extend=extend.right)
// okkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
// === Inputs: Previous Day High/Low/Close
showPrevHigh = input.bool(true, "Show Previous Day High")
prevHighColor = input.color(color.green, "Prev Day High Color")
prevHighWidth = input.int(1, "Prev Day High Thickness", minval=1, maxval=5)
prevHighStyleOpt = input.string("Solid", "Prev Day High Style", options=["Solid", "Dashed", "Dotted"])
prevHighStyle = prevHighStyleOpt == "Dashed" ? line.style_dashed : prevHighStyleOpt == "Dotted" ? line.style_dotted : line.style_solid
showPrevLow = input.bool(true, "Show Previous Day Low")
prevLowColor = input.color(color.maroon, "Prev Day Low Color")
prevLowWidth = input.int(1, "Prev Day Low Thickness", minval=1, maxval=5)
prevLowStyleOpt = input.string("Solid", "Prev Day Low Style", options=["Solid", "Dashed", "Dotted"])
prevLowStyle = prevLowStyleOpt == "Dashed" ? line.style_dashed : prevLowStyleOpt == "Dotted" ? line.style_dotted : line.style_solid
showPrevClose = input.bool(true, "Show Previous Day Close")
prevCloseColor = input.color(color.navy, "Prev Day Close Color")
prevCloseWidth = input.int(1, "Prev Day Close Thickness", minval=1, maxval=5)
prevCloseStyleOpt = input.string("Solid", "Prev Day Close Style", options=["Solid", "Dashed", "Dotted"])
prevCloseStyle = prevCloseStyleOpt == "Dashed" ? line.style_dashed : prevCloseStyleOpt == "Dotted" ? line.style_dotted : line.style_solid
prevDayClose = request.security(syminfo.tickerid, "D", close[1], lookahead=barmerge.lookahead_on)
var line prevHighLine = na
var line prevLowLine = na
var line prevCloseLine = na
// === Previous Day High
if not na(prevHighLine)
line.delete(prevHighLine)
if showPrevHigh
prevHighLine := line.new(bar_index, prevDayHigh, bar_index + 1, prevDayHigh, color=prevHighColor, width=prevHighWidth, style=prevHighStyle, extend=extend.right)
// === Previous Day Low
if not na(prevLowLine)
line.delete(prevLowLine)
if showPrevLow
prevLowLine := line.new(bar_index, prevDayLow, bar_index + 1, prevDayLow,color=prevLowColor, width=prevLowWidth, style=prevLowStyle, extend=extend.right)
// === Previous Day Close
if not na(prevCloseLine)
line.delete(prevCloseLine)
if showPrevClose
prevCloseLine := line.new(bar_index, prevDayClose, bar_index + 1, prevDayClose, color=prevCloseColor, width=prevCloseWidth, style=prevCloseStyle, extend=extend.right)
indicator("Midpoint Levels + Previous Week Close", overlay=true)
// === Inputs for Day Midpoint ===
showDay = input.bool(true, "Show Day Midpoint")
dayColor = input.color(color.orange, "Day Midpoint Color")
dayWidth = input.int(1, "Day Line Thickness", minval=1, maxval=5)
dayStyleOpt = input.string("Solid", "Day Line Style", options=["Solid", "Dashed", "Dotted"])
dayStyle = dayStyleOpt == "Dashed" ? line.style_dashed : dayStyleOpt == "Dotted" ? line.style_dotted : line.style_solid
// === Inputs for Week Midpoint ===
showWeek = input.bool(true, "Show Week Midpoint")
weekColor = input.color(color.blue, "Week Midpoint Color")
weekWidth = input.int(1, "Week Line Thickness", minval=1, maxval=5)
weekStyleOpt = input.string("Solid", "Week Line Style", options=["Solid", "Dashed", "Dotted"])
weekStyle = weekStyleOpt == "Dashed" ? line.style_dashed : weekStyleOpt == "Dotted" ? line.style_dotted : line.style_solid
// === Inputs for Month Midpoint ===
showMonth = input.bool(true, "Show Month Midpoint")
monthColor = input.color(color.purple, "Month Midpoint Color")
monthWidth = input.int(1, "Month Line Thickness", minval=1, maxval=5)
monthStyleOpt = input.string("Solid", "Month Line Style", options=["Solid", "Dashed", "Dotted"])
monthStyle = monthStyleOpt == "Dashed" ? line.style_dashed : monthStyleOpt == "Dotted" ? line.style_dotted : line.style_solid
// === Inputs for Previous Week Close ===
showWeekClose = input.bool(true, "Show Previous Week Close")
prevWeekCloseColor = input.color(color.red, "Previous Week Close Color")
prevWeekCloseWidth = input.int(1, "Week Close Line Thickness", minval=1, maxval=5)
weekCloseStyleOpt = input.string("Solid", "Week Close Line Style", options=["Solid", "Dashed", "Dotted"])
weekCloseStyle = weekCloseStyleOpt == "Dashed" ? line.style_dashed : weekCloseStyleOpt == "Dotted" ? line.style_dotted : line.style_solid
// === Fetch Previous Highs, Lows, Closes
prevDayHigh = request.security(syminfo.tickerid, "D", high[1], lookahead=barmerge.lookahead_on)
prevDayLow = request.security(syminfo.tickerid, "D", low[1], lookahead=barmerge.lookahead_on)
prevWeekHigh = request.security(syminfo.tickerid, "W", high[1], lookahead=barmerge.lookahead_on)
prevWeekLow = request.security(syminfo.tickerid, "W", low[1], lookahead=barmerge.lookahead_on)
prevMonthHigh = request.security(syminfo.tickerid, "M", high[1], lookahead=barmerge.lookahead_on)
prevMonthLow = request.security(syminfo.tickerid, "M", low[1], lookahead=barmerge.lookahead_on)
prevWeekClose = request.security(syminfo.tickerid, "W", close[1], lookahead=barmerge.lookahead_on)
// === Calculate Midpoints
dayMid = (prevDayHigh + prevDayLow) / 2
weekMid = (prevWeekHigh + prevWeekLow) / 2
monthMid = (prevMonthHigh + prevMonthLow) / 2
// === Detect new time periods
newDay = ta.change(time("D"))
newWeek = ta.change(time("W"))
newMonth = ta.change(time("M"))
// === Line variables
var line dayLine = na
var line weekLine = na
var line monthLine = na
var line weekCloseLine = na
// === Create/Update Lines Conditionally
if newDay and showDay
if not na(dayLine)
line.delete(dayLine)
dayLine := line.new(bar_index, dayMid, bar_index + 1, dayMid,color=dayColor, width=dayWidth, style=dayStyle, extend=extend.right)
if newWeek
if not na(weekLine)
line.delete(weekLine)
if showWeek
weekLine := line.new(bar_index, weekMid, bar_index + 1, weekMid,color=weekColor, width=weekWidth, style=weekStyle, extend=extend.right)
if not na(weekCloseLine)
line.delete(weekCloseLine)
if showWeekClose
weekCloseLine := line.new(bar_index, prevWeekClose, bar_index + 1, prevWeekClose,color=prevWeekCloseColor, width=prevWeekCloseWidth, style=weekCloseStyle, extend=extend.right)
if newMonth and showMonth
if not na(monthLine)
line.delete(monthLine)
monthLine := line.new(bar_index, monthMid, bar_index + 1, monthMid,color=monthColor, width=monthWidth, style=monthStyle, extend=extend.right)
// okkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
// === Inputs: Previous Day High/Low/Close
showPrevHigh = input.bool(true, "Show Previous Day High")
prevHighColor = input.color(color.green, "Prev Day High Color")
prevHighWidth = input.int(1, "Prev Day High Thickness", minval=1, maxval=5)
prevHighStyleOpt = input.string("Solid", "Prev Day High Style", options=["Solid", "Dashed", "Dotted"])
prevHighStyle = prevHighStyleOpt == "Dashed" ? line.style_dashed : prevHighStyleOpt == "Dotted" ? line.style_dotted : line.style_solid
showPrevLow = input.bool(true, "Show Previous Day Low")
prevLowColor = input.color(color.maroon, "Prev Day Low Color")
prevLowWidth = input.int(1, "Prev Day Low Thickness", minval=1, maxval=5)
prevLowStyleOpt = input.string("Solid", "Prev Day Low Style", options=["Solid", "Dashed", "Dotted"])
prevLowStyle = prevLowStyleOpt == "Dashed" ? line.style_dashed : prevLowStyleOpt == "Dotted" ? line.style_dotted : line.style_solid
showPrevClose = input.bool(true, "Show Previous Day Close")
prevCloseColor = input.color(color.navy, "Prev Day Close Color")
prevCloseWidth = input.int(1, "Prev Day Close Thickness", minval=1, maxval=5)
prevCloseStyleOpt = input.string("Solid", "Prev Day Close Style", options=["Solid", "Dashed", "Dotted"])
prevCloseStyle = prevCloseStyleOpt == "Dashed" ? line.style_dashed : prevCloseStyleOpt == "Dotted" ? line.style_dotted : line.style_solid
prevDayClose = request.security(syminfo.tickerid, "D", close[1], lookahead=barmerge.lookahead_on)
var line prevHighLine = na
var line prevLowLine = na
var line prevCloseLine = na
// === Previous Day High
if not na(prevHighLine)
line.delete(prevHighLine)
if showPrevHigh
prevHighLine := line.new(bar_index, prevDayHigh, bar_index + 1, prevDayHigh, color=prevHighColor, width=prevHighWidth, style=prevHighStyle, extend=extend.right)
// === Previous Day Low
if not na(prevLowLine)
line.delete(prevLowLine)
if showPrevLow
prevLowLine := line.new(bar_index, prevDayLow, bar_index + 1, prevDayLow,color=prevLowColor, width=prevLowWidth, style=prevLowStyle, extend=extend.right)
// === Previous Day Close
if not na(prevCloseLine)
line.delete(prevCloseLine)
if showPrevClose
prevCloseLine := line.new(bar_index, prevDayClose, bar_index + 1, prevDayClose, color=prevCloseColor, width=prevCloseWidth, style=prevCloseStyle, extend=extend.right)
Mã nguồn mở
Theo đúng tinh thần TradingView, người tạo ra tập lệnh này đã biến tập lệnh thành mã nguồn mở để các nhà giao dịch có thể xem xét và xác minh công năng. Xin dành lời khen tặng cho tác giả! Mặc dù bạn có thể sử dụng miễn phí, nhưng lưu ý nếu đăng lại mã, bạn phải tuân theo Quy tắc nội bộ của chúng tôi.
Thông báo miễn trừ trách nhiệm
Thông tin và ấn phẩm không có nghĩa là và không cấu thành, tài chính, đầu tư, kinh doanh, hoặc các loại lời khuyên hoặc khuyến nghị khác được cung cấp hoặc xác nhận bởi TradingView. Đọc thêm trong Điều khoản sử dụng.
Mã nguồn mở
Theo đúng tinh thần TradingView, người tạo ra tập lệnh này đã biến tập lệnh thành mã nguồn mở để các nhà giao dịch có thể xem xét và xác minh công năng. Xin dành lời khen tặng cho tác giả! Mặc dù bạn có thể sử dụng miễn phí, nhưng lưu ý nếu đăng lại mã, bạn phải tuân theo Quy tắc nội bộ của chúng tôi.
Thông báo miễn trừ trách nhiệm
Thông tin và ấn phẩm không có nghĩa là và không cấu thành, tài chính, đầu tư, kinh doanh, hoặc các loại lời khuyên hoặc khuyến nghị khác được cung cấp hoặc xác nhận bởi TradingView. Đọc thêm trong Điều khoản sử dụng.