Vidya Quantile Bands

Viewing 3 posts - 1 through 3 (of 3 total)
  • Author
    Posts
  • #244218 quote
    Bateson
    Participant
    New

    Bonjour
    Je suis en train de finir l’étude de la Vidya et j’aurai besoin d’un dernier coup de main pour traduire le code Trading View ci-dessous.
    Merci d’avance !

    // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
    // © loxx
    
    //@version=5
    // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
    //@version=5
    
    indicator('STD-Stepped VIDYA w/ Quantile Bands [Loxx]', 
         shorttitle = "STDDVIDYAQB [Loxx]", 
         overlay = true, 
         timeframe="", 
         timeframe_gaps=true)
         
    import loxx/loxxexpandedsourcetypes/3
    
    greencolor = #2DD204
    redcolor = #D2042D
    
    SM02 = 'Slope'
    SM03 = 'Middle Crossover'
    SM04 = 'Levels Crossover'
    
    _filt(src, len, filter)=>
        price = src
        filtdev = filter * ta.stdev(src, len)
        price := math.abs(price - price[1]) < filtdev ? price[1] : price
        price
    
    smthtype = input.string("Kaufman", "Heikin-Ashi Better Caculation Type", options = ["AMA", "T3", "Kaufman"], group = "Basic Settings")
    
    srcin = input.string("Close", "Source", group= "Basic Settings", 
         options = 
         ["Close", "Open", "High", "Low", "Median", "Typical", "Weighted", "Average", "Average Median Body", "Trend Biased", "Trend Biased (Extreme)", 
         "HA Close", "HA Open", "HA High", "HA Low", "HA Median", "HA Typical", "HA Weighted", "HA Average", "HA Average Median Body", "HA Trend Biased", "HA Trend Biased (Extreme)",
         "HAB Close", "HAB Open", "HAB High", "HAB Low", "HAB Median", "HAB Typical", "HAB Weighted", "HAB Average", "HAB Average Median Body", "HAB Trend Biased", "HAB Trend Biased (Extreme)"])
    
    per = input(9, 'Period', group=  "Basic Settings")
    histPer = input(30, 'Hist Period', group=  "Basic Settings")
    
    filterop = input.string("Both", "Filter Options", options = ["Price", "VIDYA", "Both"], group=  "Filter Settings")
    filter = input.float(0, "Filter Devaitions", minval = 0, group= "Filter Settings")
    filterperiod = input.int(1, "Filter Period", minval = 0, group= "Filter Settings")
    
    FlPeriod = input.int(25, "Levels Period", group = "Levels Settings") 
    FlUp  = input.float(80 , "Up Level", group = "Levels Settings")
    FlDn = input.float(20 , "Down Level", group = "Levels Settings")
    
    sigtype = input.string(SM03, "Signal type", options = [SM02, SM03, SM04], group = "Signal Settings")
    
    colorbars = input.bool(false, "Color bars?", group = "UI Options")
    showsignals = input.bool(false, "Show signals?", group = "UI Options")
    
    kfl=input.float(0.666, title="* Kaufman's Adaptive MA (KAMA) Only - Fast End", group = "Moving Average Inputs")
    ksl=input.float(0.0645, title="* Kaufman's Adaptive MA (KAMA) Only - Slow End", group = "Moving Average Inputs")
    amafl = input.int(2, title="* Adaptive Moving Average (AMA) Only - Fast", group = "Moving Average Inputs")
    amasl = input.int(30, title="* Adaptive Moving Average (AMA) Only - Slow", group = "Moving Average Inputs")
    
    haclose = request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, close)
    haopen = request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, open)
    hahigh = request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, high)
    halow = request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, low)
    hamedian = request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, hl2)
    hatypical = request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, hlc3)
    haweighted = request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, hlcc4)
    haaverage = request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, ohlc4)
    
    src = switch srcin
    	"Close" => loxxexpandedsourcetypes.rclose()
    	"Open" => loxxexpandedsourcetypes.ropen()
    	"High" => loxxexpandedsourcetypes.rhigh()
    	"Low" => loxxexpandedsourcetypes.rlow()
    	"Median" => loxxexpandedsourcetypes.rmedian()
    	"Typical" => loxxexpandedsourcetypes.rtypical()
    	"Weighted" => loxxexpandedsourcetypes.rweighted()
    	"Average" => loxxexpandedsourcetypes.raverage()
        "Average Median Body" => loxxexpandedsourcetypes.ravemedbody()
    	"Trend Biased" => loxxexpandedsourcetypes.rtrendb()
    	"Trend Biased (Extreme)" => loxxexpandedsourcetypes.rtrendbext()
    	"HA Close" => loxxexpandedsourcetypes.haclose(haclose)
    	"HA Open" => loxxexpandedsourcetypes.haopen(haopen)
    	"HA High" => loxxexpandedsourcetypes.hahigh(hahigh)
    	"HA Low" => loxxexpandedsourcetypes.halow(halow)
    	"HA Median" => loxxexpandedsourcetypes.hamedian(hamedian)
    	"HA Typical" => loxxexpandedsourcetypes.hatypical(hatypical)
    	"HA Weighted" => loxxexpandedsourcetypes.haweighted(haweighted)
    	"HA Average" => loxxexpandedsourcetypes.haaverage(haaverage)
        "HA Average Median Body" => loxxexpandedsourcetypes.haavemedbody(haclose, haopen)
    	"HA Trend Biased" => loxxexpandedsourcetypes.hatrendb(haclose, haopen, hahigh, halow)
    	"HA Trend Biased (Extreme)" => loxxexpandedsourcetypes.hatrendbext(haclose, haopen, hahigh, halow)
    	"HAB Close" => loxxexpandedsourcetypes.habclose(smthtype, amafl, amasl, kfl, ksl)
    	"HAB Open" => loxxexpandedsourcetypes.habopen(smthtype, amafl, amasl, kfl, ksl)
    	"HAB High" => loxxexpandedsourcetypes.habhigh(smthtype, amafl, amasl, kfl, ksl)
    	"HAB Low" => loxxexpandedsourcetypes.hablow(smthtype, amafl, amasl, kfl, ksl)
    	"HAB Median" => loxxexpandedsourcetypes.habmedian(smthtype, amafl, amasl, kfl, ksl)
    	"HAB Typical" => loxxexpandedsourcetypes.habtypical(smthtype, amafl, amasl, kfl, ksl)
    	"HAB Weighted" => loxxexpandedsourcetypes.habweighted(smthtype, amafl, amasl, kfl, ksl)
    	"HAB Average" => loxxexpandedsourcetypes.habaverage(smthtype, amafl, amasl, kfl, ksl)
        "HAB Average Median Body" => loxxexpandedsourcetypes.habavemedbody(smthtype, amafl, amasl, kfl, ksl)
    	"HAB Trend Biased" => loxxexpandedsourcetypes.habtrendb(smthtype, amafl, amasl, kfl, ksl)
    	"HAB Trend Biased (Extreme)" => loxxexpandedsourcetypes.habtrendbext(smthtype, amafl, amasl, kfl, ksl)
    	=> haclose
    
    price = filterop == "Both" or filterop == "Price" and filter > 0 ? _filt(src, filterperiod, filter) : src
    
    k = ta.stdev(price, per) / ta.stdev(price, histPer)
    sc = 2 / (per + 1)
    vidya = 0.0
    vidya := nz(k * sc * price + (1 - k * sc) * vidya[1], 0)
    
    out = filterop == "Both" or filterop == "VIDYA" and filter > 0 ? _filt(vidya, filterperiod, filter) : vidya
    sig = out[1]
    
    flhi = ta.percentile_linear_interpolation(out, FlPeriod, FlUp) 
    mid = ta.percentile_linear_interpolation(out, FlPeriod, (FlUp+FlDn)/2.0)
    fllo = ta.percentile_linear_interpolation(out, FlPeriod, FlDn)
    
    state = 0.
    if sigtype == SM02
        if (out<sig) 
            state :=-1
        if (out>sig) 
            state := 1
    else if sigtype == SM03
        if (out<mid) 
            state :=-1
        if (out>mid)
            state := 1
    else if sigtype == SM04
        if (out<fllo) 
            state :=-1
        if (out>flhi)
            state := 1
    
    colorfish = state == -1 ? redcolor : state == 1 ? greencolor : color.gray
    
    plot(out, color= colorfish, title="Fisher", linewidth = 3)
    
    plot(flhi, "High Level", color = color.gray)
    plot(fllo, "Low Level" ,color = color.gray)
    plot(mid, "Middle", color = color.white)
    
    barcolor(colorbars ? colorfish : na)
    
    goLong = sigtype == SM02 ? ta.crossover(out, sig) : sigtype == SM03 ? ta.crossover(out, mid) : ta.crossover(out, flhi)
    goShort = sigtype == SM02 ? ta.crossunder(out, sig) : sigtype == SM03 ? ta.crossunder(out, mid) :  ta.crossunder(out, fllo)
    
    plotshape(goLong and showsignals, title = "Long", color = color.yellow, textcolor = color.yellow, text = "L", style = shape.triangleup, location = location.belowbar, size = size.tiny)
    plotshape(goShort and showsignals, title = "Short", color = color.fuchsia, textcolor = color.fuchsia, text = "S", style = shape.triangledown, location = location.abovebar, size = size.tiny)
    
    alertcondition(goLong, title="Long", message="STD-Stepped VIDYA w/ Quantile Bands [Loxx]: Long\nSymbol: {{ticker}}\nPrice: {{close}}")
    alertcondition(goShort, title="Short", message="STD-Stepped VIDYA w/ Quantile Bands [Loxx]: Short\nSymbol: {{ticker}}\nPrice: {{close}}")
    
    
    
    
    Capture-decran-2025-02-23-124013.png Capture-decran-2025-02-23-124013.png
    #244281 quote
    Iván González
    Moderator
    Master

    Voici ce que vous avez :

    //-------------------------------------------------//
    //PRC_Vidya Quantile Bands
    //version = 0
    //24.02.25
    //Iván González @ www.prorealcode.com
    //Sharing ProRealTime knowledge
    //-------------------------------------------------//
    // PARAMETERS & CONFIGURATIONS
    //-------------------------------------------------//
    
    // VIDYA calculation periods
    Per = 9       // VIDYA calculation period
    HistPer = 30  // Historical period for standard deviation
    
    // Quantile levels settings
    FlPeriod = 25 // Period for quantile levels calculation
    FlUp  = 80    // Upper quantile level (80%)
    FlDn  = 20    // Lower quantile level (20%)
    
    // Filter settings
    FilterOp = 1  // 1 = Price, 2 = VIDYA, 3 = Both
    Filter = 2
    FilterPeriod = 1
    
    // Source type selection (1 = Close, 2 = Open, 3 = High, 4 = Low, 5 = Heikin-Ashi Close)
    srcType = 1
    
    // Signal type selection (1 = Slope, 2 = Middle Crossover, 3 = Levels Crossover)
    SigType = 2  // Default: Middle Crossover
    
    // Enable or disable signal plotting on chart
    ShowSignals = 1
    
    //-------------------------------------------------//
    // HEIKIN-ASHI CANDLE CALCULATION
    //-------------------------------------------------//
    once haopen = open
    haclose = (open + close + high + low) / 4
    
    IF barindex > 0 THEN
    haopen = (haopen + haclose[1]) / 2
    ENDIF
    
    halow  = min(low, min(haclose, haopen))
    hahigh = max(high, max(haclose, haopen))
    
    //-------------------------------------------------//
    // SELECT DATA SOURCE
    //-------------------------------------------------//
    IF srcType = 1 THEN
    src = Close
    ELSIF srcType = 2 THEN
    src = Open
    ELSIF srcType = 3 THEN
    src = High
    ELSIF srcType = 4 THEN
    src = Low
    ELSIF srcType = 5 THEN
    src = HAClose
    ELSE
    src = Close
    ENDIF
    
    //-------------------------------------------------//
    // VIDYA CALCULATION
    //-------------------------------------------------//
    once vidya = 0
    
    IF barindex > max(Per, HistPer) THEN
    
    // ------------------------------
    // PRICE FILTERING
    // ------------------------------
    IF FilterOp = 3 OR (FilterOp = 1 AND Filter > 0) THEN
    iPrice = src
    StdDevFilter = Filter * STD[FilterPeriod](src)
    
    IF ABS(iPrice - iPrice[1]) < StdDevFilter THEN
    iPrice = iPrice[1]
    ELSE
    iPrice = iPrice
    ENDIF
    ELSE
    iPrice = src
    ENDIF
    
    // ------------------------------
    // VIDYA COMPUTATION
    // ------------------------------
    k = STD[Per](iPrice) / STD[HistPer](iPrice)
    sc = 2 / (Per + 1)
    vidya = k * sc * iPrice + (1 - k * sc) * vidya[1]
    
    // ------------------------------
    // VIDYA FILTERING FOR OUTPUT
    // ------------------------------
    IF FilterOp = 3 OR (FilterOp = 2 AND Filter > 0) THEN
    Out = vidya
    StdDevFilterVIDYA = Filter * STD[FilterPeriod](vidya)
    
    IF ABS(Out - Out[1]) < StdDevFilterVIDYA THEN
    Out = Out[1]
    ELSE
    Out = Out
    ENDIF
    ELSE
    Out = vidya
    ENDIF
    ENDIF
    
    Sig = Out[1]
    
    //-------------------------------------------------//
    // QUANTILE LEVELS CALCULATION
    //-------------------------------------------------//
    
    // Store last FlPeriod values of Out
    FOR i = 0 TO FlPeriod - 1 DO
    $OutArray[i] = Out[i]
    NEXT
    
    // Sort array in descending order
    ArraySort($OutArray, DESCEND)
    
    // Extract percentile levels
    flhi = $OutArray[ROUND(FlPeriod * (FlUp / 100))]    // 80% percentile (upper level)
    mid  = $OutArray[ROUND(FlPeriod * ((FlUp + FlDn) / 200))] // 50% percentile (middle level)
    fllo = $OutArray[ROUND(FlPeriod * (FlDn / 100))]    // 20% percentile (lower level)
    
    //-------------------------------------------------//
    // TREND STATE DETERMINATION
    //-------------------------------------------------//
    state = 0
    
    IF SigType = 1 THEN
    IF Out < Sig THEN
    state = -1
    ELSIF Out > Sig THEN
    state = 1
    ENDIF
    ELSIF SigType = 2 THEN
    IF Out < mid THEN
    state = -1
    ELSIF Out > mid THEN
    state = 1
    ENDIF
    ELSIF SigType = 3 THEN
    IF Out < FlDn THEN
    state = -1
    ELSIF Out > FlUp THEN
    state = 1
    ENDIF
    ENDIF
    
    //-------------------------------------------------//
    // COLOR ASSIGNMENT BASED ON TREND STATE
    //-------------------------------------------------//
    IF state = -1 THEN
    r = 210
    g = 4
    b = 45  // Red for downtrend
    ELSIF state = 1 THEN
    r = 45
    g = 210
    b = 4  // Green for uptrend
    ELSE
    r = 123
    g = 123
    b = 123  // Gray for neutral trend
    ENDIF
    
    //-------------------------------------------------//
    // SIGNAL GENERATION (ENTRY & EXIT)
    //-------------------------------------------------//
    IF SigType = 1 THEN
    goLong = Out CROSSES OVER Sig
    goShort = Out CROSSES UNDER Sig
    ELSIF SigType = 2 THEN
    goLong = Out CROSSES OVER mid
    goShort = Out CROSSES UNDER mid
    ELSIF SigType = 3 THEN
    goLong = Out CROSSES OVER flhi
    goShort = Out CROSSES UNDER fllo
    ENDIF
    
    //-------------------------------------------------//
    // SIGNAL DISPLAY ON CHART
    //-------------------------------------------------//
    atr = averagetruerange[14](close)
    
    IF goLong AND ShowSignals THEN
    DRAWTEXT("▲", BarIndex, Low - 0.5 * atr, Dialog, Bold, 10) COLOURED(0, 0, 255) // Blue for long entry
    ELSIF goShort AND ShowSignals THEN
    DRAWTEXT("▼", BarIndex, High + 0.5 * atr, Dialog, Bold, 10) COLOURED(255, 0, 255) // Fuchsia for short entry
    ENDIF
    
    //-------------------------------------------------//
    RETURN Out COLOURED(r, g, b) STYLE(LINE, 3),flhi COLOURED("grey"),fllo COLOURED("grey"),mid COLOURED("orange")
    #244283 quote
    Bateson
    Participant
    New

    Bonjour Ivan
    Vraiment un très grand merci pour le code qui fonctionne parfaitement.
    Le code est vraiment très “propre”, c’est du très bon travail !
    Le fait d’avoir bien séparé et décrit les différentes “modules” de calcul dans le code va me permettre de faire quelques modifications ciblées.
    Encore un très grand merci pour votre contribution

Viewing 3 posts - 1 through 3 (of 3 total)
  • You must be logged in to reply to this topic.

Vidya Quantile Bands


ProBuilder : Indicateurs & Outils Personnalisés

New Reply
Author
author-avatar
Bateson @bateson Participant
Summary

This topic contains 2 replies,
has 2 voices, and was last updated by Bateson
1 year ago.

Topic Details
Forum: ProBuilder : Indicateurs & Outils Personnalisés
Language: French
Started: 02/23/2025
Status: Active
Attachments: 1 files
Logo Logo
Loading...