सुचारू मूविंग एवरेज बैंड रणनीति


निर्माण तिथि: 2023-12-11 14:48:35 अंत में संशोधित करें: 2023-12-11 14:48:35
कॉपी: 0 क्लिक्स: 343
1
ध्यान केंद्रित करना
1141
समर्थक

सुचारू मूविंग एवरेज बैंड रणनीति

अवलोकन

इस रणनीति का उपयोग कर एक चिकनी चलती औसत के निर्माण के लिए एक चिकनी मूल्य बैंड और एकीकरण के कई प्रकार के चिकनी चलती औसत के लिए एक वास्तविक समय में फ़िल्टर प्रवृत्ति की सुविधा है, जो एक विशिष्ट प्रवृत्ति का पालन कर रहे रणनीति है.

रणनीति सिद्धांत

  1. कीमतों के परिवर्तनों को ट्रैक करने के लिए एक चिकनी चलती औसत का उपयोग करके एक चिकनी मूल्य बैंड का निर्माण करके।
  2. नीति में EMA, SMMA, KAMA, आदि जैसे विभिन्न प्रकार के चलती औसत को समतल चलती औसत के रूप में दर्ज करने का समर्थन है।
  3. एक अधिक चिकनी मूल्य पट्टी प्राप्त करने के लिए इन चलती औसतों को 1-5 बार सरलीकृत करने का समर्थन करता है।
  4. मूल्य परिवर्तन को बेहतर ढंग से पकड़ने के लिए मूल्य और चलती औसत के बीच ब्रिन बैंड का उपयोग करने का समर्थन करता है।
  5. एक अतिरिक्त चलती औसत फ़िल्टर को सक्षम करके, आप प्रवृत्ति की दिशा को पहचानने के लिए बेहतर रूप से झटके को फ़िल्टर कर सकते हैं। फ़िल्टर कई प्रकार के चलती औसत प्रकारों का भी समर्थन करता है।
  6. आकृति पहचान सूचक के साथ, खरीद और बेचने के संकेतों की स्वचालित पहचान की जा सकती है।

यह रणनीति मूल्य प्रवृत्तियों को पकड़ने के लिए एक चिकनी मूल्य बैंड का निर्माण करके और प्रवृत्ति की दिशा की पुष्टि करने के लिए एक चलती औसत फ़िल्टर को एकीकृत करके एक विशिष्ट प्रवृत्ति अनुवर्ती रणनीति है। पैरामीटर को समायोजित करके, यह विभिन्न प्रकार के विभिन्न चक्रों के लिए बाजार की स्थिति के लिए लचीलापन प्रदान करता है।

रणनीतिक लाभ

  1. मूल्य बैंड के निर्माण से कीमतों में बदलाव के रुझानों को अधिक सुचारू रूप से ट्रैक किया जा सकता है, जिससे छूटने की संभावना कम हो जाती है।
  2. विभिन्न प्रकार के चलती औसत का समर्थन करें, जो विभिन्न चक्रों और किस्मों के अनुसार उपयुक्त चलती औसत का चयन करने के लिए, रणनीति की अनुकूलनशीलता को बढ़ाता है।
  3. 1-5 बार ओवरले स्मूद, कीमतों में बदलाव को ट्रैक करने की क्षमता में काफी सुधार करता है, और रुझान मोड़ बिंदुओं को अधिक सटीक रूप से पकड़ता है।
  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 )