অ্যাডাপ্টিভ মুভিং এভারেজ চ্যানেল ব্রেকআউট কৌশলটি অ্যাডাপ্টিভ মুভিং এভারেজ (এএমএ) এবং ট্রেডিং সিগন্যাল তৈরির জন্য একটি অভিযোজিত চ্যানেল ব্যাপ্তির উপর ভিত্তি করে একটি প্রবণতা অনুসরণকারী ব্রেকআউট কৌশল। এটি বর্তমান মূল্য প্রবণতা দিক নির্ধারণ এবং সময়মত প্রবেশ এবং প্রস্থানগুলির জন্য মূল্য ব্রেকআউট সংকেত সনাক্ত করতে অভিযোজিত চ্যানেল স্তরগুলি নির্ধারণ করতে এএমএ ব্যবহার করে।
এই কৌশলটির মূল সূচক হল অ্যাডাপ্টিভ মুভিং এভারেজ (এএমএ), যা মূল্য প্রবণতা ক্যাপচার করতে ব্যবহৃত হয়। এএমএ গণনা করা হয়ঃ
AMA (t) = α (t-1) * P (t) + [1 - α (t-1) ] * AMA (t-1)
যেখানে P ((t) বর্তমান মূল্য, এবং α ((t) 0 এবং 1 এর মধ্যে মসৃণকরণ ধ্রুবক α ((t) দামের পরিবর্তনের জন্য AMA এর সংবেদনশীলতা নিয়ন্ত্রণের জন্য নির্দিষ্ট নিয়ম অনুযায়ী গতিশীলভাবে সামঞ্জস্য করা হয়। বিশেষত, α ((t) AMA এবং দামের মধ্যে বিচ্যুতি SNRT এর সাথে আনুপাতিক, যা গণনা করা হয়ঃ
SNRT = (P(t) - AMA(t-1)) / AMA(t-1)
সুতরাং, যখন দামের ওঠানামা বৃদ্ধি পায়, তখন এএমএকে আরও প্রতিক্রিয়াশীল করার জন্য α ((t) বৃদ্ধি পাবে; যখন ওঠানামা হ্রাস পায়, তখন এএমএকে আরও মসৃণ করার জন্য α ((t) হ্রাস পাবে।
এএমএ এর উপর ভিত্তি করে, কৌশলটি মূল্যের ব্রেকআউট সংকেত সনাক্ত করতে একটি অভিযোজিত চ্যানেল পরিসীমা তৈরি করে। উপরের এবং নীচের চ্যানেল স্তরগুলি হলঃ
উপরের অংশঃ H ((t) = (1 + β*H ((t-1)) * AMA ((t))
নিম্নঃ L ((t) = (1 - β*L ((t-1)) * AMA ((t))
যেখানে β হল একটি নিয়মিত পরামিতি যা চ্যানেলের প্রস্থ নিয়ন্ত্রণ করে। অবশেষে, কৌশলটি চ্যানেলের স্তরের দামের ব্রেকআউটগুলির উপর ভিত্তি করে ট্রেড তৈরি করেঃ
যখন দাম উপরের স্তরের উপরে ভেঙে যায় তখন লং প্রবেশ করুন।
যখন দাম নিচের স্তরের নিচে পড়ে তখন শর্ট এন্ট্রি করুন।
অন্যথায়, সমতল থাকুন।
এই কৌশলটির সুবিধাগুলির মধ্যে রয়েছেঃ
সহজ চলমান গড়ের তুলনায় AMA মূল্যের প্রবণতা ক্যাপচার করতে আরও নমনীয়, বিশেষ করে অস্থির বাজারে।
অভিযোজিত চ্যানেলটি তার প্রস্থকে গতিশীলভাবে সামঞ্জস্য করতে পারে, প্রবণতা অস্পষ্ট হলে প্রসারিত হয় এবং প্রবণতা উদ্ভূত হলে সংকীর্ণ হয়।
দামের ব্রেকআউট সিগন্যালগুলি উচ্চতর জয়ের হার সহ প্রবণতা শুরু করে সময়মতো ক্যাপচার করতে পারে।
যুক্তিটি সহজ এবং পরিষ্কার, সহজেই বোঝা যায় এবং পরিমাণগত ট্রেডিংয়ের জন্য স্বয়ংক্রিয় করা যায়।
এই কৌশলের ঝুঁকিগুলির মধ্যে রয়েছেঃ
ভুল AMA পরামিতিগুলি মূল্যের প্রবণতা মিস করতে পারে বা মিথ্যা সংকেত তৈরি করতে পারে।
β এর মতো অভিযোজনশীল চ্যানেলের পরামিতিগুলি সাবধানে সুরক্ষিত করা দরকার, অন্যথায় খুব বেশি উইপসো বা মিসড ট্রেন্ডগুলি ঘটতে পারে।
দামের ব্রেকআউট মিথ্যা ব্রেকআউটের জন্য সংবেদনশীল, যার জন্য আরও ফিল্টার প্রয়োজন।
কৌশলটি ঝুঁকি ব্যবস্থাপনা বা স্টপ লস প্রক্রিয়া অন্তর্ভুক্ত করে না।
কৌশলটি নিম্নলিখিতগুলির মাধ্যমে অপ্টিমাইজ করা যেতে পারেঃ
এএমএকে আরও প্রতিক্রিয়াশীল করার জন্য α গণনা উন্নত করা।
মিথ্যা সংকেত এড়ানোর জন্য প্রাথমিক ব্রেকআউটের পরে আরও নিশ্চিতকরণ যোগ করা হচ্ছে।
ভলিউম বা অস্থিরতার মতো ফিল্টার প্রয়োগ করে ব্রেকআউট বৈধতা যাচাই করা।
লাভ এবং ঝুঁকি নিয়ন্ত্রণের জন্য স্টপ লস অন্তর্ভুক্ত করা।
বিভিন্ন সম্পদ শ্রেণীর জন্য পজিশনের আকারকে অনুকূল করা।
সংক্ষেপে, অভিযোজিত চলন্ত গড় চ্যানেল ব্রেকআউট কৌশলটি একটি সহজ এবং ব্যবহারিক প্রবণতা অনুসরণকারী ব্রেকআউট কৌশল। এটি মূল্যের প্রবণতা ট্র্যাক করতে নমনীয় এএমএ এবং ব্রেকআউট সংকেত সনাক্ত করতে একটি অভিযোজিত চ্যানেল ব্যবহার করে। কৌশলটির কিছু সুবিধা রয়েছে তবে সম্ভাব্য ঝুঁকিও রয়েছে। প্যারামিটার টিউনিং, ফিল্টার যুক্ত করা এবং স্টপগুলি উন্নত করার মতো অপ্টিমাইজেশানগুলির সাথে এটি আরও শক্তিশালী হয়ে উঠতে পারে। সামগ্রিকভাবে, এটি পরিমাণগত ব্যবসায়ের জন্য একটি শক্ত বেসলাইন মডেল সরবরাহ করে।
/*backtest start: 2022-10-26 00:00:00 end: 2023-11-01 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 // CryptoStatistical - 2019 // AMA Strategy Channel Breakout Strategy from E. Durenard - Professional Automated Trading // https://www.amazon.com/Professional-Automated-Trading-Theory-Practice/dp/1118129857 strategy(title="[CS] AMA Strategy - Channel Break Out", shorttitle="AMA_ChannelBreakout_Strategy", initial_capital = 1000, overlay=true, pyramiding = 0, calc_on_every_tick=false, calc_on_order_fills=false, commission_type= strategy.commission.percent, commission_value = 0.08, currency=currency.USD) testStartYear = input(2019, "Backtest Start Year") testStartMonth = input(6, "Backtest Start Month") testStartDay = input(1, "Backtest Start Day") testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0) testStopYear = input(2019, "Backtest Stop Year") testStopMonth = input(12, "Backtest Stop Month") testStopDay = input(31, "Backtest Stop Day") testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0) testPeriodBackground = input(title="Color Background?", type=input.bool, defval=true) testPeriodBackgroundColor = testPeriodBackground and (time >= testPeriodStart) and (time <= testPeriodStop) ? #00FF00 : na bgcolor(testPeriodBackgroundColor, transp=95) testPeriod() => true price = input(title='Price Source:', type=input.source, defval=close) ama = price hb = price lb = price // Static model parameters minfactor = 0. maxfactor = 1. deviation_max = 1. deviation_min = 1. beta_hb = 1. beta_lb = 1. snr = 1. normalized_atan= 0. alpha = 0.5 // Suggested snr-factor from .5 upto 3.1 by .3 to find best parameter snrfactor = input(title='SNR Factor:', type=input.float, minval=0.6, maxval=3.3, step=0.3, defval=2.1) // Sensitivity Lookback search for the best perdiod from 5 to 20 lookback = input(title='Sensitivity Lookback:', type=input.integer, defval=5) // Suggested Beta from .5 below 4.5 by .3, usually in the range 1.2, 1.5 beta = input(title='Beta:', type=input.float, minval=0.6, maxval=4.5, step=0.3, defval=2.1) offsetlabel = input(title='Offset Label:', type=input.float, minval=0.001, maxval=0.03, step=0.001, defval=0.001) // pi/2 pi2 = 1.5707963267948966 // Zero-lag resampled moving average (Durschner nwma) f_nwma(_src, _period) => fast = _period/2 lambda = _period/fast alpha = lambda * (_period - 1)/(_period - lambda) average1 = wma(_src,_period) average2 = wma(average1,fast) nwma = (1+alpha)*average1 - alpha*average2 ama := alpha[1]*price + (1-alpha[1])*nz(ama[1]) deviation_max := alpha[1]*max((price[0] - price[1])/price[1],0) + (1-alpha[1])*nz(deviation_max[1]) deviation_min := -alpha[1]*min((price[0] - price[1])/price[1],0) + (1-alpha[1])*nz(deviation_min[1]) beta_hb := beta*deviation_max beta_lb := beta*deviation_min hb := (1 + beta_hb[1])*ama lb := (1 - beta_lb[1])*ama snr := if price > hb ((price - ama[1])/ama[1])/beta_lb else if price < lb -((price - ama[1])/ama[1])/beta_hb else 0 normalized_atan := (atan(snrfactor*snr) + pi2)/(2*pi2) alpha := f_nwma(minfactor + (maxfactor - minfactor)*normalized_atan, lookback) plot(ama, color=color.black) plot(hb, color=color.green) plot(lb, color=color.red) // Buy Condition Var bc = false // Sell Condition Var sc = false d = color.black // Buy Condition if(price > hb) bc := true d := color.green // Sell Condition if(price < lb) sc := true d := color.red if(testPeriod()) strategy.entry("Long", strategy.long, when = bc) strategy.entry("Short", strategy.short, when = sc) alertcondition(bc, title='BuyCondition', message='Buy') alertcondition(sc, title='SellCondition', message='Sell') plotshape(title='Buy', series=bc ? price * (1 - offsetlabel) : na, text='A1B', style=shape.labelup, location=location.absolute, color=d, textcolor=color.white, offset=0) plotshape(title='Sell', series=sc ? price * (1 + offsetlabel) : na, text='A1S', style=shape.labeldown, location=location.absolute, color=d, textcolor=color.white, offset=0)