द्विदिश व्यापार के लिए चलती औसत क्रॉसओवर रणनीति

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

img

अवलोकन

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

सिद्धांत

यह रणनीति बाजार के रुझानों का आकलन करती है और विभिन्न अवधियों के चलती औसत के बीच क्रॉसओवर के आधार पर ट्रेडिंग सिग्नल उत्पन्न करती है। इसमें 8-पीरियड, 13-पीरियड और 21-पीरियड की तीन चलती औसत लाइनें उपयोग की जाती हैं, जहां 8-पीरियड लाइन सबसे छोटी अवधि रेखा है और 21-पीरियड लाइन सबसे लंबी अवधि रेखा है। 8-पीरियड लाइन 21-पीरियड लाइन के ऊपर पार होने पर एक लंबा संकेत ट्रिगर किया जाता है। 8-पीरियड लाइन 21-पीरियड लाइन से नीचे पार होने पर एक छोटा संकेत ट्रिगर किया जाता है।

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

लाभ

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

जोखिम

  1. अत्यधिक अस्थिर बाजारों में विफल हो सकता है या अत्यधिक झूठे संकेत उत्पन्न कर सकता है
  2. जब कीमतें पक्षीय रूप से चलती हैं, तो उन्हें न्याय करने में असमर्थ, अवसरों को याद करते हैं
  3. अंतर-अवधि क्रॉसओवर में विलंब होता है, अल्पकालिक रुझान परिवर्तनों को समय पर नहीं पकड़ सकता है
  4. मूल्य अस्थिरता पर विचार नहीं करता है, मापदंडों को विभिन्न अस्थिरता स्तरों के लिए समायोजन की आवश्यकता होती है
  5. कोई स्टॉप लॉस या ले लाभ नहीं, अनलिमिटेड नुकसान का जोखिम

जोखिमों के समाधान

  1. बाजारों का आकलन करने के लिए अन्य संकेतकों का संयोजन करें, अस्थिरता प्रभाव से बचें
  2. उच्च संवेदनशीलता के लिए कम चलती औसत अवधि
  3. जोखिमों और ड्रॉडाउन को नियंत्रित करने के लिए स्टॉप लॉस और ले लाभ जोड़ें

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

  1. प्रभावशीलता में सुधार के लिए एमएसीडी और केडीजे जैसे अन्य संकेतकों को मिलाएं
  2. समग्र रणनीति प्रदर्शन पर विभिन्न पैरामीटर सेटिंग्स के परीक्षण प्रभाव
  3. बाजार के प्रकार और अस्थिरता के स्तर के आधार पर अनुकूलन पैरामीटर निर्धारित करें
  4. डीईएमए, जेएलईएमए आदि का उपयोग करके चलती औसत गणना विधियों का अनुकूलन करना।
  5. स्टॉप लॉस और ले लाभ तर्क जोड़ें
  6. सर्वोत्तम मापदंडों का निर्धारण करने के लिए क्वांट बैकटेस्टिंग मेट्रिक्स का अनुकूलन करें

निष्कर्ष

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


/*backtest
start: 2022-12-05 00:00:00
end: 2023-12-11 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
//Converted to strategy by shawnteoh

strategy(title = "MA Emperor insiliconot Strategy" , overlay=true, pyramiding=1, precision=8)
strat_dir_input = input(title="Strategy Direction", defval="long", options=["long", "short", "all"])
strat_dir_value = strat_dir_input == "long" ? strategy.direction.long : strat_dir_input == "short" ? strategy.direction.short : strategy.direction.all
strategy.risk.allow_entry_in(strat_dir_value)

// Testing start dates
testStartYear = input(2020, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)
//Stop date if you want to use a specific range of dates
testStopYear = input(2030, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(30, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)
// Order size
orderQty = input(1, "Order quantity", type = float)
// Plot indicator
plotInd = input(false, "Plot indicators?", type = bool)

testPeriod() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false

haClose = close
haOpen  = open
haHigh  = high
haLow   = low 

haClose := (open + high + low + close) / 4
haOpen  := (nz(haOpen[1]) + nz(haClose[1])) / 2
haHigh  := max(high, max(haOpen, haClose))
haLow   := min(low , min(haOpen, haClose))

ssrc = close
ha = false

o = ha ? haOpen : open
c = ha ? haClose : close
h = ha ? haHigh : high
l = ha ? haLow : low

ssrc := ssrc == close ? ha ? haClose : c : ssrc
ssrc := ssrc == open ? ha ? haOpen : o : ssrc
ssrc := ssrc == high ? ha ? haHigh : h : ssrc
ssrc := ssrc == low ? ha ? haLow : l : ssrc
ssrc := ssrc == hl2 ? ha ? (haHigh + haLow) / 2 : hl2 : ssrc
ssrc := ssrc == hlc3 ? ha ? (haHigh + haLow + haClose) / 3 : hlc3 : ssrc
ssrc := ssrc == ohlc4 ? ha ? (haHigh + haLow + haClose+ haOpen) / 4 : ohlc4 : ssrc

type = input(defval = "EMA", title = "Type", options = ["Butterworth_2Pole", "DEMA", "EMA", "Gaussian", "Geometric_Mean", "LowPass", "McGuinley", "SMA", "Sine_WMA", "Smoothed_MA", "Super_Smoother",  "Triangular_MA", "Wilders", "Zero_Lag"])

len1=input(8, title ="MA 1")
len2=input(13, title = "MA 2") 
len3=input(21, title = "MA 3")
len4=input(55, title = "MA 4")
len5=input(89, title = "MA 5")
lenrib=input(120, title = "IB")
lenrib2=input(121, title = "2B")
lenrib3=input(200, title = "21b")
lenrib4=input(221, title = "22b")

onOff1  = input(defval=true, title="Enable 1")
onOff2  = input(defval=true, title="Enable 2")
onOff3  = input(defval=true, title="Enable 3")
onOff4  = input(defval=false, title="Enable 4")
onOff5  = input(defval=false, title="Enable 5")
onOff6  = input(defval=false, title="Enable 6")
onOff7  = input(defval=false, title="Enable 7")
onOff8  = input(defval=false, title="Enable x")
onOff9  = input(defval=false, title="Enable x")


gauss_poles = input(3, "*** Gaussian poles ***",  minval = 1, maxval = 14) 
linew = 2
shapes = false

 
variant_supersmoother(src,len) =>
    Pi = 2 * asin(1)
    a1 = exp(-1.414* Pi / len)
    b1 = 2*a1*cos(1.414* Pi / len)
    c2 = b1
    c3 = (-a1)*a1
    c1 = 1 - c2 - c3
    v9 = 0.0
    v9 := c1*(src + nz(src[1])) / 2 + c2*nz(v9[1]) + c3*nz(v9[2])
    v9
    
variant_smoothed(src,len) =>
    v5 = 0.0
    v5 := na(v5[1]) ? sma(src, len) : (v5[1] * (len - 1) + src) / len
    v5

variant_zerolagema(src, len) =>
    price = src
    l = (len - 1) / 2
    d = (price + (price - price[l]))
    z = ema(d, len)
    z
    
variant_doubleema(src,len) =>
    v2 = ema(src, len)
    v6 = 2 * v2 - ema(v2, len)
    v6

variant_WiMA(src, length) =>
    MA_s= nz(src)
    MA_s:=(src + nz(MA_s[1] * (length-1)))/length
    MA_s
    
fact(num)=>
    a = 1
    nn = num <= 1 ? 1 : num
    for i = 1 to nn
        a := a * i
    a
    
getPoles(f, Poles, alfa)=>
    filt = f
    sign = 1
    results = 0 + n//tv series spoofing
    for r = 1 to max(min(Poles, n),1)
	    mult  = fact(Poles) / (fact(Poles - r) * fact(r))
	    matPo = pow(1 - alfa, r)
        prev  = nz(filt[r-1],0)
        sum   =  sign * mult * matPo * prev
        results := results + sum
        sign  := sign * -1
    results := results - n
    results
    
variant_gauss(Price, Lag, Poles)=>
    Pi = 2 * asin(1)
    beta = (1 - cos(2 * Pi / Lag)) / ( pow (sqrt(2), 2.0 / Poles) - 1)
    alfa = -beta + sqrt(beta * beta +  2 * beta)
    pre = nz(Price, 0) * pow(alfa, Poles) 
    filter = pre
    result = n > 0 ?  getPoles(nz(filter[1]), Poles, alfa) : 0
    filter := pre + result

variant_mg(src, len)=>
    mg = 0.0
    mg := na(mg[1]) ? ema(src, len) : mg[1] + (src - mg[1]) / (len * pow(src/mg[1], 4))
    mg
    
variant_sinewma(src, length) =>
    PI = 2 * asin(1)
    sum = 0.0
    weightSum = 0.0
    for i = 0 to length - 1
        weight = sin(i * PI / (length + 1))
        sum := sum + nz(src[i]) * weight
        weightSum := weightSum + weight
    sinewma = sum / weightSum
    sinewma
    
variant_geoMean(price, per)=>
    gmean = pow(price, 1.0/per)
    gx = for i = 1 to per-1
        gmean := gmean * pow(price[i], 1.0/per)
        gmean
    ggx = n > per? gx : price    
    ggx


variant_butt2pole(pr, p1)=>
    Pi = 2 * asin(1)
    DTR = Pi / 180    
    a1 = exp(-sqrt(2) * Pi / p1)
    b1 = 2 * a1 * cos(DTR * (sqrt(2) * 180 / p1))
    cf1 = (1 - b1 + a1 * a1) / 4
    cf2 = b1
    cf3 = -a1 * a1
    butt_filt = pr
    butt_filt := cf1 * (pr + 2 * nz(pr[1]) + nz(pr[2])) + cf2 * nz(butt_filt[1]) + cf3 * nz(butt_filt[2])

variant_lowPass(src, len)=>
    LP = src
    sr = src
    a = 2.0 / (1.0 + len)
    LP := (a - 0.25 * a * a) * sr + 0.5 * a * a * nz(sr[1]) - (a - 0.75 * a * a) * nz(sr[2]) + 2.0 * (1.0 - a) * nz(LP[1]) - (1.0 - a) * (1.0 - a) * nz(LP[2])
    LP


variant_sma(src, len) =>
    sum = 0.0
    for i = 0 to len - 1
        sum := sum + src[i] / len
    sum

variant_trima(src, length) =>
    len = ceil((length + 1) * 0.5)
    trima =  sum(sma(src, len), len)/len
    trima
 
 
    
variant(type, src, len) =>
      type=="EMA"   ? ema(src, len) : 
      type=="LowPass" ? variant_lowPass(src, len) :  
      type=="Linreg"  ? linreg(src, len, 0) : 
      type=="Gaussian"  ? variant_gauss(src, len, gauss_poles) :
      type=="Sine_WMA"  ? variant_sinewma(src, len) :
      
      type=="Geometric_Mean"  ? variant_geoMean(src, len) :
      
      type=="Butterworth_2Pole" ? variant_butt2pole(src, len) : 
      type=="Smoothed_MA"  ? variant_smoothed(src, len) :
      type=="Triangular_MA"  ? variant_trima(src, len) : 
      type=="McGuinley" ? variant_mg(src, len) : 
      type=="DEMA"  ? variant_doubleema(src, len):  
      type=="Super_Smoother"  ? variant_supersmoother(src, len) : 
      type=="Zero_Lag"  ? variant_zerolagema(src, len) :  
      type=="Wilders"? variant_WiMA(src, len) : variant_sma(src, len)


c1=#44E2D6
c2=#DDD10D
c3=#0AA368
c4=#E0670E
c5=#AB40B2

cRed = #F93A00


ma1 =  variant(type, ssrc, len1)
ma2 =  variant(type, ssrc, len2)
ma3 =  variant(type, ssrc, len3)
ma4 =  variant(type, ssrc, len4)
ma5 =  variant(type, ssrc, len5)
ma6 =  variant(type, ssrc, lenrib)
ma7 =  variant(type, ssrc, lenrib2)
ma8 =  variant(type, ssrc, lenrib3)
ma9 =  variant(type, ssrc, lenrib4)

col1 = c1
col2 = c2
col3 = c3
col4 = c4
col5 = c5

p1 = plot(onOff1 ? ma1 : na, title = "MA 1",  color = col1,  linewidth = linew, style = linebr)
p2 = plot(onOff2 ? ma2 : na, title = "MA 2",  color = col2,  linewidth = linew, style = linebr)
p3 = plot(onOff3 ? ma3 : na, title = "MA 3",  color = col3,  linewidth = linew, style = linebr)
p4 = plot(onOff4 ? ma4 : na, title = "MA 4",  color = col4,  linewidth = linew, style = linebr)
p5 = plot(onOff5 ? ma5 : na, title = "MA 5",  color = col5,  linewidth = linew, style = linebr)
p6 = plot(onOff6 ? ma6 : na, title = "MA 6",  color = col5,  linewidth = linew, style = linebr)
p7 = plot(onOff7 ? ma7 : na, title = "MA 7",  color = col5,  linewidth = linew, style = linebr)
p8 = plot(onOff8 ? ma8 : na, title = "MA 8",  color = col5,  linewidth = linew, style = linebr)
p9 = plot(onOff9 ? ma9 : na, title = "MA 9",  color = col5,  linewidth = linew, style = linebr)

longCond = crossover(ma2, ma3)
if longCond and testPeriod()
    strategy.entry("buy", strategy.long, qty = orderQty, when = open > ma2[1])

shortCond = crossunder(ma2, ma3)
if shortCond and testPeriod()
    strategy.entry("sell", strategy.short, qty = orderQty, when = open < ma2[1])

plotshape(series=plotInd? longCond : na, title="P", style=shape.triangleup, location=location.belowbar, color=green, text="P", size=size.small)   
plotshape(series=plotInd? shortCond : na, title="N", style=shape.triangledown, location=location.abovebar, color=red, text="N", size=size.small)


अधिक