Iván González

Drawdown Distribution Analysis

Category: Indicators By: Iván González Created: October 26, 2026, 12:25 PM
October 26, 2026, 12:25 PM
Indicators
0 Comments
Drawdown Distribution Analysis

Introduction

 

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.

Theory Behind the Indicator

 

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:

  • the mean and the 1, 2 and 3 standard deviation bands around it;
  • the 5th, 10th, 25th, 50th, 75th, 90th and 95th percentiles, with shaded areas between them;
  • the 95% VaR (the 5th percentile) and the 99% VaR (the 1st percentile): the drawdown level that was exceeded only 5% and 1% of the time.

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.

Key Features at a Glance

 

  • Smoothed drawdown from the all-time high, coloured by risk level.
  • Seven percentile bands and three standard deviation bands, with fills.
  • 95% and 99% Value at Risk lines.
  • Risk level from the percentile rank, with adjustable thresholds.
  • Z-score background for significant and severe drawdowns.
  • Statistics table: current drawdown, risk level, percentile rank, Sharpe ratio, risk efficiency, maximum drawdown, VaR and annualized return.
  • Eight colour themes, each with a light and a dark version.
  • Seven alert series.

How to Read the Indicator

 

  • Main line inside the central bands: the current drawdown is ordinary for this market.
  • Main line below the 10th or the 5th percentile: the drawdown is deeper than 90% or 95% of the recent history. The risk level turns High or Extreme.
  • Below the 99% VaR: an exceptional drawdown for this instrument over the analysis period.
  • Red background: the drawdown is more than 3 standard deviations away from its mean.
  • The table gives the numbers behind the picture, and the Sharpe ratio and annualized return tell whether the drawdowns are being paid for by the returns.

Practical Applications

 

  • Position sizing: reduce exposure when the drawdown sits in the worst percentiles, add when it is back in the central bands.
  • Comparing assets: the volatility-adjusted drawdown and the percentile rank put different markets on the same footing.
  • Expectations for a strategy or an instrument: the VaR lines give a realistic idea of the drawdowns to be ready for.
  • Risk monitoring: alerts on a change of risk level, a significant or severe drawdown, a new maximum drawdown, a negative Sharpe ratio or a low risk efficiency.

Indicator Configuration

 

  • lookbackPeriod (default 500, from 100 to 2000): bars of the distribution. Around 252 to 756 on a daily chart.
  • smoothingPeriod (default 14): exponential smoothing of the drawdown.
  • The price source is the indicator’s “Apply to” setting (close by default).
  • showPercentileBands, showStdDevBands, showFills (default 1): bands and fills on or off.
  • riskThresholdModerate, riskThresholdHigh, riskThresholdExtreme (default 50, 75, 90): percentages of history that separate the Low, Moderate, High and Extreme levels.
  • enableRiskAdjustedMetrics (default 1): the Sharpe and risk efficiency alerts.
  • fixedRiskFreeRate (default 4.0): annual risk-free rate in percent, for the Sharpe ratio.
  • enableVaR (default 1): VaR lines on or off.
  • enableVolatilityAdjustment (default 1) and showVolAdjusted (default 0): compute the volatility-adjusted drawdown, and draw it in the panel.
  • showTable (default 1), tablePosition (default 0: 0 top right, 1 top left, 2 bottom right, 3 bottom left).
  • showCurrentPosition (default 1): a thin second line over the main one once the analysis period is full.
  • showZeroLine (default 0): reference line at 0.
  • colorScheme (default 1): 0 Gold, 1 EdgeTools, 2 Behavioral, 3 Quant, 4 Ocean, 5 Fire, 6 Matrix, 7 Arctic.
  • useDarkMode (default 0): set it to 1 on a dark chart background.

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.

The Code

 

//---------------------------------------------------------------
// 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"

Download
Filename: PRC_Drawdown-Distribution.itf
Downloads: 7
Iván González
Iván González Legend
Operating in the shadows, I hack problems one by one. My bio is currently encrypted by a complex algorithm. Decryption underway...
Author’s Profile

Comments

ProRealCode ProRealCode
Loading...