Indicatori Adaptive Trend Channel

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

    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álezIván González
    Moderator
    Legend

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

    #259677 quote
    Iván GonzálezIván González
    Moderator
    Legend

    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álezIván González
    Moderator
    Legend
Viewing 4 posts - 1 through 4 (of 4 total)
  • You must be logged in to reply to this topic.
ProRealAI ProRealAI New

Stuck on this ProBuilder code?

Describe what this topic is trying to build, in plain English, and ProRealAI writes the ProRealTime™ indicator, screener or system for you.

Available in 7 languages
Try ProRealAI

TradingView to ProRealTime Translation Center

New Reply
Summary

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

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