FRAMA CHANNEL

Viewing 1 post (of 1 total)
  • Author
    Posts
  • #262924 quote
    brian gilbert
    Participant
    Average
    Good evening, here I am again: over the weekend, I came across an interesting indicator on TW called "FRAMA CHANNEL," and I’ve included both the page link and the code below. As always, thank you in advance for your help in converting it for PRT.
    https://www.tradingview.com/script/hskyfPWP-FRAMA-Channel-BigBeluga/
    
    // This work is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International  
    // https://creativecommons.org/licenses/by-nc-sa/4.0/
    // © BigBeluga
    
    
    
    
    //@version=5
    indicator("FRAMA Channel [BigBeluga]", overlay=true, max_labels_count = 500)
    
    
    // INPUTS --------------------------------------------------------------------------------------------------------{
    // User Inputs for FRAMA Channel
    int    N          = input.int   (26, title="Length", minval=2, step = 2, group = "Channel") // Length for FRAMA calculation
    float  distance   = input.float (1.5, "Bands Distance", step = 0.01, minval = 0.3, group = "Channel") // Distance for channel bands
    string price_vol  = input.string("Price", "Signals Data", ["Price", "Average Volume"]) // Source data for signals
    string labl_size  = input.string("Small", "Lables Size", ["Small", "Normal", "Large"])
    
    
    // Colors
    group = "Colors"
    color color1     = input.color(#27e27b, "Momentum Up", group = group, inline = "1") // Color for upward momentum
    color color2     = input.color(color.rgb(39, 114, 226), "Down", group = group, inline = "1") // Color for downward momentum
    color color3     = input.color(#a2b5ca, "Neutral", group = group) // Color for neutral state
    var color color  = color(na) // Variable to hold the current color
    
    
    bool  candles    = input.bool  (true, "Color Candles") // Toggle for coloring candles based on momentum
    
    
    // Source for FRAMA calculation
    series float price = hl2 // Use hl2 as the default source
    
    
    // Variables for FRAMA calculation
    var float Filt   = na
    var float Filt1  = na
    var float Filt2  = na
    var int   count1 = na
    var int   count2 = na
    // }
    
    
    // UDTs----------------------------------------------------------------------------------------------------------------{
    // Define a user-defined type (UDT) to store variables used in FRAMA calculation
    type vars 
        float N1
        float N2
        float N3
        float HH
        float LL
        float Dimen 
        float alpha
    
    
    // Initialize UDT instance
    v = vars.new(0., 0., 0., 0., 0., 0., 0.)
    // }
    
    
    
    
    // CALCULATIONS----------------------------------------------------------------------------------------------{
    // Perform calculations for the FRAMA Channel
    series float volatility = ta.sma(high - low, 200) // Calculate volatility using the average true range
    series float p_vol      = switch price_vol // Select the data source for signals (Price or Average Volume)
        "Price"             => close
        "Average Volume"    => math.round(math.sum(volume, 10) / 10, 2)
    
    
    // Calculate N3 for the fractal dimension
    v.N3 := (ta.highest(high, N) - ta.lowest(low, N)) / N
    
    
    // Loop to calculate N1
    v.HH := high
    v.LL := low
    
    
    for count = 0 to N / 2 - 1
        if high[count] > v.HH
            v.HH := high[count]
        if low[count] < v.LL
            v.LL := low[count]
    
    
    v.N1 := (v.HH - v.LL) / (N / 2)
    
    
    // Loop to calculate N2
    v.HH := high[N / 2]
    v.LL := low[N / 2]
    
    
    for count = N / 2 to N - 1
        if high[count] > v.HH
            v.HH := high[count]
        if low[count] < v.LL
            v.LL := low[count]
    
    
    v.N2 := (v.HH - v.LL) / (N / 2)
    
    
    // Calculate the fractal dimension
    if (v.N1 > 0 and v.N2 > 0 and v.N3 > 0)
        v.Dimen := (math.log(v.N1 + v.N2) - math.log(v.N3)) / math.log(2)
    
    
    // Calculate alpha for FRAMA
    v.alpha := math.exp(-4.6 * (v.Dimen - 1))
    v.alpha := math.max(math.min(v.alpha, 1), 0.01) // Clamp alpha between 0.01 and 1
    
    
    // Calculate the FRAMA filtered value
    Filt  := na(Filt) 
              ? price 
              : v.alpha * price + (1 - v.alpha) * Filt[1]
    
    
    Filt  := ta.sma((bar_index < N + 1) ? price : Filt, 5) // Apply SMA for smoothing
    
    
    // Calculate the channel bands
    Filt1 := Filt + volatility * distance
    Filt2 := Filt - volatility * distance
    // }
    
    
    
    
    // PLOT-------------------------------------------------------------------------------------------------------------{
    // Define conditions for plotting and coloring
    break_up = ta.crossover(hlc3, Filt1) and barstate.isconfirmed
    break_dn = ta.crossunder(hlc3, Filt2) and barstate.isconfirmed
    
    
    if ta.cross(close, Filt)
        color := color3 // Neutral color 
    
    
    // Determine the color based on breakout conditions
    switch 
        break_up => color := color1 // Upward breakout
        break_dn => color := color2 // Downward breakout
    
    
    // Set candle color if enabled
    color color_c = candles ? color : na
    
    
    // Plot the FRAMA and bands
    p0 = plot(Filt,  color = color.new(color,color == color3 ? 100 : 50),  editable = false)
    p1 = plot(Filt1, color = color.new(color,20), linewidth = 1, editable = false)
    p2 = plot(Filt2, color = color.new(color,20), linewidth = 1, editable = false)
    
    
    // Fill the area between the bands and FRAMA
    fill(p1, p0, Filt1, Filt, color.new(color, candles ? 95 : 85), na, editable = false)
    fill(p0, p2, Filt, Filt2, na, color.new(color, candles ? 95 : 85), editable = false)
    
    
    size = switch labl_size
        "Small"  => size.small
        "Normal" => size.normal
        "Large"  => size.large
    
    
    // Add labels on breakout events
    if break_up
        count2 := 0
        count1 += 1 
        if count1 == 1
            label.new(
                      x         = bar_index,
                      y         = Filt2, 
                      text      = "🢁n" + str.tostring(p_vol),
                      style     = label.style_label_up,
                      textcolor = color1, 
                      color     = color(na), 
                      size = size
                      )
    
    
    if break_dn
        count1 := 0 
        count2 += 1
        if count2 == 1
            label.new(
                      x         = bar_index,
                      y         = Filt1, 
                      text      = str.tostring(p_vol) + "n🢃",
                      style     = label.style_label_down,
                      textcolor = color2, 
                      color     = color(na), 
                      size      = size
                      )
    
    
    // Plot candles with the calculated colors
    plotcandle(
                 open, high, low, close, 
                 "Candles", 
                 color_c,
                 color_c, 
                 bordercolor = color_c, 
                 editable    = false
                 )
    // }
    
    
    


Viewing 1 post (of 1 total)
  • You must be logged in to reply to this topic.

TradingView to ProRealTime Translation Center

New Reply
Author
Summary

This topic contains 1 voice and has 0 replies.

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