समतल चलती औसत रणनीति

लेखक:चाओझांग, दिनांक: 2023-11-06 10:29:24
टैगः

img

अवलोकन

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

रणनीति तर्क

रणनीति पहले समापन मूल्य को चिकनी करती है, जिसमें हेकेन आशी समापन मूल्य का उपयोग करने का विकल्प होता है। फिर यह कई चिकनी चलती औसत को ओवरले करने के लिए चिकनी एमए फ़ंक्शन को कॉल करती है। चिकनी एमए फ़ंक्शन पहले वैरिएंट फ़ंक्शन को कॉल करती है, जो विभिन्न प्रकार के चलती औसत जैसे एसएमए, ईएमए, डीएमए आदि उत्पन्न कर सकती है। वैरिएंट फ़ंक्शन निर्दिष्ट चलती औसत उत्पन्न करने के बाद, चिकनी एमए रिकर्सिव रूप से चिकनी को ओवरले करने के लिए वैरिएंट को कई बार कॉल करती है। इसके परिणामस्वरूप उच्च स्तर की चिकनी के साथ एक चलती औसत होता है। यह खरीद संकेत उत्पन्न करता है जब चिकनी एमए ऊपर जाता है और संकेत बेचता है जब यह नीचे जाता है।

लाभ विश्लेषण

  • चलती औसत के कई ओवरले प्रभावी रूप से बाजार शोर को फ़िल्टर कर सकते हैं और रुझानों की पहचान कर सकते हैं।
  • विभिन्न चलती औसत प्रकारों जैसे SMA, EMA, DEMA आदि का समर्थन करता है, लचीले संयोजन की अनुमति देता है।
  • हेकेन एशी तकनीक झूठी पलायनों को फ़िल्टर करती है।
  • सरल और लागू करने में आसान।
  • अनुकूलन योग्य एमए लंबाई, प्रकार और चिकनाई समय विभिन्न उत्पादों के लिए अनुकूलन की अनुमति देता है।

जोखिम विश्लेषण

  • कई बार समतल होने से देरी हो सकती है और शुरुआती रुझान परिवर्तनों को याद किया जा सकता है।
  • सरल एमए प्रणाली विभिन्न बाजारों में लाभ कमाने के लिए संघर्ष करती है।
  • लेन-देन की लागतों को अनदेखा करता है जो वास्तविक व्यापार में लाभप्रदता को कम करता है।
  • कोई स्टॉप लॉस नहीं है, जो बढ़े हुए नुकसान का जोखिम है।

सिग्नल सटीकता में सुधार के लिए एमएसीडी, केडीजे जैसे अन्य संकेतकों को जोड़ने पर विचार करें। लेग को कम करने के लिए एमए मापदंडों का अनुकूलन करें। एकल व्यापार हानि को नियंत्रित करने के लिए उचित स्टॉप लॉस का उपयोग करें। लेनदेन लागत को कम करने के लिए व्यापार आवृत्ति को भी नियंत्रित करें।

अनुकूलन दिशाएँ

  • सर्वोत्तम संयोजन के लिए विभिन्न एमए लंबाई और प्रकारों का परीक्षण करें।
  • अधिक व्यवस्थित प्रवेश और बाहर निकलने के नियमों के लिए अन्य तकनीकी संकेतकों को जोड़ें।
  • प्रमुख घटनाओं के प्रभाव से बचने के लिए ट्रेडिंग सत्र सेट करें।
  • उत्पाद की विशेषताओं के आधार पर मापदंडों को समायोजित करें।
  • जोखिमों को नियंत्रित करने के लिए स्टॉप लॉस और ले लाभ सेट करें।

सारांश

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


/*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 )




अधिक