মোমেন্টাম ব্রেকআউট কৌশল হল একটি প্রবণতা অনুসরণকারী কৌশল যা বাজারের গতি অনুসরণ করে। এটি একাধিক সূচককে একত্রিত করে বাজার বর্তমানে একটি আপ বা ডাউন প্রবণতায় রয়েছে কিনা তা বিচার করে এবং মূল প্রতিরোধের স্তরগুলি ভেঙে ফেলার সময় দীর্ঘ অবস্থানগুলি খোলে এবং মূল সমর্থন স্তরগুলি ভেঙে ফেলার সময় শর্ট অবস্থানগুলি খোলে।
এই কৌশলটি মূলত বাজারের প্রবণতা এবং মূল মূল্যের স্তর নির্ধারণের জন্য একাধিক সময়সীমার ডনচিয়ান চ্যানেলগুলি ব্যবহার করে। বিশেষত, যখন দামগুলি দীর্ঘমেয়াদী ডনচিয়ান চ্যানেলের উপরের রেলটি যেমন 40 দিনের মধ্যে ভেঙে যায়, তখন এটি একটি আপট্রেন্ড হিসাবে বিচার করা হয়। বছরের মধ্যে নতুন উচ্চতা এবং চলমান গড়ের সারিবদ্ধতার মতো অতিরিক্ত ফিল্টারগুলির সাথে, দীর্ঘ সংকেতগুলি ট্রিগার করা হয়। যখন দামগুলি দীর্ঘমেয়াদী ডনচিয়ান চ্যানেলের নিম্ন রেলের নীচে ভেঙে যায়, তখন এটি একটি ডাউনট্রেন্ড হিসাবে বিচার করা হয়। বছরের মধ্যে নতুন নিম্নের মতো ফিল্টারগুলির সাথে, সংক্ষিপ্ত সংকেতগুলি ট্রিগার করা হয়।
কৌশলটি প্রস্থান পজিশনের জন্য দুটি বিকল্প সরবরাহ করেঃ স্থির অবৈধকরণ লাইন এবং ট্রেলিং স্টপ লস। স্থির অবৈধকরণ লাইনটি 20 দিনের মতো একটি সংক্ষিপ্ত ডনচিয়ান চ্যানেলের নিম্ন / উপরের রেল ব্যবহার করে। ট্রেলিং স্টপ লস এটিআর মানগুলির উপর ভিত্তি করে প্রতিদিন একটি গতিশীল স্টপ লস লাইন গণনা করে। উভয় পদ্ধতিই ঝুঁকি কার্যকরভাবে নিয়ন্ত্রণ করতে পারে।
এই কৌশলটি প্রবণতা বিচার এবং ব্রেকআউট অপারেশনকে একত্রিত করে, যা বাজারে স্বল্পমেয়াদী দিকনির্দেশমূলক সুযোগগুলি কার্যকরভাবে ক্যাপচার করতে পারে। একক সূচকের তুলনায়, এটি একাধিক ফিল্টার ব্যবহার করে যা কিছু মিথ্যা ব্রেকআউট ফিল্টার করতে পারে এবং এন্ট্রি সংকেতগুলির গুণমান উন্নত করতে পারে। তদতিরিক্ত, স্টপ লস কৌশলগুলি প্রয়োগ করা তার স্থিতিস্থাপকতাও বাড়ায় এবং বাজারের সংক্ষিপ্তভাবে পিছনে টানলেও কার্যকরভাবে ক্ষতি নিয়ন্ত্রণ করতে পারে।
এই কৌশলটির মূল ঝুঁকি হ'ল দামগুলি হিংস্রভাবে ওঠানামা করতে পারে, যা প্রস্থান পজিশনে স্টপ লসকে ট্রিগার করে। যদি দামগুলি দ্রুত বিপরীত হয় তবে সুযোগগুলি মিস করা যেতে পারে। এছাড়াও, একাধিক ফিল্টার ব্যবহার কিছু সুযোগ ফিল্টার করতে পারে এবং ব্যবসায়ের ফ্রিকোয়েন্সি হ্রাস করতে পারে।
ঝুঁকি কমাতে, এটিআর গুণকগুলি সামঞ্জস্য করা যেতে পারে বা স্টপ লস আঘাতের সম্ভাবনা হ্রাস করার জন্য ডনচিয়ান চ্যানেলের ব্যবধানগুলি প্রশস্ত করা যেতে পারে। কিছু ফিল্টারগুলি প্রবেশের ফ্রিকোয়েন্সি বাড়ানোর জন্য সরানো বা শিথিল করা যেতে পারে, তবে ঝুঁকিগুলিও বাড়বে।
এই কৌশলটি নিম্নলিখিত দিকগুলিতে অনুকূলিত করা যেতে পারেঃ
বিভিন্ন পরামিতি পরীক্ষা করে, ঝুঁকি এবং রিটার্নের সর্বোত্তম সমন্বয় খুঁজে পাওয়া যায়।
এই কৌশলটি ট্রেন্ডের দিকনির্দেশ নির্ধারণের জন্য একাধিক সূচককে একত্রিত করে এবং মূল ব্রেকআউট স্তরে বাণিজ্যকে ট্রিগার করে। এর স্টপ লস প্রক্রিয়াটি এটিকে ঝুঁকির প্রতি প্রতিরোধী করে তোলে। প্যারামিটারগুলি অনুকূল করে, স্থিতিশীল অতিরিক্ত রিটার্ন অর্জন করা যায়। এটি বিনিয়োগকারীদের জন্য উপযুক্ত যারা বাজারের উপর পরিষ্কার দৃষ্টিভঙ্গি নেই তবে প্রবণতা অনুসরণ করতে চান।
/*backtest start: 2024-01-23 00:00:00 end: 2024-02-22 00:00:00 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/ // © HeWhoMustNotBeNamed //@version=4 strategy("BuyHigh-SellLow Strategy", overlay=true, initial_capital = 10000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, pyramiding = 1, commission_value = 0.01, calc_on_order_fills = true) donchianEntryLength = input(40, step=10) donchianExitLength = input(20, step=10) considerNewLongTermHighLows = input(true) shortHighLowPeriod = input(120, step=10) longHighLowPeriod = input(180, step=10) considerMAAlignment = input(true) MAType = input(title="Moving Average Type", defval="ema", options=["ema", "sma", "hma", "rma", "vwma", "wma"]) LookbackPeriod = input(40, minval=10,step=10) atrLength = input(22) atrMult = input(4) exitStrategy = input(title="Exit Strategy", defval="tsl", options=["dc", "tsl"]) considerYearlyHighLow = input(true) backtestYears = input(10, minval=1, step=1) f_getMovingAverage(source, MAType, length)=> ma = sma(source, length) if(MAType == "ema") ma := ema(source,length) if(MAType == "hma") ma := hma(source,length) if(MAType == "rma") ma := rma(source,length) if(MAType == "vwma") ma := vwma(source,length) if(MAType == "wma") ma := wma(source,length) ma f_getTrailingStop(atr, atrMult)=> stop = close - atrMult*atr stop := strategy.position_size > 0 ? max(stop, stop[1]) : stop stop f_getMaAlignment(MAType, includePartiallyAligned)=> ma5 = f_getMovingAverage(close,MAType,5) ma10 = f_getMovingAverage(close,MAType,10) ma20 = f_getMovingAverage(close,MAType,20) ma30 = f_getMovingAverage(close,MAType,30) ma50 = f_getMovingAverage(close,MAType,50) ma100 = f_getMovingAverage(close,MAType,100) ma200 = f_getMovingAverage(close,MAType,200) upwardScore = 0 upwardScore := close > ma5? upwardScore+1:upwardScore upwardScore := ma5 > ma10? upwardScore+1:upwardScore upwardScore := ma10 > ma20? upwardScore+1:upwardScore upwardScore := ma20 > ma30? upwardScore+1:upwardScore upwardScore := ma30 > ma50? upwardScore+1:upwardScore upwardScore := ma50 > ma100? upwardScore+1:upwardScore upwardScore := ma100 > ma200? upwardScore+1:upwardScore upwards = close > ma5 and ma5 > ma10 and ma10 > ma20 and ma20 > ma30 and ma30 > ma50 and ma50 > ma100 and ma100 > ma200 downwards = close < ma5 and ma5 < ma10 and ma10 < ma20 and ma20 < ma30 and ma30 < ma50 and ma50 < ma100 and ma100 < ma200 upwards?1:downwards?-1:includePartiallyAligned ? (upwardScore > 5? 0.5: upwardScore < 2?-0.5:upwardScore>3?0.25:-0.25) : 0 //////////////////////////////////// Calculate new high low condition ////////////////////////////////////////////////// f_calculateNewHighLows(shortHighLowPeriod, longHighLowPeriod, considerNewLongTermHighLows)=> newHigh = highest(shortHighLowPeriod) == highest(longHighLowPeriod) or not considerNewLongTermHighLows newLow = lowest(shortHighLowPeriod) == lowest(longHighLowPeriod) or not considerNewLongTermHighLows [newHigh,newLow] //////////////////////////////////// Calculate Yearly High Low ////////////////////////////////////////////////// f_getYearlyHighLowCondition(considerYearlyHighLow)=> yhigh = security(syminfo.tickerid, '12M', high[1]) ylow = security(syminfo.tickerid, '12M', low[1]) yhighlast = yhigh[365] ylowlast = ylow[365] yhighllast = yhigh[2 * 365] ylowllast = ylow[2 * 365] yearlyTrendUp = na(yhigh)? true : na(yhighlast)? close > yhigh : na(yhighllast)? close > max(yhigh,yhighlast) : close > max(yhigh, min(yhighlast, yhighllast)) yearlyHighCondition = ( (na(yhigh) or na(yhighlast) ? true : (yhigh > yhighlast) ) and ( na(yhigh) or na(yhighllast) ? true : (yhigh > yhighllast))) or yearlyTrendUp or not considerYearlyHighLow yearlyTrendDown = na(ylow)? true : na(ylowlast)? close < ylow : na(ylowllast)? close < min(ylow,ylowlast) : close < min(ylow, max(ylowlast, ylowllast)) yearlyLowCondition = ( (na(ylow) or na(ylowlast) ? true : (ylow < ylowlast) ) and ( na(ylow) or na(ylowllast) ? true : (ylow < ylowllast))) or yearlyTrendDown or not considerYearlyHighLow label_x = time+(60*60*24*1000*1) [yearlyHighCondition,yearlyLowCondition] donchian(rangeLength)=> upper = highest(rangeLength) lower = lowest(rangeLength) middle = (upper+lower)/2 [middle, upper, lower] inDateRange = true [eMiddle, eUpper, eLower] = donchian(donchianEntryLength) [exMiddle, exUpper, exLower] = donchian(donchianExitLength) maAlignment = f_getMaAlignment(MAType, false) [yearlyHighCondition, yearlyLowCondition] = f_getYearlyHighLowCondition(considerYearlyHighLow) [newHigh,newLow] = f_calculateNewHighLows(shortHighLowPeriod, longHighLowPeriod, considerNewLongTermHighLows) maAlignmentLongCondition = highest(maAlignment, LookbackPeriod) == 1 or not considerMAAlignment atr = atr(atrLength) tsl = f_getTrailingStop(atr, atrMult) //U = plot(eUpper, title="Up", color=color.green, linewidth=2, style=plot.style_linebr) //D = plot(exLower, title="Ex Low", color=color.red, linewidth=2, style=plot.style_linebr) longCondition = crossover(close, eUpper[1]) and yearlyHighCondition and newHigh and maAlignmentLongCondition exitLongCondition = crossunder(close, exLower[1]) shortCondition = crossunder(close, eLower[1]) and yearlyLowCondition and newLow exitShortCondition = crossover(close, exUpper[1]) strategy.entry("Buy", strategy.long, when=longCondition and inDateRange, oca_name="oca_buy") strategy.exit("ExitBuyDC", "Buy", when=exitStrategy=='dc', stop=exLower) strategy.exit("ExitBuyTSL", "Buy", when=exitStrategy=='tsl', stop=tsl) plot(strategy.position_size > 0 ? (exitStrategy=='dc'?exLower:tsl) : na, title="Trailing Stop", color=color.red, linewidth=2, style=plot.style_linebr) //strategy.close("Buy", when=exitLongCondition)