मल्टी-टाइम फ़्रेम एमए मोंड्रियन क्रॉसओवर रणनीति


निर्माण तिथि: 2023-11-16 17:28:43 अंत में संशोधित करें: 2023-11-16 17:28:43
कॉपी: 0 क्लिक्स: 661
1
ध्यान केंद्रित करना
1617
समर्थक

मल्टी-टाइम फ़्रेम एमए मोंड्रियन क्रॉसओवर रणनीति

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

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

  1. उपयोगकर्ता द्वारा अनुकूलित समय सीमा दर्ज करें।

  2. Heikin-Ashi मानचित्र का उपयोग कर या नहीं करने के लिए इनपुट करें, डिफ़ॉल्ट रूप से।

  3. धीमी एमए लाइन, तेज एमए लाइन और वैकल्पिक तीसरी धड़कन के लिए एमए लाइन को परिभाषित करें।

  4. प्रत्येक MA लाइन के लिए MA प्रकार, समय अवधि और पैरामीटर आदि को अनुकूलित किया जा सकता है।

  5. तेजी से एमए के आधार पर, धीमी गति से एमए के माध्यम से एक खरीद संकेत और एक बेचने का संकेत होता है।

  6. एक बहु-दिशात्मक फ़िल्टर के रूप में एक तीसरे एमए लाइन का उपयोग करना विकल्प है, जो केवल खरीद संकेत उत्पन्न करता है जब समापन मूल्य तीसरे एमए से अधिक हो।

  7. स्वचालित व्यापार के लिए strategy.entry मॉड्यूल का उपयोग करना।

  8. प्रति लेनदेन की संख्या को अनुकूलित किया जा सकता है या एक निश्चित लेनदेन मात्रा का उपयोग किया जा सकता है।

रणनीतिक लाभ

  1. MTF आर्किटेक्चर का उपयोग करते हुए, विभिन्न MA लाइनों को विभिन्न समय-सीमाओं पर प्रवृत्ति विशेषताओं की पहचान करने के लिए अलग-अलग समय-सीमाओं का उपयोग किया जा सकता है।

  2. अनुकूलित एमए प्रकार, एक चिकनी एमए को स्थिरता बढ़ाने के लिए चुना जा सकता है, या एक चुस्त एमए की प्रतिक्रिया का चयन किया जा सकता है।

  3. हेइकिन-आशी के संयोजन में, यह फ़िल्टर करने योग्य है।

  4. मल्टीहेड डायरेक्शन फिल्टर के रूप में एक तीसरी एमए लाइन को अतिरिक्त रूप से जोड़ा जा सकता है, जिससे कि आघात ट्रेडिंग से बचा जा सके।

  5. विभिन्न बाजार स्थितियों के लिए एमए चक्र पैरामीटर को लचीले ढंग से समायोजित करें।

  6. strategy.entry मॉड्यूल का उपयोग करके स्वचालित रूप से ऑर्डर करने के लिए, मैन्युअल हस्तक्षेप के बिना लेनदेन की आवश्यकता होती है।

  7. ऑप्टिमाइज़ेशन मापदंडों को पुनः मापने के लिए समर्थन, सबसे अच्छा मापदंडों का संयोजन ढूंढना।

रणनीतिक जोखिम

  1. MA क्रॉसिंग रणनीतियाँ झूठे संकेतों को तोड़ने के लिए संवेदनशील हैं और अनावश्यक ट्रेडों का उत्पादन कर सकती हैं। जोखिम को कम करने के लिए MA चक्र को उचित रूप से समायोजित किया जा सकता है या फ़िल्टरिंग शर्तों को बढ़ाया जा सकता है।

  2. अस्थिरता के दौरान, एमए लाइनें अक्सर पार हो जाती हैं, जिससे नुकसान हो सकता है। जोखिम को कम करने के लिए एमए अंतराल को उचित रूप से चौड़ा किया जा सकता है या एमए चक्र को बढ़ाया जा सकता है।

  3. निश्चित ट्रेड वॉल्यूम जोखिम को नियंत्रित नहीं कर सकता है, ट्रेड वॉल्यूम को खाते की राशि के प्रतिशत के रूप में सेट करने पर विचार करें।

  4. ट्रेडिंग शुल्क और स्लिप पॉइंट भी रणनीति की लाभप्रदता को प्रभावित करते हैं। जीत की पर्याप्त दर सुनिश्चित करने के लिए पैरामीटर को उचित रूप से समायोजित किया जा सकता है।

अनुकूलन दिशा

  1. विभिन्न प्रकार के एमए का परीक्षण करें, सबसे अच्छा संयोजन खोजने के लिए। चिकनी एमए स्थिरता को बढ़ाता है, तेज एमए चपलता को बढ़ाता है।

  2. एमए के पैरामीटर को अनुकूलित करें, उचित लंबाई की अवधि प्रवृत्ति की पहचान करने के लिए फायदेमंद है, छोटी अवधि संवेदनशीलता को बढ़ा सकती है।

  3. स्टॉक खोलने की स्थिति को अनुकूलित करें, मल्टीहेड फ़िल्टरिंग को मजबूत करने पर विचार करें, और अस्थिर बाजारों में स्टॉक खोलने से बचें।

  4. MA चक्र पैरामीटर को किसी विशेष किस्म के लिए अनुकूलित किया जा सकता है, जो कि किस्म के व्यापारिक वातावरण के लिए सबसे उपयुक्त है।

  5. अन्य संकेतकों के साथ संयोजन पर विचार किया जा सकता है जो फ़िल्टर के रूप में रणनीतिक स्थिरता को बढ़ा सकते हैं, जैसे कि व्यापार मात्रा ऊर्जा सूचक आदि।

  6. प्रतिक्रिया डेटा के लिए पैरामीटर संयोजन का अनुकूलन करें, रणनीति प्रभावशीलता को बढ़ाने के लिए सर्वोत्तम पैरामीटर खोजें।

संक्षेप

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

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

//@version=4
strategy(shorttitle="MZ MA Cross",title="MA MTF Cross Strategy", overlay=true, calc_on_order_fills=false, calc_on_every_tick=false, default_qty_type=strategy.fixed, default_qty_value=5,commission_value=0.1)

timeFrameticker  = input('D',type=input.resolution, title="Chart Timeframe")
uha   =input(true, title="Use Heikin Ashi Candles")

// Use only Heikinashi Candles for all calculations
haclose = uha ? security(heikinashi(syminfo.tickerid), timeFrameticker, close) : security(syminfo.tickerid, timeFrameticker, close)
haopen = uha ? security(heikinashi(syminfo.tickerid), timeFrameticker, open) : security(syminfo.tickerid, timeFrameticker, open)
hahigh = uha ? security(heikinashi(syminfo.tickerid), timeFrameticker, high) : security(syminfo.tickerid, timeFrameticker, high)
halow = uha ?security(heikinashi(syminfo.tickerid), timeFrameticker, low) : security(syminfo.tickerid, timeFrameticker, low)

//Backtest dates
fromMonth = input(defval = 1,    title = "From Month",      type = input.integer, minval = 1, maxval = 12)
fromDay   = input(defval = 1,    title = "From Day",        type = input.integer, minval = 1, maxval = 31)
fromYear  = input(defval = 2021, title = "From Year",       type = input.integer, minval = 1970)
thruMonth = input(defval = 12,    title = "Thru Month",      type = input.integer, minval = 1, maxval = 12)
thruDay   = input(defval = 30,    title = "Thru Day",        type = input.integer, minval = 1, maxval = 31)
thruYear  = input(defval = 2021, title = "Thru Year",       type = input.integer, minval = 1970)

showDate  = input(defval = true, title = "Show Date Range", type = input.bool)

start     = timestamp(fromYear, fromMonth, fromDay, 00, 00)        // backtest start window
finish    = timestamp(thruYear, thruMonth, thruDay, 23, 59)        // backtest finish window
window()  => true

src = security(heikinashi(syminfo.tickerid), timeFrameticker, close)

//  INPUT MA TYPE
slowMAtype = input(title="Slow MA Type", type=input.string, defval="LRC", options=["SMA","EMA","DEMA","TEMA","LRC","WMA","MF","VAMA","TMA","HMA", "JMA", "Kijun v2", "EDSMA","McGinley"])
fastMAtype = input(title="Fast MA Type", type=input.string, defval="EDSMA", options=["SMA","EMA","DEMA","TEMA","LRC","WMA","MF","VAMA","TMA","HMA", "JMA", "Kijun v2", "EDSMA","McGinley"])
upMAcond =input(false, title="Use Uptrend Conditional 3rd MA for Confirmation")
upMAtype=input(title="Uptrend Conditional MA Type", type=input.string, defval="HMA", options=["SMA","EMA","DEMA","TEMA","LRC","WMA","MF","VAMA","TMA","HMA", "JMA", "Kijun v2", "EDSMA","McGinley"])


//  INPUT RESOLUTION
slowMAresolution = input("D",type=input.resolution, title="Slow MA Resolution")
fastMAresolution = input("D",type=input.resolution, title="Fast MA Resolution")
upMAresolution = input("D",type=input.resolution, title="Uptrend Conditional MA Resolution")
haMAslow = uha ? security(heikinashi(syminfo.tickerid), slowMAresolution, close) : security(syminfo.tickerid, slowMAresolution, close)
haMAfast = uha ?security(heikinashi(syminfo.tickerid), fastMAresolution, close) : security(syminfo.tickerid, fastMAresolution, close)
haMAup =  uha ?security(heikinashi(syminfo.tickerid), upMAresolution, close) : security(syminfo.tickerid, upMAresolution, close)

//  INPUT LENGTHS
slowMAlength = input(50, minval=1, title="Slow MA Length")
fastMAlength = input(30, minval=1, title="Fast MA Length")
upMAlength =  input(200, minval=1, title="Uptrend Conditional MA Length")

/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
/////                      MA Function                         //////
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////

//           Pre-reqs
//
tema(src, len) =>
    ema1 = ema(src, len)
    ema2 = ema(ema1, len)
    ema3 = ema(ema2, len)
    (3 * ema1) - (3 * ema2) + ema3
kidiv = input(defval=1,maxval=4,  title="Kijun MOD Divider")

jurik_phase = input(title="* Jurik (JMA) Only - Phase", type=input.integer, defval=3)
jurik_power = input(title="* Jurik (JMA) Only - Power", type=input.integer, defval=1)
volatility_lookback = input(10, title="* Volatility Adjusted (VAMA) Only - Volatility lookback length")
//                  MF
beta = input(0.8,minval=0,maxval=1,step=0.1,  title="Modular Filter, General Filter Only - Beta")
feedback = input(false, title="Modular Filter Only - Feedback")
z = input(0.5,title="Modular Filter Only - Feedback Weighting",step=0.1, minval=0, maxval=1)
//EDSMA
ssfLength = input(title="EDSMA - Super Smoother Filter Length", type=input.integer, minval=1, defval=20)
ssfPoles = input(title="EDSMA - Super Smoother Filter Poles", type=input.integer, defval=2, options=[2, 3])

//----
//                  EDSMA
get2PoleSSF(src, length) =>
    PI = 2 * asin(1)
    arg = sqrt(2) * PI / length
    a1 = exp(-arg)
    b1 = 2 * a1 * cos(arg)
    c2 = b1
    c3 = -pow(a1, 2)
    c1 = 1 - c2 - c3
    
    ssf = 0.0
    ssf := c1 * src + c2 * nz(ssf[1]) + c3 * nz(ssf[2])

get3PoleSSF(src, length) =>
    PI = 2 * asin(1)

    arg = PI / length
    a1 = exp(-arg)
    b1 = 2 * a1 * cos(1.738 * arg)
    c1 = pow(a1, 2)

    coef2 = b1 + c1
    coef3 = -(c1 + b1 * c1)
    coef4 = pow(c1, 2)
    coef1 = 1 - coef2 - coef3 - coef4

    ssf = 0.0
    ssf := coef1 * src + coef2 * nz(ssf[1]) + coef3 * nz(ssf[2]) + coef4 * nz(ssf[3])

//          MA Main function
ma(type, src, len) =>
    float result = 0
    if type=="TMA"
        result := sma(sma(src, ceil(len / 2)), floor(len / 2) + 1)
    if type=="MF"
        ts=0.,b=0.,c=0.,os=0.
        //----
        alpha = 2/(len+1)
        a = feedback ? z*src + (1-z)*nz(ts[1],src) : src
        //----
        b := a > alpha*a+(1-alpha)*nz(b[1],a) ? a : alpha*a+(1-alpha)*nz(b[1],a)
        c := a < alpha*a+(1-alpha)*nz(c[1],a) ? a : alpha*a+(1-alpha)*nz(c[1],a)
        os := a == b ? 1 : a == c ? 0 : os[1]
        //----
        upper = beta*b+(1-beta)*c
        lower = beta*c+(1-beta)*b 
        ts := os*upper+(1-os)*lower
        result := ts
    if type=="LRC"
        result := linreg(src, len, 0)
    if type=="SMA" // Simple
        result := sma(src, len)
    if type=="EMA" // Exponential
        result := ema(src, len)
    if type=="DEMA" // Double Exponential
        e = ema(src, len)
        result := 2 * e - ema(e, len)
    if type=="TEMA" // Triple Exponential
        e = ema(src, len)
        result := 3 * (e - ema(e, len)) + ema(ema(e, len), len)
    if type=="WMA" // Weighted
        result := wma(src, len)
    if type=="VAMA" // Volatility Adjusted
        /// Copyright © 2019 to present, Joris Duyck (JD)
        mid=ema(src,len)
        dev=src-mid
        vol_up=highest(dev,volatility_lookback)
        vol_down=lowest(dev,volatility_lookback)
        result := mid+avg(vol_up,vol_down)
    if type=="HMA" // Hull
        result := wma(2 * wma(src, len / 2) - wma(src, len), round(sqrt(len)))
    if type=="JMA" // Jurik
        /// Copyright © 2018 Alex Orekhov (everget)
        /// Copyright © 2017 Jurik Research and Consulting.
        phaseRatio = jurik_phase < -100 ? 0.5 : jurik_phase > 100 ? 2.5 : jurik_phase / 100 + 1.5
        beta = 0.45 * (len - 1) / (0.45 * (len - 1) + 2)
        alpha = pow(beta, jurik_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])
        result := jma
    if type=="Kijun v2"
        kijun = avg(lowest(len), highest(len))//, (open + close)/2)
        conversionLine = avg(lowest(len/kidiv), highest(len/kidiv))
        delta = (kijun + conversionLine)/2
        result :=delta
    if type=="McGinley"
        mg = 0.0
        mg := na(mg[1]) ? ema(src, len) : mg[1] + (src - mg[1]) / (len * pow(src/mg[1], 4))
        result :=mg
    if type=="EDSMA"
    
        zeros = src - nz(src[2])
        avgZeros = (zeros + zeros[1]) / 2
        
        // Ehlers Super Smoother Filter 
        ssf = ssfPoles == 2
             ? get2PoleSSF(avgZeros, ssfLength)
             : get3PoleSSF(avgZeros, ssfLength)
        
        // Rescale filter in terms of Standard Deviations
        stdev = stdev(ssf, len)
        scaledFilter = stdev != 0
             ? ssf / stdev
             : 0
        
        alpha = 5 * abs(scaledFilter) / len
        
        edsma = 0.0
        edsma := alpha * src + (1 - alpha) * nz(edsma[1])
        result :=  edsma
    result
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////


//  MA DEFINITION
slowMA = ma(slowMAtype, haMAslow , slowMAlength)
//fastMA = ma(fastMAtype, slowMA , fastMAlength)
fastMA = ma(fastMAtype, haMAfast , fastMAlength)
upMA = ma(upMAtype, haMAup , upMAlength)
closeMA = ma('SMA', src , 2)

//  Strategy Conditions
L1 = crossover(fastMA,slowMA)
L2 = close > upMA
S1 = crossunder(fastMA,slowMA)
S2 = close < upMA
longcondition = upMAcond ? L1 and L2 : L1
shortcondition = upMAcond ? S1 or S2 : S1

//  Plots
color_fill_uptrend = color.new(#4caf50, 80)
color_fill_downtrend = color.new(#c2185b, 80)
plot(slowMA, title='Slow MA', color=color.olive, linewidth=2)
plot(fastMA, title='Fast MA', color=color.teal, linewidth=2)
cls=plot(closeMA, title='Source Line', color=na, linewidth=1)
up = plot(upMA, title='Uptrend Conditional MA', color=color.purple, linewidth=2)
fill(up,cls, color = close > upMA ? color_fill_uptrend : color_fill_downtrend )

//plotshape(longcondition, style = shape.triangleup, color = color.green, location = location.belowbar, text = "Long", size = size.small)
//plotshape(shortcondition, style = shape.triangledown, color = color.red, location = location.abovebar, text = "Short", size = size.small)


strategy.entry(id="long", long = true, when = longcondition and window())
strategy.close("long", when = shortcondition and window())

//if (longcondition)
//    strategy.entry("BUY", strategy.long, when = window())

//if (shortcondition)
//    strategy.entry("SELL", strategy.short, when = window())