ইম্পোমেন্ট ব্রেকআউট কৌশল

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

img

সারসংক্ষেপ

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

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

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

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

সুবিধা বিশ্লেষণ

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

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

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

ঝুঁকি কমাতে, এটিআর গুণকগুলি সামঞ্জস্য করা যেতে পারে বা স্টপ লস আঘাতের সম্ভাবনা হ্রাস করার জন্য ডনচিয়ান চ্যানেলের ব্যবধানগুলি প্রশস্ত করা যেতে পারে। কিছু ফিল্টারগুলি প্রবেশের ফ্রিকোয়েন্সি বাড়ানোর জন্য সরানো বা শিথিল করা যেতে পারে, তবে ঝুঁকিগুলিও বাড়বে।

অপ্টিমাইজেশান নির্দেশাবলী

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

  1. প্যারামিটারগুলির সেরা সমন্বয় খুঁজে পেতে ডনচিয়ান চ্যানেলগুলির দৈর্ঘ্য অপ্টিমাইজ করুন।
  2. ফিল্টার হিসেবে বিভিন্ন ধরণের চলমান গড় ব্যবহার করে দেখুন।
  3. এটিআর মাল্টিপ্লাইফায়ার সামঞ্জস্য করুন অথবা স্টপ লস এর জন্য নির্দিষ্ট পয়েন্ট ব্যবহার করুন।
  4. এমএসিডি এর মত আরো ট্রেন্ড বিচারক সূচক যোগ করুন।
  5. বছরের মধ্যে নতুন উচ্চতা / নিম্নতা ইত্যাদির জন্য পুনর্বিবেচনার সময়কালকে অনুকূল করুন

বিভিন্ন পরামিতি পরীক্ষা করে, ঝুঁকি এবং রিটার্নের সর্বোত্তম সমন্বয় খুঁজে পাওয়া যায়।

সিদ্ধান্ত

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


/*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)

আরো