
Strategi ini didasarkan pada metode Nadaraya-Watson Nuclear Regression untuk membangun sebuah beling lingkaran volatilitas dinamis yang memungkinkan sinyal perdagangan untuk membeli dan menjual dengan harga rendah dengan melacak persilangan harga dengan beling lingkaran. Strategi ini memiliki dasar analisis matematika dan dapat beradaptasi dengan perubahan pasar.
Inti dari strategi ini adalah menghitung harga yang bergerak di sekitar belenggu. Pertama, berdasarkan pada periode pengamatan yang disesuaikan, membangun kurva regresi inti Nadaraya-Watson dengan harga (harga close, high, low) dan mendapatkan perkiraan harga yang dihaluskan. Kemudian menghitung indikator ATR berdasarkan panjang ATR yang disesuaikan, menggabungkan faktor dekat dan faktor jauh, untuk mendapatkan jangkauan belenggu atas-bawah.
Untuk menghindari dan mengurangi risiko ini terutama dengan mengoptimalkan parameter, melakukan pengujian ulang, memahami faktor-faktor yang mempengaruhi, dan berhati-hati dalam menjalankan bisnis.
Strategi ini mengintegrasikan analisis statistik dengan analisis indikator teknis, dengan cara melacak harga dan fluktuasi secara dinamis, untuk mencapai sinyal perdagangan yang murah dan murah. Parameter dapat disesuaikan sesuai dengan pasar dan kondisi mereka sendiri. Secara keseluruhan, dasar teori strategi ini kuat, kinerja praktis masih harus diverifikasi lebih lanjut.
/*backtest
start: 2022-12-04 00:00:00
end: 2023-12-10 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// © Julien_Eche
//@version=5
strategy("Nadaraya-Watson Envelope Strategy", overlay=true, pyramiding=1, default_qty_type=strategy.percent_of_equity, default_qty_value=20)
// Helper Functions
getEnvelopeBounds(_atr, _nearFactor, _farFactor, _envelope) =>
_upperFar = _envelope + _farFactor*_atr
_upperNear = _envelope + _nearFactor*_atr
_lowerNear = _envelope - _nearFactor*_atr
_lowerFar = _envelope - _farFactor*_atr
_upperAvg = (_upperFar + _upperNear) / 2
_lowerAvg = (_lowerFar + _lowerNear) / 2
[_upperNear, _upperFar, _upperAvg, _lowerNear, _lowerFar, _lowerAvg]
customATR(length, _high, _low, _close) =>
trueRange = na(_high[1])? math.log(_high)-math.log(_low) : math.max(math.max(math.log(_high) - math.log(_low), math.abs(math.log(_high) - math.log(_close[1]))), math.abs(math.log(_low) - math.log(_close[1])))
ta.rma(trueRange, length)
customKernel(x, h, alpha, x_0) =>
sumWeights = 0.0
sumXWeights = 0.0
for i = 0 to h
weight = math.pow(1 + (math.pow((x_0 - i), 2) / (2 * alpha * h * h)), -alpha)
sumWeights := sumWeights + weight
sumXWeights := sumXWeights + weight * x[i]
sumXWeights / sumWeights
// Custom Settings
customLookbackWindow = input.int(8, 'Lookback Window (Custom)', group='Custom Settings')
customRelativeWeighting = input.float(8., 'Relative Weighting (Custom)', step=0.25, group='Custom Settings')
customStartRegressionBar = input.int(25, "Start Regression at Bar (Custom)", group='Custom Settings')
// Envelope Calculations
customEnvelopeClose = math.exp(customKernel(math.log(close), customLookbackWindow, customRelativeWeighting, customStartRegressionBar))
customEnvelopeHigh = math.exp(customKernel(math.log(high), customLookbackWindow, customRelativeWeighting, customStartRegressionBar))
customEnvelopeLow = math.exp(customKernel(math.log(low), customLookbackWindow, customRelativeWeighting, customStartRegressionBar))
customEnvelope = customEnvelopeClose
customATRLength = input.int(60, 'ATR Length (Custom)', minval=1, group='Custom Settings')
customATR = customATR(customATRLength, customEnvelopeHigh, customEnvelopeLow, customEnvelopeClose)
customNearATRFactor = input.float(1.5, 'Near ATR Factor (Custom)', minval=0.5, step=0.25, group='Custom Settings')
customFarATRFactor = input.float(2.0, 'Far ATR Factor (Custom)', minval=1.0, step=0.25, group='Custom Settings')
[customUpperNear, customUpperFar, customUpperAvg, customLowerNear, customLowerFar, customLowerAvg] = getEnvelopeBounds(customATR, customNearATRFactor, customFarATRFactor, math.log(customEnvelopeClose))
// Colors
customUpperBoundaryColorFar = color.new(color.red, 60)
customUpperBoundaryColorNear = color.new(color.red, 80)
customBullishEstimatorColor = color.new(color.teal, 50)
customBearishEstimatorColor = color.new(color.red, 50)
customLowerBoundaryColorNear = color.new(color.teal, 80)
customLowerBoundaryColorFar = color.new(color.teal, 60)
// Plots
customUpperBoundaryFar = plot(math.exp(customUpperFar), color=customUpperBoundaryColorFar, title='Upper Boundary: Far (Custom)')
customUpperBoundaryAvg = plot(math.exp(customUpperAvg), color=customUpperBoundaryColorNear, title='Upper Boundary: Average (Custom)')
customUpperBoundaryNear = plot(math.exp(customUpperNear), color=customUpperBoundaryColorNear, title='Upper Boundary: Near (Custom)')
customEstimationPlot = plot(customEnvelopeClose, color=customEnvelope > customEnvelope[1] ? customBullishEstimatorColor : customBearishEstimatorColor, linewidth=2, title='Custom Estimation')
customLowerBoundaryNear = plot(math.exp(customLowerNear), color=customLowerBoundaryColorNear, title='Lower Boundary: Near (Custom)')
customLowerBoundaryAvg = plot(math.exp(customLowerAvg), color=customLowerBoundaryColorNear, title='Lower Boundary: Average (Custom)')
customLowerBoundaryFar = plot(math.exp(customLowerFar), color=customLowerBoundaryColorFar, title='Lower Boundary: Far (Custom)')
// Fills
fill(customUpperBoundaryFar, customUpperBoundaryAvg, color=customUpperBoundaryColorFar, title='Upper Boundary: Farmost Region (Custom)')
fill(customUpperBoundaryNear, customUpperBoundaryAvg, color=customUpperBoundaryColorNear, title='Upper Boundary: Nearmost Region (Custom)')
fill(customLowerBoundaryNear, customLowerBoundaryAvg, color=customLowerBoundaryColorNear, title='Lower Boundary: Nearmost Region (Custom)')
fill(customLowerBoundaryFar, customLowerBoundaryAvg, color=customLowerBoundaryColorFar, title='Lower Boundary: Farmost Region (Custom)')
longCondition = ta.crossover(close, customEnvelopeLow)
if (longCondition)
strategy.entry("Buy", strategy.long)
exitLongCondition = ta.crossover(customEnvelopeHigh, close)
if (exitLongCondition)
strategy.close("Buy")