एहलर्स त्वरित ट्रेंडलाइन रणनीति

लेखक:चाओझांग, दिनांक: 2023-12-20 16:51:05
टैगः

img

अवलोकन

एहलर्स इंस्टैंट ट्रेंडलाइन रणनीति को जॉन एहलर्स ने अपनी पुस्तक साइबरनेटिक एनालिसिस फॉर स्टॉक एंड फ्यूचर्स में प्रस्तावित किया है। यह स्टॉक / फ्यूचर्स के वास्तविक समय के रुझानों की पहचान करने और रुझानों के उलट होने पर खुली स्थिति की पहचान करने के लिए तकनीकी संकेतकों का उपयोग करता है।

रणनीति तर्क

इस रणनीति का मूल तात्कालिक प्रवृत्ति रेखा (आईटी) की गणना है। आईटी के लिए सूत्र हैः

it := (a-((a*a)/4.0))*src+0.5*a*a*src[1]-(a-0.75*a*a)*src[2]+2*(1-a )*it[1]-(1-a )*(1-a )*it[2]

जहां src कीमत है, a एक चिकनाई कारक है, डिफ़ॉल्ट 0.07 है। यह सूत्र एक दूसरे क्रम का फ़िल्टर है जो कीमत को चिकना कर सकता है और रुझान उत्पन्न कर सकता है।

एक अन्य प्रमुख संकेतक विलंब रेखा है, जिसकी गणना निम्नानुसार की जाती हैः

lag = 2.0 * it - nz(it[2])

लेग लाइन आईटी लाइन से एक बार पीछे है. जब कीमत लेग लाइन से ऊपर जाती है, तो यह ऊपर की ओर ब्रेकआउट का संकेत देती है, लंबी हो जाती है. जब कीमत लेग लाइन से नीचे जाती है, तो यह नीचे की ओर ब्रेकआउट का संकेत देती है, छोटी हो जाती है.

इसके अतिरिक्त, रणनीति जोखिमों को नियंत्रित करने के लिए स्टॉप लॉस ऑर्डर सेट करती है।

लाभ विश्लेषण

इस रणनीति के लाभों में निम्नलिखित शामिल हैंः

  1. आईटी लाइन प्रभावी रूप से शोर को फ़िल्टर करती है और सिग्नल की गुणवत्ता में सुधार करती है
  2. दूसरे क्रम का फ़िल्टर अधिक ट्यूनिंग लचीलापन और मजबूती प्रदान करता है
  3. लाग लाइन प्रवृत्तियों के भीतर अनावश्यक पिचों से बचती है
  4. पूर्वनिर्धारित स्तरों पर शामिल स्टॉप लॉस नियंत्रण जोखिम
  5. स्पष्ट कोड संरचना, समझने और संशोधित करने में आसान

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

इस रणनीति के साथ कुछ जोखिम भी हैंः

  1. आईटी/लेग लाइन के गलत पैरामीटर ट्यूनिंग से झूठे संकेत उत्पन्न हो सकते हैं
  2. खराब स्टॉप लॉस कॉन्फ़िगरेशन के परिणामस्वरूप समय से पहले स्टॉप आउट या ओवरसाइज्ड लॉस हो सकता है
  3. उच्च व्यापारिक आवृत्ति से संचित कमीशन शुल्क होता है
  4. लंबे समय तक पकड़ने से हानि का जोखिम बढ़ जाता है

इन जोखिमों को निम्न द्वारा कम किया जा सकता हैः

  1. पैरामीटर अनुकूलन के लिए मशीन लर्निंग लागू करना
  2. अनुकूलन स्टॉप लॉस स्तरों की स्थापना
  3. कम ट्रेडिंग आवृत्तियों के लिए स्थिति के आकार को कम करना
  4. होल्डिंग पीरियड स्टॉप लॉस को शामिल करना

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

इस रणनीति को निम्नलिखित पहलुओं में और अधिक अनुकूलित किया जा सकता हैः

  1. इष्टतम खोजने के लिए विभिन्न फिल्टर मापदंडों के परीक्षण प्रभाव
  2. संकेतों को फ़िल्टर करने के लिए अन्य संकेतकों का संयोजन करने का प्रयास करें
  3. प्रवृत्ति त्वरण चरणों के दौरान आकार बढ़ाने के लिए प्रवेश तर्क में सुधार
  4. बाजार की अस्थिरता के आधार पर अनुकूलन स्टॉप लॉस सेट करें
  5. ट्रेडिंग सत्रों और आवृत्तियों पर समय श्रृंखला विश्लेषण करना

निष्कर्ष

कुल मिलाकर, एहलर इंस्टैंट ट्रेंडलाइन रणनीति स्टॉक / वायदा और खुले पदों में वास्तविक समय के रुझानों की पहचान करने के लिए तकनीकी संकेतकों का उपयोग करती है जब रुझान उलट जाते हैं। इसमें प्रभावी शोर फ़िल्टरिंग, उच्च पैरामीटर ट्यूनिंग, स्पष्ट सिग्नल जनरेशन लॉजिक और शामिल जोखिम नियंत्रण के फायदे हैं। पैरामीटर चयन, सिग्नल फ़िल्टरिंग, स्थिति आकार और स्टॉप लॉस ट्यूनिंग पर आगे अनुकूलन के साथ, यह रणनीति और भी बेहतर प्रदर्शन प्राप्त कर सकती है। स्पष्ट कोड संरचना भी इसे समझने और संशोधित करने में आसान बनाती है। सारांश में, यह परीक्षण और सुधार के लायक एक कुशल प्रवृत्ति प्रणाली है।


/*backtest
start: 2022-12-13 00:00:00
end: 2023-12-19 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy("Ehlers Instantaneous Trendline Strategy", shorttitle = "Ehlers Instantaneous Trendline Strategy", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100.0, pyramiding = 1, backtest_fill_limits_assumption = 1)
src = input(hl2, title="Source")
a = input(0.07, title="Alpha", step=0.01) 
fr = input(false, title="Fill Trend Region")
it = na
if (na(it[2]) or na(it[1]))
    it := (src + 2 * src[1] + src[2]) / 4.0
else
    it := (a-((a*a)/4.0))*src+0.5*a*a*src[1]-(a-0.75*a*a)*src[2]+2*(1-a )*it[1]-(1-a )*(1-a )*it[2]
lag = 2.0 * it - nz(it[2])
rngFrac = input(0.35)
revPct = input(0.015)
stopType = input(title="Stop type", defval = "stop-order", options = ["stop-order", "market-order", "None"])

diff = input(0.5, title = "Spread")
LongPrice(p) =>
    LongPrice = diff == 0 ? p : floor(p / diff) * diff

ShortPrice(p) =>
    ShortPrice = diff == 0 ? p : ceil(p / diff) * diff

strategy.cancel_all()
reverseTrade = false
if stopType == "market-order" 
    if  strategy.position_size > 0 and close < strategy.position_avg_price * (1 - revPct) 
        strategy.order("StopLoss open short", strategy.short, 2 * strategy.position_size, limit = close - 2 * diff)
        reverseTrade := true
    if  strategy.position_size < 0 and close > strategy.position_avg_price * (1 + revPct) 
        strategy.order("StopLoss open long", strategy.long, -2 * strategy.position_size, limit = close + 2 * diff)
        reverseTrade := true
    
if lag > it and not reverseTrade
    price = LongPrice(max(close - (high - low) * rngFrac, low))
    if strategy.position_size <= 0
        strategy.order("Open long", strategy.long, strategy.equity / price - strategy.position_size, limit = price)
        if stopType == "stop-order"
            strategy.order("StopLoss open long", strategy.short, 2 * strategy.equity / price, stop = ShortPrice(price * (1 - revPct)))
    else
        if stopType == "stop-order"
            strategy.order("StopLoss open short", strategy.short, 2 * strategy.position_size, stop = ShortPrice(strategy.position_avg_price * (1 - revPct)))
if lag < it and not reverseTrade
    price = ShortPrice(min(close - (high - low) * rngFrac, high))
    if strategy.position_size >= 0
        strategy.order("Open short", strategy.short, strategy.equity / price + strategy.position_size, limit = price)
        if stopType == "stop-order"
            strategy.order("StopLoss open short", strategy.long, 2 * strategy.equity / price, stop = LongPrice(price * (1 + revPct)))
    else
        if stopType == "stop-order"
            strategy.order("StopLoss open long", strategy.long, -2 * strategy.position_size, stop = LongPrice(strategy.position_avg_price * (1 + revPct)))


itPlot=plot(it, color=red, linewidth=1, title="Trend")
lagPlot=plot(lag, color=blue, linewidth=1, title="Trigger")
fill(itPlot, lagPlot, it < lag ? green : red,  transp=70)

// === Backtesting Dates ===
testPeriodSwitch = input(false, "Custom Backtesting Dates")
testStartYear = input(2018, "Backtest Start Year")
testStartMonth = input(9, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testStartHour = input(0, "Backtest Start Hour")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,testStartHour,0)
testStopYear = input(2018, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(14, "Backtest Stop Day")
testStopHour = input(14, "Backtest Stop Hour")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,testStopHour,0)
testPeriod() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false
isPeriod = testPeriodSwitch == true ? testPeriod() : true
// === /END
if not isPeriod
    strategy.cancel_all()
    strategy.close_all()

अधिक