দ্বিপাক্ষিক ট্রেডিংয়ের জন্য চলমান গড় ক্রসওভার কৌশল

লেখক:চাওঝাং, তারিখ: ২০২৩-১২-১২ ১১ঃ২৬ঃ৫৪
ট্যাগঃ

img

সারসংক্ষেপ

এই কৌশলটি বিভিন্ন সময়ের চলমান গড় গণনা করে এবং যখন স্বল্প সময়ের চলমান গড়টি দীর্ঘ সময়ের চলমান গড়ের উপরে বা নীচে অতিক্রম করে তখন ট্রেডিং সংকেত দেয়। এটি সাধারণ চলমান গড় ক্রসওভার সিস্টেমের অন্তর্গত। কৌশলটি দ্বি-মুখী ট্রেডিং অর্জনের জন্য দীর্ঘ এবং সংক্ষিপ্ত অবস্থান উভয়ই সমর্থন করে।

নীতিমালা

কৌশলটি বাজারের প্রবণতা বিচার করে এবং বিভিন্ন সময়ের চলমান গড়ের ক্রসওভারের উপর ভিত্তি করে ট্রেডিং সংকেত উত্পন্ন করে। এটি 8-অবধি, 13-অবধি এবং 21-অবধি তিনটি চলমান গড় রেখা ব্যবহার করে, যেখানে 8-অবধি লাইনটি স্বল্পতম সময়কালের লাইন এবং 21-অবধি লাইনটি দীর্ঘতম সময়কালের লাইন। 8-অবধি লাইনটি 21-অবধি লাইনের উপরে অতিক্রম করার সময় একটি দীর্ঘ সংকেত সক্রিয় হয়। 8-অবধি লাইনটি 21-অবধি লাইনের নীচে অতিক্রম করার সময় একটি সংক্ষিপ্ত সংকেত সক্রিয় হয়।

প্রকৃত ট্রেডিং এক্সিকিউশনে, কৌশলটিতে একটি ফিল্টারিং শর্তও অন্তর্ভুক্ত রয়েছে যাতে অস্থির বাজারে আটকে না যায়। এটি কেবলমাত্র যখন বন্ধের দাম ক্রসওভার পয়েন্টের চেয়ে বেশি (দীর্ঘ সংকেত) বা কম (সংক্ষিপ্ত সংকেত) হয় তখন অর্ডার দেয়। এটি কার্যকরভাবে কিছু মিথ্যা সংকেত ফিল্টার করতে পারে।

সুবিধা

  1. বাজারের প্রবণতা কার্যকরভাবে ট্র্যাক করার জন্য চলমান গড় ক্রসওভার নিয়ম প্রয়োগ করে
  2. কিছু মিথ্যা সংকেত এবং ফাঁদে পড়া এড়াতে ট্রেড ফিল্টার যোগ করে
  3. উভয় ষাঁড় এবং ভালুকের বাজারে মুনাফা অর্জনের জন্য দ্বি-মুখী ব্যবসায়কে সমর্থন করে
  4. সময়ের মধ্যে চলমান গড় ব্যবহার করে প্রধান স্তরগুলির মধ্যে পরিবর্তনগুলি ধরা হয়
  5. সহজ এবং পরিষ্কার যুক্তি, সহজ বুঝতে এবং অপ্টিমাইজ করা

ঝুঁকি

  1. খুব অস্থির বাজারে ব্যর্থ হতে পারে বা অত্যধিক মিথ্যা সংকেত তৈরি করতে পারে
  2. যখন দামের দিকে যায় তখন বিচার করতে অক্ষম, সুযোগ হারাচ্ছে
  3. সময়সীমার মধ্যে ক্রসওভারের সময়সীমা কম, স্বল্পমেয়াদী প্রবণতা পরিবর্তনগুলি সময়মতো ধরতে পারে না
  4. মূল্যের অস্থিরতা বিবেচনা করে না, বিভিন্ন অস্থিরতার স্তরের জন্য পরামিতিগুলি সংশোধন করা প্রয়োজন
  5. কোন স্টপ লস বা লাভ নিতে, সীমাহীন ক্ষতি ঝুঁকি

ঝুঁকির সমাধান

  1. বাজারের মূল্যায়নের জন্য অন্যান্য সূচককে একত্রিত করুন, অস্থিরতার প্রভাব এড়ান
  2. উচ্চ সংবেদনশীলতার জন্য নিম্ন চলমান গড় সময়কাল
  3. ঝুঁকি এবং ড্রডাউন নিয়ন্ত্রণে স্টপ লস এবং লাভ গ্রহণ যোগ করুন

অপ্টিমাইজেশান নির্দেশাবলী

  1. কার্যকারিতা উন্নত করার জন্য MACD এবং KDJ এর মতো অন্যান্য সূচকগুলি একত্রিত করুন
  2. সামগ্রিক কৌশল কর্মক্ষমতা উপর বিভিন্ন পরামিতি সেটিংসের পরীক্ষার প্রভাব
  3. বাজারের ধরন এবং অস্থিরতার মাত্রার উপর ভিত্তি করে অভিযোজিত পরামিতি নির্ধারণ করুন
  4. DEMA, ZLEMA ইত্যাদি ব্যবহার করে চলমান গড় গণনার পদ্ধতি অপ্টিমাইজ করুন।
  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)


আরো