এই কৌশলটি মূল্য এবং এনভেলপ ব্যান্ডের মধ্যে ক্রসওভার পরিস্থিতিগুলি ট্র্যাক করে কম কেনার এবং উচ্চ বিক্রয় করার ট্রেডিং সংকেত তৈরি করার জন্য নাদারায়া-ওয়াটসন কার্নেল রিগ্রেশন পদ্ধতির উপর ভিত্তি করে একটি গতিশীল অস্থিরতা এনভেলপ তৈরি করে। একটি গাণিতিক বিশ্লেষণ কাঠামোর সাহায্যে কৌশলটি বাজারের পরিবর্তনের সাথে নিজেকে মানিয়ে নিতে পারে।
কৌশলটির মূলটি হ'ল দামের গতিশীল এনভেলপ গণনা করা। প্রথমত, কাস্টম লুকব্যাক উইন্ডো ব্যবহার করে, এটি একটি মসৃণ মূল্য অনুমান পেতে দামের (বন্ধ, উচ্চ, নিম্ন) নাদারায়া-ওয়াটসন কার্নেল রিগ্রেশন বক্ররেখা তৈরি করে। তারপরে এটি একটি কাস্টম এটিআর দৈর্ঘ্যের উপর ভিত্তি করে এটিআর গণনা করে এবং কাছাকাছি এবং দূরবর্তী কারণগুলির সাথে উপরের এবং নীচের এনভেলপ ব্যান্ডগুলি গঠন করে। যখন দাম নীচে থেকে এনভেলপে ভেঙে যায়, তখন একটি ক্রয় সংকেত উত্পন্ন হয়। যখন দাম উপরে থেকে এনভেলপে ভেঙে যায়, তখন একটি বিক্রয় সংকেত ট্রিগার হয়। দাম এবং অস্থিরতা সম্পর্কিত পরিসংখ্যানগত বৈশিষ্ট্যগুলির মধ্যে গতিশীল সম্পর্ক ট্র্যাক করে, কৌশলটি তার ট্রেডিং সিদ্ধান্তগুলি অভিযোজিতভাবে সামঞ্জস্য করে।
সঠিক অপ্টিমাইজেশান, পর্যাপ্ত ব্যাকটেস্ট, মূল কারণগুলি বোঝা এবং লাইভ ট্রেডিংয়ে সতর্কতার সাথে অবস্থানের আকার নির্ধারণ এই ঝুঁকিগুলি হ্রাস করতে সহায়তা করতে পারে।
কৌশলটি মূল্য এবং অস্থিরতার মধ্যে সম্পর্ককে গতিশীলভাবে ট্র্যাক করে ট্রেডিং সিগন্যাল তৈরির জন্য পরিসংখ্যানগত বিশ্লেষণ এবং প্রযুক্তিগত সূচক বিশ্লেষণকে অন্তর্ভুক্ত করে। বাজারের পরিস্থিতি এবং ব্যক্তিগত প্রয়োজনের উপর ভিত্তি করে পরামিতিগুলি সামঞ্জস্য করা যেতে পারে। সামগ্রিকভাবে বলতে গেলে, দৃ the় তাত্ত্বিক ভিত্তি সত্ত্বেও, এর প্রকৃত পারফরম্যান্সের এখনও আরও যাচাইয়ের প্রয়োজন। একজনকে এটিকে সতর্কতার সাথে আচরণ করা উচিত এবং সতর্কতার সাথে বাণিজ্য করা উচিত।
/*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")