Here is the "Pro" version. It utilizes Pine Script v5's table rendering for a live dashboard and ensures execution happens on every tick, not just at the bar close.
Code: Select all
//@version=5
// calc_on_every_tick=true is CRITICAL for scalpers to trigger stops mid-bar
strategy("Pro Risk Desk & Execution", overlay=true,
calc_on_every_tick=true,
initial_capital=100000,
default_qty_type=strategy.percent_of_equity,
default_qty_value=2.0,
commission_type=strategy.commission.cash_per_order,
commission_value=2.5, // Modeled commissions
slippage=1) // Modeled slippage (ticks)
// =========================================================================
// 1. RISK DESK PARAMETERS
// =========================================================================
grpRisk = "Risk Management Settings"
dailyLossLimitPct = input.float(3.0, "Daily Hard Stop (%)", minval=0.1, step=0.5, group=grpRisk)
enforceTarget = input.bool(false, "Halt on Profit Target?", group=grpRisk)
dailyTargetPct = input.float(5.0, "Daily Profit Target (%)", minval=0.1, step=0.5, group=grpRisk)
grpUI = "Dashboard Settings"
showHUD = input.bool(true, "Show Risk Dashboard", group=grpUI)
// =========================================================================
// 2. STATE TRACKING
// =========================================================================
var float startOfDayEquity = na
var bool isHalted = false
var string haltMessage = "TRADING ACTIVE"
// Detect session change natively
isNewSession = ta.change(time("D")) != 0
// Reset risk metrics at midnight/session start
if isNewSession
startOfDayEquity := strategy.equity
isHalted := false
haltMessage := "TRADING ACTIVE"
// Calculate live Daily PnL (including floating positions)
float currentEquity = strategy.equity
float dailyPnLPct = na(startOfDayEquity) or startOfDayEquity == 0 ? 0.0 :
((currentEquity - startOfDayEquity) / startOfDayEquity) * 100
// =========================================================================
// 3. RISK ENFORCEMENT ENGINE
// =========================================================================
if not isHalted and not na(startOfDayEquity)
// Rule 1: Hard Daily Loss Cap
if dailyPnLPct <= -dailyLossLimitPct
isHalted := true
haltMessage := "LOSS CAP HIT"
strategy.close_all(comment="RISK: DAILY STOP")
// Rule 2: Daily Profit Target (Walk away a winner)
else if enforceTarget and dailyPnLPct >= dailyTargetPct
isHalted := true
haltMessage := "TARGET REACHED"
strategy.close_all(comment="RISK: TARGET SECURED")
// Background alert when halted
bgcolor(isHalted ? (dailyPnLPct < 0 ? color.new(color.red, 92) : color.new(color.green, 92)) : na, title="Halt Status")
// =========================================================================
// 4. YOUR PRICE ACTION STRATEGY (Placeholder)
// =========================================================================
// Replace this with your specific 15m price action / candlestick structure logic
// Example: Simple Inside Bar breakout for demonstration
insideBar = high < high[1] and low > low[1]
breakUp = ta.crossover(close, high[1]) and insideBar[1]
breakDown = ta.crossunder(close, low[1]) and insideBar[1]
// =========================================================================
// 5. EXECUTION LAYER (Gated by Risk Desk)
// =========================================================================
if not isHalted
if breakUp
strategy.entry("Long", strategy.long)
if breakDown
strategy.entry("Short", strategy.short)
// =========================================================================
// 6. LIVE HUD / DASHBOARD
// =========================================================================
var table riskPanel = table.new(position.bottom_right, 2, 4, border_width=1, border_color=color.new(color.gray, 80), frame_color=color.new(color.black, 0), frame_width=2)
if showHUD and barstate.islast
// Start Equity
table.cell(riskPanel, 0, 0, "Start Equity:", text_color=color.gray, text_halign=text.align_left, bgcolor=color.new(color.black, 10))
table.cell(riskPanel, 1, 0, str.tostring(startOfDayEquity, "#.00"), text_color=color.white, text_halign=text.align_right, bgcolor=color.new(color.black, 10))
// Live Equity
table.cell(riskPanel, 0, 1, "Live Equity:", text_color=color.gray, text_halign=text.align_left, bgcolor=color.new(color.black, 10))
table.cell(riskPanel, 1, 1, str.tostring(currentEquity, "#.00"), text_color=color.white, text_halign=text.align_right, bgcolor=color.new(color.black, 10))
// Daily PnL
color pnlColor = dailyPnLPct > 0 ? color.lime : dailyPnLPct < 0 ? color.red : color.gray
table.cell(riskPanel, 0, 2, "Daily PnL (%):", text_color=color.gray, text_halign=text.align_left, bgcolor=color.new(color.black, 10))
table.cell(riskPanel, 1, 2, str.tostring(dailyPnLPct, "#.##") + "%", text_color=pnlColor, text_halign=text.align_right, bgcolor=color.new(color.black, 10))
// Desk Status
color statusColor = isHalted ? (dailyPnLPct < 0 ? color.maroon : color.new(color.green, 40)) : color.new(color.blue, 60)
table.cell(riskPanel, 0, 3, "Desk Status:", text_color=color.white, text_halign=text.align_left, bgcolor=statusColor)
table.cell(riskPanel, 1, 3, haltMessage, text_color=color.white, text_halign=text.align_right, bgcolor=statusColor)