এই কৌশলটি গতিশীল স্টপ লিন্ড সেট করে, স্টপ লিন্ডের উপর ভিত্তি করে এবং স্টপ লস সুরক্ষার সাথে সাথে সর্বাধিক মুনাফা লক করার জন্য শেয়ারের দামের পরিবর্তনগুলি অনুসরণ করে।
এই কৌশলটি মূলত নিম্নলিখিত ধাপগুলি অনুসরণ করে বাস্তবায়িত হয়ঃ
এটিআর সূচক গণনা করুন, এটিআর সময়কাল nATRPeriod প্যারামিটার দ্বারা সেট করা হয়, ডিফল্ট 5;
এটিআর মানের উপর ভিত্তি করে স্টপ লিনের হিসাব করা হয়েছে, স্টপ লিনের মাত্রাটি nATRMultip প্যারামিটার দ্বারা সেট করা হয়েছে, এটিআর এর 3.5 গুণ ডিফল্ট;
যখন শেয়ারের দাম বৃদ্ধি পায়, তখন স্টপ লাইনটি শেয়ারের দামের উপর থেকে স্টপ লেভেল ছাড়িয়ে বাড়ানো হয়; যখন শেয়ারের দাম কমে যায়, তখন স্টপ লাইনটি শেয়ারের দামের উপর থেকে স্টপ লেভেল ছাড়িয়ে নামানো হয়;
শেয়ারের দাম স্টপ লিনিয়ার (Stop Lines) অতিক্রম করেছে কিনা তা নির্ধারণ করা, এবং ক্রয় বা বিক্রয়ের সংকেত দেওয়ার জন্য এটি অতিক্রম করা;
স্টপলাইন ভেঙে যাওয়ার সংকেত অনুসারে, অতিরিক্ত বা খালি অবস্থানে প্রবেশ করুন এবং আবার স্টপলাইন স্পর্শ করার সময় পজিশনটি খালি করুন।
যখন শেয়ারের দাম বেড়ে যায়, তখন স্টপ লাইনটি ক্রমাগত বাড়তে থাকে, যার ফলে মুনাফা লক হয়; যখন শেয়ারের দাম কমে যায়, তখন স্টপ লাইনটি ক্রমাগত হ্রাস পায়, যার ফলে স্টপ ক্ষতি হয়। এটিআর সূচকটি শেয়ারের দামের ওঠানামাকে আরও সঠিকভাবে প্রতিফলিত করতে পারে, এটিআর গতিশীলতার উপর নির্ভর করে স্টপ লাইনটি সামঞ্জস্য করতে পারে, যাতে স্টপ ক্ষতির পরিমাণ অত্যধিক আগ্রাসী বা রক্ষণশীল হওয়া এড়ানো যায়।
প্যারামিটার অপ্টিমাইজেশনের মাধ্যমে, এটিআর চক্রের প্যারামিটার এবং স্টপ আউটপুটকে সামঞ্জস্য করে, স্টপ এবং ট্র্যাকিংয়ের সর্বোত্তম প্যারামিটার সমন্বয় খুঁজে পাওয়া যায়। অন্যান্য প্রযুক্তিগত সূচকগুলির সাথে মিলিত হয়ে অপ্রয়োজনীয় স্টপ হ্রাস করতে বাজারে প্রবেশের সময়সীমা ফিল্টার করা যেতে পারে।
এই কৌশলটি গতিশীলভাবে এটিআর স্টপ লাইনের সমন্বয় পদ্ধতির মাধ্যমে হোল্ডিংয়ের সময় স্টপ লস এবং মুনাফা লকিংয়ের অনুমতি দেয়। এটি স্টপ লস অবস্থানগুলির তুলনায় শেয়ারের দামের ওঠানামার সাথে আরও ভালভাবে খাপ খাইয়ে নিতে পারে, অত্যধিক আগ্রাসী বা রক্ষণশীল স্টপ লস এড়াতে পারে। এটিআর সূচকটি স্টপ লিনের সমন্বয়কে আরও লক্ষ্যবস্তু করে তোলে। তবে প্যারামিটার সেটিং এবং পুনরায় প্রবেশের কৌশলটি অপ্রয়োজনীয় স্টপ লস কমাতে এবং লাভের জায়গা প্রসারিত করার জন্য আরও অপ্টিমাইজ করা দরকার। সামগ্রিকভাবে, এই কৌশলটি একটি ভাল গতিশীল ট্র্যাকিং স্টপ লস ধারণা, যা আরও গবেষণা এবং প্রয়োগের জন্য উপযুক্ত।
/*backtest
start: 2023-09-08 00:00:00
end: 2023-10-08 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=3
//@okadoke
////////////////////////////////////////////////////////////
// Based on Average True Range Trailing Stops Strategy by HPotter
// Average True Range Trailing Stops Strategy, by Sylvain Vervoort
// The related article is copyrighted material from Stocks & Commodities Jun 2009
////////////////////////////////////////////////////////////
strategy(title="ATR Trailing Stops Strategy", shorttitle="ATRTSS", overlay = true,
initial_capital=100000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type="percent", commission_value=0.0)
nATRPeriod = input(5, "ATR Period")
nATRMultip = input(3.5, "ATR Multiplier")
useShorts = input(false, "Test w/Shorts?")
daysBackMax = input(defval = 360, title = "Max Days Back to Test", minval = 0)
daysBackMin = input(defval = 0, title = "Min Days Back to Test", minval = 0)
msBackMax = 1000 * 60 * 60 * 24 * daysBackMax
msBackMin = 1000 * 60 * 60 * 24 * daysBackMin
xATR = atr(nATRPeriod)
nLoss = nATRMultip * xATR
xATRTrailingStop = na
xATRTrailingStop :=
iff(close > nz(xATRTrailingStop[1], 0) and close[1] > nz(xATRTrailingStop[1], 0), max(nz(xATRTrailingStop[1]), close - nLoss),
iff(close < nz(xATRTrailingStop[1], 0) and close[1] < nz(xATRTrailingStop[1], 0), min(nz(xATRTrailingStop[1]), close + nLoss),
iff(close > nz(xATRTrailingStop[1], 0), close - nLoss, close + nLoss)))
pos = na
pos :=
iff(close[1] < nz(xATRTrailingStop[1], 0) and close > nz(xATRTrailingStop[1], 0), 1,
iff(close[1] > nz(xATRTrailingStop[1], 0) and close < nz(xATRTrailingStop[1], 0), -1, nz(pos[1], 0)))
color = pos == -1 ? red: pos == 1 ? green : blue
plot(xATRTrailingStop, color=color, title="ATR Trailing Stop")
isWithinTimeBounds = (msBackMax == 0 or (time > (timenow - msBackMax))) and (msBackMin == 0 or (time < (timenow - msBackMin)))
buy = crossover(close, xATRTrailingStop)
sell = crossunder(close, xATRTrailingStop)
strategy.entry("LONG", long=true, when=buy and isWithinTimeBounds)
strategy.close("LONG", when=sell and isWithinTimeBounds)
strategy.entry("SHORT", long=false, when=useShorts and sell and isWithinTimeBounds)
strategy.close("SHORT", when=useShorts and buy and isWithinTimeBounds)