এডাপ্টিভ জিরো লেগ ইএমএ ট্রেডিং কৌশল

লেখক:চাওঝাং, তারিখঃ 2023-09-13 14:22:55
ট্যাগঃ

এই কৌশলটি প্রবণতা নির্ধারণ এবং বাণিজ্য সংকেতগুলির জন্য অভিযোজিত জিরো লেগ ইএমএ সূচক ব্যবহার করে। অভিযোজিত ইএমএ গতিশীলভাবে প্যারামিটারগুলিকে বিলম্ব দূর করতে সামঞ্জস্য করে। এটি প্রবণতা অনুসরণ করার লক্ষ্যে।

কৌশলগত যুক্তি:

  1. কোসিনস এবং আই-কিউ অভিযোজিত অ্যালগরিদম দিয়ে অ্যাডাপ্টিভ জিরো লেগ ইএমএ গণনা করুন।

  2. ইএমএ হল স্বাভাবিক ইএমএ, ইসি হল অভিযোজিত শূন্য বিলম্ব ইএমএ।

  3. যখন ইসি ইএমএ এর উপরে অতিক্রম করে তখন লম্বা এবং যখন এর নীচে অতিক্রম করে তখন সংক্ষিপ্ত।

  4. ভুল সংকেত ফিল্টার করার জন্য ত্রুটি বক্ররেখা গণনা করুন এবং সীমা নির্ধারণ করুন।

  5. স্টপ লসের জন্য নির্দিষ্ট পয়েন্ট ব্যবহার করুন এবং ঝুঁকি নিয়ন্ত্রণের জন্য মুনাফা নিন।

উপকারিতা:

  1. এডাপ্টিভ ইএমএ সূচক বিলম্বকে উল্লেখযোগ্যভাবে হ্রাস করে।

  2. থ্রেশহোল্ড ফিল্টারিং সিগন্যালের গুণমান উন্নত করে এবং মিথ্যা ব্রেকআউট এড়ায়।

  3. সহজ স্টপ এবং লক্ষ্য বাস্তবায়ন করা সহজ।

ঝুঁকি:

  1. এডাপ্টিভ ইএমএ প্যারামিটার অস্থির হয়ে উঠতে পারে।

  2. স্থির স্টপ/টার্গেট পরিবর্তনশীল বাজারের অবস্থার সাথে মানিয়ে নিতে ব্যর্থ হয়।

  3. ক্ষতির আকারের কোন সীমা নেই, বড় ক্ষতির ঝুঁকি রয়েছে।

সংক্ষেপে, এই কৌশলটি প্রবণতা অনুসরণ করার জন্য অভিযোজিত ইএমএ ব্যবহার করে, কিছুটা লেগ হ্রাস করে। তবে ঝুঁকি নিয়ন্ত্রণের জন্য পরামিতি স্থিতিশীলতা এবং অনুকূলিত স্টপ প্রয়োজন।


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

//@version=3
strategy(title="Adaptive Zero Lag EMA v2 (w/ Backtest Date Range)", shorttitle="AZLEMA", overlay = true,  commission_type=strategy.commission.cash_per_contract, slippage = 5, pyramiding=1, calc_on_every_tick=true)

src = input(title="Source",  defval=close)
secType = input(title="Security Type", options=["Forex", "Metal Spot", "Cryptocurrency","Custom"], defval="Forex")
contracts = input(title="Custom # of Contracts", defval=1, step=1)
limit = input(title="Max Lots",  defval=100)
Period = input(title="Period",  defval = 20)
adaptive = input(title="Adaptive Method", options=["Off", "Cos IFM", "I-Q IFM", "Average"], defval="Cos IFM")
GainLimit = input(title="Gain Limit",  defval = 8)
Threshold = input(title="Threshold",  defval=0.05, step=0.01)
fixedSL = input(title="SL Points", defval=70)
fixedTP = input(title="TP Points", defval=10)
risk = input(title='Risk', defval=0.01, step=0.01)

// === INPUT BACKTEST RANGE ===
FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2019, title = "From Year", minval = 2015)
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 = 2015)

// === FUNCTION EXAMPLE ===
start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  // backtest start window
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)        // backtest finish window
window()  => true

range = 50 //input(title="Max Period",  defval=60, minval=8, maxval=100)

PI = 3.14159265359
lenIQ = 0.0
lenC = 0.0

//##############################################################################
//I-Q IFM
//##############################################################################
if(adaptive=="I-Q IFM" or adaptive=="Average")
    imult = 0.635
    qmult = 0.338
    inphase = 0.0
    quadrature = 0.0
    re = 0.0
    im = 0.0
    deltaIQ = 0.0
    instIQ = 0.0
    V = 0.0
    
    P = src - src[7]
    inphase := 1.25*(P[4] - imult*P[2]) + imult*nz(inphase[3])
    quadrature := P[2] - qmult*P + qmult*nz(quadrature[2])
    re := 0.2*(inphase*inphase[1] + quadrature*quadrature[1]) + 0.8*nz(re[1])
    im := 0.2*(inphase*quadrature[1] - inphase[1]*quadrature) + 0.8*nz(im[1])
    if (re!= 0.0)
        deltaIQ := atan(im/re)
    for i=0 to range
        V := V + deltaIQ[i]
        if (V > 2*PI and instIQ == 0.0)
            instIQ := i
    if (instIQ == 0.0)
        instIQ := nz(instIQ[1])
    lenIQ := 0.25*instIQ + 0.75*nz(lenIQ[1])

//##############################################################################
//COSINE IFM
//##############################################################################
if(adaptive == "Cos IFM" or adaptive == "Average")
    s2 = 0.0
    s3 = 0.0
    deltaC = 0.0
    instC = 0.0
    v1 = 0.0
    v2 = 0.0
    v4 = 0.0
    
    v1 := src - src[7]
    s2 := 0.2*(v1[1] + v1)*(v1[1] + v1) + 0.8*nz(s2[1])
    s3 := 0.2*(v1[1] - v1)*(v1[1] - v1) + 0.8*nz(s3[1])
    if (s2 != 0)
        v2 := sqrt(s3/s2)
    if (s3 != 0)
        deltaC := 2*atan(v2)
    for i = 0 to range
        v4 := v4 + deltaC[i]
        if (v4 > 2*PI and instC == 0.0)
            instC := i - 1
    if (instC == 0.0)
        instC := instC[1]
    lenC := 0.25*instC + 0.75*nz(lenC[1])

if (adaptive == "Cos IFM")
    Period := round(lenC)
if (adaptive == "I-Q IFM")
    Period := round(lenIQ)
if (adaptive == "Average")
    Period := round((lenC + lenIQ)/2)

//##############################################################################
//ZERO LAG EXPONENTIAL MOVING AVERAGE
//##############################################################################
LeastError = 1000000.0
EC = 0.0
Gain = 0.0
EMA = 0.0
Error = 0.0
BestGain = 0.0

alpha =2/(Period + 1)
EMA := alpha*src + (1-alpha)*nz(EMA[1])

for i = -GainLimit to GainLimit
    Gain := i/10
    EC := alpha*(EMA + Gain*(src - nz(EC[1]))) + (1 - alpha)*nz(EC[1])
    Error := src - EC
    if(abs(Error)<LeastError)
        LeastError := abs(Error)
        BestGain := Gain

EC := alpha*(EMA + BestGain*(src - nz(EC[1]))) + (1-alpha)*nz(EC[1])

plot(EC, title="EC", color=orange, linewidth=2)
plot(EMA, title="EMA", color=red, linewidth=2)

//##############################################################################
//Trade Logic & Risk Management
//##############################################################################
buy = crossover(EC,EMA) and 100*LeastError/src > Threshold
sell = crossunder(EC,EMA) and 100*LeastError/src > Threshold

secScaler = secType == "Forex" ? 100000 : secType == "Metal Spot" ? 100 : secType == "Cryptocurrency" ? 10000 : secType == "Custom" ? contracts : 0
strategy.initial_capital = 50000
balance = strategy.initial_capital + strategy.netprofit
if (time>timestamp(2016, 1, 1 , 0, 0) and balance > 0)
    //LONG
    lots = ((risk * balance)/fixedSL)*secScaler
    lots := lots > limit * secScaler ? limit * secScaler : lots
    strategy.entry("BUY", strategy.long,  oca_name="BUY",  when=buy and window())
    strategy.exit("B.Exit", "BUY", qty_percent = 100, loss=fixedSL, trail_offset=15, trail_points=fixedTP)
    //SHORT
    strategy.entry("SELL", strategy.short,  oca_name="SELL",when=sell and window())
    strategy.exit("S.Exit", "SELL", qty_percent = 100, loss=fixedSL, trail_offset=15, trail_points=fixedTP)


আরো