संसाधन लोड हो रहा है... लोड करना...

चिकनी चलती औसत रिबन रणनीति

लेखक:चाओझांग, दिनांक: 2023-12-11 14:48:35
टैगः

img

अवलोकन

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

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

  1. चिकनी चलती औसत का उपयोग करके कीमत परिवर्तनों को ट्रैक करने के लिए एक चिकनी मूल्य बैंड का निर्माण करें।
  2. यह रणनीति सुचारू चलती औसत के लिए गणना विधि के रूप में विभिन्न चलती औसत प्रकारों का समर्थन करती है, जैसे कि ईएमए, एसएमएमए, केएएमए आदि।
  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 )


अधिक