커뮤니티

변환 부탁 드립니다.

프로필 이미지
다올
2025-12-26 12:55:19
142
글번호 229373
답변완료

트레이팅 뷰 지표입니다.

사용가능 하도록 수정 부탁 드립니다.




//@version=6

indicator(

 title="Kalman Adjusted Average True Range [BackQuant]",

 shorttitle = "Kalman ATR [BackQuant]",

 overlay=true)




// Define User Inputs

const string      tooltip1                = "If T3 is selected as the moving average this will be the volume factor, if ALMA is selected it will be the sigma, ELSE it is nothing"

simple bool       showAtr                 =        input.bool(true, "Plot Kalman Atr on Chart?")

series float      pricesource             =        input.source(close, "Kalman Price Source", group = "Calculation")

simple float      processNoise            =        input.float(0.01, title="Process Noise", step = 0.01, group = "Calculation")

simple float      measurementNoise        =        input.float(3.0, title="Measurement Noise", group = "Calculation")

simple int        N                       =        input.int(5, title="Filter Order", minval=1, group = "Calculation")

simple int        periodAtr               =        input.int(5, "Period", group = "Kalman Atr")

simple float      factorAtr               =        input.float(0.5, "Factor", step = 0.01, group = "Kalman Atr")

simple bool       paintCandles            =        input.bool(false, "Paint Candles According to trend?")

simple bool       showMA                  =        input.bool(false, "Show Atr Moving Average as Confluence?",group = "Confluence")

string            movingAverageType       =        input.string("Ema", title="MA Type", options=["SMA", "Hull", "Ema", "Wma", "Dema", "RMA", "LINREG", "ALMA"],group = "Confluence")

simple float      vfsig                   =        input.float(0.7, "Volume Factor if T3, Sigma if ALMA", group = "Confluence", tooltip = "If T3 is selected as the moving average this will be the volume factor, if ALMA is selected it will be the sigma, ELSE it is nothing")

simple int        movingAveragePeriod     =        input.int(50, "Moving Average Period", group = "Confluence")

simple color      longColour              =        input.color(#00ff00, "Long Colour", group = "Colors")

simple color      shortColour             =        input.color(#ff0000, "Short Color", group = "Colors")

/////////////////////////////////////////////////////////////// © BackQuant ///////////////////////////////////////////////////////////////

// Function

var float[] stateEstimate = array.new_float(N, na)

var float[] errorCovariance = array.new_float(N, 100.0)



f_init(series float pricesource) =>

    if na(array.get(stateEstimate, 0))

        for i = 0 to N-1

            array.set(stateEstimate, i, pricesource)

            array.set(errorCovariance, i, 1.0)



f_kalman(series float pricesource) =>

    // Prediction Step

    predictedStateEstimate = array.new_float(N)

    predictedErrorCovariance = array.new_float(N)

    for i = 0 to N-1

        array.set(predictedStateEstimate, i, array.get(stateEstimate, i)) // Simplified prediction

        array.set(predictedErrorCovariance, i, array.get(errorCovariance, i) + processNoise)

   

    kalmanGain = array.new_float(N)

    for i = 0 to N-1

        kg = array.get(predictedErrorCovariance, i) / (array.get(predictedErrorCovariance, i) + measurementNoise)

        array.set(kalmanGain, i, kg)

        array.set(stateEstimate, i, array.get(predictedStateEstimate, i) + kg * (pricesource - array.get(predictedStateEstimate, i)))

        array.set(errorCovariance, i, (1 - kg) * array.get(predictedErrorCovariance, i))

   

    array.get(stateEstimate, 0)



KalmanAtrWithBands(pricesource, lookback, atrFactor)=>

    f_init(pricesource)

    kalmanFilteredPrice = f_kalman(pricesource)




    atr = ta.atr(lookback)

    trueRange = atr * atrFactor



    kalmanatr = kalmanFilteredPrice

    kalmanatr := nz(kalmanatr[1], kalmanatr)



    trueRangeUpper = kalmanFilteredPrice + trueRange

    trueRangeLower  = kalmanFilteredPrice - trueRange



    if trueRangeLower > kalmanatr

        kalmanatr := trueRangeLower

    if trueRangeUpper < kalmanatr

        kalmanatr := trueRangeUpper

    kalmanatr



// Function Out

kalmanatr = KalmanAtrWithBands(pricesource, periodAtr, factorAtr)

/////////////////////////////////////////////////////////////// © BackQuant ///////////////////////////////////////////////////////////////

// Moving Average Switch Type

movingAverage(source, length, type, vfsig) =>

    switch type

        "SMA" => ta.sma(source, length)

        "Hull" => ta.hma(source, length)

        "Ema" => ta.ema(source, length)

        "Wma" => ta.wma(source, length)

        "Dema" => ta.dema(source, length)

        "RMA" => ta.rma(source, length)

        "LINREG" => ta.linreg(source, length, 0)

        "ALMA" => ta.alma(source, length, 0, vfsig)



maOut = movingAverage(kalmanatr, movingAveragePeriod, movingAverageType, vfsig)

/////////////////////////////////////////////////////////////// © BackQuant ///////////////////////////////////////////////////////////////

// Conditions

kalmanatrLong = ta.crossover(kalmanatr, kalmanatr[1])

kalmanatrShort = ta.crossunder(kalmanatr, kalmanatr[1])



// Colour Condtions

var color Trend = #ffffff

if kalmanatrLong

    Trend := longColour

if kalmanatrShort

    Trend := shortColour



// Plotting

plot(

 showAtr ? kalmanatr : na,

 "ATR",

 color=Trend,

 linewidth = 2

 )



barcolor(paintCandles ? Trend : na)



plot(showMA ? maOut : na, "Moving Average", color.white, 2, plot.style_line)

/////////////////////////////////////////////////////////////// © BackQuant ///////////////////////////////////////////////////////////////



// Alerts

alertcondition(

 kalmanatrLong,

 title="Kalman ATR Trend Up",

 message="Kalman ATR Trend Up - {{ticker}} - {{interval}}"

 )



alertcondition(

 kalmanatrShort,

 title="Kalman ATR Trend Down",

 message="Kalman ATR Trend Down - {{ticker}} - {{interval}}"

 )



지표
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2025-12-29 15:00:35

안녕하세요 예스스탁입니다. input : showAtr(true); input : processNoise(0.01); input : measurementNoise(3.0); input : N(5); input : periodAtr(5); input : factorAtr(0.5); input : paintCandles(false); input : showMA(false); input : movingAverageType(3);#1:SMA, 2:Hull, 3:Ema, 4:Wma, 5:Dema, 6:RMA, 7:LINREG, 8:ALMA input : vfsig(0.7); input : movingAveragePeriod(50); input : longColour(Lime); input : shortColour(Red); var : pricesource(0),i(0); Array : stateEstimate[50](Nan),errorCovariance[50](100); Array : predictedStateEstimate[50](0),predictedErrorCovariance[50](0),kalmanGain[50](0); var : kg(0),alpha(0),atrv(0),tr(0),kalmanatr(0),kalmanFilteredPrice(0); var : trueRangeUpper(0),trueRangeLower(0),trend(Black); var : maOut(0),ap(0),mm(0),s(0),norm(0),sum(0),weight(0); pricesource = close; if IsNan(stateEstimate[0]) == true Then { for i = 0 to N-1 { stateEstimate[i] = pricesource; errorCovariance[i] = 1.0; } } if IsNan(stateEstimate[0]) == False Then { for i = 0 to N-1 { predictedStateEstimate[i] = stateEstimate[i]; predictedErrorCovariance[i] = errorCovariance[i] + processNoise; } for i = 0 to N-1 { kg = predictedErrorCovariance[i] / (predictedErrorCovariance[i]+ measurementNoise); kalmanGain[i] = kg; stateEstimate[i] = predictedStateEstimate[i] + kg * (pricesource - predictedStateEstimate[i]); errorCovariance[i] = (1 - kg) * predictedErrorCovariance[i]; } kalmanFilteredPrice = stateEstimate[0]; alpha = 1 / periodAtr ; ATRV = IFf(IsNan(ATRV[1]) == true, ma(TrueRange,periodAtr) , alpha * TrueRange + (1 - alpha) * IFf(isnan(ATRV[1])==true,0,ATRV[1])); tr = atrv * factorAtr; kalmanatr = kalmanFilteredPrice; kalmanatr = iff(IsNan(kalmanatr[1])==true, kalmanatr,kalmanatr[1]); trueRangeUpper = kalmanFilteredPrice + tr; trueRangeLower = kalmanFilteredPrice - tr ; if trueRangeLower > kalmanatr Then kalmanatr = trueRangeLower; if trueRangeUpper < kalmanatr Then kalmanatr = trueRangeUpper; if CrossUp(kalmanatr, kalmanatr[1]) Then trend = longColour; if CrossDown(kalmanatr, kalmanatr[1]) Then trend = shortColour; if showAtr Then Plot1(kalmanatr,"ATR",Trend); Else NoPlot(1); if movingAverageType == 1 Then maOut = ma(kalmanatr,movingAveragePeriod); if movingAverageType == 2 Then maOut = wma(2 * wma(kalmanatr, movingAveragePeriod / 2) - wma(kalmanatr, movingAveragePeriod), round(sqrt(movingAveragePeriod),0)); if movingAverageType == 3 Then maOut = ema(kalmanatr,movingAveragePeriod); if movingAverageType == 4 Then maOut = wma(kalmanatr,movingAveragePeriod); if movingAverageType == 5 Then maOut = 2 * ema(kalmanatr, movingAveragePeriod) - ema(ema(kalmanatr, movingAveragePeriod), movingAveragePeriod); if movingAverageType == 6 Then maOut = ma(kalmanatr,movingAveragePeriod); if movingAverageType == 7 Then { ap = 1/movingAveragePeriod; maOut = iff(Isnan(maOut[1]) == true , ma(kalmanatr, movingAveragePeriod) , ap * kalmanatr + (1 - ap) * iff(isnan(maOut[1]) == true,0,maOut[1])); } if movingAverageType == 8 Then { mm = 0 * (movingAveragePeriod - 1); s = movingAveragePeriod / vfsig; norm = 0.0; sum = 0.0; for i = 0 to movingAveragePeriod - 1 { weight = exp(-1 * pow(i - mm, 2) / (2 * pow(s, 2))); norm = norm + weight; sum = sum + kalmanatr[movingAveragePeriod - i - 1] * weight; } maOut = sum / norm; } if showMA == true Then plot2(maOut,"Moving Average",Black); Else NoPlot(2); } 새해 복 많이 받으세요