স্মুথড মুভিং এভারেজ ব্যান্ড কৌশল


সৃষ্টির তারিখ: 2023-12-11 14:48:35 অবশেষে সংশোধন করুন: 2023-12-11 14:48:35
অনুলিপি: 0 ক্লিকের সংখ্যা: 343

স্মুথড মুভিং এভারেজ ব্যান্ড কৌশল

ওভারভিউ

এই কৌশলটি প্রচলিত প্রবণতা-অনুসরণমূলক কৌশলগুলির মধ্যে একটি, যা প্রবণতা-অনুসরণমূলক কৌশলগুলির মধ্যে একটি, যা প্রবণতা-অনুসরণমূলক কৌশলগুলির মধ্যে একটি, যা প্রবাহিত চলমান গড় ব্যবহার করে প্রবাহিত মূল্যের ব্যান্ড তৈরি করে এবং রিয়েল-টাইম ফিল্টারিং প্রবণতা সক্ষম করার জন্য একাধিক প্রবাহিত গড়কে একত্রিত করে।

কৌশল নীতি

  1. একটি মসৃণ দামের ব্যান্ড নির্মাণের মাধ্যমে, একটি মসৃণ চলমান গড় ব্যবহার করে দামের পরিবর্তনের ট্র্যাকিং করা যায়।
  2. কৌশলটি EMA, SMMA, KAMA, ইত্যাদির মতো মসৃণ চলমান গড়ের গণনা হিসাবে বিভিন্ন ধরণের চলমান গড়ের ইনপুটকে সমর্থন করে।
  3. এই মুভিং এভারেজগুলির উপর 1-5 টি সুপারপ্লেসমেন্ট সমতলতা সমর্থন করে যাতে আরও মসৃণ দামের ব্যান্ড পাওয়া যায়।
  4. দাম এবং চলমান গড়ের মধ্যে ব্রিন ব্যান্ডের ব্যবহারকে সমর্থন করে, যা দামের পরিবর্তনকে আরও ভালভাবে ক্যাপচার করে।
  5. একটি অতিরিক্ত চলমান গড় ফিল্টার সক্ষম করে, আপনি আরও ভালভাবে ঝাঁকুনিগুলি ফিল্টার করতে পারেন এবং প্রবণতার দিকটি সনাক্ত করতে পারেন। ফিল্টারটি বিভিন্ন ধরণের চলমান গড়কে সমর্থন করে।
  6. মডেল আইডেন্টিফিকেশন ইন্ডিকেটর সহ, এটি ক্রয়-বিক্রয় সংকেতগুলির স্বয়ংক্রিয় সনাক্তকরণ সক্ষম করে।

এই কৌশলটি প্রচলিত প্রবণতা-অনুসরণ কৌশলগুলির মধ্যে একটি যা প্রবণতা-অনুসরণ কৌশলগুলির মধ্যে একটি যা প্রবণতা-অনুসরণ কৌশলগুলির মধ্যে একটি যা মূল্য প্রবণতা ক্যাপচার করে এবং প্রবণতা নিশ্চিত করার জন্য একটি চলমান গড় ফিল্টার অন্তর্ভুক্ত করে। প্যারামিটারগুলি সামঞ্জস্য করে যা বিভিন্ন জাতের বিভিন্ন পিরিয়ডের বাজারের পরিবেশের সাথে নমনীয়ভাবে মানিয়ে নিতে পারে।

কৌশলগত সুবিধা

  1. দামের ব্যান্ডগুলি তৈরি করা দামের পরিবর্তনের প্রবণতা আরও মসৃণভাবে ট্র্যাক করতে পারে, হারানো সুযোগের সম্ভাবনাকে কার্যকরভাবে হ্রাস করতে পারে।
  2. বিভিন্ন ধরনের চলমান গড় সমর্থন করে, যা বিভিন্ন সময়কাল এবং জাতের জন্য উপযুক্ত চলমান গড় নির্বাচন করতে পারে, কৌশলগুলির অভিযোজনযোগ্যতা বাড়ায়।
  3. ১-৫ বার সুপারপ্লেসমেন্ট মসৃণতা, মূল্য পরিবর্তনের ট্র্যাকিং ক্ষমতা উল্লেখযোগ্যভাবে উন্নত করতে পারে, আরো সঠিকভাবে প্রবণতা বিপর্যয় চিহ্নিত করতে পারে।
  4. চলমান গড় ফিল্টারগুলি কার্যকরভাবে অকার্যকর সংকেত হ্রাস করতে পারে এবং বিজয়ী হার বাড়িয়ে তুলতে পারে।
  5. চলমান গড়ের দৈর্ঘ্য পরিবর্তন করে, এটি বিভিন্ন সময়কালের সাথে খাপ খাইয়ে নিতে পারে, এমনকি একাধিক সময় ফ্রেমে যাচাই করতে পারে, যা কৌশলটির কার্যকারিতা আরও বাড়িয়ে তোলে।
  6. ব্ল্যাক গ্লাসের সাহায্যে, আপনি স্পষ্টভাবে এবং স্বজ্ঞাতভাবে দামের অঞ্চলের গতিবিধি দেখতে পারেন।

কৌশলগত ঝুঁকি

  1. দীর্ঘমেয়াদী প্রবণতা অনুসরণ করা শক্তিশালী, তবে স্বল্পমেয়াদী ওঠানামা অনুসরণ এবং প্রতিক্রিয়া দুর্বল, ঝড়ের পরিস্থিতিতে বেশি অকার্যকর সংকেত তৈরি করা সহজ।
  2. দামের দ্রুত পরিবর্তনের সাথে সাথে স্লাইডিং এভারেজগুলি কিছুটা পিছিয়ে যায় এবং সেরা সময়টি মিস করতে পারে।
  3. একাধিক ওভারল্যাপেড মুভিং এভারেজ দামের পরিবর্তনকে খুব মসৃণ করতে পারে, যার ফলে ক্রেতা এবং বিক্রেতার অবস্থান সনাক্ত করা যায় না।
  4. যদি সক্রিয় করা চলমান গড় দৈর্ঘ্যের পরামিতিটি ভুলভাবে সেট করা হয়, তাহলে এটি প্রচুর পরিমাণে মিথ্যা সংকেত তৈরি করতে পারে।

সমাধানঃ

  1. দামের পরিবর্তনের প্রতিক্রিয়া দ্রুততর করার জন্য, চলমান গড়ের দৈর্ঘ্য যথাযথভাবে সংক্ষিপ্ত করুন।
  2. অতিরিক্ত মসৃণতার সম্ভাবনা কমাতে ওভারল্যাপের সংখ্যা সামঞ্জস্য করুন।
  3. অপ্টিমাইজ করুন এবং চলমান গড় সমন্বয় পরীক্ষা করুন এবং সর্বোত্তম প্যারামিটার নির্বাচন করুন।
  4. অন্য সূচকগুলির সাথে মিলিতভাবে, একাধিক টাইম ফ্রেম যাচাইকরণ, মিথ্যা সংকেত হ্রাস।

কৌশল অপ্টিমাইজেশনের দিকনির্দেশনা

  1. চলমান গড়ের প্রকারের সংমিশ্রণটি পরীক্ষা করুন এবং সর্বোত্তম প্যারামিটার নির্বাচন করুন।
  2. পরীক্ষার জন্য একটি বিস্তৃত জাত এবং সময়কালের জন্য অপ্টিমাইজড চলমান গড় দৈর্ঘ্যের পরামিতি।
  3. বিভিন্ন স্তর সমতল করার চেষ্টা করুন এবং সর্বোত্তম ভারসাম্য খুঁজে বের করুন।
  4. ব্রিন ব্যান্ডেজকে সাহায্যকারী সূচক হিসেবে ব্যবহার করার চেষ্টা করুন।
  5. ফিল্টার হিসাবে বিভিন্ন অতিরিক্ত চলমান গড় পরীক্ষা করুন।
  6. অন্যান্য সূচকগুলির সাথে মিলিত একাধিক টাইমফ্রেম যাচাইকরণ

সারসংক্ষেপ

এই কৌশলটি প্রচলিত প্রবণতা অনুসরণকারী কৌশলগুলির মধ্যে একটি। এটি একটি সমতল চলমান গড় ব্যান্ড তৈরি করে যা মূল্যের প্রবণতাকে ক্রমাগত ট্র্যাক করে এবং সহায়ক ফিল্টারগুলির সাথে মিলিত হয়ে অকার্যকর সংকেত এড়ায়। কৌশলটির সুবিধা হ’ল সমতল মূল্যের ব্যান্ডগুলি তৈরি করা, যা মূল্যের প্রবণতার পরিবর্তনকে আরও ভালভাবে ক্যাপচার করতে পারে। একই সাথে, কিছুটা পিছিয়ে যাওয়ার ঝুঁকিও রয়েছে। প্যারামিটার অপ্টিমাইজেশন এবং সূচক অপ্টিমাইজেশনের মাধ্যমে কৌশলটির কার্যকারিতা ক্রমাগত বাড়ানো যেতে পারে, যা আরও গবেষণার জন্য উপযুক্ত।

কৌশল সোর্স কোড
/*backtest
start: 2023-12-03 00:00:00
end: 2023-12-10 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// Copyright (c) 2007-present Jurik Research and Consulting. All rights reserved.
// Copyright (c) 2018-present, Alex Orekhov (everget)
// Thanks to everget for code for more advanced moving averages
// Smooth Moving Average Ribbon [STRATEGY] @PuppyTherapy script may be freely distributed under the MIT license.
strategy( title="Smooth Moving Average Ribbon [STRATEGY] @PuppyTherapy", overlay=true )

// ---- CONSTANTS ----
lsmaOffset = 1
almaOffset = 0.85
almaSigma  = 6
phase = 2
power = 2

// ---- GLOBAL FUNCTIONS ----
kama(src, len)=>
    xvnoise = abs(src - src[1])
    nfastend = 0.666
    nslowend = 0.0645
    nsignal = abs(src - src[len])
    nnoise = sum(xvnoise, len)
    nefratio = iff(nnoise != 0, nsignal / nnoise, 0)
    nsmooth = pow(nefratio * (nfastend - nslowend) + nslowend, 2)
    nAMA = 0.0
    nAMA := nz(nAMA[1]) + nsmooth * (src - nz(nAMA[1]))

t3(src, len)=>
    xe1_1 = ema(src,    len)
    xe2_1 = ema(xe1_1,  len)
    xe3_1 = ema(xe2_1,  len)
    xe4_1 = ema(xe3_1,  len)
    xe5_1 = ema(xe4_1,  len)
    xe6_1 = ema(xe5_1,  len)
    b_1 = 0.7
    c1_1 = -b_1*b_1*b_1
    c2_1 = 3*b_1*b_1+3*b_1*b_1*b_1
    c3_1 = -6*b_1*b_1-3*b_1-3*b_1*b_1*b_1
    c4_1 = 1+3*b_1+b_1*b_1*b_1+3*b_1*b_1
    nT3Average_1 = c1_1 * xe6_1 + c2_1 * xe5_1 + c3_1 * xe4_1 + c4_1 * xe3_1
    
// The general form of the weights of the (2m + 1)-term Henderson Weighted Moving Average
getWeight(m, j) =>
    numerator = 315 * (pow(m + 1, 2) - pow(j, 2)) * (pow(m + 2, 2) - pow(j, 2)) * (pow(m + 3, 2) - pow(j, 2)) * (3 * pow(m + 2, 2) - 11 * pow(j, 2) - 16)
    denominator = 8 * (m + 2) * (pow(m + 2, 2) - 1) * (4 * pow(m + 2, 2) - 1) * (4 * pow(m + 2, 2) - 9) * (4 * pow(m + 2, 2) - 25)

    denominator != 0
         ? numerator / denominator
         : 0

hwma(src, termsNumber) =>
    sum = 0.0
    weightSum = 0.0
    
    termMult = (termsNumber - 1) / 2

    for i = 0 to termsNumber - 1
        weight = getWeight(termMult, i - termMult)
        sum := sum + nz(src[i]) * weight
        weightSum := weightSum + weight

    sum / weightSum

get_jurik(length, phase, power, src)=>
    phaseRatio = phase < -100 ? 0.5 : phase > 100 ? 2.5 : phase / 100 + 1.5
    beta = 0.45 * (length - 1) / (0.45 * (length - 1) + 2)
    alpha = pow(beta, power)
    jma = 0.0
    e0 = 0.0
    e0 := (1 - alpha) * src + alpha * nz(e0[1])
    e1 = 0.0
    e1 := (src - e0) * (1 - beta) + beta * nz(e1[1])
    e2 = 0.0
    e2 := (e0 + phaseRatio * e1 - nz(jma[1])) * pow(1 - alpha, 2) + pow(alpha, 2) * nz(e2[1])
    jma := e2 + nz(jma[1])

variant(src, type, len ) =>
    v1 = sma(src, len)                                                  // Simple
    v2 = ema(src, len)                                                  // Exponential
    v3 = 2 * v2 - ema(v2, len)                                          // Double Exponential
    v4 = 3 * (v2 - ema(v2, len)) + ema(ema(v2, len), len)               // Triple Exponential
    v5 = wma(src, len)                                                  // Weighted
    v6 = vwma(src, len)                                                 // Volume Weighted
    v7 = na(v5[1]) ? sma(src, len) : (v5[1] * (len - 1) + src) / len    // Smoothed
    v8 = wma(2 * wma(src, len / 2) - wma(src, len), round(sqrt(len)))   // Hull
    v9 = linreg(src, len, lsmaOffset)                                   // Least Squares
    v10 = alma(src, len, almaOffset, almaSigma)                         // Arnaud Legoux
    v11 = kama(src, len)                                                // KAMA
    ema1 = ema(src, len)
    ema2 = ema(ema1, len)
    v13 = t3(src, len)                                                  // T3
    v14 = ema1+(ema1-ema2)                                              // Zero Lag Exponential
    v15 = hwma(src, len)                                                // Henderson Moving average thanks to  @everget
    ahma = 0.0
    ahma := nz(ahma[1]) + (src - (nz(ahma[1]) + nz(ahma[len])) / 2) / len //Ahrens Moving Average 
    v16 = ahma
    v17 = get_jurik( len, phase, power, src) 
    type=="EMA"?v2 : type=="DEMA"?v3 : type=="TEMA"?v4 : type=="WMA"?v5 : type=="VWMA"?v6 :
     type=="SMMA"?v7 : type=="Hull"?v8 : type=="LSMA"?v9 : type=="ALMA"?v10 : type=="KAMA"?v11 :
     type=="T3"?v13 : type=="ZEMA"?v14 : type=="HWMA"?v15 : type=="AHMA"?v16 : type=="JURIK"?v17 : v1

smoothMA(o, h, l, c, maLoop, type, len) =>
	ma_o = 0.0
	ma_h = 0.0
	ma_l = 0.0
	ma_c = 0.0
	if maLoop == 1
		ma_o := variant(o, type, len)
		ma_h := variant(h, type, len)
		ma_l := variant(l, type, len)
		ma_c := variant(c, type, len)
	if maLoop == 2
		ma_o := variant(variant(o ,type, len),type, len)
		ma_h := variant(variant(h ,type, len),type, len)
		ma_l := variant(variant(l ,type, len),type, len)
		ma_c := variant(variant(c ,type, len),type, len)
	if maLoop == 3
		ma_o := variant(variant(variant(o ,type, len),type, len),type, len)
		ma_h := variant(variant(variant(h ,type, len),type, len),type, len)
		ma_l := variant(variant(variant(l ,type, len),type, len),type, len)
		ma_c := variant(variant(variant(c ,type, len),type, len),type, len)
	if maLoop == 4
		ma_o := variant(variant(variant(variant(o ,type, len),type, len),type, len),type, len)
		ma_h := variant(variant(variant(variant(h ,type, len),type, len),type, len),type, len)
		ma_l := variant(variant(variant(variant(l ,type, len),type, len),type, len),type, len)
		ma_c := variant(variant(variant(variant(c ,type, len),type, len),type, len),type, len)
	if maLoop == 5
		ma_o := variant(variant(variant(variant(variant(o ,type, len),type, len),type, len),type, len),type, len)
		ma_h := variant(variant(variant(variant(variant(h ,type, len),type, len),type, len),type, len),type, len)
		ma_l := variant(variant(variant(variant(variant(l ,type, len),type, len),type, len),type, len),type, len)
		ma_c := variant(variant(variant(variant(variant(c ,type, len),type, len),type, len),type, len),type, len)
    [ma_o, ma_h, ma_l, ma_c]

smoothHA( o, h, l, c ) =>
    hao = 0.0
    hac = ( o + h + l + c ) / 4
    hao := na(hao[1])?(o + c / 2 ):(hao[1] + hac[1])/2
    hah = max(h, max(hao, hac))
    hal = min(l, min(hao, hac))
	[hao, hah, hal, hac]

// ---- Main Ribbon ----
haSmooth   = input(true, title=" Use HA as source ? " )
length     = input(11, title=" MA1 Length", minval=1, maxval=1000)
maLoop     = input(3, title=" Nr. of MA1 Smoothings ", minval=1, maxval=5)
type       = input("EMA", title="MA Type", options=["SMA", "EMA", "DEMA", "TEMA", "WMA", "VWMA", "SMMA", "Hull", "LSMA", "ALMA", "KAMA", "ZEMA", "HWMA", "AHMA", "JURIK", "T3"])
haSmooth2  = input(true, title=" Use HA as source ? " )

// ---- Trend ----
ma_use    = input(true, title=" ----- Use MA Filter ( For Lower Timeframe Swings / Scalps ) ? ----- " )
ma_source = input(defval = close, title = "MA - Source", type = input.source)
ma_length = input(100,title="MA - Length", minval=1 )
ma_type   = input("SMA", title="MA - Type", options=["SMA", "EMA", "DEMA", "TEMA", "WMA", "VWMA", "SMMA", "Hull", "LSMA", "ALMA", "KAMA", "ZEMA", "HWMA", "AHMA", "JURIK", "T3"])
ma_useHA  = input(defval = false, title = "Use HA Candles as Source ?")
ma_rsl    = input(true, title = "Use Rising / Falling Logic ?" )

// ---- BODY SCRIPT ----
[ ha_open, ha_high, ha_low, ha_close ] = smoothHA(open, high, low, close)

_open_ma  = haSmooth ? ha_open : open
_high_ma  = haSmooth ? ha_high : high
_low_ma   = haSmooth ? ha_low : low
_close_ma = haSmooth ? ha_close : close

[ _open, _high, _low, _close ] = smoothMA( _open_ma, _high_ma, _low_ma, _close_ma, maLoop, type, length)
[ ha_open2, ha_high2, ha_low2, ha_close2 ] = smoothHA(_open, _high, _low, _close)

_open_ma2  = haSmooth2 ? ha_open2 : _open
_high_ma2  = haSmooth2 ? ha_high2 : _high
_low_ma2   = haSmooth2 ? ha_low2 : _low
_close_ma2 = haSmooth2 ? ha_close2 : _close

ribbonColor = _close_ma2 > _open_ma2 ? color.lime : color.red
p_open  = plot(_open_ma2,  title="Ribbon - Open",   color=ribbonColor, transp=70)
p_close = plot(_close_ma2, title="Ribbon - Close",  color=ribbonColor, transp=70)
fill(p_open, p_close, color = ribbonColor, transp = 40 )

// ----- FILTER

ma = 0.0
if ma_use == true
    ma := variant( ma_useHA ? ha_close : ma_source, ma_type,  ma_length )

maFilterShort = ma_use ? ma_rsl ? falling(ma,1) : ma_useHA ? ha_close : close < ma : true 
maFilterLong  = ma_use ? ma_rsl ? rising(ma,1) : ma_useHA ? ha_close : close > ma : true 


colorTrend = rising(ma,1) ? color.green : color.red
plot( ma_use ? ma : na, title="MA Trend",  color=colorTrend, transp=80, transp=70, linewidth = 5)

long     = crossover(_close_ma2, _open_ma2 ) and maFilterLong
short    = crossunder(_close_ma2, _open_ma2 ) and maFilterShort
closeAll = cross(_close_ma2, _open_ma2 )

plotshape( short , title="Short", color=color.red,  transp=80, style=shape.triangledown, location=location.abovebar, size=size.small)
plotshape( long ,  title="Long",  color=color.lime, transp=80, style=shape.triangleup,   location=location.belowbar, size=size.small)

//* Backtesting Period Selector | Component *//
//* Source: https://www.tradingview.com/script/eCC1cvxQ-Backtesting-Period-Selector-Component *//
testStartYear   = input(2018, "Backtest Start Year",minval=1980)
testStartMonth  = input(1, "Backtest Start Month",minval=1,maxval=12)
testStartDay    = input(1, "Backtest Start Day",minval=1,maxval=31)
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)
testStopYear    = 9999 //input(9999, "Backtest Stop Year",minval=1980)
testStopMonth   = 12 // input(12, "Backtest Stop Month",minval=1,maxval=12)
testStopDay     = 31 //input(31, "Backtest Stop Day",minval=1,maxval=31)
testPeriodStop  = timestamp(testStopYear,testStopMonth,testStopDay,0,0)
testPeriod() => time >= testPeriodStart and time <= testPeriodStop ? true : false

if testPeriod() and long
    strategy.entry( "long", strategy.long )

if testPeriod() and short
    strategy.entry( "short", strategy.short )
    
if closeAll
    strategy.close_all( when = closeAll )