//@version=6 indicator("Macro Times", overlay=false, format=format.price, max_boxes_count=500) // ═══════════════════════════════════════════════════════════════════════════ // WAT ER VERANDERD IS: de achtergrond kan nu de hele dag vooruit. // // De balk in de pane tekende al wel vooruit -- die gebruikt line.new met een // timestamp, en een tijdstempel mag voorbij de laatste kaars liggen. De // achtergrond gebruikte bgcolor(), en bgcolor kan alleen een bar kleuren die // bestaat. Vandaar dat hij alleen live meegroeide. // // De oplossing stond dus al in dit bestand, maar op de verkeerde helft: // boxes op xloc.bar_time, met dezelfde timestamps als de balk. Die tekenen // wel voorbij de laatste kaars, en dat is wat je in bar replay nodig hebt. // // EEN KEUZE IN PLAATS VAN TWEE SCHAKELAARS. bgcolor en boxes tegelijk aan // zetten verft het verleden dubbel en dus donkerder dan de toekomst. Daarom // is het nu een keuzelijst: uit, alleen historie, of de hele dag. // // BOXEN HEBBEN EEN PRIJS NODIG. Pine kent geen "volle hoogte", dus de box // loopt van anderhalf maal de koers tot de helft ervan. Op een index-future // ligt dat zo ver buiten beeld dat het als achtergrond leest. // ═══════════════════════════════════════════════════════════════════════════ // ==== SETTINGS ==== tz = input.string("America/New_York", "Tijdzone", group="Algemeen") dagen = input.int(1, "Dagen tekenen", minval=1, maxval=5, group="Algemeen", tooltip="1 = vandaag, inclusief alle macro's die nog moeten komen. Meer dagen is handig als je door een replay stapt en de volgende dag alvast op het scherm wilt. 14 macro's per dag, dus 5 dagen is 70 boxen van de 500.") showBar = input.bool(true, "Balk tonen (pane)", group="Balk") colBar = input.color(color.black, "Balk kleur", group="Balk") w = input.int(3, "Balk dikte", minval=1, maxval=10, group="Balk") bgMode = input.string("Hele dag (ook vooruit)", "Achtergrond op chart", group="Achtergrond", options=["Uit", "Alleen historie", "Hele dag (ook vooruit)"], tooltip="'Alleen historie' is de oude bgcolor: die kan per definitie niet vooruit. 'Hele dag' tekent boxen met tijdstempels en laat de komende macro's dus wel zien, ook in bar replay.") colBg = input.color(color.new(color.blue, 85), "Achtergrond kleur", group="Achtergrond") colBgFut = input.color(color.new(color.blue, 92), " └ kleur voor wat nog komt", group="Achtergrond", tooltip="Iets lichter dan het verleden, zodat je in een oogopslag ziet wat al geweest is en wat er aankomt. Zet hem gelijk aan de andere als je dat onderscheid niet wilt.") // ==== MACRO'S (elk apart aan/uit) ==== gM = "Macro tijden" m02 = input.bool(true, "02:42 - 03:15", group=gM) m03 = input.bool(true, "03:42 - 04:15", group=gM) m04 = input.bool(true, "04:42 - 05:15", group=gM) m05 = input.bool(true, "05:42 - 06:15", group=gM) m06 = input.bool(true, "06:42 - 07:15", group=gM) m07 = input.bool(true, "07:42 - 08:15", group=gM) m08 = input.bool(true, "08:42 - 09:15", group=gM) m09 = input.bool(true, "09:42 - 10:15", group=gM) m10 = input.bool(true, "10:42 - 11:15", group=gM) m11 = input.bool(true, "11:42 - 12:15", group=gM) m12 = input.bool(true, "12:42 - 13:15", group=gM) m13 = input.bool(true, "13:42 - 14:15", group=gM) m14 = input.bool(true, "14:42 - 15:15", group=gM) m15 = input.bool(true, "15:42 - 16:15", group=gM) // index 0 = macro die start om 02:42, index 13 = 15:42 en = array.from(m02, m03, m04, m05, m06, m07, m08, m09, m10, m11, m12, m13, m14, m15) FIRST_H = 2 LAST_H = 15 // ==== ACHTERGROND, HISTORIE (de oude weg) ==== h = hour(time, tz) mi = minute(time, tz) // start-uur van de macro waar deze bar in valt (na = geen macro) int startH = mi >= 42 ? h : mi < 15 ? h - 1 : na bool inMacro = false if not na(startH) if startH >= FIRST_H and startH <= LAST_H inMacro := en.get(startH - FIRST_H) // Alleen in "Alleen historie". In "Hele dag" doen de boxen het werk, en de // twee tegelijk zou het verleden dubbel verven. bgcolor(bgMode == "Alleen historie" and inMacro ? colBg : na, force_overlay=true, title="Macro achtergrond") // ==== BALKEN IN DE PANE + ACHTERGROND VOOR DE HELE DAG ==== y = year(time, tz) mo = month(time, tz) d = dayofmonth(time, tz) var array lines = array.new() var array boxes = array.new() // Geen "volle hoogte" in Pine, dus ver buiten beeld. Op NQ is dat 12.500 tot // 37.500 bij een koers van 25.000 -- dat ziet niemand als een rand. f_top() => close * 1.5 f_bot() => close * 0.5 if barstate.islast // Alles opnieuw tekenen in plaats van bijwerken. Dat is in bar replay het // enige dat klopt: daar schuift "de laatste bar" naar achteren, en een // bijgehouden lijst zou de toekomst van een vorige stap vasthouden. while lines.size() > 0 line.delete(lines.pop()) while boxes.size() > 0 box.delete(boxes.pop()) for dagOff = 0 to dagen - 1 for hh = FIRST_H to LAST_H if en.get(hh - FIRST_H) ts = timestamp(tz, y, mo, d + dagOff, hh, 42, 0) te = timestamp(tz, y, mo, d + dagOff, hh + 1, 15, 0) if showBar lines.push(line.new(x1=ts, y1=0, x2=te, y2=0, xloc=xloc.bar_time, extend=extend.none, color=colBar, width=w)) if bgMode == "Hele dag (ook vooruit)" // ts > time is de macro die nog moet beginnen. De lopende // macro telt als historie: die ben je al in. boxes.push(box.new(ts, f_top(), te, f_bot(), xloc=xloc.bar_time, bgcolor=ts > time ? colBgFut : colBg, border_color=color.new(color.white, 100), force_overlay=true))