गतिशील चलती औसत क्रॉसओवर ट्रेडिंग रणनीति

लेखक:चाओझांग, दिनांकः 2023-11-13 10:27:54
टैगः

img

अवलोकन

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

रणनीति तर्क

इस रणनीति में दो अनुपात ओसीएचएल औसत संकेतकों का उपयोग किया जाता है, जो अलग-अलग समय सीमाओं के साथ तेजी से और धीमी रेखाओं के रूप में हैं। अनुपात ओसीएचएल औसत की गणना इस प्रकार की जाती हैः

b = abs(close-open)/(high - low)
c = min(max(b, 0), 1)  
Ratio OCHL Averager = c*close + (1-c)*previous Ratio OCHL Averager

यहाँ b इंट्राडे प्राइस मूवमेंट रेश्यो का प्रतिनिधित्व करता है और c नॉर्मलाइज्ड b है।

यह रणनीति फास्ट लाइन के लिए एक छोटी अवधि और स्लो लाइन के लिए एक लंबी अवधि निर्धारित करती है। एक खरीद संकेत तब उत्पन्न होता है जब फास्ट लाइन स्लो लाइन के ऊपर पार करती है, और एक बिक्री संकेत जब फास्ट लाइन नीचे पार करती है। यह चलती औसत क्रॉसओवर तर्क द्वारा प्रवृत्ति को पकड़ती है।

लाभ

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

  2. विभिन्न समय सीमाओं के साथ संयुक्त दोहरी चलती औसत क्रॉसओवर एक नई प्रवृत्ति की शुरुआत को बेहतर ढंग से पहचान सकती है।

  3. तेज और धीमी लाइन की अवधि को विभिन्न बाजार स्थितियों के अनुसार समायोजित किया जा सकता है।

  4. रणनीति तर्क सरल और सहज है। समझने और लागू करने में आसान है।

  5. जोखिमों को नियंत्रित करने के लिए स्टॉप लॉस और टेक प्रॉफिट को लचीलापन से सेट किया जा सकता है।

जोखिम

  1. चलती औसत क्रॉसओवर से अत्यधिक झूठे संकेत उत्पन्न हो सकते हैं। फ़िल्टरिंग के लिए अन्य तकनीकी संकेतकों की आवश्यकता हो सकती है।

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

  3. यह एक ट्रेंड फॉलो करने वाली रणनीति है जो रेंज-बाउंड मार्केट के लिए उपयुक्त नहीं है। इसका उपयोग ट्रेंडिंग स्थितियों में किया जाना चाहिए।

  4. घाटे को कम करने और लाभ स्तर को अनुकूलित करने के लिए स्टॉप लॉस और टेक प्रॉफिट को उचित रूप से समायोजित किया जाना चाहिए।

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

  1. संकेत निस्पंदन और गुणवत्ता में सुधार के लिए एमएसीडी, केडीजे जैसे गति संकेतकों को जोड़ने पर विचार करें।

  2. इष्टतम मापदंडों को खोजने के लिए विभिन्न तेज और धीमी लाइन अवधि संयोजनों का परीक्षण करें।

  3. बैकटेस्ट परिणामों के आधार पर स्टॉप लॉस को अनुकूलित करें और लाभ लें।

  4. कुछ बाजार स्थितियों में गतिशील रूप से मापदंडों को समायोजित करने पर विचार करें, उदाहरण के लिए, सीमाबद्ध बाजार में अवधि बढ़ाएं।

निष्कर्ष

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


/*backtest
start: 2023-11-05 00:00:00
end: 2023-11-12 00:00:00
period: 3m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title="[XC] Adaptive Strategy V3 - Ratio OCHL Averager no repaint",shorttitle="R_OHCL", overlay=true, currency=currency.EUR,initial_capital=10000,
     default_qty_value=100, default_qty_type=strategy.percent_of_equity , calc_on_every_tick=false, calc_on_order_fills=true)


//                  ╔═ SETTINGS                  ╗
//░░░░░░░░░░░░░░░░░ ╚════════════════════════════╝ ░░░░░░░░░░░░░░░░░░░░░░░░

strategy_1     = input ( defval=true   , type=input.bool    , title="STRATEGY 1? —>"      )
Recursive      = input(false)
RES201         = "Min",RES202= "D",RES203 = "W",RES204 = "M"

//++ Resolution 1 ++
inp_resolution1 = input(600, minval=1, title="Resolution Line 1")
restype1        = input ( defval="Min"  , type=input.string , title= "Resolution Line 1" , options=[ "Min","D","W","M"])
multiplier1     = restype1 == "Min" ? "" : restype1 == "D" ? "D" : restype1 == "W" ? "W" : "M"
resolution1     = tostring(inp_resolution1)+ multiplier1

//++ Resolution 2 ++
inp_resolution2 = input(1440, minval=1, title="Resolution Line 2")
restype2        = input ( defval="Min"  , type=input.string , title= "Resolution Line 2" , options=["Min","D","W","M"])
multiplier2     = restype2 == "Min" ? "" : restype2 == "D" ? "D" : restype2 == "W" ? "W" : "M"
resolution2     = tostring(inp_resolution2)+ multiplier2

StopLoss        = input(defval = 500 , title = "Stop Loss", minval = 0)
TakeProfit      = input(defval = 2500 , title = "Take Profit", minval = 0)
// === RISK MANAGEMENT VALUE PREP ===
// if an input is less than 1, assuming not wanted so we assign 'na' value to disable it.
useTakeProfit   = TakeProfit  >= 1 ? TakeProfit  : na
useStopLoss     = StopLoss    >= 1 ? StopLoss    : na


//                  ╔═ BACKTEST RANGE            ╗
//░░░░░░░░░░░░░░░░░ ╚════════════════════════════╝ ░░░░░░░░░░░░░░░░░░░░░░░░
line_breakBTR  = input ( defval = true   , type=input.bool   , title="BACKTEST RANGE —"      ) 
FromYear       = input ( defval = 2019, title = "From Year", minval = 2017)
FromMonth      = input ( defval = 1, title = "From Month", minval = 1, maxval = 12)
FromDay        = input ( defval = 2, title = "From Day", minval = 1, maxval = 31)
//FromHour     = input ( defval = 1, title = "From Hour", minval = 1, maxval = 24)
ToYear         = input ( defval = 9999, title = "To Year", minval = 2017)
//ToHour       = input ( defval = 0, title = "From Hour", minval = 0, maxval = 24)
ToMonth        = input ( defval = 1, title = "To Month", minval = 1, maxval = 12)
ToDay          = input ( defval = 1, title = "To Day", minval = 1, maxval = 31)

// === FUNCTION EXAMPLE ===
start     = timestamp(syminfo.timezone, FromYear, FromMonth, FromDay, 0, 00)  // backtest start window
finish    = timestamp(syminfo.timezone, ToYear  , ToMonth  , ToDay  , 0, 59)  // backtest finish window
window()  => time >= start and time <= finish ? true : false // create function "within window of time"

//                  ╔═ INDICATOR                 ╗
//░░░░░░░░░░░░░░░░░ ╚════════════════════════════╝ ░░░░░░░░░░░░░░░░░░░░░░░░

// "Ratio OCHL Averager" -> alexgrover / tradingview.com/script/RGAtOI6h-Ratio-OCHL-Averager-An-Alternative-to-VWAP/

rochla( res,Recursive)=>
    //Recursive = false
    H =  security(syminfo.tickerid,res,high[1],gaps = barmerge.gaps_off,  lookahead = barmerge.lookahead_on)
    L =  security(syminfo.tickerid,res,low[1] ,gaps = barmerge.gaps_off,  lookahead = barmerge.lookahead_on)
    d = 0.
    //----
    a = Recursive ? nz(d[1],open) : open
    b = abs(close-a)/(H - L)
    c = b > 1 ? 1 : b
    d := c*close+(1-c)*nz(d[1],close)



strat1_line1=rochla(resolution1,Recursive)
strat1_line2=rochla(resolution2,Recursive)

plot(strat1_line1, title="Ratio OCHL Averager 1", color=#DAA520,linewidth=2,transp=0)
plot(strat1_line2, title="Ratio OCHL Averager 2", color=#B22222,linewidth=2,transp=0)



//                  ╔═ STRATEGY 1                ╗
//░░░░░░░░░░░░░░░░░ ╚════════════════════════════╝ ░░░░░░░░░░░░░░░░░░░░░░░░

trading_strat1_line1 = strategy_1 == 1    ? strat1_line1   : na
trading_strat1_line2 = strategy_1 == 1    ? strat1_line2   : na

longCross  = crossunder (trading_strat1_line2, trading_strat1_line1) ? true : false
shortCross = crossover  (trading_strat1_line2, trading_strat1_line1) ? true : false

plot( longCross  ? trading_strat1_line1 : na , title = "Long"  , color=color.aqua, style=plot.style_circles, linewidth=5, offset= 0)
plot( shortCross ? trading_strat1_line2 : na , title = "Short" , color=color.red , style=plot.style_circles, linewidth=5, offset= 0)



//                  ╔═ Backtest 1                ╗
//░░░░░░░░░░░░░░░░░ ╚════════════════════════════╝ ░░░░░░░░░░░░░░░░░░░░░░░░


strategy.exit("close",loss = useStopLoss, profit = useTakeProfit)

if longCross  and window() and strategy_1 == 1 
    strategy.entry("Go Long", strategy.long)
if shortCross and window() and strategy_1 == 1 
    strategy.entry("Go Short", strategy.short)

//end

अधिक