স্লোয়েড মুভিং এভারেজ কৌশল

লেখক:চাওঝাং, তারিখঃ ২০২৩-১১-০৬ ১০ঃ২৯ঃ২৪
ট্যাগঃ

img

সারসংক্ষেপ

এই কৌশলটি একটি সহজ প্রবণতা অনুসরণকারী কৌশল বাস্তবায়নের জন্য একাধিক চলমান গড়কে একত্রিত করে। এটিতে গোলমাল ফিল্টার করার কার্যকারিতাও রয়েছে।

কৌশলগত যুক্তি

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

সুবিধা বিশ্লেষণ

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

ঝুঁকি বিশ্লেষণ

  • একাধিক মসৃণকরণ বিলম্বিত হতে পারে এবং প্রারম্ভিক ট্রেন্ড পরিবর্তন মিস করতে পারে।
  • সহজ এমএ সিস্টেম বিভিন্ন বাজারে লাভের জন্য সংগ্রাম করে।
  • লেনদেনের খরচ উপেক্ষা করে যা প্রকৃত ব্যবসায়ের লাভজনকতা হ্রাস করে।
  • স্টপ লস নেই, বড় ক্ষতির ঝুঁকি আছে।

সিগন্যালের নির্ভুলতা উন্নত করতে এমএসিডি, কেডিজে এর মতো অন্যান্য সূচকগুলির সংমিশ্রণ বিবেচনা করুন। বিলম্ব হ্রাস করতে এমএ পরামিতিগুলি অনুকূল করুন। একক বাণিজ্য ক্ষতি নিয়ন্ত্রণ করতে যুক্তিসঙ্গত স্টপ লস ব্যবহার করুন। লেনদেনের ব্যয় হ্রাস করতে বাণিজ্য ফ্রিকোয়েন্সিও নিয়ন্ত্রণ করুন।

অপ্টিমাইজেশান নির্দেশাবলী

  • সর্বোত্তম সমন্বয়ের জন্য বিভিন্ন এমএ দৈর্ঘ্য এবং প্রকার পরীক্ষা করুন।
  • আরো পদ্ধতিগত প্রবেশ এবং প্রস্থান নিয়মের জন্য অন্যান্য প্রযুক্তিগত সূচক যোগ করুন।
  • বড় ইভেন্টের প্রভাব এড়াতে ট্রেডিং সেশন সেট করুন।
  • পণ্যের বৈশিষ্ট্য অনুযায়ী পরামিতিগুলি সামঞ্জস্য করুন।
  • ঝুঁকি নিয়ন্ত্রণের জন্য স্টপ লস সেট করুন এবং লাভ নিন।

সংক্ষিপ্তসার

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


/*backtest
start: 2022-10-30 00:00:00
end: 2023-11-05 00:00:00
period: 1d
basePeriod: 1h
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 [STRATEGY] @PuppyTherapy script may be freely distributed under the MIT license.
strategy( title="Smooth Moving Average [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(c, maLoop, type, len) =>
	ma_c = 0.0
	if maLoop == 1
		ma_c := variant(c, type, len)
	if maLoop == 2
		ma_c := variant(variant(c ,type, len),type, len)
	if maLoop == 3
		ma_c := variant(variant(variant(c ,type, len),type, len),type, len)
	if maLoop == 4
		ma_c := variant(variant(variant(variant(c ,type, len),type, len),type, len),type, len)
	if maLoop == 5
		ma_c := variant(variant(variant(variant(variant(c ,type, len),type, len),type, len),type, len),type, len)
	ma_c

// Smoothing HA Function
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 Selection ----
haSmooth   = input(false, title=" Use HA as source ? " )
length     = input(60, title=" MA1 Length", minval=1, maxval=1000)
maLoop     = input(2, 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"])

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

_close_ma = haSmooth ? ha_close : close

_close_smoothed_ma = smoothMA( _close_ma, maLoop, type, length)

maColor = _close_smoothed_ma > _close_smoothed_ma[1] ? color.lime : color.red
plot(_close_smoothed_ma, title= "MA - Trend",  color=maColor, transp=85, linewidth = 4)

long     = _close_smoothed_ma > _close_smoothed_ma[1] and _close_smoothed_ma[1] < _close_smoothed_ma[2]
short    = _close_smoothed_ma < _close_smoothed_ma[1] and _close_smoothed_ma[1] > _close_smoothed_ma[2]

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 )




আরো