A drawdown of 12% means very different things depending on the market. For a broad stock index it is a serious correction; for a growth stock or a cryptocurrency it can be an ordinary week. The useful question is not how deep the drawdown is, but how unusual it is for that instrument.
The Drawdown Distribution Analysis by EdgeTools answers that question in a separate panel. It measures the drawdown from the all-time high, smooths it, and places it inside the statistical distribution of its own last 500 bars: percentile bands, standard deviation bands and Value at Risk lines. A risk level, a z-score and a statistics table complete the picture, with Sharpe ratio, annualized return and a risk efficiency score.
Drawdown. On every bar the indicator computes the distance from the running all-time high of the source, in percent: (source – peak) / peak x 100. The value is 0 at a new high and negative below it. It is then smoothed with a 14-bar exponential average.
The distribution. Over the analysis period (500 bars by default) the indicator collects the smoothed drawdown and draws:
Risk level. The percentile rank of the current drawdown (the share of the previous bars with a drawdown equal or deeper) sets the risk level: Low when it is in the better half of its history, Moderate below that, High in the worst 25%, and Extreme in the worst 10%. The thresholds are adjustable, and the main line takes the colour of the level.
Statistical significance. The z-score compares the current drawdown with the mean and standard deviation of the window. Beyond 2.5 standard deviations the drawdown is significant; beyond 3 it is severe, and the panel background turns red.
Risk-adjusted metrics. From the logarithmic returns of the same window the indicator computes the annualized return and volatility (252 periods per year), the Sharpe ratio against a risk-free rate, and a Risk Efficiency Score from 0 to 100 that combines the Sharpe ratio with the percentile rank. A volatility-adjusted drawdown, normalized to a 20% volatility, makes drawdowns comparable across assets.
The bands appear once the analysis period is full (500 bars by default). The annualized return, the Sharpe ratio and the risk efficiency need twice that period, and the table shows NaN until then.
To create an alert, use the series named “Alert …” in the indicator’s list: each one is 1 on the bar where its condition is met.
//---------------------------------------------------------------
// PRC_Drawdown Distribution
// version = 0
// 26.10.2026
// Iván González @ www.prorealcode.com
// Author: EdgeTools
// Sharing ProRealTime knowledge
//--------------------------------------------------------------------//
DEFPARAM DRAWONLASTBARONLY = true
// ===================== INPUTS =====================
// Core settings (the price source is the indicator's "Apply to" setting)
lookbackPeriod = 500 // Distribution Analysis Period (100 to 2000)
smoothingPeriod = 14 // Drawdown Smoothing Period (EMA, 1 to 50)
// Distribution bands
showPercentileBands = 1 // Show Percentile Bands
showStdDevBands = 1 // Show Standard Deviation Bands
showFills = 1 // Show Band Fills
// Risk assessment thresholds (%)
riskThresholdModerate = 50 // Low Risk Threshold
riskThresholdHigh = 75 // Moderate Risk Threshold
riskThresholdExtreme = 90 // High Risk Threshold
// Advanced metrics
enableRiskAdjustedMetrics = 1 // Risk-adjusted alerts (Sharpe, efficiency)
fixedRiskFreeRate = 4.0 // Annual risk-free rate (%)
enableVaR = 1 // Show the VaR lines
enableVolatilityAdjustment = 1 // Volatility-adjusted drawdown
showVolAdjusted = 0 // Plot the myVolatility-adjusted drawdown (hidden by default)
// Display options
showTable = 1 // Show Statistics Table
showCurrentPosition = 1 // Show Current Position Line
showZeroLine = 0 // Show Zero Reference Line
tablePosition = 0 // 0 = top right, 1 = top left, 2 = bottom right, 3 = bottom left
// Appearance
colorScheme = 1 // 0 Gold, 1 EdgeTools, 2 Behavioral, 3 Quant, 4 Ocean, 5 Fire, 6 Matrix, 7 Arctic
useDarkMode = 0 // 1 = colours for a dark chart background
// ===================== COLOURS =====================
thm = max(0, min(7, round(colorScheme)))
darkMode = useDarkMode
IF thm = 0 THEN // Gold
IF darkMode = 1 THEN
priR = 255
priG = 215
priB = 0
bulR = 255
bulG = 165
bulB = 0
beaR = 255
beaG = 82
beaB = 82
neuR = 192
neuG = 192
neuB = 192
txtR = 255
txtG = 255
txtB = 255
tbgR = 26
tbgG = 26
tbgB = 0
hbgR = 45
hbgG = 38
hbgB = 0
ELSE
priR = 218
priG = 165
priB = 32
bulR = 255
bulG = 140
bulB = 0
beaR = 211
beaG = 47
beaB = 47
neuR = 128
neuG = 128
neuB = 128
txtR = 0
txtG = 0
txtB = 0
tbgR = 255
tbgG = 254
tbgB = 240
hbgR = 245
hbgG = 245
hbgB = 220
ENDIF
ELSIF thm = 1 THEN // EdgeTools
IF darkMode = 1 THEN
priR = 59
priG = 130
priB = 246
bulR = 34
bulG = 197
bulB = 94
beaR = 239
beaG = 68
beaB = 68
neuR = 115
neuG = 115
neuB = 115
txtR = 250
txtG = 250
txtB = 250
tbgR = 23
tbgG = 23
tbgB = 23
hbgR = 38
hbgG = 38
hbgB = 38
ELSE
priR = 37
priG = 99
priB = 235
bulR = 22
bulG = 163
bulB = 74
beaR = 220
beaG = 38
beaB = 38
neuR = 82
neuG = 82
neuB = 82
txtR = 10
txtG = 10
txtB = 10
tbgR = 249
tbgG = 249
tbgB = 249
hbgR = 229
hbgG = 229
hbgB = 229
ENDIF
ELSIF thm = 2 THEN // Behavioral
IF darkMode = 1 THEN
priR = 128
priG = 128
priB = 128
bulR = 0
bulG = 255
bulB = 0
beaR = 139
beaG = 0
beaB = 0
neuR = 255
neuG = 191
neuB = 0
txtR = 255
txtG = 255
txtB = 255
tbgR = 26
tbgG = 26
tbgB = 26
hbgR = 45
hbgG = 45
hbgB = 45
ELSE
priR = 128
priG = 128
priB = 128
bulR = 0
bulG = 255
bulB = 0
beaR = 139
beaG = 0
beaB = 0
neuR = 255
neuG = 191
neuB = 0
txtR = 0
txtG = 0
txtB = 0
tbgR = 248
tbgG = 248
tbgB = 248
hbgR = 232
hbgG = 232
hbgB = 232
ENDIF
ELSIF thm = 3 THEN // Quant
IF darkMode = 1 THEN
priR = 128
priG = 128
priB = 128
bulR = 255
bulG = 165
bulB = 0
beaR = 139
beaG = 0
beaB = 0
neuR = 70
neuG = 130
neuB = 180
txtR = 255
txtG = 255
txtB = 255
tbgR = 13
tbgG = 13
tbgB = 13
hbgR = 26
hbgG = 26
hbgB = 26
ELSE
priR = 128
priG = 128
priB = 128
bulR = 255
bulG = 165
bulB = 0
beaR = 139
beaG = 0
beaB = 0
neuR = 70
neuG = 130
neuB = 180
txtR = 0
txtG = 0
txtB = 0
tbgR = 250
tbgG = 250
tbgB = 250
hbgR = 240
hbgG = 240
hbgB = 240
ENDIF
ELSIF thm = 4 THEN // Ocean
IF darkMode = 1 THEN
priR = 32
priG = 178
priB = 170
bulR = 0
bulG = 206
bulB = 209
beaR = 255
beaG = 69
beaB = 0
neuR = 135
neuG = 206
neuB = 235
txtR = 240
txtG = 248
txtB = 255
tbgR = 0
tbgG = 26
tbgB = 46
hbgR = 0
hbgG = 42
hbgB = 71
ELSE
priR = 0
priG = 139
priB = 139
bulR = 70
bulG = 130
bulB = 180
beaR = 178
beaG = 34
beaB = 34
neuR = 47
neuG = 79
neuB = 79
txtR = 25
txtG = 25
txtB = 112
tbgR = 230
tbgG = 247
tbgB = 255
hbgR = 204
hbgG = 242
hbgB = 255
ENDIF
ELSIF thm = 5 THEN // Fire
IF darkMode = 1 THEN
priR = 255
priG = 99
priB = 71
bulR = 255
bulG = 215
bulB = 0
beaR = 139
beaG = 0
beaB = 0
neuR = 255
neuG = 165
neuB = 0
txtR = 255
txtG = 250
txtB = 240
tbgR = 38
tbgG = 22
tbgB = 17
hbgR = 61
hbgG = 36
hbgB = 26
ELSE
priR = 220
priG = 20
priB = 60
bulR = 255
bulG = 140
bulB = 0
beaR = 128
beaG = 0
beaB = 0
neuR = 205
neuG = 133
neuB = 63
txtR = 47
txtG = 27
txtB = 20
tbgR = 255
tbgG = 248
tbgB = 240
hbgR = 255
hbgG = 228
hbgB = 204
ENDIF
ELSIF thm = 6 THEN // Matrix
IF darkMode = 1 THEN
priR = 0
priG = 255
priB = 65
bulR = 57
bulG = 255
bulB = 20
beaR = 255
beaG = 7
beaB = 58
neuR = 0
neuG = 255
neuB = 255
txtR = 192
txtG = 255
txtB = 140
tbgR = 10
tbgG = 26
tbgB = 10
hbgR = 17
hbgG = 43
hbgB = 17
ELSE
priR = 0
priG = 100
priB = 0
bulR = 34
bulG = 139
bulB = 34
beaR = 139
beaG = 0
beaB = 0
neuR = 0
neuG = 139
neuB = 139
txtR = 0
txtG = 51
txtB = 0
tbgR = 232
tbgG = 255
tbgB = 240
hbgR = 204
hbgG = 255
hbgB = 204
ENDIF
ELSIF thm = 7 THEN // Arctic
IF darkMode = 1 THEN
priR = 135
priG = 206
priB = 250
bulR = 0
bulG = 191
bulB = 255
beaR = 255
beaG = 20
beaB = 147
neuR = 176
neuG = 224
neuB = 230
txtR = 248
txtG = 248
txtB = 255
tbgR = 20
tbgG = 27
tbgB = 71
hbgR = 30
hbgG = 42
hbgB = 92
ELSE
priR = 65
priG = 105
priB = 225
bulR = 0
bulG = 0
bulB = 205
beaR = 139
beaG = 0
beaB = 139
neuR = 72
neuG = 61
neuB = 139
txtR = 25
txtG = 25
txtB = 112
tbgR = 240
tbgG = 248
tbgB = 255
hbgR = 224
hbgG = 240
hbgB = 255
ENDIF
ENDIF
IF darkMode = 1 THEN
backgroundAlpha = 85
bandAlpha = 70
tableAlpha = 80
ELSE
backgroundAlpha = 92
bandAlpha = 85
tableAlpha = 15
ENDIF
// Transparency (0 = opaque, 100 = invisible) to ProRealTime opacity (255 = opaque)
aBand0 = round(2.55 * (100 - min(100, bandAlpha)))
aBand10 = round(2.55 * (100 - min(100, bandAlpha + 10)))
aBand20 = round(2.55 * (100 - min(100, bandAlpha + 20)))
aVaR95 = round(2.55 * (100 - min(100, bandAlpha - 20)))
aVaR99 = round(2.55 * (100 - min(100, bandAlpha - 30)))
aFill0 = round(2.55 * (100 - min(100, backgroundAlpha)))
aFill5 = round(2.55 * (100 - min(100, backgroundAlpha + 5)))
aFill10 = round(2.55 * (100 - min(100, backgroundAlpha + 10)))
aFill15 = round(2.55 * (100 - min(100, backgroundAlpha + 15)))
tbgA = round(2.55 * (100 - min(100, tableAlpha)))
// ===================== CORE CALCULATIONS =====================
lbP = max(100, min(2000, round(lookbackPeriod)))
smP = max(1, min(50, round(smoothingPeriod)))
src = customclose
IF barindex = 0 THEN
runningPeak = src
ENDIF
runningPeak = max(runningPeak, src)
IF runningPeak > 0 THEN
rawDrawdown = (src - runningPeak) / runningPeak * 100
ELSE
rawDrawdown = 0
ENDIF
// EMA of the drawdown, seeded with the simple mean of its first smP values
emaK = 2 / (smP + 1)
IF barindex < smP - 1 THEN
smoothedDrawdown = 0
sddOk = 0
ELSIF barindex = smP - 1 THEN
smoothedDrawdown = average[smP](rawDrawdown)
sddOk = 1
ELSE
smoothedDrawdown = emaK * rawDrawdown + (1 - emaK) * smoothedDrawdown[1]
sddOk = 1
ENDIF
sdd = smoothedDrawdown
validBars = 0
IF barindex >= lbP THEN
validBars = 1
ENDIF
// the window of the mean and the deviation holds no missing value
fullWin = 0
IF barindex >= smP - 1 + lbP - 1 THEN
fullWin = 1
ENDIF
// ===================== SORTED WINDOW OF THE SMOOTHED DRAWDOWN =====================
// Holds the closed bars of the window (lbP - 1 values) and is updated once per bar,
// with all its state in arrays, so the live ticks never repeat an update.
// The live bar is merged in when reading.
IF barindex = 0 THEN
$gst[0] = -1
$cnt[0] = 0
ENDIF
IF barindex > $gst[0] THEN
$gst[0] = barindex
IF barindex >= 1 THEN
hasN = sddOk[1]
newV = sdd[1]
hasO = 0
IF barindex >= lbP THEN
hasO = sddOk[lbP]
oldV = sdd[lbP]
ENDIF
nS = $cnt[0]
// position of the value that leaves the window
rPos = -1
IF hasO = 1 AND nS > 0 THEN
loB = 0
hiB = nS
WHILE loB < hiB DO
mdB = floor((loB + hiB) / 2)
IF $srt[mdB] < oldV THEN
loB = mdB + 1
ELSE
hiB = mdB
ENDIF
WEND
rPos = loB
IF rPos >= nS THEN
rPos = nS - 1
ENDIF
IF rPos > 0 THEN
IF abs($srt[rPos - 1] - oldV) < abs($srt[rPos] - oldV) THEN
rPos = rPos - 1
ENDIF
ENDIF
ENDIF
// position of the value that enters the window
pPos = -1
IF hasN = 1 THEN
loB = 0
hiB = nS
WHILE loB < hiB DO
mdB = floor((loB + hiB) / 2)
IF $srt[mdB] < newV THEN
loB = mdB + 1
ELSE
hiB = mdB
ENDIF
WEND
pPos = loB
ENDIF
IF rPos >= 0 AND pPos >= 0 THEN
// replace: only the values between the two positions move
IF pPos > rPos THEN
IF pPos - 2 >= rPos THEN
FOR i = rPos TO pPos - 2 DO
$srt[i] = $srt[i + 1]
NEXT
ENDIF
$srt[pPos - 1] = newV
ELSE
IF rPos >= pPos + 1 THEN
FOR i = rPos DOWNTO pPos + 1 DO
$srt[i] = $srt[i - 1]
NEXT
ENDIF
$srt[pPos] = newV
ENDIF
ELSIF rPos >= 0 THEN
// remove only
IF nS - 2 >= rPos THEN
FOR i = rPos TO nS - 2 DO
$srt[i] = $srt[i + 1]
NEXT
ENDIF
$cnt[0] = nS - 1
ELSIF pPos >= 0 THEN
// insert only
IF nS - 1 >= pPos THEN
FOR i = nS DOWNTO pPos + 1 DO
$srt[i] = $srt[i - 1]
NEXT
ENDIF
$srt[pPos] = newV
$cnt[0] = nS + 1
ENDIF
ENDIF
ENDIF
// ===================== DISTRIBUTION STATISTICS =====================
nS = $cnt[0]
pctOk = 0
IF validBars = 1 AND sddOk = 1 THEN
pctOk = 1
// lower bound of the live value (its position in the merged window)
loB = 0
hiB = nS
WHILE loB < hiB DO
mdB = floor((loB + hiB) / 2)
IF $srt[mdB] < sdd THEN
loB = mdB + 1
ELSE
hiB = mdB
ENDIF
WEND
liveLo = loB
// upper bound: closed values less than or equal to the live value
loB = liveLo
hiB = nS
WHILE loB < hiB DO
mdB = floor((loB + hiB) / 2)
IF $srt[mdB] <= sdd THEN
loB = mdB + 1
ELSE
hiB = mdB
ENDIF
WEND
cntLE = loB
// percent rank: previous lbP values less than or equal to the current one
IF sddOk[lbP] = 1 AND sdd[lbP] <= sdd THEN
cntLE = cntLE + 1
ENDIF
currentPercentileRank = cntLE / lbP * 100
// nearest-rank percentiles of the merged window (closed values + live one)
nW = nS + 1
FOR q = 0 TO 7 DO
IF q = 0 THEN
pQ = 1
ELSIF q = 1 THEN
pQ = 5
ELSIF q = 2 THEN
pQ = 10
ELSIF q = 3 THEN
pQ = 25
ELSIF q = 4 THEN
pQ = 50
ELSIF q = 5 THEN
pQ = 75
ELSIF q = 6 THEN
pQ = 90
ELSE
pQ = 95
ENDIF
kR = floor((pQ * nW + 99) / 100)
idxP = max(0, kR - 1)
IF idxP < liveLo THEN
$pct[q] = $srt[idxP]
ELSIF idxP = liveLo THEN
$pct[q] = sdd
ELSE
$pct[q] = $srt[idxP - 1]
ENDIF
NEXT
p1v = $pct[0]
p5v = $pct[1]
p10v = $pct[2]
p25v = $pct[3]
p50v = $pct[4]
p75v = $pct[5]
p90v = $pct[6]
p95v = $pct[7]
// deepest smoothed drawdown of the window
IF liveLo = 0 OR nS = 0 THEN
maxDrawdownInPeriod = sdd
ELSE
maxDrawdownInPeriod = $srt[0]
ENDIF
ENDIF
statOk = 0
IF validBars = 1 AND fullWin = 1 THEN
drawdownMean = average[lbP](sdd)
drawdownStdDev = std[lbP](sdd)
statOk = 1
ENDIF
// ===================== RISK ASSESSMENT =====================
// riskCode: 0 insufficient data, 1 low, 2 moderate, 3 high, 4 extreme
riskCode = 0
IF pctOk = 1 THEN
IF currentPercentileRank >= 100 - riskThresholdModerate THEN
riskCode = 1
ELSIF currentPercentileRank >= 100 - riskThresholdHigh THEN
riskCode = 2
ELSIF currentPercentileRank >= 100 - riskThresholdExtreme THEN
riskCode = 3
ELSE
riskCode = 4
ENDIF
ENDIF
IF riskCode = 1 THEN
rkR = bulR
rkG = bulG
rkB = bulB
ELSIF riskCode = 2 THEN
rkR = neuR
rkG = neuG
rkB = neuB
ELSIF riskCode >= 3 THEN
rkR = beaR
rkG = beaG
rkB = beaB
ELSE
rkR = priR
rkG = priG
rkB = priB
ENDIF
zOk = 0
IF statOk = 1 THEN
IF drawdownStdDev > 0 THEN
zScore = (sdd - drawdownMean) / drawdownStdDev
zOk = 1
ENDIF
ENDIF
significantDrawdown = 0
severeDrawdown = 0
IF zOk = 1 THEN
IF abs(zScore) > 2.5 THEN
significantDrawdown = 1
ENDIF
IF abs(zScore) > 3.0 THEN
severeDrawdown = 1
ENDIF
ENDIF
// ===================== RISK-ADJUSTED METRICS =====================
// log returns exist from the first valid bar, so their mean needs lbP more bars
IF validBars = 1 AND src[1] > 0 THEN
rets = log(src / src[1])
ELSE
rets = 0
ENDIF
IF rets < 0 THEN
downRets = rets
ELSE
downRets = 0
ENDIF
retOk = 0
IF barindex >= 2 * lbP - 1 THEN
annualizedReturns = average[lbP](rets) * 252 * 100
myVolatility = std[lbP](rets) * sqrt(252) * 100
retOk = 1
ENDIF
riskFreeRate = fixedRiskFreeRate
sharpeOk = 0
IF retOk = 1 THEN
IF myVolatility > 0 THEN
sharpeRatio = (annualizedReturns - riskFreeRate) / myVolatility
sharpeOk = 1
ENDIF
ENDIF
effOk = 0
IF sharpeOk = 1 AND pctOk = 1 THEN
riskEfficiencyScore = max(0, min(100, (sharpeRatio * 10 + currentPercentileRank) / 2))
effOk = 1
ENDIF
volatilityAdjustedDrawdown = sdd
IF enableVolatilityAdjustment = 1 AND validBars = 1 AND retOk = 1 THEN
IF myVolatility > 0 THEN
volatilityAdjustedDrawdown = sdd / (myVolatility / 20)
ENDIF
ENDIF
// ===================== ALERT SERIES =====================
// 1 on the bar where each alert condition of the original fires
alertExtreme = riskCode = 4 AND riskCode[1] <> 4
alertHigh = riskCode = 3 AND riskCode[1] <> 3 AND riskCode[1] <> 4
alertSignificant = significantDrawdown = 1 AND significantDrawdown[1] = 0
alertSevere = severeDrawdown = 1 AND severeDrawdown[1] = 0
alertNewMax = pctOk = 1 AND sdd <= maxDrawdownInPeriod AND sdd[1] > maxDrawdownInPeriod
alertSharpe = enableRiskAdjustedMetrics = 1 AND validBars = 1 AND sharpeOk = 1 AND sharpeOk[1] = 1 AND sharpeRatio < 0 AND sharpeRatio[1] >= 0
alertEfficiency = enableRiskAdjustedMetrics = 1 AND validBars = 1 AND effOk = 1 AND effOk[1] = 1 AND riskEfficiencyScore < 30 AND riskEfficiencyScore[1] >= 30
// ===================== BACKGROUND =====================
// The four highlight layers of the original, composited in their drawing order
bgA = 0
bgR = 0
bgG = 0
bgB = 0
FOR ly = 1 TO 4 DO
lyA = 0
IF ly = 1 AND riskCode = 4 THEN
lyA = aFill10
lyR = beaR
lyG = beaG
lyB = beaB
ELSIF ly = 2 AND riskCode = 3 THEN
lyA = aFill15
lyR = beaR
lyG = beaG
lyB = beaB
ELSIF ly = 3 AND significantDrawdown = 1 AND severeDrawdown = 0 THEN
lyA = aFill15
lyR = neuR
lyG = neuG
lyB = neuB
ELSIF ly = 4 AND severeDrawdown = 1 THEN
lyA = round(2.55 * (100 - min(100, backgroundAlpha + 5)))
lyR = beaR
lyG = beaG
lyB = beaB
ENDIF
IF lyA > 0 THEN
fa = lyA / 255
fb = bgA / 255
fo = fa + fb * (1 - fa)
bgR = (lyR * fa + bgR * fb * (1 - fa)) / fo
bgG = (lyG * fa + bgG * fb * (1 - fa)) / fo
bgB = (lyB * fa + bgB * fb * (1 - fa)) / fo
bgA = fo * 255
ENDIF
NEXT
IF bgA > 0 THEN
BACKGROUNDCOLOR(round(bgR), round(bgG), round(bgB), round(bgA))
ENDIF
// ===================== PLOTTED SERIES =====================
IF showZeroLine = 1 THEN
zeroLine = 0
ELSE
zeroLine = undefined
ENDIF
// both are missing only while the EMA warms up
IF barindex < smP - 1 THEN
mainDD = undefined
ELSE
mainDD = sdd
ENDIF
IF showVolAdjusted = 1 AND enableVolatilityAdjustment = 1 THEN
IF barindex < smP - 1 THEN
volAdjDD = undefined
ELSE
volAdjDD = volatilityAdjustedDrawdown
ENDIF
ELSE
volAdjDD = undefined
ENDIF
IF showCurrentPosition = 1 AND validBars = 1 THEN
curPos = sdd
ELSE
curPos = undefined
ENDIF
IF statOk = 1 THEN
meanDD = drawdownMean
ELSE
meanDD = undefined
ENDIF
IF showPercentileBands = 1 AND pctOk = 1 THEN
p95L = p95v
p90L = p90v
p75L = p75v
p50L = p50v
p25L = p25v
p10L = p10v
p5L = p5v
ELSE
p95L = undefined
p90L = undefined
p75L = undefined
p50L = undefined
p25L = undefined
p10L = undefined
p5L = undefined
ENDIF
IF enableVaR = 1 AND pctOk = 1 THEN
var95L = p5v
var99L = p1v
ELSE
var95L = undefined
var99L = undefined
ENDIF
IF showStdDevBands = 1 AND statOk = 1 THEN
std1U = drawdownMean + drawdownStdDev
std1D = drawdownMean - drawdownStdDev
std2U = drawdownMean + 2 * drawdownStdDev
std2D = drawdownMean - 2 * drawdownStdDev
std3U = drawdownMean + 3 * drawdownStdDev
std3D = drawdownMean - 3 * drawdownStdDev
ELSE
std1U = undefined
std1D = undefined
std2U = undefined
std2D = undefined
std3U = undefined
std3D = undefined
ENDIF
// ===================== FILLS =====================
IF showFills = 1 AND showPercentileBands = 1 THEN
COLORBETWEEN(p95L, p90L, beaR, beaG, beaB, aFill0)
COLORBETWEEN(p90L, p75L, beaR, beaG, beaB, aFill5)
COLORBETWEEN(p75L, p50L, neuR, neuG, neuB, aFill0)
COLORBETWEEN(p50L, p25L, priR, priG, priB, aFill0)
COLORBETWEEN(p25L, p10L, bulR, bulG, bulB, aFill0)
COLORBETWEEN(p10L, p5L, bulR, bulG, bulB, aFill10)
ENDIF
IF showFills = 1 AND showStdDevBands = 1 THEN
COLORBETWEEN(std2U, std1U, priR, priG, priB, aFill5)
COLORBETWEEN(std1D, std2D, priR, priG, priB, aFill5)
COLORBETWEEN(std3U, std2U, neuR, neuG, neuB, aFill5)
COLORBETWEEN(std2D, std3D, neuR, neuG, neuB, aFill5)
ENDIF
// ===================== STATISTICS TABLE =====================
IF islastbarupdate AND showTable = 1 AND validBars = 1 THEN
tPos = max(0, min(3, round(tablePosition)))
rowH = 18
chW = 6.2
nameW = 21 * chW + 14
valW = 9 * chW + 14
tW = nameW + valW
tH = 9 * rowH
IF tPos = 0 OR tPos = 2 THEN
tL = -85 - tW
ELSE
tL = 12
ENDIF
IF tPos = 0 THEN
tT = -12
ELSIF tPos = 1 THEN
tT = -40
ELSIF tPos = 2 THEN
tT = 12 + tH
ELSE
tT = 40 + tH
ENDIF
cxN = tL + nameW / 2
cxV = tL + nameW + valW / 2
// cell list: text code, value, position and colour
FOR cIdx = 0 TO 19 DO
cRowT = floor(cIdx / 2)
$tY[cIdx] = tT - rowH * (cRowT + 0.5)
IF cIdx MOD 2 = 0 THEN
$tX[cIdx] = cxN
$tCode[cIdx] = cRowT + 2
$tR[cIdx] = txtR
$tG[cIdx] = txtG
$tB[cIdx] = txtB
ELSE
$tX[cIdx] = cxV
$tR[cIdx] = rkR
$tG[cIdx] = rkG
$tB[cIdx] = rkB
ENDIF
$tVal[cIdx] = 0
NEXT
// header row
$tCode[0] = 1
$tCode[1] = 2
$tR[1] = txtR
$tG[1] = txtG
$tB[1] = txtB
// current drawdown
$tCode[3] = 21
$tVal[3] = round(sdd * 100) / 100
// risk level
IF riskCode >= 1 THEN
$tCode[5] = 26 + riskCode
ELSE
$tCode[5] = 25
ENDIF
// percentile rank
IF pctOk = 1 THEN
$tCode[7] = 21
$tVal[7] = round(currentPercentileRank * 10) / 10
ELSE
$tCode[7] = 24
ENDIF
// Sharpe ratio
IF sharpeOk = 1 THEN
$tCode[9] = 22
$tVal[9] = round(sharpeRatio * 100) / 100
IF sharpeRatio > 1.0 THEN
$tR[9] = bulR
$tG[9] = bulG
$tB[9] = bulB
ELSIF sharpeRatio > 0 THEN
$tR[9] = priR
$tG[9] = priG
$tB[9] = priB
ELSE
$tR[9] = beaR
$tG[9] = beaG
$tB[9] = beaB
ENDIF
ELSE
$tCode[9] = 25
$tR[9] = neuR
$tG[9] = neuG
$tB[9] = neuB
ENDIF
// risk efficiency score
IF effOk = 1 THEN
$tCode[11] = 23
$tVal[11] = round(riskEfficiencyScore * 10) / 10
IF riskEfficiencyScore > 70 THEN
$tR[11] = bulR
$tG[11] = bulG
$tB[11] = bulB
ELSIF riskEfficiencyScore > 40 THEN
$tR[11] = priR
$tG[11] = priG
$tB[11] = priB
ELSE
$tR[11] = beaR
$tG[11] = beaG
$tB[11] = beaB
ENDIF
ELSE
$tCode[11] = 26
$tR[11] = neuR
$tG[11] = neuG
$tB[11] = neuB
ENDIF
// max drawdown and 95% VaR
$tCode[13] = 21
$tVal[13] = round(maxDrawdownInPeriod * 100) / 100
$tCode[15] = 21
$tVal[15] = round(p5v * 100) / 100
FOR cIdx = 13 TO 15 DO
$tR[cIdx] = beaR
$tG[cIdx] = beaG
$tB[cIdx] = beaB
NEXT
$tR[14] = txtR
$tG[14] = txtG
$tB[14] = txtB
// annualized return
IF retOk = 1 THEN
$tCode[17] = 21
$tVal[17] = round(annualizedReturns * 100) / 100
ELSE
$tCode[17] = 24
ENDIF
IF retOk = 1 AND annualizedReturns > 0 THEN
$tR[17] = bulR
$tG[17] = bulG
$tB[17] = bulB
ELSE
$tR[17] = beaR
$tG[17] = beaG
$tB[17] = beaB
ENDIF
// row 9 does not exist: send its two cells out of the way
$tCode[18] = 0
$tCode[19] = 0
IF tPos = 0 THEN
DRAWRECTANGLE(tL, tT, tL + tW, tT - tH) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(neuR, neuG, neuB, 128) FILLCOLOR(tbgR, tbgG, tbgB, tbgA)
DRAWRECTANGLE(tL, tT, tL + tW, tT - rowH) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(neuR, neuG, neuB, 128) FILLCOLOR(hbgR, hbgG, hbgB, 204)
FOR cRow = 1 TO 8 DO
DRAWRECTANGLE(tL, tT - cRow * rowH, tL + nameW, tT - (cRow + 1) * rowH) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(neuR, neuG, neuB, 128) FILLCOLOR(0, 0, 0, 0)
DRAWRECTANGLE(tL + nameW, tT - cRow * rowH, tL + tW, tT - (cRow + 1) * rowH) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(neuR, neuG, neuB, 128) FILLCOLOR(0, 0, 0, 0)
NEXT
FOR cIdx = 0 TO 19 DO
cCode = $tCode[cIdx]
cellV = $tVal[cIdx]
cX = $tX[cIdx]
cY = $tY[cIdx]
cR = $tR[cIdx]
cG = $tG[cIdx]
cB = $tB[cIdx]
IF cCode = 1 THEN
DRAWTEXT("Risk Analysis", cX, cY, monospaced, bold, 10) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 2 THEN
DRAWTEXT("Value", cX, cY, monospaced, bold, 10) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 3 THEN
DRAWTEXT("Current Drawdown", cX, cY, monospaced, bold, 10) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 4 THEN
DRAWTEXT("Risk Level", cX, cY, monospaced, bold, 10) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 5 THEN
DRAWTEXT("Percentile Rank", cX, cY, monospaced, bold, 10) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 6 THEN
DRAWTEXT("Sharpe Ratio", cX, cY, monospaced, bold, 10) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 7 THEN
DRAWTEXT("Risk Efficiency Score", cX, cY, monospaced, bold, 10) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 8 THEN
DRAWTEXT("Max Drawdown", cX, cY, monospaced, bold, 10) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 9 THEN
DRAWTEXT("95% VaR", cX, cY, monospaced, bold, 10) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 10 THEN
DRAWTEXT("Annualized Return", cX, cY, monospaced, bold, 10) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 21 THEN
DRAWTEXT("#cellV#%", cX, cY, monospaced, bold, 10) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 22 THEN
DRAWTEXT("#cellV#", cX, cY, monospaced, bold, 10) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 23 THEN
DRAWTEXT("#cellV#/100", cX, cY, monospaced, bold, 10) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 24 THEN
DRAWTEXT("NaN%", cX, cY, monospaced, bold, 10) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 25 THEN
DRAWTEXT("NaN", cX, cY, monospaced, bold, 10) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 26 THEN
DRAWTEXT("NaN/100", cX, cY, monospaced, bold, 10) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 27 THEN
DRAWTEXT("Low", cX, cY, monospaced, bold, 10) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 28 THEN
DRAWTEXT("Moderate", cX, cY, monospaced, bold, 10) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 29 THEN
DRAWTEXT("High", cX, cY, monospaced, bold, 10) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 30 THEN
DRAWTEXT("Extreme", cX, cY, monospaced, bold, 10) ANCHOR(TOPRIGHT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ENDIF
NEXT
ELSIF tPos = 1 THEN
DRAWRECTANGLE(tL, tT, tL + tW, tT - tH) ANCHOR(TOPLEFT, XSHIFT, YSHIFT) COLOURED(neuR, neuG, neuB, 128) FILLCOLOR(tbgR, tbgG, tbgB, tbgA)
DRAWRECTANGLE(tL, tT, tL + tW, tT - rowH) ANCHOR(TOPLEFT, XSHIFT, YSHIFT) COLOURED(neuR, neuG, neuB, 128) FILLCOLOR(hbgR, hbgG, hbgB, 204)
FOR cRow = 1 TO 8 DO
DRAWRECTANGLE(tL, tT - cRow * rowH, tL + nameW, tT - (cRow + 1) * rowH) ANCHOR(TOPLEFT, XSHIFT, YSHIFT) COLOURED(neuR, neuG, neuB, 128) FILLCOLOR(0, 0, 0, 0)
DRAWRECTANGLE(tL + nameW, tT - cRow * rowH, tL + tW, tT - (cRow + 1) * rowH) ANCHOR(TOPLEFT, XSHIFT, YSHIFT) COLOURED(neuR, neuG, neuB, 128) FILLCOLOR(0, 0, 0, 0)
NEXT
FOR cIdx = 0 TO 19 DO
cCode = $tCode[cIdx]
cellV = $tVal[cIdx]
cX = $tX[cIdx]
cY = $tY[cIdx]
cR = $tR[cIdx]
cG = $tG[cIdx]
cB = $tB[cIdx]
IF cCode = 1 THEN
DRAWTEXT("Risk Analysis", cX, cY, monospaced, bold, 10) ANCHOR(TOPLEFT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 2 THEN
DRAWTEXT("Value", cX, cY, monospaced, bold, 10) ANCHOR(TOPLEFT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 3 THEN
DRAWTEXT("Current Drawdown", cX, cY, monospaced, bold, 10) ANCHOR(TOPLEFT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 4 THEN
DRAWTEXT("Risk Level", cX, cY, monospaced, bold, 10) ANCHOR(TOPLEFT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 5 THEN
DRAWTEXT("Percentile Rank", cX, cY, monospaced, bold, 10) ANCHOR(TOPLEFT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 6 THEN
DRAWTEXT("Sharpe Ratio", cX, cY, monospaced, bold, 10) ANCHOR(TOPLEFT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 7 THEN
DRAWTEXT("Risk Efficiency Score", cX, cY, monospaced, bold, 10) ANCHOR(TOPLEFT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 8 THEN
DRAWTEXT("Max Drawdown", cX, cY, monospaced, bold, 10) ANCHOR(TOPLEFT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 9 THEN
DRAWTEXT("95% VaR", cX, cY, monospaced, bold, 10) ANCHOR(TOPLEFT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 10 THEN
DRAWTEXT("Annualized Return", cX, cY, monospaced, bold, 10) ANCHOR(TOPLEFT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 21 THEN
DRAWTEXT("#cellV#%", cX, cY, monospaced, bold, 10) ANCHOR(TOPLEFT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 22 THEN
DRAWTEXT("#cellV#", cX, cY, monospaced, bold, 10) ANCHOR(TOPLEFT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 23 THEN
DRAWTEXT("#cellV#/100", cX, cY, monospaced, bold, 10) ANCHOR(TOPLEFT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 24 THEN
DRAWTEXT("NaN%", cX, cY, monospaced, bold, 10) ANCHOR(TOPLEFT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 25 THEN
DRAWTEXT("NaN", cX, cY, monospaced, bold, 10) ANCHOR(TOPLEFT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 26 THEN
DRAWTEXT("NaN/100", cX, cY, monospaced, bold, 10) ANCHOR(TOPLEFT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 27 THEN
DRAWTEXT("Low", cX, cY, monospaced, bold, 10) ANCHOR(TOPLEFT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 28 THEN
DRAWTEXT("Moderate", cX, cY, monospaced, bold, 10) ANCHOR(TOPLEFT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 29 THEN
DRAWTEXT("High", cX, cY, monospaced, bold, 10) ANCHOR(TOPLEFT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 30 THEN
DRAWTEXT("Extreme", cX, cY, monospaced, bold, 10) ANCHOR(TOPLEFT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ENDIF
NEXT
ELSIF tPos = 2 THEN
DRAWRECTANGLE(tL, tT, tL + tW, tT - tH) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(neuR, neuG, neuB, 128) FILLCOLOR(tbgR, tbgG, tbgB, tbgA)
DRAWRECTANGLE(tL, tT, tL + tW, tT - rowH) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(neuR, neuG, neuB, 128) FILLCOLOR(hbgR, hbgG, hbgB, 204)
FOR cRow = 1 TO 8 DO
DRAWRECTANGLE(tL, tT - cRow * rowH, tL + nameW, tT - (cRow + 1) * rowH) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(neuR, neuG, neuB, 128) FILLCOLOR(0, 0, 0, 0)
DRAWRECTANGLE(tL + nameW, tT - cRow * rowH, tL + tW, tT - (cRow + 1) * rowH) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(neuR, neuG, neuB, 128) FILLCOLOR(0, 0, 0, 0)
NEXT
FOR cIdx = 0 TO 19 DO
cCode = $tCode[cIdx]
cellV = $tVal[cIdx]
cX = $tX[cIdx]
cY = $tY[cIdx]
cR = $tR[cIdx]
cG = $tG[cIdx]
cB = $tB[cIdx]
IF cCode = 1 THEN
DRAWTEXT("Risk Analysis", cX, cY, monospaced, bold, 10) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 2 THEN
DRAWTEXT("Value", cX, cY, monospaced, bold, 10) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 3 THEN
DRAWTEXT("Current Drawdown", cX, cY, monospaced, bold, 10) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 4 THEN
DRAWTEXT("Risk Level", cX, cY, monospaced, bold, 10) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 5 THEN
DRAWTEXT("Percentile Rank", cX, cY, monospaced, bold, 10) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 6 THEN
DRAWTEXT("Sharpe Ratio", cX, cY, monospaced, bold, 10) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 7 THEN
DRAWTEXT("Risk Efficiency Score", cX, cY, monospaced, bold, 10) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 8 THEN
DRAWTEXT("Max Drawdown", cX, cY, monospaced, bold, 10) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 9 THEN
DRAWTEXT("95% VaR", cX, cY, monospaced, bold, 10) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 10 THEN
DRAWTEXT("Annualized Return", cX, cY, monospaced, bold, 10) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 21 THEN
DRAWTEXT("#cellV#%", cX, cY, monospaced, bold, 10) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 22 THEN
DRAWTEXT("#cellV#", cX, cY, monospaced, bold, 10) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 23 THEN
DRAWTEXT("#cellV#/100", cX, cY, monospaced, bold, 10) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 24 THEN
DRAWTEXT("NaN%", cX, cY, monospaced, bold, 10) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 25 THEN
DRAWTEXT("NaN", cX, cY, monospaced, bold, 10) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 26 THEN
DRAWTEXT("NaN/100", cX, cY, monospaced, bold, 10) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 27 THEN
DRAWTEXT("Low", cX, cY, monospaced, bold, 10) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 28 THEN
DRAWTEXT("Moderate", cX, cY, monospaced, bold, 10) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 29 THEN
DRAWTEXT("High", cX, cY, monospaced, bold, 10) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 30 THEN
DRAWTEXT("Extreme", cX, cY, monospaced, bold, 10) ANCHOR(BOTTOMRIGHT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ENDIF
NEXT
ELSIF tPos = 3 THEN
DRAWRECTANGLE(tL, tT, tL + tW, tT - tH) ANCHOR(BOTTOMLEFT, XSHIFT, YSHIFT) COLOURED(neuR, neuG, neuB, 128) FILLCOLOR(tbgR, tbgG, tbgB, tbgA)
DRAWRECTANGLE(tL, tT, tL + tW, tT - rowH) ANCHOR(BOTTOMLEFT, XSHIFT, YSHIFT) COLOURED(neuR, neuG, neuB, 128) FILLCOLOR(hbgR, hbgG, hbgB, 204)
FOR cRow = 1 TO 8 DO
DRAWRECTANGLE(tL, tT - cRow * rowH, tL + nameW, tT - (cRow + 1) * rowH) ANCHOR(BOTTOMLEFT, XSHIFT, YSHIFT) COLOURED(neuR, neuG, neuB, 128) FILLCOLOR(0, 0, 0, 0)
DRAWRECTANGLE(tL + nameW, tT - cRow * rowH, tL + tW, tT - (cRow + 1) * rowH) ANCHOR(BOTTOMLEFT, XSHIFT, YSHIFT) COLOURED(neuR, neuG, neuB, 128) FILLCOLOR(0, 0, 0, 0)
NEXT
FOR cIdx = 0 TO 19 DO
cCode = $tCode[cIdx]
cellV = $tVal[cIdx]
cX = $tX[cIdx]
cY = $tY[cIdx]
cR = $tR[cIdx]
cG = $tG[cIdx]
cB = $tB[cIdx]
IF cCode = 1 THEN
DRAWTEXT("Risk Analysis", cX, cY, monospaced, bold, 10) ANCHOR(BOTTOMLEFT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 2 THEN
DRAWTEXT("Value", cX, cY, monospaced, bold, 10) ANCHOR(BOTTOMLEFT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 3 THEN
DRAWTEXT("Current Drawdown", cX, cY, monospaced, bold, 10) ANCHOR(BOTTOMLEFT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 4 THEN
DRAWTEXT("Risk Level", cX, cY, monospaced, bold, 10) ANCHOR(BOTTOMLEFT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 5 THEN
DRAWTEXT("Percentile Rank", cX, cY, monospaced, bold, 10) ANCHOR(BOTTOMLEFT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 6 THEN
DRAWTEXT("Sharpe Ratio", cX, cY, monospaced, bold, 10) ANCHOR(BOTTOMLEFT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 7 THEN
DRAWTEXT("Risk Efficiency Score", cX, cY, monospaced, bold, 10) ANCHOR(BOTTOMLEFT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 8 THEN
DRAWTEXT("Max Drawdown", cX, cY, monospaced, bold, 10) ANCHOR(BOTTOMLEFT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 9 THEN
DRAWTEXT("95% VaR", cX, cY, monospaced, bold, 10) ANCHOR(BOTTOMLEFT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 10 THEN
DRAWTEXT("Annualized Return", cX, cY, monospaced, bold, 10) ANCHOR(BOTTOMLEFT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 21 THEN
DRAWTEXT("#cellV#%", cX, cY, monospaced, bold, 10) ANCHOR(BOTTOMLEFT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 22 THEN
DRAWTEXT("#cellV#", cX, cY, monospaced, bold, 10) ANCHOR(BOTTOMLEFT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 23 THEN
DRAWTEXT("#cellV#/100", cX, cY, monospaced, bold, 10) ANCHOR(BOTTOMLEFT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 24 THEN
DRAWTEXT("NaN%", cX, cY, monospaced, bold, 10) ANCHOR(BOTTOMLEFT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 25 THEN
DRAWTEXT("NaN", cX, cY, monospaced, bold, 10) ANCHOR(BOTTOMLEFT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 26 THEN
DRAWTEXT("NaN/100", cX, cY, monospaced, bold, 10) ANCHOR(BOTTOMLEFT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 27 THEN
DRAWTEXT("Low", cX, cY, monospaced, bold, 10) ANCHOR(BOTTOMLEFT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 28 THEN
DRAWTEXT("Moderate", cX, cY, monospaced, bold, 10) ANCHOR(BOTTOMLEFT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 29 THEN
DRAWTEXT("High", cX, cY, monospaced, bold, 10) ANCHOR(BOTTOMLEFT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ELSIF cCode = 30 THEN
DRAWTEXT("Extreme", cX, cY, monospaced, bold, 10) ANCHOR(BOTTOMLEFT, XSHIFT, YSHIFT) COLOURED(cR, cG, cB, 255)
ENDIF
NEXT
ENDIF
ENDIF
RETURN zeroLine COLOURED(120, 123, 134, 255) STYLE(line, 1) AS "Zero Line", mainDD COLOURED(rkR, rkG, rkB, 255) STYLE(line, 2) AS "Smoothed Drawdown (%)", volAdjDD COLOURED(priR, priG, priB, 179) STYLE(line, 1) AS "Vol-Adjusted Drawdown (%)", curPos COLOURED(rkR, rkG, rkB, 153) STYLE(line, 1) AS "Current Position Line", meanDD COLOURED(priR, priG, priB, 153) STYLE(line, 1) AS "Mean Drawdown", p95L COLOURED(beaR, beaG, beaB, aBand0) STYLE(line, 1) AS "95th Percentile", p90L COLOURED(beaR, beaG, beaB, aBand10) STYLE(line, 1) AS "90th Percentile", p75L COLOURED(neuR, neuG, neuB, aBand0) STYLE(line, 1) AS "75th Percentile", p50L COLOURED(priR, priG, priB, aBand0) STYLE(line, 1) AS "50th Percentile (Median)", p25L COLOURED(bulR, bulG, bulB, aBand0) STYLE(line, 1) AS "25th Percentile", p10L COLOURED(bulR, bulG, bulB, aBand10) STYLE(line, 1) AS "10th Percentile", p5L COLOURED(bulR, bulG, bulB, aBand20) STYLE(line, 1) AS "5th Percentile", var95L COLOURED(beaR, beaG, beaB, aVaR95) STYLE(line, 2) AS "95% VaR", var99L COLOURED(beaR, beaG, beaB, aVaR99) STYLE(line, 2) AS "99% VaR", std1U COLOURED(priR, priG, priB, aBand0) STYLE(line, 1) AS "1 Sigma Upper", std1D COLOURED(priR, priG, priB, aBand0) STYLE(line, 1) AS "1 Sigma Lower", std2U COLOURED(neuR, neuG, neuB, aBand0) STYLE(line, 1) AS "2 Sigma Upper", std2D COLOURED(neuR, neuG, neuB, aBand0) STYLE(line, 1) AS "2 Sigma Lower", std3U COLOURED(beaR, beaG, beaB, aBand0) STYLE(line, 1) AS "3 Sigma Upper", std3D COLOURED(beaR, beaG, beaB, aBand0) STYLE(line, 1) AS "3 Sigma Lower", alertExtreme COLOURED(0, 0, 0, 0) AS "Alert Extreme Risk", alertHigh COLOURED(0, 0, 0, 0) AS "Alert High Risk", alertSignificant COLOURED(0, 0, 0, 0) AS "Alert Significant Drawdown", alertSevere COLOURED(0, 0, 0, 0) AS "Alert Severe Drawdown", alertNewMax COLOURED(0, 0, 0, 0) AS "Alert New Max Drawdown", alertSharpe COLOURED(0, 0, 0, 0) AS "Alert Sharpe Negative", alertEfficiency COLOURED(0, 0, 0, 0) AS "Alert Poor Risk Efficiency"