এই কৌশলটি মূল্যের অস্থিরতার উচ্চতা বা নিম্নতা ব্যবহার করে একটি অবস্থানে প্রবেশ বা প্রস্থান করার সময় নির্ধারণ করে, যার লক্ষ্য হল উচ্চ মূল্যের অস্থিরতার সময় একাধিক অবস্থান স্থাপন করা এবং যখন মূল্যের প্রবণতা অনুকূল হয়ে যায় তখন মুনাফা অর্জন করা।
এটিআর সূচক ব্যবহার করে মূল্যের ওঠানামা পরিমাপ করা। এটিআর এর সর্বশেষ 20 টি চক্রের মান গণনা করুন এবং এর চলমান গড় এবং স্ট্যান্ডার্ড ডিভেরিয়েন্স গণনা করুন। যদি বর্তমান এটিআর মান গড়ের চেয়ে বেশি হয় এবং একটি স্ট্যান্ডার্ড ডিভেরিয়েন্স থাকে তবে দামের ওঠানামা বেশি বলে মনে করা হয়।
দামের প্রবণতা নির্ধারণের জন্য প্রথম পর্যায়ের জোড়ার দামের পরিবর্তনের হার ব্যবহার করুন। সাম্প্রতিক 20 টি চক্রের জোড়ার সমাপ্তির দামের পরিবর্তনের হার গণনা করুন, এর চলমান গড় গণনা করুন, যদি বর্তমান পরিবর্তনের হারটি 3 টি ক্রমাগত দিনের জন্য গড়ের চেয়ে বড় এবং ইতিবাচক হয় তবে দামটি একটি উত্থানের প্রবণতায় রয়েছে বলে মনে করা হয়।
যখন দামের অস্থিরতা বেশি থাকে এবং দামের উত্থানের প্রবণতা দেখা দেয় তখন অতিরিক্ত পজিশন খোলার জন্য। যখন দাম ফিরে আসে এবং স্টপ লস মূল্য ট্রিগার করা হয় তখন পজিশন বন্ধ করে দেয়। স্টপ লস দামের গতিশীলতা সামঞ্জস্য করে সর্বদা সর্বনিম্ন মূল্যের 2 গুণ কম ATR এর মধ্যে বজায় রাখা উচিত।
দামের উচ্চ ও নিম্ন ও প্রবণতা বিচার করে অতিরিক্ত শূন্য সময় ব্যবহার করুন এবং বাজারে ঘন ঘন লেনদেন এড়িয়ে চলুন।
স্টপ-অফ-প্রাইসের গতিশীল সমন্বয় করুন যাতে স্টপ-অফ-প্রাইস খুব বেশি ক্ষতি না করে।
২০১৫ থেকে ২০২১ সালের মধ্যে এই কৌশল বার্ষিক ১৫৯% আয় করেছে, যা Buy and Hold কৌশল থেকে ১২০% বেশি।
এটিআর প্যারামিটারগুলিকে খুব বেশি জোরালোভাবে সেট করা যেতে পারে যার ফলে অ্যাক্সেসের সুযোগ কম থাকে। প্যারামিটারগুলি যথাযথভাবে প্রসারিত করা যেতে পারে যাতে প্রবেশাধিকার বাড়ানো যায়।
প্রবণতা মূল্যায়ন সূচকগুলি ভুল বিচার করতে পারে এবং প্রকৃত প্রবণতার সাথে সামঞ্জস্যপূর্ণ নয়, সম্ভাব্য ক্ষতি এড়াতে নিশ্চিতকরণ ফ্যাক্টর যুক্ত করা উচিত।
পুনরাবৃত্তি চক্র মাত্র 6 বছর, নমুনা ব্যাপ্তি প্রসারিত করা এবং স্থিতিশীলতা পরীক্ষা করা প্রয়োজন, ওভারফিট এড়াতে।
এই ধরনের চরম পরিস্থিতিতে পারফরম্যান্সের মূল্যায়ন করা অসম্ভব, যেমন দ্রুত একচেটিয়া পরিস্থিতিতে, যা ম্যানুয়াল হস্তক্ষেপ বা প্রোগ্রামিং স্টপ সেট করা প্রয়োজন।
প্রবণতা নিশ্চিতকরণ সূচক যেমন MACD, KDJ ইত্যাদি যোগ করা হয়েছে, যা প্রবণতার দিকনির্দেশনা আরও সঠিকভাবে নির্ধারণ করে।
এটিআর প্যারামিটারগুলি বিভিন্ন জাত এবং বাজারের অবস্থার উপর নির্ভর করে স্বতঃস্ফূর্তভাবে সামঞ্জস্য করতে পারে, ওঠানামার হারকে অনুকূল করতে পারে।
একটি ব্রেকথ্রু বিচার মডিউল যোগ করুন, প্রবণতা ত্বরণ ফ্যাক্টর কনফিগার করুন, এবং একটি ব্রেকথ্রু ঘটলে পজিশন বাড়ান।
শতকরা হার, ওলট পালট ক্ষতির মতো বিভিন্ন ক্ষতির পদ্ধতির কার্যকারিতা পরীক্ষা করা।
ট্রেডিংয়ের সংখ্যা, উপার্জন কার্ভের স্থিতিশীলতা, সর্বাধিক প্রত্যাহার ইত্যাদির মূল্যায়ন করা, যাতে কৌশলটি শক্তিশালী হয়।
এই কৌশলটি মূল্যের অস্থিরতা এবং প্রবণতা বিচার করার সুবিধাগুলিকে সংহত করে, যখন অস্থিরতা বাড়বে তখন দামের সম্ভাব্য বিপর্যয় নির্ধারণের সময়কাল নির্ধারণ করে, ঝুঁকি নিয়ন্ত্রণের জন্য গতিশীল স্টপ লস সেট করে, পুনর্নির্মাণের ফলাফল থেকে ভাল অতিরিক্ত আয় অর্জন করে। তবে নমুনা ব্যবধানটি মাত্র 6 বছর, বিভিন্ন বাজারের সাথে সামঞ্জস্য রেখে মূল প্যারামিটার সেট করা প্রয়োজন, এবং আরও নিশ্চিতকরণ ফ্যাক্টর প্রবর্তন করা প্রয়োজন যাতে ভুল বিচারের সম্ভাবনা হ্রাস করা যায়। প্রকৃত ট্রেডিংয়ের জন্য কৌশলটির আরও ব্যাপক স্থিতিশীলতা পরীক্ষা করা প্রয়োজন। সামগ্রিকভাবে, এই কৌশলটি অস্থিরতার বিপরীত অপারেশন ব্যবহারের জন্য একটি উপায় সরবরাহ করে, তবে আরও গভীর অপ্টিমাইজেশন এবং পরীক্ষার প্রয়োজন, যাতে কৌশলটি স্থিতিশীল এবং নির্ভরযোগ্য হতে পারে।
/*backtest
start: 2022-09-14 00:00:00
end: 2023-09-20 00:00:00
period: 1d
basePeriod: 1h
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/
// © DojiEmoji (kevinhhl)
//@version=4
strategy("Mean Reversion (ATR) Strategy [KL]",overlay=true,pyramiding=1)
ENUM_LONG = "Long"
// Timeframe {
backtest_timeframe_start = input(defval = timestamp("01 Apr 2000 13:30 +0000"), title = "Backtest Start Time", type = input.time)
USE_ENDTIME = input(false,title="Define backtest end-time (If false, will test up to most recent candle)")
backtest_timeframe_end = input(defval = timestamp("01 May 2021 19:30 +0000"), title = "Backtest End Time (if checked above)", type = input.time)
within_timeframe = true
// }
// Trailing stop loss {
ATR_X2_TSL = atr(input(14,title="Length of ATR for trailing stop loss")) * input(2.0,title="ATR Multiplier for trailing stop loss",type=input.float)
TSL_source = low
var stop_loss_price = float(0)
TSL_line_color = color.green, TSL_transp = 100
if strategy.position_size == 0 or not within_timeframe
TSL_line_color := color.black
stop_loss_price := TSL_source - ATR_X2_TSL
else if strategy.position_size > 0
stop_loss_price := max(stop_loss_price, TSL_source - ATR_X2_TSL)
TSL_transp := 0
plot(stop_loss_price, color=color.new(TSL_line_color, TSL_transp))
// }
// Variables for confirmations of entry {
_len_volat = input(20,title="Length of ATR to determine volatility")
_ATR_volat = atr(_len_volat)
_avg_atr = sma(_ATR_volat, _len_volat)
_std_volat = stdev(_ATR_volat,_len_volat)
signal_diverted_ATR = _ATR_volat > (_avg_atr + _std_volat) or _ATR_volat < (_avg_atr - _std_volat)
_len_drift = input(20,title="Length of Drift")//default set to const: _len_vol's default value
_prcntge_chng = log(close/close[1])
_drift = sma(_prcntge_chng, _len_drift) - pow(stdev(_prcntge_chng, _len_drift),2)*0.5
_chg_drift = _drift/_drift[1]-1
signal_uptrend = (_drift > _drift[1] and _drift > _drift[2]) or _drift > 0
entry_signal_all = signal_diverted_ATR and signal_uptrend
// }
alert_per_bar(msg)=>
prefix = "[" + syminfo.root + "] "
suffix = "(P=" + tostring(close) + "; atr=" + tostring(_ATR_volat) + ")"
alert(tostring(prefix) + tostring(msg) + tostring(suffix), alert.freq_once_per_bar)
// MAIN {
if within_timeframe
if strategy.position_size > 0 and strategy.position_size[1] > 0 and (stop_loss_price/stop_loss_price[1]-1) > 0.005
alert_per_bar("TSL raised to " + tostring(stop_loss_price))
// EXIT:
if strategy.position_size > 0 and TSL_source <= stop_loss_price
exit_msg = close <= strategy.position_avg_price ? "stop loss" : "take profit"
strategy.close(ENUM_LONG, comment=exit_msg)
// ENTRY:
else if entry_signal_all and (strategy.position_size == 0 or (strategy.position_size > 0 and close > stop_loss_price))
entry_msg = strategy.position_size > 0 ? "adding" : "initial"
strategy.entry(ENUM_LONG, strategy.long, comment=entry_msg)
if strategy.position_size == 0
stop_loss_price := float(0)
// }