//@version=6
indicator("Jour du High / Low Hebdomadaire (en %) [par rang dans la semaine]", overlay=false)
// ─────────────────────────────────────────────────────────────────────────────
// Inputs : plage d'observation par années (menus) + option full history
// ─────────────────────────────────────────────────────────────────────────────
useFullHistory = input.bool(false, "Utiliser tout l'historique (ignore la plage)")
startYearStr = input.string("2018", "Année de début", options=["2010","2011","2012","2013","2014","2015","2016","2017","2018","2019","2020","2021","2022","2023","2024","2025","2026"])
endYearStr = input.string("2025", "Année de fin", options=["2010","2011","2012","2013","2014","2015","2016","2017","2018","2019","2020","2021","2022","2023","2024","2025","2026"])
startYearInput = int(str.tonumber(startYearStr))
endYearInput = int(str.tonumber(endYearStr))
startYear = math.min(startYearInput, endYearInput)
endYear = math.max(startYearInput, endYearInput)
// ─────────────────────────────────────────────────────────────────────────────
// Helpers : semaine + "jour" = rang 0..4 dans la semaine (au lieu de dayofweek)
// ─────────────────────────────────────────────────────────────────────────────
isWeekChange = ta.change(time("W")) != 0
// Rang du jour dans la semaine: 0..4 (Lun..Ven "logiques")
// On reset à 0 au début d'une nouvelle semaine, puis +1 à chaque
Bougie daily.
var int dayInWeek = na
dayInWeek := na(dayInWeek) ? 0 : (isWeekChange ? 0 : dayInWeek + 1)
// On ne garde que 0..4 (5 jours). Si >4, on ignore (ça couvre cas rares de flux).
dayIdxMonFri = dayInWeek >= 0 and dayInWeek <= 4 ? dayInWeek : na
// Filtre années appliqué au moment où on finalise la semaine précédente (au changement de semaine)
inYearRangeOnFinalize = useFullHistory ? true : (year(time) >= startYear and year(time) <= endYear)
// ─────────────────────────────────────────────────────────────────────────────
// State (persistant)
// ─────────────────────────────────────────────────────────────────────────────
var float weekHigh = na
var float weekLow = na
var int highDayIdx = na
var int lowDayIdx = na
var int[] highCount = array.new_int(5, 0) // 0..4 => Lun..Ven "logiques"
var int[] lowCount = array.new_int(5, 0)
var int totalHigh = 0
var int totalLow = 0
// ─────────────────────────────────────────────────────────────────────────────
// Weekly tracking
// ─────────────────────────────────────────────────────────────────────────────
if isWeekChange
// Finalise la semaine précédente (si dans la plage d'années)
if inYearRangeOnFinalize
if not na(highDayIdx)
array.set(highCount, highDayIdx, array.get(highCount, highDayIdx) + 1)
totalHigh += 1
if not na(lowDayIdx)
array.set(lowCount, lowDayIdx, array.get(lowCount, lowDayIdx) + 1)
totalLow += 1
// Reset nouvelle semaine (sur la
Bougie courante)
weekHigh := high
weekLow := low
highDayIdx := dayIdxMonFri
lowDayIdx := dayIdxMonFri
else
// Mise à jour intra-semaine
if not na(dayIdxMonFri)
if na(weekHigh) or high > weekHigh
weekHigh := high
highDayIdx := dayIdxMonFri
if na(weekLow) or low < weekLow
weekLow := low
lowDayIdx := dayIdxMonFri
// ─────────────────────────────────────────────────────────────────────────────
// % helpers
// ─────────────────────────────────────────────────────────────────────────────
pct(_count, _total) =>
_total > 0 ? (float(_count) / float(_total)) * 100.0 : na
fmtPct(_x) =>
na(_x) ? "—" : str.format("{0,number,#0.0}%", _x)
// ─────────────────────────────────────────────────────────────────────────────
// Table
// ─────────────────────────────────────────────────────────────────────────────
var table t = table.new(position.bottom_right, 3, 7, border_width=1)
days = array.from("Lundi","Mardi","Mercredi","Jeudi","Vendredi")
table.cell(t, 0, 0, "Jour")
table.cell(t, 1, 0, "High semaine (%)")
table.cell(t, 2, 0, "Low semaine (%)")
for i = 0 to 4
highP = pct(array.get(highCount, i), totalHigh)
lowP = pct(array.get(lowCount, i), totalLow)
table.cell(t, 0, i + 1, array.get(days, i))
table.cell(t, 1, i + 1, fmtPct(highP))
table.cell(t, 2, i + 1, fmtPct(lowP))
rangeLabel = useFullHistory ? "Full" : (str.tostring(startYear) + "-" + str.tostring(endYear))
table.cell(t, 0, 6, "N / Plage")
table.cell(t, 1, 6, str.tostring(totalHigh) + " / " + rangeLabel)
table.cell(t, 2, 6, str.tostring(totalLow) + " / " + rangeLabel)