ভলিউম ওয়েটেড মুভিং মিডিয়ার কনভার্জেন্স ডিভার্জেন্স

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

img

সারসংক্ষেপ

এই কৌশলটি ক্লাসিক এমএসিডি সূচকের একটি উন্নত সংস্করণ, মূল্য বক্ররেখা মসৃণ করতে এবং বিভ্রান্তিকর সংকেত হ্রাস করতে ১১ টি বিভিন্ন ধরণের চলমান গড় ব্যবহার করে। সূচকটি দ্রুত লাইন, ধীর লাইন এবং হিস্টোগ্রাম নিয়ে গঠিত। দ্রুত লাইন এবং ধীর লাইন যথাক্রমে দামের দ্রুত চলমান গড় এবং ধীর চলমান গড় গ্রহণ করে। হিস্টোগ্রামটি দ্রুত লাইন এবং ধীর লাইনের মধ্যে পার্থক্য উপস্থাপন করে। দ্রুত লাইনটি নীচে থেকে উপরে ধীর লাইনটি অতিক্রম করার সময় ক্রয় সংকেত উত্পন্ন হয়, যখন বিক্রয় সংকেতগুলি উপরে থেকে নীচে উত্পন্ন হয়।

কৌশলগত নীতি

  1. দ্রুত চলমান গড় রেখা MA12 গণনা করুন। ভলিউম ভেরিয়েবিলিটি রেট রেখা VAR এর সাথে ডিফল্ট হিসাবে 11 টি বিভিন্ন গণনা পদ্ধতি চলমান গড় রেখাগুলি নির্বাচন করার জন্য উপলব্ধ।

  2. ধীর গতির গড় রেখা MA26 গণনা করুন। ভলিউম ভেরিয়েবিলিটি রেট রেখা VAR এর সাথে ডিফল্ট হিসাবে 11 টি বিভিন্ন গণনার পদ্ধতি নির্বাচন করার জন্য উপলব্ধ।

  3. দ্রুত এবং ধীর রেখা SRC2 = MA12 - MA26 এর মধ্যে পার্থক্য গণনা করুন।

  4. SRC2 এর জন্য ট্রিগার লাইন MATR গণনা করুন একটি চলমান গড় রেখা ব্যবহার করে যার দৈর্ঘ্য 9. ভলিউম ভেরিয়েবিলিটি রেট লাইন VAR এর সাথে 11 টি বিভিন্ন গণনার পদ্ধতি নির্বাচন করার জন্য উপলব্ধ।

  5. MACD হিস্টোগ্রাম হিস্ট = SRC2 - MATR গণনা করুন। হিস্টোগ্রাম নেতিবাচক থেকে ইতিবাচক পরিবর্তন হলে ক্রয় সংকেত উৎপন্ন হয়। হিস্টোগ্রাম ইতিবাচক থেকে নেতিবাচক পরিবর্তন হলে বিক্রয় সংকেত উৎপন্ন হয়।

সুবিধা বিশ্লেষণ

  1. দ্রুত লাইন, ধীর লাইন এবং ট্রিগার লাইন গণনা করার জন্য 11 টি বিভিন্ন ধরণের চলমান গড় লাইন নির্বাচন করা যেতে পারে, যা সাধারণ চলমান গড়ের বিলম্বকে ব্যাপকভাবে হ্রাস করে এবং পূর্বাভাস সংকেতগুলির নির্ভুলতা উন্নত করে।

  2. ভলিউম ভ্যারিয়েবিলিটি রেট লাইন VAR স্বয়ংক্রিয়ভাবে বাজারের পরিবর্তনের সাথে আরও ভালভাবে মানিয়ে নিতে চলমান গড়ের ওজনগুলি সামঞ্জস্য করতে পারে।

  3. বাফার জোন সহ ডাবল চলমান গড় রেখা কার্যকরভাবে বাজারের গোলমাল ফিল্টার করতে পারে।

  4. ট্রিগারিং সিগন্যাল হিসাবে MACD হিস্টোগ্রাম দ্রুত এবং ধীর MACD রেখাগুলির ঐতিহ্যগত ক্রসিং দ্বারা আনা বিলম্ব সমস্যা অতিক্রম করতে পারে।

ঝুঁকি বিশ্লেষণ

  1. ম্যাকডি সূচকটি বাজারের প্রবণতা বা একত্রীকরণের ক্ষেত্রে দুর্বল ক্ষমতা রাখে।

  2. চলমান গড় নিজেই একটি নির্দিষ্ট ডিগ্রী পিছিয়ে আছে। ভিএআর আংশিকভাবে হ্রাস করে কিন্তু সম্পূর্ণরূপে সমস্যা সমাধান করতে পারে না।

  3. ত্রুটি জমা হওয়ার ফলে ভুল সংকেত বা কার্যকর সংকেত মিস হতে পারে।

অপ্টিমাইজেশনের দিকনির্দেশনা

  1. ব্যাকটেস্টের ফলাফলের ভিত্তিতে নির্দিষ্ট বাজারের অবস্থার জন্য মিলে যাওয়া চলমান গড় গণনার পদ্ধতি নির্বাচন করুন।

  2. দ্রুত লাইন, ধীর লাইন এবং ট্রিগার লাইনের দৈর্ঘ্যের পরামিতিগুলি অনুকূল করুন ভুল সংকেত হ্রাস করার জন্য সেরা পরামিতি সংমিশ্রণগুলি খুঁজে পেতে।

  3. ক্রয়/বিক্রয় সংকেত নিশ্চিত করার জন্য RSI এবং Bollinger Bands এর মতো সহায়ক সূচক যোগ করুন।

সিদ্ধান্ত

এই কৌশলটি ক্লাসিক এমএসিডি সূচকের জন্য একটি অনুকূলিত সংস্করণ। এমএসিডি দ্রুত লাইন, ধীর লাইন এবং হিস্টোগ্রাম গণনা করতে একাধিক চলমান গড় প্যাটার্ন ব্যবহার করে এটি এই সূচকের উপযোগিতা ব্যাপকভাবে বাড়ায়। এদিকে, এর কিছু সীমাবদ্ধতাও রয়েছে। ট্রেডিংয়ের কার্যকারিতা সর্বাধিক করতে প্রকৃত বাজারের অবস্থার সাথে সামঞ্জস্যপূর্ণ অবিচ্ছিন্ন অপ্টিমাইজেশান প্রয়োজন।


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

//@version=4
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © KivancOzbilgic


//developer: Gerald Appel
//author: @kivancozbilgic

strategy("MACD ReLoaded","MACDRe", overlay=true)
src = input(close, title="Source")
length=input(12, "Short Moving Average Length", minval=1)
length1=input(26, "Long Moving Average Length", minval=1)
length2=input(9, "Trigger Length", minval=1)
T3a1 = input(0.7, "TILLSON T3 Volume Factor", step=0.1)
barcoloring = input(title="Bar Coloring On/Off ?", type=input.bool, defval=true)

mav = input(title="Moving Average Type", defval="VAR", options=["SMA", "EMA", "WMA", "DEMA", "TMA", "VAR", "WWMA", "ZLEMA", "TSF", "HULL", "TILL"])
Var_Func(src,length)=>
    valpha=2/(length+1)
    vud1=src>src[1] ? src-src[1] : 0
    vdd1=src<src[1] ? src[1]-src : 0
    vUD=sum(vud1,9)
    vDD=sum(vdd1,9)
    vCMO=nz((vUD-vDD)/(vUD+vDD))
    VAR=0.0
    VAR:=nz(valpha*abs(vCMO)*src)+(1-valpha*abs(vCMO))*nz(VAR[1])
VAR=Var_Func(src,length)
DEMA = ( 2 * ema(src,length)) - (ema(ema(src,length),length) )
Wwma_Func(src,length)=>
    wwalpha = 1/ length
    WWMA = 0.0
    WWMA := wwalpha*src + (1-wwalpha)*nz(WWMA[1])
WWMA=Wwma_Func(src,length)
Zlema_Func(src,length)=>
    zxLag = length/2==round(length/2) ? length/2 : (length - 1) / 2
    zxEMAData = (src + (src - src[zxLag]))
    ZLEMA = ema(zxEMAData, length)
ZLEMA=Zlema_Func(src,length)
Tsf_Func(src,length)=>
    lrc = linreg(src, length, 0)
    lrc1 = linreg(src,length,1)
    lrs = (lrc-lrc1)
    TSF = linreg(src, length, 0)+lrs
TSF=Tsf_Func(src,length)
HMA = wma(2 * wma(src, length / 2) - wma(src, length), round(sqrt(length)))
T3e1=ema(src, length)
T3e2=ema(T3e1,length)
T3e3=ema(T3e2,length)
T3e4=ema(T3e3,length)
T3e5=ema(T3e4,length)
T3e6=ema(T3e5,length)
T3c1=-T3a1*T3a1*T3a1
T3c2=3*T3a1*T3a1+3*T3a1*T3a1*T3a1
T3c3=-6*T3a1*T3a1-3*T3a1-3*T3a1*T3a1*T3a1
T3c4=1+3*T3a1+T3a1*T3a1*T3a1+3*T3a1*T3a1
T3=T3c1*T3e6+T3c2*T3e5+T3c3*T3e4+T3c4*T3e3


getMA(src, length) =>
    ma = 0.0
    if mav == "SMA"
        ma := sma(src, length)
        ma

    if mav == "EMA"
        ma := ema(src, length)
        ma

    if mav == "WMA"
        ma := wma(src, length)
        ma

    if mav == "DEMA"
        ma := DEMA
        ma

    if mav == "TMA"
        ma := sma(sma(src, ceil(length / 2)), floor(length / 2) + 1)
        ma

    if mav == "VAR"
        ma := VAR
        ma

    if mav == "WWMA"
        ma := WWMA
        ma

    if mav == "ZLEMA"
        ma := ZLEMA
        ma

    if mav == "TSF"
        ma := TSF
        ma

    if mav == "HULL"
        ma := HMA
        ma

    if mav == "TILL"
        ma := T3
        ma
    ma
    
MA12=getMA(src, length)


Var_Func1(src,length1)=>
    valpha1=2/(length1+1)
    vud11=src>src[1] ? src-src[1] : 0
    vdd11=src<src[1] ? src[1]-src : 0
    vUD1=sum(vud11,9)
    vDD1=sum(vdd11,9)
    vCMO1=nz((vUD1-vDD1)/(vUD1+vDD1))
    VAR1=0.0
    VAR1:=nz(valpha1*abs(vCMO1)*src)+(1-valpha1*abs(vCMO1))*nz(VAR1[1])
VAR1=Var_Func1(src,length1)
DEMA1 = ( 2 * ema(src,length1)) - (ema(ema(src,length1),length1) )
Wwma_Func1(src,length1)=>
    wwalpha1 = 1/ length1
    WWMA1 = 0.0
    WWMA1 := wwalpha1*src + (1-wwalpha1)*nz(WWMA1[1])
WWMA1=Wwma_Func1(src,length1)
Zlema_Func1(src,length1)=>
    zxLag1 = length1/2==round(length1/2) ? length1/2 : (length1 - 1) / 2
    zxEMAData1 = (src + (src - src[zxLag1]))
    ZLEMA1 = ema(zxEMAData1, length1)
ZLEMA1=Zlema_Func1(src,length1)
Tsf_Func1(src,length1)=>
    lrc1 = linreg(src, length1, 0)
    lrc11 = linreg(src,length1,1)
    lrs1 = (lrc1-lrc11)
    TSF1 = linreg(src, length1, 0)+lrs1
TSF1=Tsf_Func1(src,length1)
HMA1 = wma(2 * wma(src, length1 / 2) - wma(src, length1), round(sqrt(length1)))
T3e11=ema(src, length1)
T3e21=ema(T3e11,length1)
T3e31=ema(T3e21,length1)
T3e41=ema(T3e31,length1)
T3e51=ema(T3e41,length1)
T3e61=ema(T3e51,length1)
T3c11=-T3a1*T3a1*T3a1
T3c21=3*T3a1*T3a1+3*T3a1*T3a1*T3a1
T3c31=-6*T3a1*T3a1-3*T3a1-3*T3a1*T3a1*T3a1
T3c41=1+3*T3a1+T3a1*T3a1*T3a1+3*T3a1*T3a1
T31=T3c11*T3e61+T3c21*T3e51+T3c31*T3e41+T3c41*T3e31


getMA1(src, length1) =>
    ma1 = 0.0
    if mav == "SMA"
        ma1 := sma(src, length1)
        ma1

    if mav == "EMA"
        ma1 := ema(src, length1)
        ma1

    if mav == "WMA"
        ma1 := wma(src, length1)
        ma1

    if mav == "DEMA"
        ma1 := DEMA1
        ma1

    if mav == "TMA"
        ma1 := sma(sma(src, ceil(length1 / 2)), floor(length1 / 2) + 1)
        ma1

    if mav == "VAR"
        ma1 := VAR1
        ma1

    if mav == "WWMA"
        ma1:= WWMA1
        ma1

    if mav == "ZLEMA"
        ma1 := ZLEMA1
        ma1

    if mav == "TSF"
        ma1 := TSF1
        ma1

    if mav == "HULL"
        ma1 := HMA1
        ma1

    if mav == "TILL"
        ma1 := T31
        ma1
    ma1
    
MA26=getMA1(src, length1)


src2=MA12-MA26

Var_Func2(src2,length2)=>
    valpha2=2/(length2+1)
    vud12=src2>src2[1] ? src2-src2[1] : 0
    vdd12=src2<src2[1] ? src2[1]-src2 : 0
    vUD2=sum(vud12,9)
    vDD2=sum(vdd12,9)
    vCMO2=nz((vUD2-vDD2)/(vUD2+vDD2))
    VAR2=0.0
    VAR2:=nz(valpha2*abs(vCMO2)*src2)+(1-valpha2*abs(vCMO2))*nz(VAR2[1])
VAR2=Var_Func2(src2,length2)
DEMA2 = ( 2 * ema(src2,length2)) - (ema(ema(src2,length2),length2) )
Wwma_Func2(src2,length2)=>
    wwalpha2 = 1/ length2
    WWMA2 = 0.0
    WWMA2 := wwalpha2*src2 + (1-wwalpha2)*nz(WWMA2[1])
WWMA2=Wwma_Func2(src2,length2)
Zlema_Func2(src2,length2)=>
    zxLag2 = length2/2==round(length2/2) ? length2/2 : (length2 - 1) / 2
    zxEMAData2 = (src2 + (src2 - src2[zxLag2]))
    ZLEMA2 = ema(zxEMAData2, length2)
ZLEMA2=Zlema_Func2(src2,length2)
Tsf_Func2(src2,length2)=>
    lrc2 = linreg(src2, length2, 0)
    lrc12 = linreg(src2,length2,1)
    lrs2 = (lrc2-lrc12)
    TSF2 = linreg(src2, length2, 0)+lrs2
TSF2=Tsf_Func2(src2,length2)
HMA2 = wma(2 * wma(src2, length2 / 2) - wma(src2, length2), round(sqrt(length2)))
T3e12=ema(src2, length2)
T3e22=ema(T3e12,length2)
T3e32=ema(T3e22,length2)
T3e42=ema(T3e32,length2)
T3e52=ema(T3e42,length2)
T3e62=ema(T3e52,length2)
T3c12=-T3a1*T3a1*T3a1
T3c22=3*T3a1*T3a1+3*T3a1*T3a1*T3a1
T3c32=-6*T3a1*T3a1-3*T3a1-3*T3a1*T3a1*T3a1
T3c42=1+3*T3a1+T3a1*T3a1*T3a1+3*T3a1*T3a1
T32=T3c12*T3e62+T3c22*T3e52+T3c32*T3e42+T3c42*T3e32


getMA2(src2, length2) =>
    ma2 = 0.0
    if mav == "SMA"
        ma2 := sma(src2, length2)
        ma2

    if mav == "EMA"
        ma2 := ema(src2, length2)
        ma2

    if mav == "WMA"
        ma2 := wma(src2, length2)
        ma2

    if mav == "DEMA"
        ma2 := DEMA2
        ma2

    if mav == "TMA"
        ma2 := sma(sma(src2, ceil(length2 / 2)), floor(length2 / 2) + 1)
        ma2

    if mav == "VAR"
        ma2 := VAR2
        ma2

    if mav == "WWMA"
        ma2 := WWMA2
        ma2

    if mav == "ZLEMA"
        ma2 := ZLEMA2
        ma2

    if mav == "TSF"
        ma2 := TSF2
        ma2

    if mav == "HULL"
        ma2 := HMA2
        ma2

    if mav == "TILL"
        ma2 := T32
        ma2
    ma2


MATR=getMA2(MA12-MA26, length2)
hist = src2 - MATR

FromMonth = input(defval = 9, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2018, title = "From Year", minval = 999)
ToMonth   = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 9999, title = "To Year", minval = 999)
start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)       
window()  => time >= start and time <= finish ? true : false
buySignal = crossover(hist, 0)
if (crossover(hist, 0))
	strategy.entry("MacdLong", strategy.long, comment="MacdLong")
sellSignal = crossunder(hist, 0)
if (crossunder(hist, 0))
	strategy.entry("MacdShort", strategy.short, comment="MacdShort")
buy1= barssince(buySignal)
sell1 = barssince(sellSignal)
color1 = buy1[1] < sell1[1] ? color.green : buy1[1] > sell1[1] ? color.red : na
barcolor(barcoloring ? color1 : na)


//plot(strategy.equity, title="equity", color=color.red, linewidth=2, style=plot.style_areabr)


আরো