डबल मूविंग एवरेज क्रॉसओवर रणनीति


निर्माण तिथि: 2023-12-13 15:51:13 अंत में संशोधित करें: 2023-12-13 15:51:13
कॉपी: 0 क्लिक्स: 1316
1
ध्यान केंद्रित करना
1621
समर्थक

डबल मूविंग एवरेज क्रॉसओवर रणनीति

अवलोकन

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

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

द्वि-समान-रेखा क्रॉस-बिट रणनीति के लिए गणना सूत्र निम्नानुसार हैः त्वरित रेखाएं (Hull Average Line): WMA (n/2) * WMA (value,n/2) - WMA (value,n), SQRT (n))
सुपर स्मूथर: मूल्य तीन गुना फ़िल्टर

इसमें, WMA भारित चलती औसत को दर्शाता है, SQRT खुला वर्गमूल को दर्शाता है, और फ़िल्टर में एक एक-अवधि और दो दो-अवधि विलंबता शामिल हैं।

रणनीतियाँ, जो कि फास्टलाइन और स्लोलाइन मानों की गणना करके दो लाइनों के बीच क्रॉस-रिलेशन को निर्धारित करती हैं, जिनमें सेः
शॉर्टलाइन पर शॉर्टलाइन को क्रॉस करना एक खरीद संकेत है यह एक विक्रय संकेत है।

श्रेष्ठता विश्लेषण

द्वि-समान-रेखा क्रॉस-पॉइंट रणनीति द्वि-समान-रेखा निर्णय और बिंदु व्यापार के फायदे के साथ संयुक्त है, जो प्रवृत्ति के मोड़ को सही ढंग से पकड़ने और समय पर प्रवेश करने और बाहर निकलने में सक्षम है। एकल-समान-रेखा रणनीति की तुलना में, निम्नलिखित फायदे हैंः

  1. द्वि-समान रेखा संयोजन झूठे संकेतों को समाप्त करता है। तेज रेखा प्रवृत्ति की दिशा और ताकत का निर्धारण करती है, धीमी रेखा झटके को फ़िल्टर करती है, जिससे संकेत अधिक विश्वसनीय होते हैं।
  2. सुपर स्मूथर फिल्टर के पास शक्तिशाली डेटा फिटिंग क्षमता है, जो मूल्य प्रवृत्तियों को प्रभावी ढंग से निकाल सकती है।
  3. Hull औसत मूल्य परिवर्तनों के प्रति संवेदनशील है और समय पर मोड़ को पकड़ सकता है।

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

हालांकि, यह भी कहा गया है कि द्वि-समान-रेखा क्रॉस-पॉइंट रणनीति के कुछ जोखिम हैंः

  1. झटके की स्थिति में, अधिक whipsaw सिग्नल दिखाई दे सकते हैं। झूठे सिग्नल को कम करने के लिए औसत रेखा अंतराल को उचित रूप से बढ़ाया जा सकता है।
  2. द्वि-समान-रेखा दूरी को चौड़ा करने से कुछ अवसरों को याद किया जा सकता है। सिग्नल की मात्रा और गुणवत्ता को संतुलित करना आवश्यक है।
  3. यह रणनीति स्पष्ट प्रवृत्ति वाली किस्मों के लिए उपयुक्त है और उच्च अस्थिरता वाले उत्पादों के लिए उपयुक्त नहीं है।

अनुकूलन दिशा

द्विध्रुवीय समानांतर बिंदु रणनीति को निम्नलिखित आयामों से अनुकूलित किया जा सकता हैः

  1. विभिन्न प्रकार के चक्रों और उतार-चढ़ावों के लिए औसत रेखा को समायोजित करें।
  2. एक अतिरिक्त सूचक या फ़िल्टर जोड़ें जो प्रवृत्ति की गुणवत्ता को कम करने के लिए whipsaw को कम करता है।
  3. ट्रेंड इंडिकेटर के साथ गठबंधन में स्थिति अनुपात का अनुकूलन करना।

संक्षेप

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

रणनीति स्रोत कोड
/*backtest
start: 2022-12-06 00:00:00
end: 2023-12-12 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
//

strategy(title='Open Close Cross Strategy ', shorttitle='sacinvesting', overlay=true, pyramiding=0, default_qty_type=strategy.percent_of_equity, default_qty_value=10, calc_on_every_tick=false)

// === INPUTS ===
useRes = input(defval=true, title='Use Alternate Resolution?')
intRes = input(defval=3, title='Multiplier for Alernate Resolution')
stratRes = timeframe.ismonthly ? str.tostring(timeframe.multiplier * intRes, '###M') : timeframe.isweekly ? str.tostring(timeframe.multiplier * intRes, '###W') : timeframe.isdaily ? str.tostring(timeframe.multiplier * intRes, '###D') : timeframe.isintraday ? str.tostring(timeframe.multiplier * intRes, '####') : '60'
basisType = input.string(defval='SMMA', title='MA Type: ', options=['SMA', 'EMA', 'DEMA', 'TEMA', 'WMA', 'VWMA', 'SMMA', 'HullMA', 'LSMA', 'ALMA', 'SSMA', 'TMA'])
basisLen = input.int(defval=8, title='MA Period', minval=1)
offsetSigma = input.int(defval=6, title='Offset for LSMA / Sigma for ALMA', minval=0)
offsetALMA = input.float(defval=0.85, title='Offset for ALMA', minval=0, step=0.01)
scolor = input(false, title='Show coloured Bars to indicate Trend?')
delayOffset = input.int(defval=0, title='Delay Open/Close MA (Forces Non-Repainting)', minval=0, step=1)
tradeType = input.string('BOTH', title='What trades should be taken : ', options=['LONG', 'SHORT', 'BOTH', 'NONE'])
// === /INPUTS ===

// Constants colours that include fully non-transparent option.
green100 = #008000FF
lime100 = #00FF00FF
red100 = #FF0000FF
blue100 = #0000FFFF
aqua100 = #00FFFFFF
darkred100 = #8B0000FF
gray100 = #808080FF

// === BASE FUNCTIONS ===
// Returns MA input selection variant, default to SMA if blank or typo.
variant(type, src, len, offSig, offALMA) =>
    v1 = ta.sma(src, len)  // Simple
    v2 = ta.ema(src, len)  // Exponential
    v3 = 2 * v2 - ta.ema(v2, len)  // Double Exponential
    v4 = 3 * (v2 - ta.ema(v2, len)) + ta.ema(ta.ema(v2, len), len)  // Triple Exponential
    v5 = ta.wma(src, len)  // Weighted
    v6 = ta.vwma(src, len)  // Volume Weighted
    v7 = 0.0
    sma_1 = ta.sma(src, len)  // Smoothed
    v7 := na(v7[1]) ? sma_1 : (v7[1] * (len - 1) + src) / len
    v8 = ta.wma(2 * ta.wma(src, len / 2) - ta.wma(src, len), math.round(math.sqrt(len)))  // Hull
    v9 = ta.linreg(src, len, offSig)  // Least Squares
    v10 = ta.alma(src, len, offALMA, offSig)  // Arnaud Legoux
    v11 = ta.sma(v1, len)  // Triangular (extreme smooth)
    // SuperSmoother filter
    // ©️ 2013 John F. Ehlers
    a1 = math.exp(-1.414 * 3.14159 / len)
    b1 = 2 * a1 * math.cos(1.414 * 3.14159 / len)
    c2 = b1
    c3 = -a1 * a1
    c1 = 1 - c2 - c3
    v12 = 0.0
    v12 := c1 * (src + nz(src[1])) / 2 + c2 * nz(v12[1]) + c3 * nz(v12[2])
    type == 'EMA' ? v2 : type == 'DEMA' ? v3 : type == 'TEMA' ? v4 : type == 'WMA' ? v5 : type == 'VWMA' ? v6 : type == 'SMMA' ? v7 : type == 'HullMA' ? v8 : type == 'LSMA' ? v9 : type == 'ALMA' ? v10 : type == 'TMA' ? v11 : type == 'SSMA' ? v12 : v1

// security wrapper for repeat calls
reso(exp, use, res) =>
    security_1 = request.security(syminfo.tickerid, res, exp, gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_on)
    use ? security_1 : exp

// === /BASE FUNCTIONS ===

// === SERIES SETUP ===
closeSeries = variant(basisType, close[delayOffset], basisLen, offsetSigma, offsetALMA)
openSeries = variant(basisType, open[delayOffset], basisLen, offsetSigma, offsetALMA)
// === /SERIES ===

// === PLOTTING ===

// Get Alternate resolution Series if selected.
closeSeriesAlt = reso(closeSeries, useRes, stratRes)
openSeriesAlt = reso(openSeries, useRes, stratRes)
//
trendColour = closeSeriesAlt > openSeriesAlt ? color.green : color.red
bcolour = closeSeries > openSeriesAlt ? lime100 : red100
barcolor(scolor ? bcolour : na, title='Bar Colours')
closeP = plot(closeSeriesAlt, title='Close Series', color=trendColour, linewidth=2, style=plot.style_line, transp=20)
openP = plot(openSeriesAlt, title='Open Series', color=trendColour, linewidth=2, style=plot.style_line, transp=20)
fill(closeP, openP, color=trendColour, transp=80)

// === /PLOTTING ===
//
//
// === ALERT conditions
xlong = ta.crossover(closeSeriesAlt, openSeriesAlt)
xshort = ta.crossunder(closeSeriesAlt, openSeriesAlt)
longCond = xlong  // alternative: longCond[1]? false : (xlong or xlong[1]) and close>closeSeriesAlt and close>=open
shortCond = xshort  // alternative: shortCond[1]? false : (xshort or xshort[1]) and close<closeSeriesAlt and close<=open
// === /ALERT conditions.

// === STRATEGY ===
// stop loss
slPoints = input.int(defval=0, title='Initial Stop Loss Points (zero to disable)', minval=0)
tpPoints = input.int(defval=0, title='Initial Target Profit Points (zero for disable)', minval=0)
// Include bar limiting algorithm
ebar = input.int(defval=10000, title='Number of Bars for Back Testing', minval=0)
dummy = input(false, title='- SET to ZERO for Daily or Longer Timeframes')
//
// Calculate how many mars since last bar
tdays = (timenow - time) / 60000.0  // number of minutes since last bar
tdays := timeframe.ismonthly ? tdays / 1440.0 / 5.0 / 4.3 / timeframe.multiplier : timeframe.isweekly ? tdays / 1440.0 / 5.0 / timeframe.multiplier : timeframe.isdaily ? tdays / 1440.0 / timeframe.multiplier : tdays / timeframe.multiplier  // number of bars since last bar
//
//set up exit parameters
TP = tpPoints > 0 ? tpPoints : na
SL = slPoints > 0 ? slPoints : na

// Make sure we are within the bar range, Set up entries and exit conditions
if (ebar == 0 or tdays <= ebar) and tradeType != 'NONE'
    strategy.entry('long', strategy.long, when=longCond == true and tradeType != 'SHORT')
    strategy.entry('short', strategy.short, when=shortCond == true and tradeType != 'LONG')
    strategy.close('long', when=shortCond == true and tradeType == 'LONG')
    strategy.close('short', when=longCond == true and tradeType == 'SHORT')
    strategy.exit('XL', from_entry='long', profit=TP, loss=SL)
    strategy.exit('XS', from_entry='short', profit=TP, loss=SL)

// === /STRATEGY ===
// eof