এটিআর ভিত্তিক ট্রেন্ড ট্র্যাকিং কৌশল

লেখক:চাওঝাং, তারিখঃ 2024-01-05 16:28:48
ট্যাগঃ

img

সারসংক্ষেপ

এটি গড় সত্য পরিসীমা (এটিআর) এর উপর ভিত্তি করে একটি প্রবণতা ট্র্যাকিং কৌশল। এটি সূচক মান গণনা এবং মূল্য প্রবণতা দিক নির্ধারণের জন্য এটিআর ব্যবহার করে। কৌশলটি ঝুঁকি নিয়ন্ত্রণের জন্য একটি স্টপ লস প্রক্রিয়াও সরবরাহ করে।

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

কৌশলটি তিনটি প্রধান পরামিতি ব্যবহার করেঃ সময়কাল, মাল্টিপ্লায়ার এবং প্রবেশ / প্রস্থান পয়েন্ট। ডিফল্ট পরামিতিগুলি 14 টি পিরিয়ডের এটিআর এবং 4 এর মাল্টিপ্লায়ার।

কৌশলটি প্রথমে দীর্ঘ গড় মূল্য (buyavg) এবং সংক্ষিপ্ত গড় মূল্য (sellavg) গণনা করে, তারপরে বর্তমান প্রবণতার দিক নির্ধারণের জন্য এই দুটি গড়ের মধ্যে মূল্য সম্পর্ক তুলনা করে। যদি দামটি সংক্ষিপ্ত গড় মূল্যের চেয়ে বেশি হয় তবে এটি দীর্ঘ হিসাবে বিচার করা হয়; যদি দামটি দীর্ঘ গড় মূল্যের চেয়ে কম হয় তবে এটি সংক্ষিপ্ত হিসাবে বিচার করা হয়।

অতিরিক্তভাবে, কৌশলটি একটি ট্রেলিং স্টপ লস সেট করার জন্য এটিআরকে অন্তর্ভুক্ত করে। বিশেষত, এটি স্টপ লস দূরত্ব হিসাবে এটিআর-এর 14 পিরিয়ড ওয়েটেড মুভিং এভারেজকে একটি গুণক (ডিফল্ট 4) দ্বারা গুণিত করে। এটি বাজারের অস্থিরতার উপর ভিত্তি করে স্টপ লস দূরত্ব সামঞ্জস্য করার অনুমতি দেয়।

যখন স্টপ লস ট্রিগার করা হয়, তখন কৌশলটি মুনাফা লক করার জন্য অবস্থানটি বন্ধ করবে।

সুবিধা

  1. প্রবণতা মূল্যায়নের উপর ভিত্তি করে, এটি লাভের জন্য প্রবণতা অব্যাহতভাবে অনুসরণ করতে পারে
  2. এটিআর ব্যবহার করুন গতিশীলভাবে স্টপ লস দূরত্ব সামঞ্জস্য করতে, কার্যকরভাবে ঝুঁকি নিয়ন্ত্রণ
  3. প্রবেশ এবং প্রস্থান পয়েন্ট গণনা সহজ এবং সরাসরি, সহজ বুঝতে এবং বাস্তবায়ন

ঝুঁকি ও সমাধান

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

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

  1. বিভিন্ন বাজারে পজিশন খোলা এড়াতে ফিল্টারিংয়ের জন্য অন্যান্য সূচক যোগ করুন
  2. স্টপ দূরত্বকে আরও যুক্তিসঙ্গত করার জন্য ATR সময়কাল এবং মাল্টিপ্লায়ার পরামিতিগুলি অপ্টিমাইজ করুন
  3. বাজারের অবস্থার উপর ভিত্তি করে অবস্থান আকার নিয়ন্ত্রণ যোগ করুন

সিদ্ধান্ত

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


/*backtest
start: 2022-12-29 00:00:00
end: 2024-01-04 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy('Trend Strategy by zdmre', shorttitle='Trend Strategy', overlay=true, pyramiding=0, currency=currency.USD, default_qty_type=strategy.percent_of_equity, initial_capital=10000, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.005)
show_STOPLOSSprice = input(true, title='Show TrailingSTOP Prices')
src = input(close, title='Source')
out2 = ta.ema(src, 20)

buyavg = (close + high) / 2.02 - high * (1 - open / close) * (1 - low * open / (high * close))
sellavg = ((low + close) / 1.99 + low * (1 - low / open) * (1 - low * open / (close * high)) / 1.1 + out2 )/ 2

// === INPUT BACKTEST RANGE ===
fromMonth = input.int(defval=1, title='From Month', minval=1, maxval=12)
fromDay = input.int(defval=1, title='From Day', minval=1, maxval=31)
fromYear = input.int(defval=2021, title='From Year', minval=1970)
thruMonth = input.int(defval=1, title='Thru Month', minval=1, maxval=12)
thruDay = input.int(defval=1, title='Thru Day', minval=1, maxval=31)
thruYear = input.int(defval=2100, title='Thru Year', minval=1970)

// === INPUT SHOW PLOT ===
showDate = input(defval=true, title='Show Date Range')

// === FUNCTION EXAMPLE ===
start = timestamp(fromYear, fromMonth, fromDay, 00, 00)  // backtest start window
finish = timestamp(thruYear, thruMonth, thruDay, 23, 59)  // backtest finish window
window() => true


// === TRAILING STOP LOSS === //

ATR_Period = input(14)
ATR_Mult = input(4.0)
var float ATR_TrailSL = na
var int pos = na
atr = ta.rma (ta.tr(true), 14)
xATR = ta.atr(ATR_Period)
nLoss = ATR_Mult * xATR

iff_1 = close > nz(ATR_TrailSL[1], 0) ? close - nLoss : close + nLoss
iff_2 = close < nz(ATR_TrailSL[1], 0) and close[1] < nz(ATR_TrailSL[1], 0) ? math.min(nz(ATR_TrailSL[1]), close + nLoss) : iff_1
ATR_TrailSL := close > nz(ATR_TrailSL[1], 0) and close[1] > nz(ATR_TrailSL[1], 0) ? math.max(nz(ATR_TrailSL[1]), close - nLoss) : iff_2

iff_3 = close[1] > nz(ATR_TrailSL[1], 0) and close < nz(ATR_TrailSL[1], 0) ? -1 : nz(pos[1], 0)
pos := close[1] < nz(ATR_TrailSL[1], 0) and close > nz(ATR_TrailSL[1], 0) ? 1 : iff_3

atr_color = pos == -1 ? color.green : pos == 1 ? color.red : color.aqua
atrtrend = plot(ATR_TrailSL, 'Trailing StopLoss', atr_color, linewidth=2)

// ===  Stop Loss === //
slGroup = 'Stop Loss'
useSL = input.bool(false, title='╔══════   Enable   ══════╗', group=slGroup, tooltip='If you are using this strategy for Scalping or Futures market, we do not recommend using Stop Loss.')
SLbased = input.string(title='Based on', defval='Percent', options=['ATR', 'Percent'], group=slGroup, tooltip='ATR: Average True Range\nPercent: eg. 5%.')
multiATR = input.float(10.0, title='ATR   Mult', group=slGroup, inline='atr')
lengthATR = input.int(14, title='Length', group=slGroup, inline='atr')
SLPercent = input.float(5, title='Percent', group=slGroup) * 0.01
Shortposenter = input.bool(false, title='ShortPosition')

longStop = 0.0
shortStop = 0.0

if SLbased == 'ATR'
    longStop := ta.valuewhen(pos == 1, low, 0) - ta.valuewhen(pos == 1, ta.rma(ta.tr(true), lengthATR), 0) * multiATR
    longStopPrev = nz(longStop[1], longStop)
    longStop := close[1] > longStopPrev ? math.max(longStop, longStopPrev) : longStop

    shortStop := ta.valuewhen(pos == -1, ta.rma(ta.tr(true), lengthATR), 0) * multiATR + ta.valuewhen(pos == -1, high, 0)
    shortStopPrev = nz(shortStop[1], shortStop)
    shortStop := close[1] > shortStopPrev ? math.max(shortStop, shortStopPrev) : shortStop
    shortStop
if SLbased == 'Percent'
    longStop := strategy.position_avg_price * (1 - SLPercent)
    shortStop := strategy.position_avg_price * (1 + SLPercent)
    shortStop
exitLong  = pos == -1 

// === PlotColor === //
buySignal = pos == 1 and pos[1] == -1
plotshape(buySignal, title="Long", location=location.belowbar, style=shape.labelup, size=size.normal, color=color.new(color.green,50), text='Buy', textcolor=color.white)
exitSignal = pos == -1 and pos[1] == 1
plotshape(exitSignal, title="Exit", location=location.abovebar, style=shape.labeldown, size=size.normal, color=color.new(color.red,50), text='Exit', textcolor=color.white)

hPlot = plot(ohlc4, title="", style=plot.style_circles, linewidth=0, editable = false)
longFill = (pos == 1 ? color.new(color.green,80) : na) 
shortFill = (pos == -1 ? color.new(color.red,80) : na)
fill(hPlot, atrtrend,color=longFill)
fill(hPlot,atrtrend, color=shortFill)

// === Strategy === //
strategy.entry('Long', strategy.long,limit = buyavg, when=window() and pos == 1,comment="Entry: "+str.tostring(buyavg))
strategy.close('Long', when=window() and exitLong , comment='Exit: '+str.tostring(sellavg) )

if Shortposenter
    strategy.entry('Short', strategy.short, when=window() and pos== -1,comment="Entry: "+str.tostring(close))
    strategy.close('Short', when=window() and pos == 1 , comment='Exit: ')

if useSL
    strategy.exit('Stop Loss', 'Long', stop=longStop)
    
// === Show StopLoss Price === //
if show_STOPLOSSprice
    if pos == -1
        label ShortStop = label.new(bar_index, na, 'SL: ' + str.tostring(ATR_TrailSL), color=color.green, textcolor=color.white, style=label.style_none, yloc=yloc.abovebar, size=size.small)
        label.delete(ShortStop[1])

    if pos == 1
        label LongStop = label.new(bar_index, na, 'SL: ' + str.tostring(ATR_TrailSL), color=color.red, textcolor=color.white, style=label.style_none, yloc=yloc.belowbar, size=size.small)
        label.delete(LongStop[1])

আরো