
মাল্টি টাইমফ্রেম মুভিং এভারেজ ক্রসওভার কৌশল হল একটি অ্যালগরিদমিক ট্রেডিং কৌশল যা বিভিন্ন সময়কালের চলমান গড়ের মধ্যে ক্রস সংকেত ব্যবহার করে প্রবণতার দিক নির্ধারণ করে। এই কৌশলটি প্রবণতা সূচক, গতিশীলতা সূচক এবং ওঠানামা সূচকগুলির সমন্বয় ব্যবহার করে, যা কৌশল সংকেতকে আরও নির্ভরযোগ্য করে তোলে।
এই কৌশলটি মার্কেটের প্রবণতার দিকটি নির্ধারণ করে বিভিন্ন সময়কালের সিসিআই সূচকগুলি গণনা করে, তারপরে ম্যাকড সূচকগুলির সাথে মিলিত হয়ে গোল্ড ফর্ক ডাই ফর্ক সংকেত সন্ধান করে এবং শেষ পর্যন্ত এটিআর সূচকের সাহায্যে স্টপ লস স্টপ সেট করে, যার ফলে কম কেনা বেচাকেনা করা যায়।
বিশেষ করে, প্রথমে ২০ চক্রের সিসিআই সূচক গণনা করা হয়, যাতে বাজারের প্রবণতা নির্ধারণের জন্য এর ধনাত্মক এবং নেতিবাচক দিকের উপর ভিত্তি করে; তারপরে MACD সূচকের ধীর গড় লাইনটি ক্রস হয় কিনা তা গণনা করা হয়, যাতে ক্রয়-বিক্রয় সংকেত তৈরি হয় কিনা তা নির্ধারণ করা হয়; তারপরে এটিআর সূচকটি ব্যবহার করে ট্র্যাকিং স্টপ লস মেশিন তৈরি করা হয়, যাতে আরও বেশি মুনাফা লক করা যায়; অবশেষে, উপরের একাধিক সূচকের সংকেত সংহত করে চূড়ান্ত ক্রয়-বিক্রয় কৌশল সংকেত তৈরি করা হয়।
এই কৌশলটি CCI, MACD এবং ATR এর তিনটি সূচকের সমন্বয় ব্যবহার করে বাজারের প্রবণতা, গতিশীলতা এবং অস্থিরতার বিষয়ে সমন্বিতভাবে বিচার করে, যা কৌশলগত সংকেতকে আরও নির্ভুল এবং নির্ভরযোগ্য করে তোলে।
বিভিন্ন চক্রের সিসিআই ব্যবহার করে বাজারের সামগ্রিক প্রবণতা নির্ধারণ করুন, উচ্চ চক্রের এমএসিডি-র সাথে কম ও উচ্চ বিক্রয় নোড খুঁজুন, বাজারের বৃহত্তর প্রবণতার গতি ধরে রাখতে সক্ষম হবেন।
এটিআর সূচক দ্বারা উত্পন্ন স্টপ লস ব্যবহার করে, বাজারের ওঠানামা অনুযায়ী যুক্তিসঙ্গত স্টপ লস সেট করা যেতে পারে, এবং স্টপ লস ট্র্যাকিং ফাংশন রয়েছে, যা কৌশলটির ঝুঁকি নিয়ন্ত্রণ করতে পারে।
এই কৌশলটির বেশিরভাগ প্যারামিটারের জন্য সামঞ্জস্যের জায়গা খুব বেশি নয়, এটি কার্যকারিতার সীমাতে পৌঁছানো সহজ, যা কৌশলটির কার্যকারিতা আরও বাড়িয়ে তোলে।
যেহেতু কৌশলটি একাধিক সূচক ব্যবহার করে সমন্বয় অপারেশনের জন্য, কৌশলটির গণনা বোঝা কিছুটা বৃদ্ধি পায়। উচ্চ-ফ্রিকোয়েন্সি ব্যবসায়ের ক্ষেত্রে কার্টনের সমস্যা হতে পারে।
কৌশলগত সংকেতগুলি আরও ঘন ঘন হতে পারে, এবং ঝুঁকি নিয়ন্ত্রণ মূলত এটিআর সূচকের স্টপ লস ট্র্যাকিংয়ের উপর নির্ভর করে, চরম পরিস্থিতির জন্য ঝুঁকি নিয়ন্ত্রণ অসম্পূর্ণ।
কিছু মেশিন লার্নিং সুপারপ্যারামিটার অপ্টিমাইজেশান অ্যালগরিদম যেমন বেয়েস অপ্টিমাইজেশন, জেনেটিক অ্যালগরিদম ইত্যাদি ব্যবহার করে প্যারামিটারগুলিকে আরও স্মার্ট এবং দক্ষ করে তোলার চেষ্টা করা যেতে পারে।
কিছু অন্যান্য কার্যকরী সূচক, যেমন অস্থিরতা সূচক, পরিমাণগত সূচক, আবেগ সূচক ইত্যাদি যোগ করার কথা বিবেচনা করা যেতে পারে, যা কৌশলগুলির অভিযোজনযোগ্যতা এবং স্থিতিশীলতা বাড়িয়ে তুলতে পারে।
স্টপ লস নীতিটি আরও বৈজ্ঞানিকভাবে ডিজাইন করা যেতে পারে, বা পজিশন কন্ট্রোল বা তহবিল পরিচালনার মডিউল যুক্ত করা যেতে পারে, যাতে চরম পরিস্থিতির ঝুঁকিগুলি আরও ভালভাবে প্রতিরোধ করা যায় এবং কৌশলটির স্থিতিশীলতা নিশ্চিত করা যায়।
CCI, MACD এবং ATR এর তিনটি প্রধান সূচকের সমন্বয় ব্যবহার করে একাধিক সময় ফ্রেমওয়ার্কের সমান্তরাল কৌশলটি আরও নির্ভরযোগ্য প্রবণতা বিচার এবং দক্ষ ঝুঁকি নিয়ন্ত্রণের জন্য। এই কৌশলটি প্রবণতা, গতিশীলতা এবং ওঠানামার তিনটি মাত্রা বিবেচনা করে, উচ্চ সংকেত নির্ভুলতা, বাজারের গতি এবং কার্যকর নিয়ন্ত্রণের ঝুঁকির সুবিধা রয়েছে। অবশ্যই, কৌশলটি একটি নির্দিষ্ট প্যারামিটার অপ্টিমাইজেশন স্পেস, সীমিত গণনা বোঝা এবং ঝুঁকি নিয়ন্ত্রণের উন্নতির মতো সমস্যা রয়েছে। আরও সূচক প্রবর্তন, আরও ভাল প্যারামিটার অপ্টিমাইজেশন পদ্ধতি ব্যবহার এবং আরও শক্তিশালী ঝুঁকি নিয়ন্ত্রণ মডিউল ডিজাইন করে এই কৌশলটি আরও উন্নত এবং অপ্টিমাইজ করা যেতে পারে।
/*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)