মাল্টি টাইমফ্রেম মুভিং এভারেজ ক্রসওভার কৌশল

লেখক:চাওঝাং, তারিখঃ ২০২৪-০২-১৯ 15:41:29
ট্যাগঃ

img

সারসংক্ষেপ

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

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

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

বিশেষত, এটি প্রথমে 20 পিরিয়ডের সিসিআই গণনা করে বুলিশ বা হ্রাসকারী প্রবণতা বিচার করতে। তারপরে এটি পরীক্ষা করে যে ট্রেডিং সংকেতগুলি সনাক্ত করতে এমএসিডি লাইনগুলি ক্রস করছে কিনা। এরপরে, লাভের লকিংয়ের জন্য ট্রেলিং স্টপ তৈরি করতে এটিআর ব্যবহার করা হয়। অবশেষে, সমস্ত সংকেত একত্রিত করা হয় প্রবেশ এবং প্রস্থান সংকেত তৈরি করতে।

সুবিধা

  1. একাধিক সূচক সংমিশ্রণ সংকেত সঠিকতা উন্নত

    CCI, MACD এবং ATR এর সমন্বয় ট্রেডিং সিগন্যালের নির্ভরযোগ্যতা বাড়ায় একসঙ্গে প্রবণতা, গতি এবং অস্থিরতা বিচার করে।

  2. মাল্টি-টাইমফ্রেম বিশ্লেষণ বাজারের গতি ধরে রাখে

    দীর্ঘমেয়াদী সিসিআই সামগ্রিক প্রবণতা বোঝে, যখন উচ্চতর ফ্রিকোয়েন্সির এমএসিডি স্থানীয় পাল্টা পয়েন্টগুলি সনাক্ত করে, যা কৌশলটিকে বড় বাজার ওঠানামা থেকে উপার্জন করতে দেয়।

  3. এটিআর ট্রেইলিং স্টপ কন্ট্রোলগুলি কার্যকরভাবে ঝুঁকিপূর্ণ

    এটিআর ভিত্তিক স্টপ লস বাজারের অস্থিরতার সাথে খাপ খাইয়ে নিতে পারে, যখন বাজারের অনুকূল গতিতে এর ট্রেলিং বৈশিষ্ট্যটি মুনাফা আরও লক করে।

ঝুঁকি

  1. সীমিত অপ্টিমাইজেশান স্থান

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

  2. কম্পিউটিং লোড বৃদ্ধি

    একাধিক সূচক একসাথে চলমান কম্পিউটিং লোড বৃদ্ধি করতে পারে, উচ্চ ফ্রিকোয়েন্সি ট্রেডিংয়ের বিলম্ব ঘটায়।

  3. ঘন ঘন সংকেত, সীমিত ঝুঁকি নিয়ন্ত্রণ

    সিগন্যালগুলি ঘন ঘন হতে পারে, যখন ঝুঁকি নিয়ন্ত্রণ মূলত এটিআর ট্রেলিং স্টপে নির্ভর করে, যার চরম পদক্ষেপের বিরুদ্ধে সীমাবদ্ধতা রয়েছে।

উন্নতি

  1. আরও দক্ষ প্যারামিটার টিউনিংয়ের জন্য মেশিন লার্নিং প্রয়োগ করুন

    বেয়েজিয়ান অপ্টিমাইজেশান, জেনেটিক অ্যালগরিদম ইত্যাদি আরও বুদ্ধিমান এবং দক্ষ প্যারামিটার টিউনিং সক্ষম করতে পারে।

  2. অভিযোজনযোগ্যতা উন্নত করতে কার্যকরী সূচক যোগ করুন

    অন্যান্য সূচক যেমন অস্থিরতা, ভলিউম, আবেগকে অন্তর্ভুক্ত করা কৌশলটিকে আরও শক্তিশালী এবং নমনীয় করে তুলতে পারে।

  3. উন্নত স্থিতিশীলতার জন্য ঝুঁকি ব্যবস্থাপনা জোরদার করা

    আরও বৈজ্ঞানিক স্টপ লস নিয়ম ডিজাইন করা যেতে পারে এবং অবস্থান আকারের মতো আরও মডিউলগুলি চরম ঘটনাগুলির বিরুদ্ধে সুরক্ষা দিতে সহায়তা করতে পারে।

সিদ্ধান্ত

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


/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy('smplondonclinic Strategy', shorttitle='SMPLC Strategy', overlay=true, pyramiding = 0, process_orders_on_close = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100)

direction   = input.string(title='Entry Direction', defval='Long', options=['Long', 'Short', 'Both'],group = "Strategy Entry Direction")

TPPerc = input.float(title='Take Profit (%)', minval=0.0, step=0.1, defval=0.5, group='Strategy TP & SL')
SLPerc = input.float(title='Stop Loss (%)', minval=0.0, step=0.1, defval=0.5, group='Strategy TP & SL')

period = input(20, 'CCI period',group = "TREND MAGIC")
coeff = input(1, 'ATR Multiplier',group = "TREND MAGIC")
AP = input(5, 'ATR Period',group = "TREND MAGIC")
ATR = ta.sma(ta.tr, AP)
srctm = close
upT = low - ATR * coeff
downT = high + ATR * coeff
MagicTrend = 0.0
MagicTrend := ta.cci(srctm, period) >= 0 ? upT < nz(MagicTrend[1]) ? nz(MagicTrend[1]) : upT : downT > nz(MagicTrend[1]) ? nz(MagicTrend[1]) : downT
color1 = ta.cci(srctm, period) >= 0 ? #0022FC : #FC0400
plot(MagicTrend, color=color1, linewidth=3)
tmb = ta.cci(srctm, period) >= 0 and close>MagicTrend
tms = ta.cci(srctm, period) <= 0 and close<MagicTrend

//MACD

res           = input.timeframe("",  "Indicator TimeFrame", group = "MACD")
fast_length   = input.int(title="Fast Length", defval=12, group = "MACD")
slow_length   = input.int(title="Slow Length", defval=26, group = "MACD")
src           = input.source(title="Source", defval=close, group = "MACD")
signal_length = input.int(title="Signal Smoothing", minval = 1, maxval = 999, defval = 9, group = "MACD")
sma_source    = input.string(title="Oscillator MA Type", defval="EMA", options=["SMA", "EMA"], group = "MACD")
sma_signal    = input.string(title="Signal Line MA Type", defval="EMA", options=["SMA", "EMA"], group = "MACD")

fast_ma = request.security(syminfo.tickerid, res, sma_source == "SMA" ? ta.sma(src, fast_length) : ta.ema(src, fast_length))
slow_ma = request.security(syminfo.tickerid, res, sma_source == "SMA" ? ta.sma(src, slow_length) : ta.ema(src, slow_length))
macd = fast_ma - slow_ma
signal = request.security(syminfo.tickerid, res, sma_signal == "SMA" ? ta.sma(macd, signal_length) : ta.ema(macd, signal_length))
hist = macd - signal

trend_up   = macd > signal
trend_dn   = macd < signal
cross_UP   = signal[1] >= macd[1] and signal < macd
cross_DN   = signal[1] <= macd[1] and signal > macd
cross_UP_A = (signal[1] >= macd[1] and signal < macd) and macd > 0
cross_DN_B = (signal[1] <= macd[1] and signal > macd) and macd < 0


//UT Bot

srcut = close
showut = input.bool(false, 'Show UT Bot Labels', group = "UT BOT")
keyvalue = input.float(2, title='Key Vaule. \'This changes the sensitivity\'', step=.5, group = "UT BOT")
atrperiod = input(7, title='ATR Period', group = "UT BOT")
xATR = ta.atr(atrperiod)
nLoss = keyvalue * xATR

xATRTrailingStop = 0.0
iff_1 = srcut > nz(xATRTrailingStop[1], 0) ? srcut - nLoss : srcut + nLoss
iff_2 = srcut < nz(xATRTrailingStop[1], 0) and srcut[1] < nz(xATRTrailingStop[1], 0) ? math.min(nz(xATRTrailingStop[1]), srcut + nLoss) : iff_1
xATRTrailingStop := srcut > nz(xATRTrailingStop[1], 0) and srcut[1] > nz(xATRTrailingStop[1], 0) ? math.max(nz(xATRTrailingStop[1]), srcut - nLoss) : iff_2

pos = 0
iff_3 = srcut[1] > nz(xATRTrailingStop[1], 0) and srcut < nz(xATRTrailingStop[1], 0) ? -1 : nz(pos[1], 0)
pos := srcut[1] < nz(xATRTrailingStop[1], 0) and srcut > nz(xATRTrailingStop[1], 0) ? 1 : iff_3

xcolor = pos == -1 ? color.red : pos == 1 ? color.green : color.blue

//plot(xATR, color=xcolor, title='Trailing Stop')
buy = ta.crossover(srcut, xATRTrailingStop)
sell = ta.crossunder(srcut, xATRTrailingStop)
barcolor = srcut > xATRTrailingStop

plotshape(showut ? buy:na, title='Buy', text='Buy', style=shape.labelup, location=location.belowbar, color=color.new(color.green, 0), textcolor=color.new(color.white, 0), size=size.tiny)
plotshape(showut ? sell:na, title='Sell', text='Sell', style=shape.labeldown, color=color.new(color.red, 0), textcolor=color.new(color.white, 0), size=size.tiny)

//barcolor(barcolor ? color.green : color.red)

goLong = buy and tmb and cross_UP
goShort = sell and tms and cross_DN

plotshape(goLong, location=location.bottom, style=shape.triangleup, color=color.lime, size=size.small)
plotshape(goShort, location=location.top, style=shape.triangledown, color=color.red, size=size.small)

percentAsPoints(pcnt) =>
    strategy.position_size != 0 ? math.round(pcnt / 100.0 * strategy.position_avg_price / syminfo.mintick) : float(na)

percentAsPrice(pcnt) =>
    strategy.position_size != 0 ? (pcnt / 100.0 + 1.0) * strategy.position_avg_price : float(na)

current_position_size = math.abs(strategy.position_size)
initial_position_size = math.abs(ta.valuewhen(strategy.position_size[1] == 0.0, strategy.position_size, 0))

TP = strategy.position_avg_price + percentAsPoints(TPPerc) * syminfo.mintick * strategy.position_size / math.abs(strategy.position_size)
SL = strategy.position_avg_price - percentAsPoints(SLPerc) * syminfo.mintick * strategy.position_size / math.abs(strategy.position_size)

var long = false
var short = false

if direction == 'Long' 
    long := goLong
    short := false

if direction == 'Short'
    short := goShort
    long := false

if direction == 'Both' 
    long := goLong
    short := goShort

if long and strategy.opentrades == 0
    strategy.entry(id='Long', direction=strategy.long)

if short and strategy.opentrades == 0
    strategy.entry(id='Short', direction=strategy.short)

if strategy.position_size > 0

    strategy.exit('TPSL', from_entry='Long', qty=initial_position_size, limit=TP, stop=SL)

if strategy.position_size < 0

    strategy.exit('TPSL2', from_entry='Short', qty=initial_position_size, limit=TP, stop=SL)



আরো