Multi-Indicator Signal Engine

Category: Indicators By: Iván González Created: June 12, 2026, 8:31 AM
June 12, 2026, 8:31 AM
Indicators
0 Comments

Most traders combine several classic indicators to confirm their entries — a moving average crossover here, an RSI filter there, maybe a Supertrend for direction. The problem is that this process is usually informal: you look at three or four panels and “feel” the confluence.

Signal Forge, originally created by LuxAlgo, turns that informal process into a configurable signal engine. It bundles 11 classic indicators into a single LONG/SHORT signal, lets you choose between strict confluence or any-trigger logic, and — its most interesting feature — keeps a live performance record of every component, so you can see at a glance which indicators have actually been earning their place on your chart and which ones have been dead weight.

 

How It Works

The engine evaluates 11 independent components on every bar. Each one votes Bullish, Bearish or Neutral:

  • SMA Crossover: fast SMA above/below slow SMA
  • RSI Filter: RSI above the long level / below the short level (default 50/50)
  • MACD Crossover: MACD line above/below its signal line
  • Supertrend: price above/below the Supertrend line
  • Stochastic: smoothed %K in the upper/lower half (above/below 50)
  • Bollinger Trend: price above/below the middle band
  • EMA Crossover: fast EMA above/below slow EMA
  • Awesome Oscillator: AO above/below zero
  • Parabolic SAR: price above/below the SAR dots
  • CCI Filter: CCI above the long level / below the short level (default 0/0)
  • ADX Filter: ADX above threshold with DI+ dominant (bullish) or DI- dominant (bearish)

You enable only the components you want. The combined signal then follows one of two fusion modes:

  • Require All (confluence mode, default): every enabled indicator must agree before a LONG or SHORT signal fires. Fewer signals, higher conviction.
  • Any mode: a single enabled indicator is enough to trigger. More signals, useful for fast scalping setups or for auditing one component at a time.

A new position opens on the edge of the combined condition (the bar where it turns true), and an internal trade simulator manages it with optional ATR-based risk tools:

  • Stop Loss: entry ± ATR × multiplier (default 1.5)
  • Take Profit: entry ± ATR × multiplier (default 2.0)
  • Trailing Stop: ratcheting stop that only tightens, never loosens (default 1.0 × ATR)

If none of the risk exits is hit, the trade closes when the opposite combined signal appears — and can reverse on the same bar.

 

Standalone Performance Tracking

This is the part that makes Signal Forge more than a signal mashup. In parallel with the combined engine, the indicator runs 11 independent virtual trade books, one per component, each entering on its own signal edges and exiting with the same ATR risk rules. The dashboard then shows the standalone win rate and trade count of every indicator on the instrument and timeframe you are actually trading.

This answers a question most traders never test: “is this filter helping me here, or am I just used to seeing it?” If CCI shows a 38% win rate over 120 virtual trades on your chart while Supertrend shows 54% over 80, you know exactly which toggle deserves to be ON.

 

Visual Elements

  • Entry orbs: a three-layer glow circle below longs / above shorts, with a vertical ray to the bar and a label showing the engine’s cumulative win rate at the moment of entry.
  • Exit crosses: a small x above/below the bar when a position closes (hidden when the exit is an immediate reversal).
  • Active trade levels: the current Stop Loss (red), Take Profit (green) and Trailing Stop (blue, thicker) are drawn as live lines while a position is open, with a shaded zone between price and the trailing level.
  • Indicator Dashboard (top right): one row per component — current status (Bullish/Bearish/Neutral), standalone win rate with trade count, and whether it is enabled. The last row shows the current combined signal: LONG, SHORT or NEUTRAL.
  • Performance Dashboard (bottom right): total trades, wins, losses, win rate, profit factor and cumulative PnL% of the combined engine.

How to Read the Indicator

  1. Pick your components and fusion mode. Start simple: SMA crossover alone, or SMA + Supertrend + ADX in Require All mode for a trend-following stack.
  2. Watch the Indicator Dashboard for a while. Components with consistently poor standalone win rates on your instrument are candidates to disable.
  3. A green orb below the price = new LONG from the engine; a red orb above the price = new SHORT. The label shows the win rate of the engine up to that point.
  4. Manage expectations with the Performance Dashboard: it is a raw, frictionless simulation (no spread, no slippage), so treat its numbers as relative quality measures — great for comparing configurations, not as a promise of returns.

Practical Applications

  • Filter audit: enable everything in Any mode, let it run over your full history, and use the standalone win rates to kill the components that do not work on your market.
  • Confluence systems: build a 3-4 component stack in Require All mode and check whether the combined win rate and profit factor beat each component alone.
  • Parameter sensitivity: change one length (say SMA 10/20 → 20/50) and compare dashboards — an instant, visual A/B test.
  • Prototyping for ProOrder: once a configuration looks robust, port the same conditions to a ProBacktest strategy for a realistic test with spread and position sizing.

Indicator Configuration

  • Require All (default: 1): 1 = all enabled indicators must align, 0 = any enabled indicator triggers
  • ATR Length (default: 14)
  • Stop Loss on/off (default: 0) and multiplier (default: 1.5)
  • Take Profit on/off (default: 0) and multiplier (default: 2.0)
  • Trailing Stop on/off (default: 0) and multiplier (default: 1.0)
  • Show orbs (default: 1) — entry glow + win-rate labels
  • Orb distance in ATR (default: 1.5)
  • Show dashboards (default: 1)
  • One enable toggle + standard settings per component (SMA 10/20, RSI 14 with 50/50 levels, MACD 12/26/9, Supertrend 3.0/10, Stochastic 14/3, Bollinger 20, EMA 10/20, SAR 0.02/0.02/0.2, CCI 20 with 0/0 levels, ADX 14/14 with threshold 20). Only the SMA crossover is enabled by default.

The dashboards are anchored to the top-right (indicator table) and bottom-right (performance table) corners. To move them, edit the anchor(...) keyword in the code (topleft, topright, bottomleft, bottomright).

 

Code

//----------------------------------------------------------//
//PRC_Signal Forge (by LuxAlgo)
//version = 0
//11.06.26
//Iván González @ www.prorealcode.com
//Sharing ProRealTime knowledge
//----------------------------------------------------------//
//-----Signal logic------------------------------------------//
requireAll = 1    // 1 = ALL enabled indicators must align / 0 = ANY enabled indicator triggers
//-----Risk management (ATR)---------------------------------//
atrLen = 14       // ATR length
enableSl = 0      // stop loss on/off
slMult = 1.5      // SL multiplier
enableTp = 0      // take profit on/off
tpMult = 2.0      // TP multiplier
enableTs = 0      // trailing stop on/off
tsMult = 1.0      // TS multiplier
//-----Visuals-----------------------------------------------//
showOrbs = 1      // entry orbs + WR labels on/off
orbDist = 1.5     // orb distance (ATR units)
showDash = 1      // dashboards on/off
//-----Indicator toggles & settings--------------------------//
enableSma = 1     // SMA crossover
smaFastLen = 10
smaSlowLen = 20
enableRsi = 0     // RSI filter
rsiLen = 14
rsiLongLevel = 50
rsiShortLevel = 50
enableMacd = 0    // MACD crossover
macdFastLen = 12
macdSlowLen = 26
macdSigLen = 9
enableSt = 0      // Supertrend
stFactor = 3.0
stLen = 10
enableStoch = 0   // Stochastic (%K vs 50)
stochLen = 14
stochSmooth = 3
enableBb = 0      // Bollinger trend (close vs middle band)
bbLen = 20
enableEma = 0     // EMA crossover
emaFastLen = 10
emaSlowLen = 20
enableAo = 0      // Awesome Oscillator
enableSar = 0     // Parabolic SAR
sarStart = 0.02
sarInc = 0.02
sarMax = 0.2
enableCci = 0     // CCI filter
cciLen = 20
cciLongLevel = 0
cciShortLevel = 0
enableAdx = 0     // ADX filter
adxLen = 14       // ADX smoothing
diLen = 14        // DI length
adxThreshold = 20
//-----Colors------------------------------------------------//
bullR = 8
bullG = 153
bullB = 129
bearR = 242
bearG = 54
bearB = 69
tsR = 41
tsG = 98
tsB = 255
neuR = 128
neuG = 128
neuB = 128
txtR = 219
txtG = 219
txtB = 219
//----------------------------------------------------------//
//-----Indicator calculations--------------------------------//
atrV = averagetruerange[atrLen]


// 1. SMA crossover
smaFast = average[smaFastLen](close)
smaSlow = average[smaSlowLen](close)
smaBull = smaFast > smaSlow
smaBear = smaFast < smaSlow


// 2. RSI filter
rsiV = rsi[rsiLen](close)
rsiBull = rsiV > rsiLongLevel
rsiBear = rsiV < rsiShortLevel


// 3. MACD crossover
macdL = macdline[macdFastLen,macdSlowLen,macdSigLen](close)
macdS = macdsignal[macdFastLen,macdSlowLen,macdSigLen](close)
macdBull = macdL > macdS
macdBear = macdL < macdS


// 4. Supertrend
stV = supertrend[stFactor,stLen]
stBull = close > stV
stBear = close < stV


// 5. Stochastic (smoothed %K, upper/lower half)
stochK = stochastic[stochLen,stochSmooth](close)
stochBull = stochK > 50
stochBear = stochK < 50


// 6. Bollinger trend (close vs middle band)
bbMid = average[bbLen](close)
bbBull = close > bbMid
bbBear = close < bbMid


// 7. EMA crossover
emaFast = average[emaFastLen,1](close)
emaSlow = average[emaSlowLen,1](close)
emaBull = emaFast > emaSlow
emaBear = emaFast < emaSlow


// 8. Awesome Oscillator
medPrice = (high + low) / 2
aoV = average[5](medPrice) - average[34](medPrice)
aoBull = aoV > 0
aoBear = aoV < 0


// 9. Parabolic SAR
sarV = sar[sarStart,sarInc,sarMax]
sarBull = close > sarV
sarBear = close < sarV


// 10. CCI filter
cciV = cci[cciLen](close)
cciBull = cciV > cciLongLevel
cciBear = cciV < cciShortLevel


// 11. ADX filter
adxV = adx[adxLen]
diP = diplus[diLen](close)
diM = diminus[diLen](close)
adxBull = adxV > adxThreshold and diP > diM
adxBear = adxV > adxThreshold and diM > diP
//----------------------------------------------------------//
//-----Standalone performance tracking-----------------------//
// one virtual trade book per indicator (always computed,
// independent of toggles) -> feeds dashboard WR column
$bullA[0] = smaBull
$bullA[1] = rsiBull
$bullA[2] = macdBull
$bullA[3] = stBull
$bullA[4] = stochBull
$bullA[5] = bbBull
$bullA[6] = emaBull
$bullA[7] = aoBull
$bullA[8] = sarBull
$bullA[9] = cciBull
$bullA[10] = adxBull
$bearA[0] = smaBear
$bearA[1] = rsiBear
$bearA[2] = macdBear
$bearA[3] = stBear
$bearA[4] = stochBear
$bearA[5] = bbBear
$bearA[6] = emaBear
$bearA[7] = aoBear
$bearA[8] = sarBear
$bearA[9] = cciBear
$bearA[10] = adxBear


if not isset($indState[0]) then
   for j = 0 to 10 do
      $indState[j] = 0
      $indEntry[j] = 0
      $indSl[j] = 0
      $indTp[j] = 0
      $indTs[j] = 0
      $indTotal[j] = 0
      $indWin[j] = 0
      $prevBull[j] = 0
      $prevBear[j] = 0
   next
endif


for i = 0 to 10 do
   bullI = $bullA[i]
   bearI = $bearA[i]
   stateI = $indState[i]
   exitL = 0
   exitS = 0
   pxOut = 0
   
   // exits (SL -> TP -> TS -> opposite signal)
   if stateI = 1 then
      if enableSl = 1 and low <= $indSl[i] then
         exitL = 1
         pxOut = $indSl[i]
      elsif enableTp = 1 and high >= $indTp[i] then
         exitL = 1
         pxOut = $indTp[i]
      elsif enableTs = 1 and low <= $indTs[i] then
         exitL = 1
         pxOut = $indTs[i]
      elsif bearI = 1 then
         exitL = 1
         pxOut = close
      endif
   endif
   if stateI = -1 then
      if enableSl = 1 and high >= $indSl[i] then
         exitS = 1
         pxOut = $indSl[i]
      elsif enableTp = 1 and low <= $indTp[i] then
         exitS = 1
         pxOut = $indTp[i]
      elsif enableTs = 1 and high >= $indTs[i] then
         exitS = 1
         pxOut = $indTs[i]
      elsif bullI = 1 then
         exitS = 1
         pxOut = close
      endif
   endif
   
   // book closed trades
   if exitL = 1 then
      retI = (pxOut - $indEntry[i]) / $indEntry[i] * 100
      $indTotal[i] = $indTotal[i] + 1
      if retI > 0 then
         $indWin[i] = $indWin[i] + 1
      endif
      $indState[i] = 0
      $indSl[i] = 0
      $indTp[i] = 0
      $indTs[i] = 0
      stateI = 0
   endif
   if exitS = 1 then
      retI = ($indEntry[i] - pxOut) / $indEntry[i] * 100
      $indTotal[i] = $indTotal[i] + 1
      if retI > 0 then
         $indWin[i] = $indWin[i] + 1
      endif
      $indState[i] = 0
      $indSl[i] = 0
      $indTp[i] = 0
      $indTs[i] = 0
      stateI = 0
   endif
   
   // entries on signal edge (state change vs previous bar)
   entL = 0
   if bullI = 1 and $prevBull[i] = 0 and stateI <> 1 then
      entL = 1
   endif
   entS = 0
   if bearI = 1 and $prevBear[i] = 0 and stateI <> -1 then
      entS = 1
   endif
   if entL = 1 then
      $indState[i] = 1
      $indEntry[i] = close
      if enableSl = 1 then
         $indSl[i] = close - atrV * slMult
      endif
      if enableTp = 1 then
         $indTp[i] = close + atrV * tpMult
      endif
      if enableTs = 1 then
         $indTs[i] = close - atrV * tsMult
      endif
   endif
   if entS = 1 then
      $indState[i] = -1
      $indEntry[i] = close
      if enableSl = 1 then
         $indSl[i] = close + atrV * slMult
      endif
      if enableTp = 1 then
         $indTp[i] = close - atrV * tpMult
      endif
      if enableTs = 1 then
         $indTs[i] = close + atrV * tsMult
      endif
   endif
   
   // trailing stop ratchet
   if stateI = 1 and entL = 0 and enableTs = 1 then
      $indTs[i] = max($indTs[i], close - atrV * tsMult)
   endif
   if stateI = -1 and entS = 0 and enableTs = 1 then
      $indTs[i] = min($indTs[i], close + atrV * tsMult)
   endif
   
   $prevBull[i] = bullI
   $prevBear[i] = bearI
next
//----------------------------------------------------------//
//-----Combined signal logic---------------------------------//
enabledN = enableSma + enableRsi + enableMacd + enableSt + enableStoch + enableBb + enableEma + enableAo + enableSar + enableCci + enableAdx
bullN = enableSma * smaBull + enableRsi * rsiBull + enableMacd * macdBull + enableSt * stBull + enableStoch * stochBull + enableBb * bbBull + enableEma * emaBull + enableAo * aoBull + enableSar * sarBull + enableCci * cciBull + enableAdx * adxBull
bearN = enableSma * smaBear + enableRsi * rsiBear + enableMacd * macdBear + enableSt * stBear + enableStoch * stochBear + enableBb * bbBear + enableEma * emaBear + enableAo * aoBear + enableSar * sarBear + enableCci * cciBear + enableAdx * adxBear


longCond = 0
shortCond = 0
if enabledN > 0 then
   if requireAll = 1 then
      if bullN = enabledN then
         longCond = 1
      endif
      if bearN = enabledN then
         shortCond = 1
      endif
   else
      if bullN > 0 then
         longCond = 1
      endif
      if bearN > 0 then
         shortCond = 1
      endif
   endif
endif
//----------------------------------------------------------//
//-----Internal backtester (combined signal)-----------------//
once tradeState = 0
once entryPx = 0
once slLvl = 0
once tpLvl = 0
once tsLvl = 0
once totalTrades = 0
once winTrades = 0
once netPnl = 0
once gProfit = 0
once gLoss = 0


outLong = 0
outShort = 0
outLongPx = 0
outShortPx = 0


// 1. evaluate exits (SL -> TP -> TS -> opposite signal)
if tradeState = 1 then
   if enableSl = 1 and low <= slLvl then
      outLong = 1
      outLongPx = slLvl
   elsif enableTp = 1 and high >= tpLvl then
      outLong = 1
      outLongPx = tpLvl
   elsif enableTs = 1 and low <= tsLvl then
      outLong = 1
      outLongPx = tsLvl
   elsif shortCond = 1 then
      outLong = 1
      outLongPx = close
   endif
endif
if tradeState = -1 then
   if enableSl = 1 and high >= slLvl then
      outShort = 1
      outShortPx = slLvl
   elsif enableTp = 1 and low <= tpLvl then
      outShort = 1
      outShortPx = tpLvl
   elsif enableTs = 1 and high >= tsLvl then
      outShort = 1
      outShortPx = tsLvl
   elsif longCond = 1 then
      outShort = 1
      outShortPx = close
   endif
endif


// 2. process exits & update metrics
if outLong = 1 then
   tradeRet = (outLongPx - entryPx) / entryPx * 100
   netPnl = netPnl + tradeRet
   totalTrades = totalTrades + 1
   if tradeRet > 0 then
      winTrades = winTrades + 1
      gProfit = gProfit + tradeRet
   else
      gLoss = gLoss + abs(tradeRet)
   endif
   tradeState = 0
   slLvl = 0
   tpLvl = 0
   tsLvl = 0
endif
if outShort = 1 then
   tradeRet = (entryPx - outShortPx) / entryPx * 100
   netPnl = netPnl + tradeRet
   totalTrades = totalTrades + 1
   if tradeRet > 0 then
      winTrades = winTrades + 1
      gProfit = gProfit + tradeRet
   else
      gLoss = gLoss + abs(tradeRet)
   endif
   tradeState = 0
   slLvl = 0
   tpLvl = 0
   tsLvl = 0
endif


// 3. new entries on signal edge
goLong = 0
if longCond = 1 and longCond[1] <> 1 and tradeState <> 1 then
   goLong = 1
endif
goShort = 0
if shortCond = 1 and shortCond[1] <> 1 and tradeState <> -1 then
   goShort = 1
endif
if goLong = 1 then
   tradeState = 1
   entryPx = close
   if enableSl = 1 then
      slLvl = close - atrV * slMult
   endif
   if enableTp = 1 then
      tpLvl = close + atrV * tpMult
   endif
   if enableTs = 1 then
      tsLvl = close - atrV * tsMult
   endif
endif
if goShort = 1 then
   tradeState = -1
   entryPx = close
   if enableSl = 1 then
      slLvl = close + atrV * slMult
   endif
   if enableTp = 1 then
      tpLvl = close - atrV * tpMult
   endif
   if enableTs = 1 then
      tsLvl = close + atrV * tsMult
   endif
endif


// 4. trailing stop ratchet for ongoing trades
if tradeState = 1 and goLong = 0 and enableTs = 1 then
   tsLvl = max(tsLvl, close - atrV * tsMult)
endif
if tradeState = -1 and goShort = 0 and enableTs = 1 then
   tsLvl = min(tsLvl, close + atrV * tsMult)
endif
//----------------------------------------------------------//
//-----Entry visuals (glow orbs + WR label, event class)-----//
if totalTrades > 0 then
   wrNow = round(winTrades / totalTrades * 100, 1)
else
   wrNow = 0
endif


if goLong = 1 then
   glowY = low - atrV * orbDist
   if showOrbs = 1 then
      drawsegment(barindex, low, barindex, glowY) coloured(bullR, bullG, bullB, 60) style(line, 2)
      drawpoint(barindex, glowY, 5) coloured(bullR, bullG, bullB, 50)
      drawpoint(barindex, glowY, 3) coloured(bullR, bullG, bullB, 130)
      drawpoint(barindex, glowY, 2) coloured(bullR, bullG, bullB, 255)
      drawtext("#wrNow#%", barindex, glowY - atrV * 0.6) coloured(bullR, bullG, bullB)
   endif
endif
if goShort = 1 then
   glowY = high + atrV * orbDist
   if showOrbs = 1 then
      drawsegment(barindex, high, barindex, glowY) coloured(bearR, bearG, bearB, 60) style(line, 2)
      drawpoint(barindex, glowY, 5) coloured(bearR, bearG, bearB, 50)
      drawpoint(barindex, glowY, 3) coloured(bearR, bearG, bearB, 130)
      drawpoint(barindex, glowY, 2) coloured(bearR, bearG, bearB, 255)
      drawtext("#wrNow#%", barindex, glowY + atrV * 0.6) coloured(bearR, bearG, bearB)
   endif
endif


// exit marks (skipped if immediately reversed)
if outLong = 1 and goShort = 0 then
   drawtext("x", barindex, high + atrV * 0.5) coloured(bearR, bearG, bearB)
endif
if outShort = 1 and goLong = 0 then
   drawtext("x", barindex, low - atrV * 0.5) coloured(bullR, bullG, bullB)
endif
//----------------------------------------------------------//
//-----Active trade levels (plots)---------------------------//
slPlot = undefined
tpPlot = undefined
tsPlot = undefined
closePlot = undefined
inEntryBar = 0
if goLong = 1 or goShort = 1 then
   inEntryBar = 1
endif
if tradeState <> 0 and inEntryBar = 0 then
   if enableSl = 1 then
      slPlot = slLvl
   endif
   if enableTp = 1 then
      tpPlot = tpLvl
   endif
   if enableTs = 1 then
      tsPlot = tsLvl
      closePlot = close
   endif
endif
// trailing stop shading (price vs trailing level)
colorbetween(tsPlot, closePlot, tsR, tsG, tsB)
//----------------------------------------------------------//
//-----Dashboards (last bar only)----------------------------//
if islastbarupdate and showDash = 1 then
   
   // ===== Indicator dashboard (top right corner) =====
   drawrectangle(-465, -15, -85, -370) anchor(topright, xshift, yshift) fillcolor("black", 60)
   drawtext("SIGNAL FORGE", -240, -28) anchor(topright, xshift, yshift) coloured(txtR, txtG, txtB)
   drawtext("Indicator", -420, -52) anchor(topright, xshift, yshift) coloured(neuR, neuG, neuB)
   drawtext("Status", -300, -52) anchor(topright, xshift, yshift) coloured(neuR, neuG, neuB)
   drawtext("WR (trades)", -180, -52) anchor(topright, xshift, yshift) coloured(neuR, neuG, neuB)
   drawtext("On", -45, -52) anchor(topright, xshift, yshift) coloured(neuR, neuG, neuB)
   
   // --- row 1: SMA Cross (y=-77)
   tt = $indTotal[0]
   if tt > 0 then
      wrI = round($indWin[0] / tt * 100, 1)
   else
      wrI = 0
   endif
   drawtext("SMA Cross", -420, -77) anchor(topright, xshift, yshift) coloured(txtR, txtG, txtB)
   if smaBull = 1 then
      drawtext("Bullish", -300, -77) anchor(topright, xshift, yshift) coloured(bullR, bullG, bullB)
   elsif smaBear = 1 then
      drawtext("Bearish", -300, -77) anchor(topright, xshift, yshift) coloured(bearR, bearG, bearB)
   else
      drawtext("Neutral", -300, -77) anchor(topright, xshift, yshift) coloured(neuR, neuG, neuB)
   endif
   if tt = 0 then
      drawtext("n/a", -180, -77) anchor(topright, xshift, yshift) coloured(neuR, neuG, neuB)
   elsif wrI >= 50 then
      drawtext("#wrI#% (#tt#)", -180, -77) anchor(topright, xshift, yshift) coloured(bullR, bullG, bullB)
   else
      drawtext("#wrI#% (#tt#)", -180, -77) anchor(topright, xshift, yshift) coloured(bearR, bearG, bearB)
   endif
   if enableSma = 1 then
      drawtext("ON", -45, -77) anchor(topright, xshift, yshift) coloured(bullR, bullG, bullB)
   else
      drawtext("OFF", -45, -77) anchor(topright, xshift, yshift) coloured(neuR, neuG, neuB)
   endif
   
   // --- row 2: RSI (y=-102)
   tt = $indTotal[1]
   if tt > 0 then
      wrI = round($indWin[1] / tt * 100, 1)
   else
      wrI = 0
   endif
   drawtext("RSI", -420, -102) anchor(topright, xshift, yshift) coloured(txtR, txtG, txtB)
   if rsiBull = 1 then
      drawtext("Bullish", -300, -102) anchor(topright, xshift, yshift) coloured(bullR, bullG, bullB)
   elsif rsiBear = 1 then
      drawtext("Bearish", -300, -102) anchor(topright, xshift, yshift) coloured(bearR, bearG, bearB)
   else
      drawtext("Neutral", -300, -102) anchor(topright, xshift, yshift) coloured(neuR, neuG, neuB)
   endif
   if tt = 0 then
      drawtext("n/a", -180, -102) anchor(topright, xshift, yshift) coloured(neuR, neuG, neuB)
   elsif wrI >= 50 then
      drawtext("#wrI#% (#tt#)", -180, -102) anchor(topright, xshift, yshift) coloured(bullR, bullG, bullB)
   else
      drawtext("#wrI#% (#tt#)", -180, -102) anchor(topright, xshift, yshift) coloured(bearR, bearG, bearB)
   endif
   if enableRsi = 1 then
      drawtext("ON", -45, -102) anchor(topright, xshift, yshift) coloured(bullR, bullG, bullB)
   else
      drawtext("OFF", -45, -102) anchor(topright, xshift, yshift) coloured(neuR, neuG, neuB)
   endif
   
   // --- row 3: MACD (y=-127)
   tt = $indTotal[2]
   if tt > 0 then
      wrI = round($indWin[2] / tt * 100, 1)
   else
      wrI = 0
   endif
   drawtext("MACD", -420, -127) anchor(topright, xshift, yshift) coloured(txtR, txtG, txtB)
   if macdBull = 1 then
      drawtext("Bullish", -300, -127) anchor(topright, xshift, yshift) coloured(bullR, bullG, bullB)
   elsif macdBear = 1 then
      drawtext("Bearish", -300, -127) anchor(topright, xshift, yshift) coloured(bearR, bearG, bearB)
   else
      drawtext("Neutral", -300, -127) anchor(topright, xshift, yshift) coloured(neuR, neuG, neuB)
   endif
   if tt = 0 then
      drawtext("n/a", -180, -127) anchor(topright, xshift, yshift) coloured(neuR, neuG, neuB)
   elsif wrI >= 50 then
      drawtext("#wrI#% (#tt#)", -180, -127) anchor(topright, xshift, yshift) coloured(bullR, bullG, bullB)
   else
      drawtext("#wrI#% (#tt#)", -180, -127) anchor(topright, xshift, yshift) coloured(bearR, bearG, bearB)
   endif
   if enableMacd = 1 then
      drawtext("ON", -45, -127) anchor(topright, xshift, yshift) coloured(bullR, bullG, bullB)
   else
      drawtext("OFF", -45, -127) anchor(topright, xshift, yshift) coloured(neuR, neuG, neuB)
   endif
   
   // --- row 4: Supertrend (y=-152)
   tt = $indTotal[3]
   if tt > 0 then
      wrI = round($indWin[3] / tt * 100, 1)
   else
      wrI = 0
   endif
   drawtext("Supertrend", -420, -152) anchor(topright, xshift, yshift) coloured(txtR, txtG, txtB)
   if stBull = 1 then
      drawtext("Bullish", -300, -152) anchor(topright, xshift, yshift) coloured(bullR, bullG, bullB)
   elsif stBear = 1 then
      drawtext("Bearish", -300, -152) anchor(topright, xshift, yshift) coloured(bearR, bearG, bearB)
   else
      drawtext("Neutral", -300, -152) anchor(topright, xshift, yshift) coloured(neuR, neuG, neuB)
   endif
   if tt = 0 then
      drawtext("n/a", -180, -152) anchor(topright, xshift, yshift) coloured(neuR, neuG, neuB)
   elsif wrI >= 50 then
      drawtext("#wrI#% (#tt#)", -180, -152) anchor(topright, xshift, yshift) coloured(bullR, bullG, bullB)
   else
      drawtext("#wrI#% (#tt#)", -180, -152) anchor(topright, xshift, yshift) coloured(bearR, bearG, bearB)
   endif
   if enableSt = 1 then
      drawtext("ON", -45, -152) anchor(topright, xshift, yshift) coloured(bullR, bullG, bullB)
   else
      drawtext("OFF", -45, -152) anchor(topright, xshift, yshift) coloured(neuR, neuG, neuB)
   endif
   
   // --- row 5: Stochastic (y=-177)
   tt = $indTotal[4]
   if tt > 0 then
      wrI = round($indWin[4] / tt * 100, 1)
   else
      wrI = 0
   endif
   drawtext("Stochastic", -420, -177) anchor(topright, xshift, yshift) coloured(txtR, txtG, txtB)
   if stochBull = 1 then
      drawtext("Bullish", -300, -177) anchor(topright, xshift, yshift) coloured(bullR, bullG, bullB)
   elsif stochBear = 1 then
      drawtext("Bearish", -300, -177) anchor(topright, xshift, yshift) coloured(bearR, bearG, bearB)
   else
      drawtext("Neutral", -300, -177) anchor(topright, xshift, yshift) coloured(neuR, neuG, neuB)
   endif
   if tt = 0 then
      drawtext("n/a", -180, -177) anchor(topright, xshift, yshift) coloured(neuR, neuG, neuB)
   elsif wrI >= 50 then
      drawtext("#wrI#% (#tt#)", -180, -177) anchor(topright, xshift, yshift) coloured(bullR, bullG, bullB)
   else
      drawtext("#wrI#% (#tt#)", -180, -177) anchor(topright, xshift, yshift) coloured(bearR, bearG, bearB)
   endif
   if enableStoch = 1 then
      drawtext("ON", -45, -177) anchor(topright, xshift, yshift) coloured(bullR, bullG, bullB)
   else
      drawtext("OFF", -45, -177) anchor(topright, xshift, yshift) coloured(neuR, neuG, neuB)
   endif
   
   // --- row 6: Bollinger (y=-202)
   tt = $indTotal[5]
   if tt > 0 then
      wrI = round($indWin[5] / tt * 100, 1)
   else
      wrI = 0
   endif
   drawtext("Bollinger", -420, -202) anchor(topright, xshift, yshift) coloured(txtR, txtG, txtB)
   if bbBull = 1 then
      drawtext("Bullish", -300, -202) anchor(topright, xshift, yshift) coloured(bullR, bullG, bullB)
   elsif bbBear = 1 then
      drawtext("Bearish", -300, -202) anchor(topright, xshift, yshift) coloured(bearR, bearG, bearB)
   else
      drawtext("Neutral", -300, -202) anchor(topright, xshift, yshift) coloured(neuR, neuG, neuB)
   endif
   if tt = 0 then
      drawtext("n/a", -180, -202) anchor(topright, xshift, yshift) coloured(neuR, neuG, neuB)
   elsif wrI >= 50 then
      drawtext("#wrI#% (#tt#)", -180, -202) anchor(topright, xshift, yshift) coloured(bullR, bullG, bullB)
   else
      drawtext("#wrI#% (#tt#)", -180, -202) anchor(topright, xshift, yshift) coloured(bearR, bearG, bearB)
   endif
   if enableBb = 1 then
      drawtext("ON", -45, -202) anchor(topright, xshift, yshift) coloured(bullR, bullG, bullB)
   else
      drawtext("OFF", -45, -202) anchor(topright, xshift, yshift) coloured(neuR, neuG, neuB)
   endif
   
   // --- row 7: EMA Cross (y=-227)
   tt = $indTotal[6]
   if tt > 0 then
      wrI = round($indWin[6] / tt * 100, 1)
   else
      wrI = 0
   endif
   drawtext("EMA Cross", -420, -227) anchor(topright, xshift, yshift) coloured(txtR, txtG, txtB)
   if emaBull = 1 then
      drawtext("Bullish", -300, -227) anchor(topright, xshift, yshift) coloured(bullR, bullG, bullB)
   elsif emaBear = 1 then
      drawtext("Bearish", -300, -227) anchor(topright, xshift, yshift) coloured(bearR, bearG, bearB)
   else
      drawtext("Neutral", -300, -227) anchor(topright, xshift, yshift) coloured(neuR, neuG, neuB)
   endif
   if tt = 0 then
      drawtext("n/a", -180, -227) anchor(topright, xshift, yshift) coloured(neuR, neuG, neuB)
   elsif wrI >= 50 then
      drawtext("#wrI#% (#tt#)", -180, -227) anchor(topright, xshift, yshift) coloured(bullR, bullG, bullB)
   else
      drawtext("#wrI#% (#tt#)", -180, -227) anchor(topright, xshift, yshift) coloured(bearR, bearG, bearB)
   endif
   if enableEma = 1 then
      drawtext("ON", -45, -227) anchor(topright, xshift, yshift) coloured(bullR, bullG, bullB)
   else
      drawtext("OFF", -45, -227) anchor(topright, xshift, yshift) coloured(neuR, neuG, neuB)
   endif
   
   // --- row 8: AO (y=-252)
   tt = $indTotal[7]
   if tt > 0 then
      wrI = round($indWin[7] / tt * 100, 1)
   else
      wrI = 0
   endif
   drawtext("AO", -420, -252) anchor(topright, xshift, yshift) coloured(txtR, txtG, txtB)
   if aoBull = 1 then
      drawtext("Bullish", -300, -252) anchor(topright, xshift, yshift) coloured(bullR, bullG, bullB)
   elsif aoBear = 1 then
      drawtext("Bearish", -300, -252) anchor(topright, xshift, yshift) coloured(bearR, bearG, bearB)
   else
      drawtext("Neutral", -300, -252) anchor(topright, xshift, yshift) coloured(neuR, neuG, neuB)
   endif
   if tt = 0 then
      drawtext("n/a", -180, -252) anchor(topright, xshift, yshift) coloured(neuR, neuG, neuB)
   elsif wrI >= 50 then
      drawtext("#wrI#% (#tt#)", -180, -252) anchor(topright, xshift, yshift) coloured(bullR, bullG, bullB)
   else
      drawtext("#wrI#% (#tt#)", -180, -252) anchor(topright, xshift, yshift) coloured(bearR, bearG, bearB)
   endif
   if enableAo = 1 then
      drawtext("ON", -45, -252) anchor(topright, xshift, yshift) coloured(bullR, bullG, bullB)
   else
      drawtext("OFF", -45, -252) anchor(topright, xshift, yshift) coloured(neuR, neuG, neuB)
   endif
   
   // --- row 9: SAR (y=-277)
   tt = $indTotal[8]
   if tt > 0 then
      wrI = round($indWin[8] / tt * 100, 1)
   else
      wrI = 0
   endif
   drawtext("SAR", -420, -277) anchor(topright, xshift, yshift) coloured(txtR, txtG, txtB)
   if sarBull = 1 then
      drawtext("Bullish", -300, -277) anchor(topright, xshift, yshift) coloured(bullR, bullG, bullB)
   elsif sarBear = 1 then
      drawtext("Bearish", -300, -277) anchor(topright, xshift, yshift) coloured(bearR, bearG, bearB)
   else
      drawtext("Neutral", -300, -277) anchor(topright, xshift, yshift) coloured(neuR, neuG, neuB)
   endif
   if tt = 0 then
      drawtext("n/a", -180, -277) anchor(topright, xshift, yshift) coloured(neuR, neuG, neuB)
   elsif wrI >= 50 then
      drawtext("#wrI#% (#tt#)", -180, -277) anchor(topright, xshift, yshift) coloured(bullR, bullG, bullB)
   else
      drawtext("#wrI#% (#tt#)", -180, -277) anchor(topright, xshift, yshift) coloured(bearR, bearG, bearB)
   endif
   if enableSar = 1 then
      drawtext("ON", -45, -277) anchor(topright, xshift, yshift) coloured(bullR, bullG, bullB)
   else
      drawtext("OFF", -45, -277) anchor(topright, xshift, yshift) coloured(neuR, neuG, neuB)
   endif
   
   // --- row 10: CCI (y=-302)
   tt = $indTotal[9]
   if tt > 0 then
      wrI = round($indWin[9] / tt * 100, 1)
   else
      wrI = 0
   endif
   drawtext("CCI", -420, -302) anchor(topright, xshift, yshift) coloured(txtR, txtG, txtB)
   if cciBull = 1 then
      drawtext("Bullish", -300, -302) anchor(topright, xshift, yshift) coloured(bullR, bullG, bullB)
   elsif cciBear = 1 then
      drawtext("Bearish", -300, -302) anchor(topright, xshift, yshift) coloured(bearR, bearG, bearB)
   else
      drawtext("Neutral", -300, -302) anchor(topright, xshift, yshift) coloured(neuR, neuG, neuB)
   endif
   if tt = 0 then
      drawtext("n/a", -180, -302) anchor(topright, xshift, yshift) coloured(neuR, neuG, neuB)
   elsif wrI >= 50 then
      drawtext("#wrI#% (#tt#)", -180, -302) anchor(topright, xshift, yshift) coloured(bullR, bullG, bullB)
   else
      drawtext("#wrI#% (#tt#)", -180, -302) anchor(topright, xshift, yshift) coloured(bearR, bearG, bearB)
   endif
   if enableCci = 1 then
      drawtext("ON", -45, -302) anchor(topright, xshift, yshift) coloured(bullR, bullG, bullB)
   else
      drawtext("OFF", -45, -302) anchor(topright, xshift, yshift) coloured(neuR, neuG, neuB)
   endif
   
   // --- row 11: ADX Filter (y=-327)
   tt = $indTotal[10]
   if tt > 0 then
      wrI = round($indWin[10] / tt * 100, 1)
   else
      wrI = 0
   endif
   drawtext("ADX Filter", -420, -327) anchor(topright, xshift, yshift) coloured(txtR, txtG, txtB)
   if adxBull = 1 then
      drawtext("Bullish", -300, -327) anchor(topright, xshift, yshift) coloured(bullR, bullG, bullB)
   elsif adxBear = 1 then
      drawtext("Bearish", -300, -327) anchor(topright, xshift, yshift) coloured(bearR, bearG, bearB)
   else
      drawtext("Neutral", -300, -327) anchor(topright, xshift, yshift) coloured(neuR, neuG, neuB)
   endif
   if tt = 0 then
      drawtext("n/a", -180, -327) anchor(topright, xshift, yshift) coloured(neuR, neuG, neuB)
   elsif wrI >= 50 then
      drawtext("#wrI#% (#tt#)", -180, -327) anchor(topright, xshift, yshift) coloured(bullR, bullG, bullB)
   else
      drawtext("#wrI#% (#tt#)", -180, -327) anchor(topright, xshift, yshift) coloured(bearR, bearG, bearB)
   endif
   if enableAdx = 1 then
      drawtext("ON", -45, -327) anchor(topright, xshift, yshift) coloured(bullR, bullG, bullB)
   else
      drawtext("OFF", -45, -327) anchor(topright, xshift, yshift) coloured(neuR, neuG, neuB)
   endif
   
   // --- current combined signal (y=-352)
   drawtext("Current Signal", -407, -352) anchor(topright, xshift, yshift) coloured(neuR, neuG, neuB)
   if longCond = 1 then
      drawtext("LONG", -50, -352) anchor(topright, xshift, yshift) coloured(bullR, bullG, bullB)
   elsif shortCond = 1 then
      drawtext("SHORT", -52, -352) anchor(topright, xshift, yshift) coloured(bearR, bearG, bearB)
   else
      drawtext("NEUTRAL", -58, -352) anchor(topright, xshift, yshift) coloured(neuR, neuG, neuB)
   endif
   
   // ===== Performance dashboard (bottom right corner) =====
   // borde derecho alineado con el panel superior (x=-85): la franja
   // 0..-85 px queda bajo el eje de precios y no se ve
   drawrectangle(-445, 95, -85, 15) anchor(bottomright, xshift, yshift) fillcolor("black", 60)
   drawtext("BACKTEST RESULTS", -265, 80) anchor(bottomright, xshift, yshift) coloured(txtR, txtG, txtB)
   drawtext("Trades", -405, 55) anchor(bottomright, xshift, yshift) coloured(neuR, neuG, neuB)
   drawtext("Wins", -345, 55) anchor(bottomright, xshift, yshift) coloured(neuR, neuG, neuB)
   drawtext("Losses", -285, 55) anchor(bottomright, xshift, yshift) coloured(neuR, neuG, neuB)
   drawtext("WR", -220, 55) anchor(bottomright, xshift, yshift) coloured(neuR, neuG, neuB)
   drawtext("PF", -170, 55) anchor(bottomright, xshift, yshift) coloured(neuR, neuG, neuB)
   drawtext("PnL%", -115, 55) anchor(bottomright, xshift, yshift) coloured(neuR, neuG, neuB)
   
   lossTrades = totalTrades - winTrades
   drawtext("#totalTrades#", -405, 30) anchor(bottomright, xshift, yshift) coloured(txtR, txtG, txtB)
   drawtext("#winTrades#", -345, 30) anchor(bottomright, xshift, yshift) coloured(txtR, txtG, txtB)
   drawtext("#lossTrades#", -285, 30) anchor(bottomright, xshift, yshift) coloured(txtR, txtG, txtB)
   
   if totalTrades > 0 then
      wrAll = round(winTrades / totalTrades * 100, 2)
      if wrAll >= 50 then
         drawtext("#wrAll#%", -220, 30) anchor(bottomright, xshift, yshift) coloured(bullR, bullG, bullB)
      else
         drawtext("#wrAll#%", -220, 30) anchor(bottomright, xshift, yshift) coloured(bearR, bearG, bearB)
      endif
   else
      drawtext("n/a", -220, 30) anchor(bottomright, xshift, yshift) coloured(neuR, neuG, neuB)
   endif
   
   if gLoss > 0 then
      pfV = round(gProfit / gLoss, 2)
      if pfV > 1 then
         drawtext("#pfV#", -170, 30) anchor(bottomright, xshift, yshift) coloured(bullR, bullG, bullB)
      else
         drawtext("#pfV#", -170, 30) anchor(bottomright, xshift, yshift) coloured(bearR, bearG, bearB)
      endif
   elsif gProfit > 0 then
      drawtext("MAX", -170, 30) anchor(bottomright, xshift, yshift) coloured(bullR, bullG, bullB)
   else
      drawtext("0", -170, 30) anchor(bottomright, xshift, yshift) coloured(neuR, neuG, neuB)
   endif
   
   pnlV = round(netPnl, 2)
   if pnlV > 0 then
      drawtext("#pnlV#%", -115, 30) anchor(bottomright, xshift, yshift) coloured(bullR, bullG, bullB)
   elsif pnlV < 0 then
      drawtext("#pnlV#%", -115, 30) anchor(bottomright, xshift, yshift) coloured(bearR, bearG, bearB)
   else
      drawtext("#pnlV#%", -115, 30) anchor(bottomright, xshift, yshift) coloured(neuR, neuG, neuB)
   endif
endif
//----------------------------------------------------------//
return slPlot as "Stop Loss" coloured(bearR, bearG, bearB) style(line, 1), tpPlot as "Take Profit" coloured(bullR, bullG, bullB) style(line, 1), tsPlot as "Trailing Stop" coloured(tsR, tsG, tsB) style(line, 2), closePlot as "Price (TS zone)" coloured(0, 0, 0, 0)

Download
Filename: PRC_Signal-Forge.itf
Downloads: 40
Iván González Legend
Code artist, my biography is a blank page waiting to be scripted. Imagine a bio so awesome it hasn't been coded yet.
Author’s Profile

Comments

Logo Logo
Loading...