বিপরীত-আটক কৌশল

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

img

সারসংক্ষেপ

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

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

কৌশলটি ট্রেডিং সংকেত যাচাই করার জন্য আরএসআই এবং অন্যান্য গতির সূচকগুলির সাথে মিলিত, মূল প্রযুক্তিগত সূচক হিসাবে বলিংজার ব্যান্ড ব্যবহার করে। নির্দিষ্ট যুক্তি হলঃ

  1. লং বা শর্ট স্ট্যান্ড নির্ধারণের জন্য প্রধান ট্রেন্ডের দিকনির্দেশনা বিচার করুন। ট্রেন্ড নির্ধারণের জন্য 50-দিনের ইএমএ এবং 21-দিনের ইএমএ গোল্ডেন ক্রস/ডেড ক্রস ব্যবহার করুন।
  2. ডাউনট্রেন্ডে, যখন মূল্য বোলিঞ্জার লোয়ার ব্যান্ডের উপরে ভেঙে যায়, আর আরএসআই কেবল ওভারসোল্ড অঞ্চল থেকে ফিরে আসে, একটি সোনার ক্রস গঠন করে, এটি নির্দেশ করে যে ওভারসোল্ড অঞ্চলটি ইতিমধ্যে নীচে পৌঁছেছে, একটি ক্রয় সংকেত দেয়।
  3. একটি আপট্রেন্ডে, যখন মূল্য বোলিঞ্জার উপরের ব্যান্ডের নিচে ভেঙে যায়, এবং আরএসআই ওভারকোপ এলাকা থেকে ফিরে যায়, একটি মৃত ক্রস গঠন করে, এটি ওভারকোপ এলাকাটি পুনরুদ্ধার শুরু করে, একটি বিক্রয় সংকেত দেয়।
  4. মিথ্যা সংকেত এড়াতে উপরের ক্রয় এবং বিক্রয় সংকেত একসাথে সক্রিয় করা উচিত।

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

এই কৌশলটির সুবিধাগুলির মধ্যে রয়েছেঃ

  1. অস্থিরতা এবং গতির সূচকগুলির সংমিশ্রণ সংকেতগুলিকে আরও নির্ভরযোগ্য করে তোলে।
  2. রিভার্সাল ট্রেডিংয়ের ঝুঁকি কম, যা স্বল্পমেয়াদী ট্রেডিংয়ের জন্য উপযুক্ত।
  3. স্বয়ংক্রিয় ট্রেডিংয়ের জন্য ট্রেডিং নিয়মগুলি প্রোগ্রামযোগ্য।
  4. ট্রেন্ড ট্রেডিংয়ের সাথে সংযুক্ত করা বাজার সংহতকরণের সময় বিশৃঙ্খলা সৃষ্টি এড়ায়।

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

এই কৌশলটির ঝুঁকিগুলির মধ্যে রয়েছেঃ

  1. Bollinger Bands breakout false signal risk, needs RSI filter. Bollinger Bands breakout false signal risk, needs RSI filter. Bollinger Bands breakout false signal risk, needs RSI filter. বোলিংজার ব্যান্ড মিথ্যা সংকেত ঝুঁকি, RSI ফিল্টার প্রয়োজন।
  2. ব্যর্থ বিপরীত ঝুঁকি, সময়মত স্টপ লস প্রয়োজন।
  3. রিভার্সাল টাইমিং ঝুঁকি, খুব তাড়াতাড়ি প্রবেশ করতে পারে বা সেরা প্রবেশের পয়েন্ট মিস করতে পারে।

ঝুঁকি নিয়ন্ত্রণের জন্য, আমরা ঝুঁকি ঝুঁকি সীমাবদ্ধ করার জন্য স্টপ লস স্তর সেট করতে পারি, এবং সিস্টেমের কর্মক্ষমতা উন্নত করতে বোলিংজার ব্যান্ড সময়কাল বা RSI পরিসংখ্যান মত পরামিতি অপ্টিমাইজ করতে পারেন।

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

মূল অপ্টিমাইজেশান দিকগুলির মধ্যে রয়েছেঃ

  1. বোলিংজার ব্যান্ডের পরামিতি অপ্টিমাইজ করুন, সময়ের দৈর্ঘ্য এবং স্ট্যান্ডার্ড ডিভিয়েশন সামঞ্জস্য করুন যাতে সর্বোত্তম সেটিং পাওয়া যায়।
  2. প্রবণতা মূল্যায়নের জন্য সর্বোত্তম সময় নির্ধারণের জন্য চলমান গড়ের সময়কালকে অনুকূল করুন।
  3. সর্বোত্তম ওভারকপ/ওভারসোল্ড রেঞ্জের জন্য RSI পরামিতিগুলি সামঞ্জস্য করুন।
  4. এন্ট্রি সিগন্যালকে বৈচিত্র্যময় করার জন্য কেডিজে, এমএসিডি এর মতো অন্যান্য সূচক যোগ করুন।
  5. অপ্টিমাইজড প্যারামিটার খুঁজতে মেশিন লার্নিং মডেল প্রবর্তন করুন।

সিদ্ধান্ত

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


/*backtest
start: 2023-10-24 00:00:00
end: 2023-11-23 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This is an Open source work. Please do acknowledge in case you want to reuse whole or part of this code.
// Please see the documentation to know the details about this.

//@version=5
strategy('Strategy:Reversal-Catcher', shorttitle="Reversal-Catcher", overlay=true , currency=currency.NONE, initial_capital=100000)

// Inputs
src = input(close, title="Source (close, high, low, open etc.")

BBlength = input.int(defval=20, minval=1,title="Bollinger Period Length, default 20")
BBmult = input.float(defval=1.5, minval=1.0, maxval=4, step=0.1, title="Bollinger Bands Standard Deviation, default is 1.5")

fastMovingAvg = input.int(defval=21, minval=5,title="Fast Exponential Moving Average, default 21", group = "Trends")
slowMovingAvg = input.int(defval=50, minval=8,title="Slow Exponential Moving Average, default 50", group = "Trends")

rsiLenght = input.int(defval=14, title="RSI Lenght, default 14", group = "Momentum")
overbought = input.int(defval=70, title="Overbought limit (RSI), default 70", group = "Momentum")
oversold = input.int(defval=30, title="Oversold limit (RSI), default 30", group = "Momentum")

hide = input.bool(defval=true, title="Hide all plots and legends from the chart (default: true)")


// Trade related
tradeType = input.string(defval='Both', group="Trade settings", title="Trade Type", options=['Both', 'TrendFollowing', 'Reversal'], tooltip="Consider all types of trades? Or only Trend Following or only Reversal? (default: Both).")
endOfDay = input.int(defval=1500, title="Close all trades, default is 3:00 PM, 1500 hours (integer)", group="Trade settings")
mktAlwaysOn = input.bool(defval=false, title="Markets that never closed (Crypto, Forex, Commodity)", tooltip="Some markers never closes. For those cases, make this checked. (Default: off)", group="Trade settings")


// Utils
annotatePlots(txt, val, hide) => 
    if (not hide)
        var l1 = label.new(bar_index, val, txt, style=label.style_label_left, size = size.tiny, textcolor = color.white, tooltip = txt)
        label.set_xy(l1, bar_index, val)

/////////////////////////////// Indicators /////////////////////
vwap = ta.vwap(src)
plot(hide ? na : vwap, color=color.purple, title="VWAP", style = plot.style_line)
annotatePlots('VWAP', vwap, hide)

// Bollinger Band of present time frame
[BBbasis, BBupper, BBlower] = ta.bb(src, BBlength, BBmult)
p1 = plot(hide ? na : BBupper, color=color.blue,title="Bollinger Bands Upper Line")
p2 = plot(hide ? na : BBlower, color=color.blue,title="Bollinger Bands Lower Line")
p3 = plot(hide ? na : BBbasis, color=color.maroon,title="Bollinger Bands Width", style=plot.style_circles, linewidth = 1)
annotatePlots('BB-Upper', BBupper, hide)
annotatePlots('BB-Lower', BBlower, hide)
annotatePlots('BB-Base(20-SMA)', BBbasis, hide)

// RSI
rsi = ta.rsi(src, rsiLenght)

// Trend following
ema50 = ta.ema(src, slowMovingAvg)
ema21 = ta.ema(src, fastMovingAvg)
annotatePlots('21-EMA', ema21, hide)
annotatePlots('50-EMA', ema50, hide)


// Trend conditions
upTrend = ema21 > ema50 
downTrend = ema21 < ema50


// Condition to check Special Entry: HH_LL
// Long side:
hhLLong = barstate.isconfirmed and (low > low[1]) and (high > high[1]) and (close > high[1])
hhLLShort = barstate.isconfirmed and (low < low[1]) and (high < high[1]) and (close < low[1])

longCond =  barstate.isconfirmed and (high[1] < BBlower[1]) and (close > BBlower) and (close < BBupper) and hhLLong and ta.crossover(rsi, oversold) and downTrend
shortCond = barstate.isconfirmed and (low[1] > BBupper[1]) and (close < BBupper) and (close > BBlower) and hhLLShort and ta.crossunder(rsi, overbought) and upTrend

// Trade execute
h = hour(time('1'), syminfo.timezone)
m = minute(time('1'), syminfo.timezone)
hourVal = h * 100 + m
totalTrades = strategy.opentrades + strategy.closedtrades
if (mktAlwaysOn or (hourVal < endOfDay))
    // Entry
    var float sl = na
    var float target = na
    if (longCond)
        strategy.entry("enter long", strategy.long, 1, limit=na, stop=na, comment="Long[E]")
        sl := low[1]
        target := high >= BBbasis ? BBupper : BBbasis
        alert('Buy:' + syminfo.ticker + ' ,SL:' + str.tostring(math.floor(sl)) + ', Target:' + str.tostring(target), alert.freq_once_per_bar)
    if (shortCond)
        strategy.entry("enter short", strategy.short, 1, limit=na, stop=na, comment="Short[E]")
        sl := high[1]
        target := low <= BBbasis ? BBlower : BBbasis
        alert('Sell:' + syminfo.ticker + ' ,SL:' + str.tostring(math.floor(sl)) + ', Target:' + str.tostring(target), alert.freq_once_per_bar)

    // Exit: target or SL
    if ((close >= target) or (close <= sl))
        strategy.close("enter long", comment=close < sl ? "Long[SL]" : "Long[T]")
    if ((close <= target) or (close >= sl))
        strategy.close("enter short", comment=close > sl ? "Short[SL]" : "Short[T]")
else if (not mktAlwaysOn)
    // Close all open position at the end if Day
    strategy.close_all(comment = "EoD[Exit]", alert_message = "EoD Exit", immediately = true)


আরো