ট্রেডিং সময়ের পরিমাণগত ট্রেডিং কৌশলের সাথে মিলিত মাল্টি-টাইম ফ্রেম মুভিং এভারেজ


সৃষ্টির তারিখ: 2024-01-12 11:50:37 অবশেষে সংশোধন করুন: 2024-01-12 11:50:37
অনুলিপি: 1 ক্লিকের সংখ্যা: 599
1
ফোকাস
1617
অনুসারী

ট্রেডিং সময়ের পরিমাণগত ট্রেডিং কৌশলের সাথে মিলিত মাল্টি-টাইম ফ্রেম মুভিং এভারেজ

ওভারভিউ

এই কৌশলটি একাধিক চলমান গড় সূচক ব্যবহার করে, ট্রেডিংয়ের সময় প্রবেশ এবং প্রস্থান করার সময় নির্বাচন করে, পরিমাণগত লেনদেনের জন্য।

কৌশল নীতি

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

সামর্থ্য বিশ্লেষণ

এই কৌশলটি একাধিক চলমান গড়ের সমন্বয়ে তৈরি করা হয়েছে, ব্যবহারকারীরা বিভিন্ন বাজারের পরিবেশের সাথে খাপ খাইয়ে নেওয়ার জন্য বিভিন্ন পরামিতি বেছে নিতে পারেন। কেবলমাত্র ট্রেন্ডগুলি নিশ্চিত করার জন্য প্রবেশ করুন।’লেনদেনের %‘একই সময়ে, এই কৌশলটি শুধুমাত্র সোমবার পজিশন খোলার জন্য এবং রবিবারের আগে স্টপ লস বা পজিশন বন্ধ করার জন্য, এক সপ্তাহে সর্বাধিক পজিশন খোলার সংখ্যা সীমাবদ্ধ করে, কার্যকরভাবে লেনদেনের ঝুঁকি নিয়ন্ত্রণ করে।

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

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

এই ঝুঁকিগুলি নিয়ন্ত্রণ করার জন্য, ডায়নামিক মুভিং এভারেজ প্যারামিটারগুলি ব্যবহার করার পরামর্শ দেওয়া হয়, যখন বাজারগুলি অস্থির হয়ে পড়ে তখন প্যারামিটারগুলি যথাযথভাবে সংক্ষিপ্ত করা হয়; একই সাথে, পজিশন খোলার সময় বাড়ানো যেতে পারে এবং বুধবার বা বৃহস্পতিবার নতুন পজিশন খোলার অনুমতি দেওয়া হয়।

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

এই কৌশলটি নিম্নলিখিত দিকগুলি থেকে উন্নত করা যেতে পারেঃ

  1. Algerism অ্যালগরিদম যুক্ত করা হয়েছে, যার সাহায্যে স্টপ লস পয়েন্টকে গতিশীলভাবে সামঞ্জস্য করা যায়।

  2. মেশিন লার্নিং মডেলের প্রবণতা নির্ণয়ের বছর বাড়ানো এবং বাজারে ঢোকার ঝড় এড়ানো;

  3. পজিশন খোলার এবং পজিশন লজিকের অপ্টিমাইজেশান, যাতে আরও পজিশন খোলার সুযোগ তৈরি হয়।

সারসংক্ষেপ

এই কৌশলটি প্রবণতার দিকনির্দেশের জন্য একাধিক চলমান গড় সূচককে সংহত করে এবং সোমবার পজিশন খোলার এবং রবিবার পজিশন খোলার মাধ্যমে এক সপ্তাহের সর্বাধিক লেনদেনের সংখ্যা কার্যকরভাবে নিয়ন্ত্রণ করে। একই সময়ে, কঠোর স্টপ-অফ-লস নিয়মটি একক লেনদেনের সর্বাধিক ক্ষতির সীমাও সীমাবদ্ধ করে। সামগ্রিকভাবে, এই কৌশলটি প্রবণতা বিচার এবং ঝুঁকি নিয়ন্ত্রণের দুটি মাত্রা থেকে অপ্টিমাইজড ডিজাইন করা হয়েছে। এটি একটি আরও শক্তিশালী পরিমাণগত লেনদেন কৌশল।

কৌশল সোর্স কোড
/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © exlux99

//@version=5
strategy('Time MA strategy ', overlay=true)

longEntry = input.bool(true, group="Type of Entries")
shortEntry = input.bool(false, group="Type of Entries")


//==========DEMA
getDEMA(src, len) =>
    dema = 2 * ta.ema(src, len) - ta.ema(ta.ema(src, len), len)
    dema
//==========HMA
getHULLMA(src, len) =>
    hullma = ta.wma(2 * ta.wma(src, len / 2) - ta.wma(src, len), math.round(math.sqrt(len)))
    hullma
//==========KAMA
getKAMA(src, len, k1, k2) =>
    change = math.abs(ta.change(src, len))
    volatility = math.sum(math.abs(ta.change(src)), len)
    efficiency_ratio = volatility != 0 ? change / volatility : 0
    kama = 0.0
    fast = 2 / (k1 + 1)
    slow = 2 / (k2 + 1)
    smooth_const = math.pow(efficiency_ratio * (fast - slow) + slow, 2)
    kama := nz(kama[1]) + smooth_const * (src - nz(kama[1]))
    kama
//==========TEMA
getTEMA(src, len) =>
    e = ta.ema(src, len)
    tema = 3 * (e - ta.ema(e, len)) + ta.ema(ta.ema(e, len), len)
    tema
//==========ZLEMA
getZLEMA(src, len) =>
    zlemalag_1 = (len - 1) / 2
    zlemadata_1 = src + src - src[zlemalag_1]
    zlema = ta.ema(zlemadata_1, len)
    zlema
//==========FRAMA
getFRAMA(src, len) =>
    Price = src
    N = len
    if N % 2 != 0
        N := N + 1
        N
    N1 = 0.0
    N2 = 0.0
    N3 = 0.0
    HH = 0.0
    LL = 0.0
    Dimen = 0.0
    alpha = 0.0
    Filt = 0.0
    N3 := (ta.highest(N) - ta.lowest(N)) / N
    HH := ta.highest(N / 2 - 1)
    LL := ta.lowest(N / 2 - 1)
    N1 := (HH - LL) / (N / 2)
    HH := high[N / 2]
    LL := low[N / 2]
    for i = N / 2 to N - 1 by 1
        if high[i] > HH
            HH := high[i]
            HH
        if low[i] < LL
            LL := low[i]
            LL
    N2 := (HH - LL) / (N / 2)
    if N1 > 0 and N2 > 0 and N3 > 0
        Dimen := (math.log(N1 + N2) - math.log(N3)) / math.log(2)
        Dimen
    alpha := math.exp(-4.6 * (Dimen - 1))
    if alpha < .01
        alpha := .01
        alpha
    if alpha > 1
        alpha := 1
        alpha
    Filt := alpha * Price + (1 - alpha) * nz(Filt[1], 1)
    if bar_index < N + 1
        Filt := Price
        Filt
    Filt
//==========VIDYA
getVIDYA(src, len) =>
    mom = ta.change(src)
    upSum = math.sum(math.max(mom, 0), len)
    downSum = math.sum(-math.min(mom, 0), len)
    out = (upSum - downSum) / (upSum + downSum)
    cmo = math.abs(out)
    alpha = 2 / (len + 1)
    vidya = 0.0
    vidya := src * alpha * cmo + nz(vidya[1]) * (1 - alpha * cmo)
    vidya
//==========JMA
getJMA(src, len, power, phase) =>
    phase_ratio = phase < -100 ? 0.5 : phase > 100 ? 2.5 : phase / 100 + 1.5
    beta = 0.45 * (len - 1) / (0.45 * (len - 1) + 2)
    alpha = math.pow(beta, power)
    MA1 = 0.0
    Det0 = 0.0
    MA2 = 0.0
    Det1 = 0.0
    JMA = 0.0
    MA1 := (1 - alpha) * src + alpha * nz(MA1[1])
    Det0 := (src - MA1) * (1 - beta) + beta * nz(Det0[1])
    MA2 := MA1 + phase_ratio * Det0
    Det1 := (MA2 - nz(JMA[1])) * math.pow(1 - alpha, 2) + math.pow(alpha, 2) * nz(Det1[1])
    JMA := nz(JMA[1]) + Det1
    JMA
//==========T3
getT3(src, len, vFactor) =>
    ema1 = ta.ema(src, len)
    ema2 = ta.ema(ema1, len)
    ema3 = ta.ema(ema2, len)
    ema4 = ta.ema(ema3, len)
    ema5 = ta.ema(ema4, len)
    ema6 = ta.ema(ema5, len)
    c1 = -1 * math.pow(vFactor, 3)
    c2 = 3 * math.pow(vFactor, 2) + 3 * math.pow(vFactor, 3)
    c3 = -6 * math.pow(vFactor, 2) - 3 * vFactor - 3 * math.pow(vFactor, 3)
    c4 = 1 + 3 * vFactor + math.pow(vFactor, 3) + 3 * math.pow(vFactor, 2)
    T3 = c1 * ema6 + c2 * ema5 + c3 * ema4 + c4 * ema3
    T3
//==========TRIMA
getTRIMA(src, len) =>
    N = len + 1
    Nm = math.round(N / 2)
    TRIMA = ta.sma(ta.sma(src, Nm), Nm)
    TRIMA


src = input.source(close, title='Source', group='Parameters')
len = input.int(17, minval=1, title='Moving Averages', group='Parameters')
out_ma_source = input.string(title='MA Type', defval='ALMA', options=['SMA', 'EMA', 'WMA', 'ALMA', 'SMMA', 'LSMA', 'VWMA', 'DEMA', 'HULL', 'KAMA', 'FRAMA', 'VIDYA', 'JMA', 'TEMA', 'ZLEMA', 'T3', 'TRIM'], group='Parameters')
out_ma = out_ma_source == 'SMA' ? ta.sma(src, len) : out_ma_source == 'EMA' ? ta.ema(src, len) : out_ma_source == 'WMA' ? ta.wma(src, len) : out_ma_source == 'ALMA' ? ta.alma(src, len, 0.85, 6) : out_ma_source == 'SMMA' ? ta.rma(src, len) : out_ma_source == 'LSMA' ? ta.linreg(src, len, 0) : out_ma_source == 'VWMA' ? ta.vwma(src, len) : out_ma_source == 'DEMA' ? getDEMA(src, len) : out_ma_source == 'HULL' ? ta.hma(src, len) : out_ma_source == 'KAMA' ? getKAMA(src, len, 2, 30) : out_ma_source == 'FRAMA' ? getFRAMA(src, len) : out_ma_source == 'VIDYA' ? getVIDYA(src, len) : out_ma_source == 'JMA' ? getJMA(src, len, 2, 50) : out_ma_source == 'TEMA' ? getTEMA(src, len) : out_ma_source == 'ZLEMA' ? getZLEMA(src, len) : out_ma_source == 'T3' ? getT3(src, len, 0.7) : out_ma_source == 'TRIM' ? getTRIMA(src, len) : na


plot(out_ma)

long = close> out_ma and close[1] < out_ma and dayofweek==dayofweek.monday
short = close< out_ma and close[1] > out_ma and dayofweek==dayofweek.monday


stopPer = input.float(10.0, title='LONG Stop Loss % ', group='Fixed Risk Management') / 100
takePer = input.float(30.0, title='LONG Take Profit %', group='Fixed Risk Management') / 100

stopPerShort = input.float(5.0, title='SHORT Stop Loss % ', group='Fixed Risk Management') / 100
takePerShort = input.float(10.0, title='SHORT Take Profit %', group='Fixed Risk Management') / 100


longStop = strategy.position_avg_price * (1 - stopPer)
longTake = strategy.position_avg_price * (1 + takePer)

shortStop = strategy.position_avg_price * (1 + stopPerShort)
shortTake = strategy.position_avg_price * (1 - takePerShort)

// strategy.risk.max_intraday_filled_orders(2) // After 10 orders are filled, no more strategy orders will be placed (except for a market order to exit current open market position, if there is any).

if(longEntry)
    strategy.entry("long",strategy.long,when=long )
    strategy.exit('LONG EXIT', "long", limit=longTake, stop=longStop)
    strategy.close("long",when=dayofweek==dayofweek.sunday)

if(shortEntry)
    strategy.entry("short",strategy.short,when=short )
    strategy.exit('SHORT EXIT', "short", limit=shortTake, stop=shortStop)
    strategy.close("short",when=dayofweek==dayofweek.sunday)