संसाधन लोड हो रहा है... लोड करना...

अनुकूली एटीआर ट्रेलिंग स्टॉप लॉस रणनीति

लेखक:चाओझांग, दिनांक: 2023-09-13 15:48:32
टैगः

इस रणनीति को Adaptive ATR Trailing Stop Loss Strategy कहा जाता है। यह ATR संकेतक का उपयोग स्टॉप लॉस स्तरों को सेट करने के लिए करता है, और जोखिम को नियंत्रित करते हुए रुझानों का पालन करने के लिए प्रवेश के बाद तंग स्टॉप से ढीले स्टॉप पर स्विच करता है।

विशिष्ट तर्क यह हैः

  1. प्रवेश संकेत के रूप में एक निश्चित अवधि के दौरान उच्चतम और निम्नतम कीमतों की सीमा की गणना करें। प्रविष्टियां तब ट्रिगर की जाती हैं जब कीमतें सीमा से बाहर निकलती हैं।

  2. प्रवेश के बाद, प्रवेश के बाद हानि को सीमित करने के लिए, एटीआर मूल्य के 1.5 गुना पर तय एक तंग एटीआर स्टॉप का प्रारंभ में उपयोग किया जाता है।

  3. ट्रेड होल्डिंग के दौरान, स्टॉप को 4 गुना एटीआर के ढीले पर स्विच किया जाता है। स्टॉप कीमतों को पीछे रखता है लेकिन रुझानों के विस्तार के लिए अधिक जगह देता है।

  4. स्टॉप लेवल हमेशा सबसे कम कीमत (लॉन्ग ट्रेड) या उच्चतम कीमत (शॉर्ट ट्रेड) को ट्रैक करता है और मूल्य उतार-चढ़ाव के साथ समायोजित होता है, जिससे एक ट्रैलिंग स्टॉप प्रभाव प्राप्त होता है।

  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)


अधिक