औसत प्रतिगमन एटीआर ट्रेंड रणनीति

लेखक:चाओझांग, दिनांक: 2023-09-21 11:42:06
टैगः

अवलोकन

यह रणनीति मूल्य अस्थिरता के उच्च और निम्न स्तरों का उपयोग पदों के प्रवेश और निकास के समय को निर्धारित करने के लिए करती है। इसका उद्देश्य मूल्य अस्थिरता अधिक होने पर लंबी स्थिति स्थापित करना और मूल्य रुझान अनुकूल होने पर लाभ लेना है।

रणनीति तर्क

  1. मूल्य अस्थिरता को मापने के लिए एटीआर संकेतक का उपयोग करें। पिछले 20 अवधियों में एटीआर की गणना करें और इसके चलती औसत और मानक विचलन प्राप्त करें। यदि वर्तमान एटीआर मूल्य औसत प्लस एक मानक विचलन से अधिक है, तो मूल्य अस्थिरता को उच्च माना जाता है।

  2. मूल्य प्रवृत्ति निर्धारित करने के लिए प्रथम क्रम लघुगणकीय मूल्य परिवर्तन दर का उपयोग करें। पिछले 20 अवधियों में लघुगणकीय निकट मूल्य परिवर्तन दर की गणना करें, इसका चलती औसत प्राप्त करें। यदि वर्तमान परिवर्तन दर 3 लगातार दिनों के लिए औसत से अधिक है और सकारात्मक है, तो मूल्य को एक अपट्रेंड में माना जाता है।

  3. जब मूल्य अस्थिरता अधिक होती है और मूल्य एक अपट्रेंड दिखाता है, तो लंबा जाता है। जब मूल्य वापस खींचता है और स्टॉप लॉस ट्रिगर होता है, तो बंद स्थिति। स्टॉप लॉस मूल्य को गतिशील रूप से समायोजित किया जाता है ताकि सबसे कम मूल्य माइनस 2 बार एटीआर से नीचे रहे।

लाभ विश्लेषण

  1. लंबी/छोटी अवधि निर्धारित करने के लिए मूल्य अस्थिरता और प्रवृत्ति का उपयोग करें, विभिन्न बाजारों में अधिक व्यापार से बचें।

  2. गतिशील स्टॉप लॉस बहुत व्यापक स्टॉप से अत्यधिक नुकसान से बचाता है।

  3. बैकटेस्ट में 2015-2021 के दौरान 159% का वार्षिक रिटर्न दिखाया गया है, जो कि 120% से अधिक है।

जोखिम विश्लेषण

  1. अत्यधिक आक्रामक एटीआर मापदंडों के परिणामस्वरूप प्रवेश के बहुत कम अवसर हो सकते हैं। आवृत्ति बढ़ाने के लिए मापदंडों को मामूली रूप से आराम कर सकते हैं।

  2. प्रवृत्ति सूचक वास्तविक प्रवृत्ति के विपरीत झूठे संकेत उत्पन्न कर सकता है। संभावित नुकसान से बचने के लिए अधिक पुष्टिकरण कारक जोड़ना चाहिए।

  3. बैकटेस्ट की अवधि केवल 6 वर्ष है। ओवरफिटिंग से बचने के लिए बड़े नमूने और मजबूती की जांच की आवश्यकता है।

  4. फ्लैश क्रैश जैसे चरम परिस्थितियों में प्रदर्शन का आकलन करने में असमर्थ।

अनुकूलन दिशाएँ

  1. प्रवृत्ति की सटीकता में सुधार के लिए एमएसीडी, केडीजे जैसे अधिक प्रवृत्ति पुष्टिकरण संकेतक जोड़ें।

  2. अस्थिरता गेज को अनुकूलित करने के लिए विभिन्न उत्पादों और बाजार व्यवस्थाओं के आधार पर एटीआर मापदंडों को अनुकूलित करें।

  3. ब्रेकआउट लॉजिक और ट्रेंड एक्सेलेरेटिंग फैक्टर्स को जोड़ें ताकि ब्रेकआउट का आकलन किया जा सके।

  4. प्रदर्शन पर प्रतिशत, अस्थिरता स्टॉप जैसे विभिन्न स्टॉप लॉस प्रकारों का परीक्षण करें।

  5. व्यापारिक आवृत्ति, वक्र स्थिरता, अधिकतम निकासी जैसे मापदंडों का आकलन करें ताकि मजबूती सुनिश्चित हो सके।

सारांश

यह रणनीति अस्थिरता और प्रवृत्ति को मापने के फायदे को जोड़ती है ताकि प्रवर्धित अस्थिरता पर प्रवेश करने के लिए संभावित उलट बिंदुओं को निर्धारित किया जा सके, और जोखिम को नियंत्रित करने के लिए गतिशील स्टॉप का उपयोग किया जा सके। बैकटेस्ट से सभ्य अल्फा उत्पन्न होता है। लेकिन 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)
// }


अधिक