ऑसिलेटिंग K-लाइन मात्रात्मक ट्रेडिंग रणनीति


निर्माण तिथि: 2023-09-26 20:05:55 अंत में संशोधित करें: 2023-09-26 20:05:55
कॉपी: 0 क्लिक्स: 442
1
ध्यान केंद्रित करना
1166
समर्थक

अवलोकन

यह रणनीति एक सूचक आधारित गतिशीलता रणनीति है, जो RSI, Stoch, MACD जैसे ऑसिलेटरों का उपयोग करके रणनीति ट्रेडिंग सिग्नल का निर्माण करती है। रणनीति का मुख्य विचार यह है कि जब कीमत में उतार-चढ़ाव होता है, तो रणनीति का उपयोग प्रवृत्ति की दिशा की पहचान करने के लिए किया जाता है। साथ ही, रणनीति विलंबित ओवरट्रेंड सूचक का उपयोग करके भी बंद हो जाती है।

रणनीति सिद्धांत

इस रणनीति को पहले कस्टम फ़ंक्शन f_getOscilatorValues को आरएसआई, स्टोच, एमएसीडी आदि सहित विभिन्न ऑस्सिलेटरों के संकेतकों के मानों को प्राप्त करने के लिए बुलाया जाता है। इसके बाद, f_getSupertrend फ़ंक्शन के माध्यम से ओवरट्रेंड संकेतकों के मानों की गणना की जाती है, जो स्टॉप लॉस को ट्रैक करने के लिए है।

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

इसके बाद, रणनीति K लाइन की वास्तविक दिशा का न्याय करती है, यदि यह ऊपर की ओर K लाइन है, तो इसे हरे रंग में चित्रित किया जाता है, और नीचे की ओर K लाइन लाल रंग में चित्रित की जाती है। K लाइन और सूचक को चित्रित करने के बाद, रणनीति निर्णय लेती है कि क्या प्रवेश की आवश्यकता है। प्रवेश की आवश्यकता तब होती है जब सूचक ओवरबॉट दिखाता है, और कीमत ट्रैक पर टूट जाती है; जब सूचक ओवरसोल दिखाता है, तो कीमत ट्रैक से टूट जाती है और खाली हो जाती है। इसके अलावा, रणनीति में उच्च-चक्र औसत रेखा फ़िल्टर की शुरुआत की गई है, जिसमें प्रवेश करने के लिए कीमतों को औसत रेखा को तोड़ने की आवश्यकता होती है।

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

रणनीति का विश्लेषण

इस रणनीति के निम्नलिखित फायदे हैं:

  1. प्रवृत्ति की दिशा को पहचानने के लिए ऑस्सिलेटर्स का उपयोग करके, बाजार के शॉर्ट-लाइन रिवर्स अवसरों को समय पर पकड़ना संभव है।

  2. देरी से ओवरट्रेंड स्टॉप लॉस रणनीति का उपयोग करें, जो नुकसान के विस्तार से पहले स्टॉप आउट को रोक सकता है, और एकल नुकसान को सीमित कर सकता है।

  3. एटीआर द्वारा गणना की गई जोखिम माप के आधार पर स्टॉप-लॉस और स्टॉप-लॉस को गतिशील रूप से समायोजित किया जा सकता है।

  4. उच्च आवर्ती औसत रेखा के साथ फ़िल्टर करें, ताकि वे ढीले न हों।

  5. एक आंशिक रोक-टोक रणनीति, जो लाभ को चालू रखने और लाभ के एक हिस्से को लॉक करने के लिए है।

  6. रणनीतिक विचार सरल और स्पष्ट है, इसे लागू करना आसान है, और यह मात्रात्मक व्यापार के शुरुआती लोगों के लिए उपयुक्त है।

रणनीतिक जोखिम विश्लेषण

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

  1. oscillators सूचक में देरी की समस्या है, जो प्रवेश सिग्नल देरी, प्रारंभिक प्रस्थान सिग्नल का कारण बन सकती है। सूचक पैरामीटर को समायोजित करके अनुकूलित किया जा सकता है, या ट्रेंड फॉलोइंग सूचक सहायक निर्णय जोड़ा जा सकता है।

  2. स्टॉप पॉइंट के करीब, एक ब्रेक स्टॉप किया जा सकता है। स्टॉप रेंज को उचित रूप से ढीला किया जा सकता है, या एक गतिशील स्टॉप रणनीति का उपयोग किया जा सकता है, जैसे कि चैंडलियर स्टॉप।

  3. आंशिक स्टॉप के बाद, शेष स्थिति को बंद कर दिया जा सकता है। आंशिक स्टॉप अनुपात को कम किया जा सकता है, पर्याप्त जगह छोड़ दी जा सकती है।

  4. डेटा मिलान के जोखिमों का पता लगाना। ओवर-मिलान से बचने के लिए विभिन्न बाजारों में कई बार सत्यापित किया जाना चाहिए।

  5. उच्च आवर्ती औसत रेखा एक फ़िल्टर शर्त के रूप में भी विफल हो सकती है। रुझान वर्गीकरण जैसे तरीकों का उपयोग बड़े चक्र की चाल का आकलन करने में सहायक होना चाहिए।

रणनीति अनुकूलन दिशा

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

  1. विभिन्न ऑस्सिलेटरों के संकेतकों के पैरामीटर संयोजन का परीक्षण करें और उन संयोजनों का चयन करें जो बेहतर गुणवत्ता वाले संकेत प्रदान करते हैं, जैसे कि स्टोच इंडिकेटर फास्ट के-लाइन आदि।

  2. आंशिक स्टॉप को चल स्टॉप में बदलने की कोशिश करें, एटीआर या चलती औसत के अनुसार स्टॉप की स्थिति सेट करें।

  3. मशीन सीखने के एल्गोरिदम को शामिल करने के लिए उच्च चक्र प्रवृत्ति का आकलन करें, उच्च चक्र औसत रेखा फ़िल्टर विधि को प्रतिस्थापित करें, और आकलन की सटीकता में सुधार करें।

  4. इनपुट फ़िल्टर के रूप में ऊर्जा संकेतक आदि को बढ़ाएं, अनावश्यक रिवर्स ट्रेडिंग से बचें।

  5. सूचकांक को एकीकृत और भारित करने के लिए अनुकूलित करें, वर्तमान नस्ल के लिए सबसे उपयुक्त सूचकांक संयोजन का चयन करें।

  6. मशीन लर्निंग विंड कंट्रोल मॉड्यूल को जोड़ना, स्टॉप-लॉस, स्टॉप-स्टॉप, पॉजिशन आदि के लिए गतिशील अनुकूलन।

  7. ट्रेडिंग सिग्नल जो त्रिकोणिक सरलीकरण या वायदा सरलीकरण जोड़ते हैं, जो कि फ्यूचर्स और कैश के बीच मूल्य अंतर का लाभ उठाते हैं।

संक्षेप

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

रणनीति स्रोत कोड
/*backtest
start: 2023-08-26 00:00:00
end: 2023-09-25 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/
// © HeWhoMustNotBeNamed

//@version=4
strategy("Oscilator candles - strategy", overlay=false, initial_capital = 1000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, pyramiding = 1, commission_value = 0.01, calc_on_order_fills = true)

oscilatorType = input(title="Oscliator Type", defval="stoch", options=["rsi", "stoch", "cog", "macd", "tsi", "cci", "cmo", "mfi"])
length = input(3)
shortlength = input(3)
longlength = input(9)

showSupertrend = input(true)
AtrMAType = input(title="Moving Average Type", defval="rma", options=["ema", "sma", "hma", "rma", "vwma", "wma"])
AtrLength = input(30, step=10)
stopMultiplier  = input(4)
targetMultiplier  = input(3)
wicks = input(true)
considerWicksForDelayByStep = input(false)
colorByPreviousClose = input(true)

useHTFPivot = input(false)
resolution = input("12M", type=input.resolution)
HTFMultiplier = input(4, title="Higher Timeframe multiplier (Used when resolution is set to Same as Symbol)", minval=2, step=1)
PivotLength = input(2, step=1)

tradeDirection = input(title="Trade Direction", defval=strategy.direction.long, options=[strategy.direction.all, strategy.direction.long, strategy.direction.short])
i_startTime = input(defval = timestamp("01 Jan 2010 00:00 +0000"), title = "Backtest Start Time", type = input.time)
i_endTime = input(defval = timestamp("01 Jan 2099 00:00 +0000"), title = "Backtest End Time", type = input.time)
inDateRange = true

f_getOscilatorValues(oscilatorType, length, shortlength, longlength)=>
    oOpen = rsi(open, length)
    oClose = rsi(close, length)
    oHigh = rsi(high, length)
    oLow = rsi(low, length)
    if(oscilatorType == "tsi")
        oOpen := tsi(open, shortlength, longlength)
        oClose := tsi(close, shortlength, longlength)
        oHigh := tsi(high, shortlength, longlength)
        oLow := tsi(low, shortlength, longlength)
    if(oscilatorType == "stoch")
        oOpen := stoch(open, longlength, shortlength, length)
        oClose := stoch(close, longlength, shortlength, length)
        oHigh := stoch(high, longlength, shortlength, length)
        oLow := stoch(low, longlength, shortlength, length)
    if(oscilatorType == "cci")
        oOpen := cci(open, length)
        oClose := cci(close, length)
        oHigh := cci(high, length)
        oLow := cci(low, length)
    if(oscilatorType == "cog")
        oOpen := cog(open, length)
        oClose := cog(close, length)
        oHigh := cog(high, length)
        oLow := cog(low, length)
    if(oscilatorType == "cmo")
        oOpen := cmo(open, length)
        oClose := cmo(close, length)
        oHigh := cmo(high, length)
        oLow := cmo(low, length)
    if(oscilatorType == "mfi")
        oOpen := mfi(open, length)
        oClose := mfi(close, length)
        oHigh := mfi(high, length)
        oLow := mfi(low, length)
    if(oscilatorType == "macd")
        [macdLineOpen, signalLineOpen, histLineOpen] = macd(open, shortlength, longlength, length)
        [macdLineClose, signalLineClose, histLineClose] = macd(close, shortlength, longlength, length)
        [macdLineHigh, signalLineHigh, histLineHigh] = macd(high, shortlength, longlength, length)
        [macdLineLow, signalLineLow, histLineLow] = macd(low, shortlength, longlength, length)
        oOpen := macdLineOpen
        oClose := macdLineClose
        oHigh := macdLineHigh
        oLow := macdLineLow
    [oOpen, oClose, oHigh, oLow]

f_getMovingAverage(source, MAType, length)=>
    ma = sma(source, length)
    if(MAType == "ema")
        ma := ema(source,length)
    if(MAType == "hma")
        ma := hma(source,length)
    if(MAType == "rma")
        ma := rma(source,length)
    if(MAType == "vwma")
        ma := vwma(source,length)
    if(MAType == "wma")
        ma := wma(source,length)
    ma

f_getSupertrend(oOpen, oClose, oHigh, oLow, AtrMAType, AtrLength, stopMultiplier, wicks)=>
    truerange = max(oHigh, oClose[1]) - min(oLow, oClose[1])
    
    averagetruerange = f_getMovingAverage(truerange, AtrMAType, AtrLength)
    atr = averagetruerange * stopMultiplier

    longStop = oClose - atr
    longStopPrev = nz(longStop[1], longStop)
    longStop := (wicks ? oLow[1] : oClose[1]) > longStopPrev ? max(longStop, longStopPrev) : longStop
    
    shortStop = oClose + atr
    shortStopPrev = nz(shortStop[1], shortStop)
    shortStop := (wicks ? oHigh[1] : oClose[1]) < shortStopPrev ? min(shortStop, shortStopPrev) : shortStop
    
    dir = 1
    dir := nz(dir[1], dir)
    dir := dir == -1 and (wicks ? oHigh : oClose) > shortStopPrev ? 1 : dir == 1 and (wicks ? oLow : oClose) < longStopPrev ? -1 : dir
    
    trailingStop = dir == 1? longStop : shortStop
    
    [dir, trailingStop]


f_getBuySellStops(oOpen, oClose, oHigh, oLow, AtrMAType, AtrLength, considerWicks, considerWicksForDelayByStep, stopMultiplier, targetMultiplier)=>
    barState = 0
    source = oClose
    
    truerange = max(oHigh, oClose[1]) - min(oLow, oClose[1])
    
    atr = f_getMovingAverage(truerange, AtrMAType, AtrLength)

    buyStop = source - atr * stopMultiplier
    sellStop = source + atr * stopMultiplier
    buyStopDerived = buyStop
    sellStopDerived = sellStop
    highTarget = considerWicks ? oHigh : source
    lowTarget = considerWicks ? oLow : source
    
    highTargetDelayByStep = considerWicksForDelayByStep ? oHigh : source
    lowTargetDelayByStep = considerWicksForDelayByStep ? oLow : source
    
    barState := highTarget > sellStopDerived[1] ? 1 : lowTarget < buyStopDerived[1] ? -1 : nz(barState[1],0)
    
    buyMultiplier = (barState == 1)? stopMultiplier : targetMultiplier
    sellMultiplier = (barState == -1)? stopMultiplier : targetMultiplier
    buyStop := source - atr * buyMultiplier
    sellStop := source + atr * sellMultiplier
    buyStop := barState == 1? max(buyStop, buyStop[1]) : barState == -1? min(buyStop, buyStop[1]) : buyStop
    sellStop := barState == 1? max(sellStop, sellStop[1]) : barState == -1? min(sellStop, sellStop[1]) : sellStop
    
    buyStopDerived := buyStop
    sellStopDerived := sellStop
    
    buyStopDerived := highTargetDelayByStep < sellStopDerived[1] and lowTargetDelayByStep > buyStopDerived[1] ? buyStopDerived[1] : buyStopDerived
    sellStopDerived := highTargetDelayByStep < sellStopDerived[1] and lowTargetDelayByStep > buyStopDerived[1] ? sellStopDerived[1] : sellStopDerived

    [buyStopDerived, sellStopDerived, barState]


f_secureSecurity(_symbol, _res, _src) => security(_symbol, _res, _src[1], lookahead = barmerge.lookahead_on, gaps=barmerge.gaps_off)

f_multiple_resolution(HTFMultiplier) => 
    target_Res_In_Min = timeframe.multiplier * HTFMultiplier * (
      timeframe.isseconds   ? 1. / 60. :
      timeframe.isminutes   ? 1. :
      timeframe.isdaily     ? 1440. :
      timeframe.isweekly    ? 7. * 24. * 60. :
      timeframe.ismonthly   ? 30.417 * 24. * 60. : na)

    target_Res_In_Min     <= 0.0417       ? "1S"  :
      target_Res_In_Min   <= 0.167        ? "5S"  :
      target_Res_In_Min   <= 0.376        ? "15S" :
      target_Res_In_Min   <= 0.751        ? "30S" :
      target_Res_In_Min   <= 1440         ? tostring(round(target_Res_In_Min)) :
      tostring(round(min(target_Res_In_Min / 1440, 365))) + "D"
    
f_getPivotHighLow(oOpen, oClose, oHigh, oLow, HTFMultiplier, resolution, PivotLength)=>
    derivedResolution = resolution == ""? f_multiple_resolution(HTFMultiplier) : resolution
    HTFHigh = f_secureSecurity(syminfo.tickerid, derivedResolution, oHigh)
    HTFLow = f_secureSecurity(syminfo.tickerid, derivedResolution, oLow)
    CLOSEprev = f_secureSecurity(syminfo.tickerid, derivedResolution, oClose)
    pivothi = pivothigh(HTFHigh, PivotLength, PivotLength)
    pivotlo = pivotlow(HTFLow, PivotLength, PivotLength)
    pivothi := na(pivothi)? nz(pivothi[1]) : pivothi
    pivotlo := na(pivotlo)? nz(pivotlo[1]) : pivotlo
    [pivothi, pivotlo]
    
[oOpen, oClose, oHigh, oLow] = f_getOscilatorValues(oscilatorType, length, shortlength, longlength)
[dir, trailingStop] = f_getSupertrend(oOpen, oClose, oHigh, oLow, AtrMAType, AtrLength, stopMultiplier, wicks)

candleColor = colorByPreviousClose ?
                 (oClose[1] < oClose ? color.green : oClose[1] > oClose ? color.red : color.silver) : 
                 (oOpen < oClose ? color.green : oOpen > oClose ? color.red : color.silver)
plotcandle(oOpen, oHigh, oLow, oClose, 'Oscilator Candles', color = candleColor)

[buyStopDerived, sellStopDerived, barState] = f_getBuySellStops(oOpen, oClose, oHigh, oLow, AtrMAType, AtrLength, wicks, considerWicksForDelayByStep, stopMultiplier, targetMultiplier)

trailingStopDerived = barState == 1? buyStopDerived : sellStopDerived

plot(showSupertrend?trailingStopDerived:na, title="TrailingStop", style=plot.style_linebr, linewidth=1, color= barState == 1 ? color.green : color.red)

[pivotHigh, pivotLow] = f_getPivotHighLow(open, close, high, low, HTFMultiplier, resolution, PivotLength)

buyCondition = (barState == 1) and (close > pivotHigh or not useHTFPivot)
exitBuyConditin = (barState == -1)
sellCondition = (barState == -1) and (close < pivotLow or not useHTFPivot)
exitSellCondition = (barState == 1)

// strategy.risk.allow_entry_in(tradeDirection)
strategy.entry("Buy", strategy.long, when=buyCondition and inDateRange, oca_name="oca")
strategy.entry("Sell", strategy.short, when=sellCondition and inDateRange, oca_name="oca")
strategy.close("Buy", when = exitBuyConditin)
strategy.close( "Sell", when = exitSellCondition)