Free tool

DAX Session Prep Map

A clean TradingView script for DAX intraday traders who want to prep off the real cash session, not random 24h CFD candles or mystical “institutional” drawings.

What this tool does

It draws the levels I use every morning in my own DAX desk prep: previous cash session structure and overnight structure, based on the real Xetra cash times. No signals, no arrows, no magical “smart money” overlays.

  • Prev Cash High / Low / Xetra Close (09:00–17:30 CET)
  • Overnight High / Low / Mid (17:30–09:00 CET)
  • Cash Open and Cash Close markers
  • Clean information table with prices and session references

Your job is to interpret the structure and build a plan. The script just draws straight lines.

DAX Session Prep Map indicator screenshot

How it fits into your prep

This is the backbone of my daily DAX outlook. I look at:

  • where price is versus previous cash high/low/close
  • how the overnight range sits around that
  • whether we are accepting above, inside, or below prior structure
  • how that lines up with the cash open and first moves

From there I build scenarios: which side makes more sense to lean on, which levels are likely magnets, and where it makes sense to stand aside. That part is trading.

Important note about access

I am not keeping a paid TradingView subscription so people can press an “add to chart” button. If you want this, you copy and paste the code into Pine Editor yourself. It takes two minutes.

This is a free tool, not a full-time Pine support hotline.

Want direct help?

If you want me to look at your DAX trading, you can always book a free 15 minute intro call or a 1 hour mentorship session on the mentorship page.

Go to mentorship and booking

How to install in TradingView

  • Open TradingView and your DAX chart (I use the 5 minute CFD)
  • Open the Pine Editor at the bottom
  • Delete everything in the editor
  • Paste the script from the section below
  • Click Add to chart
  • Optionally save it as your own script and add it to your DAX template
How to use it in your morning prep
  • Before cash open, type in:
    • Prev Cash High (yesterday 09:00–17:30 high)
    • Prev Cash Low
    • Xetra official close
    • ON High (17:30–09:00)
    • ON Low (17:30–09:00)
  • ON Mid is calculated automatically
  • The chart then shows session boundaries, extended levels, and the info table
  • From there: describe the structure, define scenarios, and plan your trades
Why this exists

Different CFD feeds print different highs and lows. “Automated” session scripts break on timezones and symbol changes. Daily candles lie. Traders need control, not prophecy. This tool gives you control: you decide the levels, the script makes them usable.

Show full Pine Script (copy & paste into TradingView)
//@version=5
indicator("DAX Session Prep Map (CFD) - Manual Levels + Sessions", overlay = true, max_lines_count = 40, max_labels_count = 20)

// =====================
// USER INPUTS
// =====================

// Prev cash session levels (manual)
prevHigh  = input.float(24444.5, "Prev Cash High",  step = 0.1)
prevLow   = input.float(24225.3, "Prev Cash Low",   step = 0.1)
prevClose = input.float(24381.0, "Prev Cash Close (Xetra)", step = 0.1)

// Overnight levels (manual)
onHigh = input.float(24500.0, "ON High", step = 0.1)
onLow  = input.float(24352.3, "ON Low",  step = 0.1)

// Visual toggles
showPrev     = input.bool(true,  "Show Prev Cash levels (H/L/C)")
showON       = input.bool(true,  "Show ON High/Low/Mid")
showTable    = input.bool(true,  "Show prep table")
showSessions = input.bool(true,  "Show cash session markers")

// Colors
colPrevHigh   = color.new(color.green,  0)
colPrevLow    = color.new(color.red,    0)
colPrevClose  = color.new(color.yellow, 0)
colONHigh     = color.new(color.blue,   0)
colONLow      = color.new(color.orange, 0)
colONMid      = color.new(color.gray,   0)
colCashOpen   = color.new(color.lime,   0)
colCashClose  = color.new(color.red,    0)
transparentCol = color.new(color.white, 100)

// Derived ON Mid
onMid = (na(onHigh) or na(onLow)) ? na : (onHigh + onLow) * 0.5

// =====================
// SESSION DETECTION (Europe/Berlin time) FOR MARKERS ONLY
// =====================

h = hour(time, "Europe/Berlin")
m = minute(time, "Europe/Berlin")

isCashOpenBar  = h == 9  and m == 0
isCashCloseBar = h == 17 and m == 30

// =====================
// HORIZONTAL LINES (MANUAL LEVELS)
// =====================

var line lPrevHigh   = na
var line lPrevLow    = na
var line lPrevClose  = na
var line lOnHigh     = na
var line lOnLow      = na
var line lOnMid      = na

f_updateLine(line ln, float price, color col, bool visible) =>
    line _ln = ln
    if visible and not na(price)
        if na(_ln)
            _ln := line.new(bar_index - 500, price, bar_index + 500, price, xloc = xloc.bar_index, extend = extend.both, color = col, width = 1)
        else
            line.set_xy1(_ln, bar_index - 500, price)
            line.set_xy2(_ln, bar_index + 500, price)
            line.set_color(_ln, col)
    else
        if not na(_ln)
            line.set_color(_ln, transparentCol)
    _ln

// Prev session levels
lPrevHigh  := f_updateLine(lPrevHigh,  prevHigh,  colPrevHigh,  showPrev)
lPrevLow   := f_updateLine(lPrevLow,   prevLow,   colPrevLow,   showPrev)
lPrevClose := f_updateLine(lPrevClose, prevClose, colPrevClose, showPrev)

// Overnight levels
lOnHigh := f_updateLine(lOnHigh, onHigh, colONHigh, showON)
lOnLow  := f_updateLine(lOnLow,  onLow,  colONLow,  showON)
lOnMid  := f_updateLine(lOnMid,  onMid,  colONMid, showON)

// =====================
// SESSION BOUNDARY LINES (VERTICAL)
// =====================

var line cashOpenLine  = na
var line cashCloseLine = na
var label cashOpenLbl  = na
var label cashCloseLbl = na
var int lastCashOpenDay  = na
var int lastCashCloseDay = na

if showSessions
    if isCashOpenBar and (na(lastCashOpenDay) or dayofmonth != lastCashOpenDay)
        lastCashOpenDay := dayofmonth
        cashOpenLine := line.new(bar_index, low, bar_index, high, xloc = xloc.bar_index, extend = extend.none, color = colCashOpen, width = 1, style = line.style_dotted)
        cashOpenLbl  := label.new(bar_index, high, "Cash Open / ON End", xloc = xloc.bar_index, yloc = yloc.price, color = colCashOpen, style = label.style_label_down, textcolor = color.white)

    if isCashCloseBar and (na(lastCashCloseDay) or dayofmonth != lastCashCloseDay)
        lastCashCloseDay := dayofmonth
        cashCloseLine := line.new(bar_index, low, bar_index, high, xloc = xloc.bar_index, extend = extend.none, color = colCashClose, width = 1, style = line.style_dotted)
        cashCloseLbl  := label.new(bar_index, high, "Cash Close / ON Start", xloc = xloc.bar_index, yloc = yloc.price, color = colCashClose, style = label.style_label_down, textcolor = color.white)

// =====================
// TABLE OUTPUT (TOP RIGHT, FULLY OPAQUE)
// =====================

var table t = na
if showTable and na(t)
    t := table.new(position.top_right, 3, 7, border_width = 1, frame_color = color.black)

f_fmt(val) =>
    na(val) ? "-" : str.tostring(val, format.mintick)

if showTable and barstate.islast and not na(t)
    // Header
    table.cell(t, 0, 0, "Item",  text_color = color.white, bgcolor = color.black)
    table.cell(t, 1, 0, "Value", text_color = color.white, bgcolor = color.black)
    table.cell(t, 2, 0, "Info",  text_color = color.white, bgcolor = color.black)

    // Prev Cash High
    table.cell(t, 0, 1, "Prev Cash High", text_color = color.white, bgcolor = colPrevHigh)
    table.cell(t, 1, 1, f_fmt(prevHigh),  text_color = color.black, bgcolor = color.white)
    table.cell(t, 2, 1, "09:00–17:30 CET (cash, CFD)", text_color = color.black, bgcolor = color.white)

    // Prev Cash Low
    table.cell(t, 0, 2, "Prev Cash Low", text_color = color.white, bgcolor = colPrevLow)
    table.cell(t, 1, 2, f_fmt(prevLow),   text_color = color.black, bgcolor = color.white)
    table.cell(t, 2, 2, "09:00–17:30 CET (cash, CFD)", text_color = color.black, bgcolor = color.white)

    // Prev Cash Close
    table.cell(t, 0, 3, "Prev Cash Close", text_color = color.black, bgcolor = colPrevClose)
    table.cell(t, 1, 3, f_fmt(prevClose),   text_color = color.black, bgcolor = color.white)
    table.cell(t, 2, 3, "Xetra official close (DB)",   text_color = color.black, bgcolor = color.white)

    // ON High
    table.cell(t, 0, 4, "ON High", text_color = color.white, bgcolor = colONHigh)
    table.cell(t, 1, 4, f_fmt(onHigh), text_color = color.black, bgcolor = color.white)
    table.cell(t, 2, 4, "17:30–09:00 CET (ON, CFD)", text_color = color.black, bgcolor = color.white)

    // ON Low
    table.cell(t, 0, 5, "ON Low", text_color = color.white, bgcolor = colONLow)
    table.cell(t, 1, 5, f_fmt(onLow), text_color = color.black, bgcolor = color.white)
    table.cell(t, 2, 5, "17:30–09:00 CET (ON, CFD)", text_color = color.black, bgcolor = color.white)

    // ON Mid
    table.cell(t, 0, 6, "ON Mid", text_color = color.white, bgcolor = colONMid)
    table.cell(t, 1, 6, f_fmt(onMid), text_color = color.black, bgcolor = color.white)
    table.cell(t, 2, 6, "17:30–09:00 CET (ON, CFD)", text_color = color.black, bgcolor = color.white)
Disclaimer: This software is provided “as is”, with no guarantees, no warranties, and no promise it even compiles after TradingView changes something. Personal use only. All rights reserved. Redistribution or modification requires my explicit written consent. This script provides no trading signals, no financial advice, and no guarantee of accuracy. You are fully responsible for your own trading decisions and risk.