اس حکمت عملی کا نام ہے خودکشی کرنے والی اے ٹی آر ٹریکنگ اسٹاپ اسٹریٹجی . اس حکمت عملی میں اے ٹی آر اشارے کا استعمال کرتے ہوئے اسٹاپ پوائنٹ طے کیا گیا ہے اور اس میں داخلے کے بعد اسٹاپ کو سخت سے نرمی میں تبدیل کیا گیا ہے ، جس کا مقصد رجحان کے عمل کو ٹریک کرنا اور خطرے کو کنٹرول کرنا ہے۔
اس حکمت عملی کی منطق کچھ اس طرح ہے:
ایک مخصوص دورانیے کے دوران قیمت کی اعلی ترین اور کم ترین قیمت کی حد کو داخلہ سگنل کے طور پر شمار کیا جاتا ہے ، اور جب قیمت اس حد سے تجاوز کرتی ہے تو داخلہ سگنل پیدا ہوتا ہے۔
داخلے کے بعد ، ابتدائی طور پر ایک تنگ اے ٹی آر اسٹاپ استعمال کیا جاتا ہے ، جس میں اسٹاپ نقصان 1.5 گنا اے ٹی آر کی قیمت پر طے ہوتا ہے۔ اس سے داخلے کے بعد ہونے والے نقصان کو محدود کیا جاسکتا ہے۔
ہولڈنگ مرحلے میں ، اسٹاپ نقصان کو چار گنا زیادہ نرمی والے اے ٹی آر میں منتقل کیا جاتا ہے۔ اسٹاپ نقصان قیمتوں کے عمل کو ٹریک کرتا رہتا ہے ، لیکن اس میں زیادہ جگہ ہوتی ہے جس کی وجہ سے طلب میں توسیع ہوتی ہے۔
حتمی اسٹاپ نقصان ہمیشہ کم ترین قیمت ((کثیر ٹکٹ) یا سب سے زیادہ قیمت ((خالی ٹکٹ) کو ٹریک کرتا ہے ، قیمت کے اتار چڑھاؤ کے ساتھ ایڈجسٹ ہوتا ہے ، تاکہ ٹریکنگ اسٹاپ نقصان کا اثر حاصل ہو۔
جب قیمت اسٹاپ نقصان کے نقطہ سے نیچے ہو (کثیر ٹکٹ) یا اسٹاپ نقصان کے نقطہ سے اوپر ہو (خالی ٹکٹ) تو اسٹاپ نقصان کا آغاز کریں۔
اس حکمت عملی کا فائدہ یہ ہے کہ اس کے مطابق ڈھالنے والے اسٹاپ میکانزم کو اپنانے سے خطرے پر قابو پانے کی ضمانت ملتی ہے اور اس سے پہلے ہی اسٹاپ نقصان سے بچا جاتا ہے۔ تاہم ، اے ٹی آر پیرامیٹرز اور ضرب کو بہتر بنانے کی ضرورت ہے ، اور رجحانات کے فیصلے کے ساتھ اسٹاپ نقصان کی حکمت عملی کا استعمال کریں۔
مجموعی طور پر ، متحرک ٹریکنگ اسٹاپ حکمت عملی کے منافع بخش ہونے کے امکانات کو بہتر بنانے کا ایک اہم ذریعہ ہے۔ اسٹاپ کا لچکدار استعمال ، رجحانات کو بہتر طور پر برقرار رکھنے اور خطرے کو کنٹرول کرنے میں مدد فراہم کرتا ہے۔
/*backtest
start: 2023-08-13 00:00:00
end: 2023-09-12 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/
//@version=4
//@author=Takazudo
strategy("ATR trailing SL tight to slack [Takazudo]",
overlay=true,
default_qty_type=strategy.fixed,
initial_capital=0,
currency=currency.USD)
posSize = strategy.position_size
hasNoPos = posSize == 0
hasLongPos = posSize > 0
hasShortPos = posSize < 0
//============================================================================
// consts, inputs
//============================================================================
// colors
var COLOR_SL_LINE = color.new(#e0f64d, 20)
var COLOR_SL_LINE_THIN = color.new(#e0f64d, 90)
var COLOR_ENTRY_BAND = color.new(#43A6F5, 30)
var COLOR_TRANSPARENT = color.new(#000000, 100)
// Entry strategy
_g1 = 'Entry strategy'
var config_entryBandBars = input(defval = 100, title = "Entry band bar count", minval=1, group=_g1)
_g2 = 'ATR SL'
var config_slAtr_length = input(24, title = "Trailing stop ATR Length", group=_g2)
var config_slAtr_multi1 = input(1.5, title = "Trailing stop ATR Multiple on tight", type=input.float, step=0.1, group=_g2)
var config_slAtr_multi2 = input(4, title = "Trailing stop ATR Multiple on slack", type=input.float, step=0.1, group=_g2)
_g3 = 'Backtesting range'
var config_fromYear = input(defval = 2016, title = "From Year", minval = 1970, group=_g3)
var config_fromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12, group=_g3)
var config_fromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31, group=_g3)
var config_toYear = input(defval = 2021, title = "To Year", minval = 1970, group=_g3)
var config_toMonth = input(defval = 4, title = "To Month", minval = 1, maxval = 12, group=_g3)
var config_toDay = input(defval = 5, title = "To Day", minval = 1, maxval = 31, group=_g3)
//============================================================================
// Range Edge calculation
//============================================================================
f_calcEntryBand_high() =>
_highest = max(open[3], close[3])
for i = 4 to (config_entryBandBars - 1)
_highest := max(_highest, open[i], close[i])
_highest
f_calcEntryBand_low() =>
_lowest = min(open[3], close[3])
for i = 4 to (config_entryBandBars - 1)
_lowest := min(_lowest, open[i], close[i])
_lowest
entryBand_high = f_calcEntryBand_high()
entryBand_low = f_calcEntryBand_low()
entryBand_height = entryBand_high - entryBand_low
plot(entryBand_high, color=COLOR_ENTRY_BAND, linewidth=1)
plot(entryBand_low, color=COLOR_ENTRY_BAND, linewidth=1)
rangeBreakDetected_long = entryBand_high < close
rangeBreakDetected_short = entryBand_low > close
shouldMakeEntryLong = (strategy.position_size == 0) and rangeBreakDetected_long
shouldMakeEntryShort = (strategy.position_size == 0) and rangeBreakDetected_short
//============================================================================
// ATR based stuff
//============================================================================
sl_atrHeight_tight = atr(config_slAtr_length) * config_slAtr_multi1
sl_atrHeight_slack = atr(config_slAtr_length) * config_slAtr_multi2
sl_tight_bull = min(open, close) - sl_atrHeight_tight
sl_tight_bear = max(open, close) + sl_atrHeight_tight
sl_slack_bull = min(open, close) - sl_atrHeight_slack
sl_slack_bear = max(open, close) + sl_atrHeight_slack
plot(sl_tight_bull, color=COLOR_SL_LINE_THIN, transp=0, linewidth=1)
plot(sl_tight_bear, color=COLOR_SL_LINE_THIN, transp=0, linewidth=1)
plot(sl_slack_bull, color=COLOR_SL_LINE_THIN, transp=0, linewidth=1)
plot(sl_slack_bear, color=COLOR_SL_LINE_THIN, transp=0, linewidth=1)
//============================================================================
// Sl
//============================================================================
var trailingSl_long = hl2
var trailingSl_short = hl2
trailingSl_long := if hasLongPos
max(trailingSl_long, sl_slack_bull)
else
sl_tight_bull
trailingSl_short := if hasShortPos
min(trailingSl_short, sl_slack_bear)
else
sl_tight_bear
color_sl_long = hasLongPos ? COLOR_SL_LINE : COLOR_TRANSPARENT
color_sl_short = hasShortPos ? COLOR_SL_LINE : COLOR_TRANSPARENT
plot(trailingSl_long, color=color_sl_long, transp=0, linewidth=2)
plot(trailingSl_short, color=color_sl_short, transp=0, linewidth=2)
//============================================================================
// make entries
//============================================================================
// Calculate start/end date and time condition
startDate = timestamp(config_fromYear, config_fromMonth, config_fromDay, 00, 00)
finishDate = timestamp(config_toYear, config_toMonth, config_toDay, 00, 00)
if (true)
if shouldMakeEntryLong
strategy.entry(id="Long", long=true, stop=close)
if shouldMakeEntryShort
strategy.entry(id="Short", long=false, stop=close)
strategy.exit('Long-SL/TP', 'Long', stop=trailingSl_long)
strategy.exit('Short-SL/TP', 'Short', stop=trailingSl_short)