Indicatori Adaptive Trend Channel

Viewing 4 posts - 1 through 4 (of 4 total)
  • Author
    Posts
  • #259672 quote
    Ciccarelli Franco
    Participant
    Average

    Se non sono troppo ingordo, questa volta chiedo la traduzione di due indicatori.

    Grazie


    https://it.tradingview.com/script/Yhg7agJ9-Adaptive-Trend-Channel/


    #259675 quote
    Iván González
    Moderator
    Master

    Per facilitare l’accesso alle informazioni da parte degli altri utenti, è consigliabile creare un post su richiesta.

    #259677 quote
    Iván González
    Moderator
    Master

    Ecco il indicadores Adative Trend Channel:

    //-------------------------------------------------//
    // PRC_Adaptive Trend Channel
    // Adapted from PineScript [Julien_Exe]
    // version = 0
    // 30.03.2026
    // Iván González @ www.prorealcode.com
    // Sharing ProRealTime knowledge
    //-------------------------------------------------//
    defparam drawonlastbaronly = true
    
    // === INPUTS ===
    devMult = 2.0       // Display Deviation Multiplier
    selDevMult = 2.0    // Selection Deviation Multiplier
    minPearsonR = 0.80  // Min |Pearson r| for eligibility
    minADXval = 20      // Min ADX for eligibility
    minContain = 0.85   // Min Containment ratio
    maxWidthPct = 35    // Max Width % allowed
    showShort = 1       // Show Short-Term Channel (1=yes)
    showLong = 1        // Show Long-Term Channel (1=yes)
    
    // === ADX NATIVE ===
    myADX = ADX[14]
    
    // === CANDIDATE LENGTHS ===
    // Short-Term: 12 candidates (closer to Pine's 20-200 step 10)
    once $sLen[0] = 20
    once $sLen[1] = 30
    once $sLen[2] = 50
    once $sLen[3] = 70
    once $sLen[4] = 90
    once $sLen[5] = 110
    once $sLen[6] = 130
    once $sLen[7] = 150
    once $sLen[8] = 170
    once $sLen[9] = 180
    once $sLen[10] = 190
    once $sLen[11] = 200
    
    // Long-Term: 10 candidates (closer to Pine's 300-1200 step 50)
    once $lLen[0] = 300
    once $lLen[1] = 400
    once $lLen[2] = 500
    once $lLen[3] = 600
    once $lLen[4] = 700
    once $lLen[5] = 800
    once $lLen[6] = 900
    once $lLen[7] = 1000
    once $lLen[8] = 1100
    once $lLen[9] = 1200
    
    // ================================================================
    // MAIN COMPUTATION (last bar only for performance)
    // ================================================================
    IF islastbarupdate THEN
       
       // ============================================================
       // SHORT-TERM CHANNEL
       // ============================================================
       IF showShort THEN
          numS = 12
          FOR c = 0 TO numS - 1 DO
             len = $sLen[c]
             IF barindex >= len THEN
                // --- Linear Regression ---
                sumX = 0
                sumXX = 0
                sumYX = 0
                sumY = 0
                FOR i = 1 TO len DO
                   val = close[i - 1]
                   sumX = sumX + i
                   sumXX = sumXX + i * i
                   sumYX = sumYX + i * val
                   sumY = sumY + val
                NEXT
                
                denom = len * sumXX - sumX * sumX
                IF denom <> 0 THEN
                   sl = (len * sumYX - sumX * sumY) / denom
                ELSE
                   sl = 0
                ENDIF
                av = sumY / len
                ic = av - sl * sumX / len + sl
                
                // --- Std Deviation + Pearson r ---
                sumDev = 0
                sumDxx = 0
                sumDyy = 0
                sumDyx = 0
                n1 = len - 1
                regMid = ic + sl * n1 * 0.5
                lv = ic
                FOR i = 0 TO n1 DO
                   v = close[i]
                   dxt = v - av
                   dyt = lv - regMid
                   diff = v - lv
                   lv = lv + sl
                   sumDxx = sumDxx + dxt * dxt
                   sumDyy = sumDyy + dyt * dyt
                   sumDyx = sumDyx + dxt * dyt
                   sumDev = sumDev + diff * diff
                NEXT
                
                df = max(1, len - 2)
                sd = sqrt(sumDev / df)
                div = sumDxx * sumDyy
                IF div > 0 THEN
                   pr = sumDyx / sqrt(div)
                ELSE
                   pr = 0
                ENDIF
                absR = abs(pr)
                
                // --- Containment Ratio ---
                ins = 0
                bd = selDevMult * sd
                lv = ic
                FOR i = 0 TO len - 1 DO
                   IF abs(close[i] - lv) <= bd THEN
                      ins = ins + 1
                   ENDIF
                   lv = lv + sl
                NEXT
                cont = ins / len
                
                // --- Channel Width % ---
                mid = ic
                wp = 0
                IF abs(mid) > 0 THEN
                   wp = (2 * selDevMult * sd) / abs(mid) * 100
                ENDIF
                
                // --- Trend Efficiency ---
                te = 0
                IF sd > 0 THEN
                   te = abs(sl) / sd
                ENDIF
                
                // --- Robust Composite Score ---
                teScore = te / (te + 1.0)
                rScore = min(max(absR, 0), 1)
                adxScore = min(max((myADX - 15) / 25, 0), 1)
                wScore = 1 - min(max(wp, 0), 40) / 40
                cntScore = min(max(cont, 0), 1)
                score = 100 * (0.40 * teScore + 0.25 * rScore + 0.10 * wScore + 0.07 * cntScore + 0.03 * adxScore)
                
                // --- Eligibility ---
                elig = 0
                IF absR >= minPearsonR AND myADX >= minADXval AND cont >= minContain AND wp <= maxWidthPct THEN
                   elig = 1
                ENDIF
                
                $sSd[c] = sd
                $sSl[c] = sl
                $sIc[c] = ic
                $sScore[c] = score
                $sElig[c] = elig
             ELSE
                $sScore[c] = 0
                $sElig[c] = 0
             ENDIF
          NEXT
          
          // --- Stability + Final Score ---
          FOR c = 0 TO numS - 1 DO
             curr = $sScore[c]
             stab = 0
             cnt = 0
             IF c > 0 THEN
                IF curr > 0 THEN
                   prev = $sScore[c - 1]
                   stab = stab + max(0, 1 - abs(curr - prev) / max(curr, 0.0001))
                   cnt = cnt + 1
                ENDIF
             ENDIF
             IF c < numS - 1 THEN
                IF curr > 0 THEN
                   nxt = $sScore[c + 1]
                   stab = stab + max(0, 1 - abs(curr - nxt) / max(curr, 0.0001))
                   cnt = cnt + 1
                ENDIF
             ENDIF
             IF cnt > 0 THEN
                stab = stab / cnt
             ENDIF
             $sFinal[c] = curr + 15 * stab
          NEXT
          
          // --- Select Best Short ---
          bestES = -1
          bestEIS = -1
          bestAS = -1
          bestAIS = -1
          FOR c = 0 TO numS - 1 DO
             IF $sFinal[c] > bestAS THEN
                bestAS = $sFinal[c]
                bestAIS = c
             ENDIF
             IF $sElig[c] = 1 THEN
                IF $sFinal[c] > bestES THEN
                   bestES = $sFinal[c]
                   bestEIS = c
                ENDIF
             ENDIF
          NEXT
          
          idxS = -1
          eligFlagS = 0
          IF bestEIS >= 0 THEN
             idxS = bestEIS
             eligFlagS = 1
          ELSIF bestAIS >= 0 THEN
             idxS = bestAIS
          ENDIF
          
          // --- Draw Short Channel ---
          IF idxS >= 0 THEN
             selLenS = $sLen[idxS]
             selSlopeS = $sSl[idxS]
             selIcS = $sIc[idxS]
             selSdS = $sSd[idxS]
             
             sBarStart = barindex - selLenS + 1
             sStartP = selIcS + selSlopeS * (selLenS - 1)
             sEndP = selIcS
             sBand = devMult * selSdS
             
             IF eligFlagS THEN
                rS = 0
                gS = 210
                bS = 255
             ELSE
                rS = 150
                gS = 150
                bS = 150
             ENDIF
             
             // Midline (dashed)
             drawsegment(sBarStart, sStartP, barindex, sEndP) coloured(rS, gS, bS, 140) style(dottedline, 1)
             // Upper band
             drawsegment(sBarStart, sStartP + sBand, barindex, sEndP + sBand) coloured(rS, gS, bS) style(line, 1)
             // Lower band
             drawsegment(sBarStart, sStartP - sBand, barindex, sEndP - sBand) coloured(rS, gS, bS) style(line, 1)
             // Label
             drawtext("ST #selLenS#", barindex + 5, sEndP) coloured(rS, gS, bS)
          ENDIF
       ENDIF
       
       // ============================================================
       // LONG-TERM CHANNEL (relaxed thresholds)
       // ============================================================
       IF showLong THEN
          numL = 10
          // Relaxed params for long-term
          lSelDev = selDevMult + 0.10
          lMinPearson = minPearsonR
          lMinADX = max(0, minADXval - 2)
          lMinContain = max(0, minContain - 0.03)
          lMaxWidth = maxWidthPct + 10
          lWidthCap = 55
          lHalfSat = 1.35
          
          FOR c = 0 TO numL - 1 DO
             len = $lLen[c]
             IF barindex >= len THEN
                // --- Linear Regression ---
                sumX = 0
                sumXX = 0
                sumYX = 0
                sumY = 0
                FOR i = 1 TO len DO
                   val = close[i - 1]
                   sumX = sumX + i
                   sumXX = sumXX + i * i
                   sumYX = sumYX + i * val
                   sumY = sumY + val
                NEXT
                
                denom = len * sumXX - sumX * sumX
                IF denom <> 0 THEN
                   sl = (len * sumYX - sumX * sumY) / denom
                ELSE
                   sl = 0
                ENDIF
                av = sumY / len
                ic = av - sl * sumX / len + sl
                
                // --- Std Deviation + Pearson r ---
                sumDev = 0
                sumDxx = 0
                sumDyy = 0
                sumDyx = 0
                n1 = len - 1
                regMid = ic + sl * n1 * 0.5
                lv = ic
                FOR i = 0 TO n1 DO
                   v = close[i]
                   dxt = v - av
                   dyt = lv - regMid
                   diff = v - lv
                   lv = lv + sl
                   sumDxx = sumDxx + dxt * dxt
                   sumDyy = sumDyy + dyt * dyt
                   sumDyx = sumDyx + dxt * dyt
                   sumDev = sumDev + diff * diff
                NEXT
                
                df = max(1, len - 2)
                sd = sqrt(sumDev / df)
                div = sumDxx * sumDyy
                IF div > 0 THEN
                   pr = sumDyx / sqrt(div)
                ELSE
                   pr = 0
                ENDIF
                absR = abs(pr)
                
                // --- Containment ---
                ins = 0
                bd = lSelDev * sd
                lv = ic
                FOR i = 0 TO len - 1 DO
                   IF abs(close[i] - lv) <= bd THEN
                      ins = ins + 1
                   ENDIF
                   lv = lv + sl
                NEXT
                cont = ins / len
                
                // --- Width % ---
                mid = ic
                wp = 0
                IF abs(mid) > 0 THEN
                   wp = (2 * lSelDev * sd) / abs(mid) * 100
                ENDIF
                
                // --- Trend Efficiency ---
                te = 0
                IF sd > 0 THEN
                   te = abs(sl) / sd
                ENDIF
                
                // --- Score (with relaxed half-sat) ---
                teScore = te / (te + lHalfSat)
                rScore = min(max(absR, 0), 1)
                adxScore = min(max((myADX - 15) / 25, 0), 1)
                wScore = 1 - min(max(wp, 0), lWidthCap) / lWidthCap
                cntScore = min(max(cont, 0), 1)
                score = 100 * (0.40 * teScore + 0.25 * rScore + 0.10 * wScore + 0.07 * cntScore + 0.03 * adxScore)
                
                // --- Eligibility (relaxed) ---
                elig = 0
                IF absR >= lMinPearson AND myADX >= lMinADX AND cont >= lMinContain AND wp <= lMaxWidth THEN
                   elig = 1
                ENDIF
                
                $lSd[c] = sd
                $lSl[c] = sl
                $lIc[c] = ic
                $lScore[c] = score
                $lElig[c] = elig
             ELSE
                $lScore[c] = 0
                $lElig[c] = 0
             ENDIF
          NEXT
          
          // --- Stability + Final Score ---
          FOR c = 0 TO numL - 1 DO
             curr = $lScore[c]
             stab = 0
             cnt = 0
             IF c > 0 THEN
                IF curr > 0 THEN
                   prev = $lScore[c - 1]
                   stab = stab + max(0, 1 - abs(curr - prev) / max(curr, 0.0001))
                   cnt = cnt + 1
                ENDIF
             ENDIF
             IF c < numL - 1 THEN
                IF curr > 0 THEN
                   nxt = $lScore[c + 1]
                   stab = stab + max(0, 1 - abs(curr - nxt) / max(curr, 0.0001))
                   cnt = cnt + 1
                ENDIF
             ENDIF
             IF cnt > 0 THEN
                stab = stab / cnt
             ENDIF
             $lFinal[c] = curr + 15 * stab
          NEXT
          
          // --- Select Best Long ---
          bestEL = -1
          bestEIL = -1
          bestAL = -1
          bestAIL = -1
          FOR c = 0 TO numL - 1 DO
             IF $lFinal[c] > bestAL THEN
                bestAL = $lFinal[c]
                bestAIL = c
             ENDIF
             IF $lElig[c] = 1 THEN
                IF $lFinal[c] > bestEL THEN
                   bestEL = $lFinal[c]
                   bestEIL = c
                ENDIF
             ENDIF
          NEXT
          
          idxL = -1
          eligFlagL = 0
          IF bestEIL >= 0 THEN
             idxL = bestEIL
             eligFlagL = 1
          ELSIF bestAIL >= 0 THEN
             idxL = bestAIL
          ENDIF
          
          // --- Draw Long Channel ---
          IF idxL >= 0 THEN
             selLenL = $lLen[idxL]
             selSlopeL = $lSl[idxL]
             selIcL = $lIc[idxL]
             selSdL = $lSd[idxL]
             
             lBarStart = barindex - selLenL + 1
             lStartP = selIcL + selSlopeL * (selLenL - 1)
             lEndP = selIcL
             lBand = devMult * selSdL
             
             IF eligFlagL THEN
                rL = 0
                gL = 180
                bL = 230
             ELSE
                rL = 130
                gL = 130
                bL = 130
             ENDIF
             
             // Midline (dashed)
             drawsegment(lBarStart, lStartP, barindex, lEndP) coloured(rL, gL, bL, 160) style(dottedline, 1)
             // Upper band
             drawsegment(lBarStart, lStartP + lBand, barindex, lEndP + lBand) coloured(rL, gL, bL) style(line, 1)
             // Lower band
             drawsegment(lBarStart, lStartP - lBand, barindex, lEndP - lBand) coloured(rL, gL, bL) style(line, 1)
             // Label
             drawtext("LT #selLenL#", barindex + 5, lEndP) coloured(rL, gL, bL)
          ENDIF
       ENDIF
       
    ENDIF
    
    RETURN
    
    
    Nicolas thanked this post
    #259683 quote
    Iván González
    Moderator
    Master
Viewing 4 posts - 1 through 4 (of 4 total)
  • You must be logged in to reply to this topic.

TradingView to ProRealTime Translation Center

New Reply
Summary

This topic contains 3 replies,
has 2 voices, and was last updated by Iván González
2 weeks, 2 days ago.

Topic Details
Forum: TradingView to ProRealTime Translation Center Forum
Started: 03/30/2026
Status: Active
Attachments: No files
Logo Logo
Loading...