यह एक गति-आधारित रणनीति है जो ट्रेडिंग संकेत उत्पन्न करने के लिए आरएसआई, स्टॉक, एमएसीडी जैसे ऑसिलेटर संकेतकों का उपयोग करती है। मुख्य विचार यह है कि संकेतकों का उपयोग करके मूल्य दोलन के दौरान प्रवृत्ति की दिशा की पहचान करना और संकेतकों के संकेतों के आधार पर ट्रेड करना। यह रणनीति स्टॉप लॉस के लिए विलंबित सुपरट्रेंड का भी उपयोग करती है।
रणनीति पहले कस्टम फ़ंक्शन f_getOscilatorValues को RSI, स्टॉक, MACD आदि सहित विभिन्न ऑसिलेटर संकेतकों के मान प्राप्त करने के लिए कॉल करती है। फिर यह स्टॉप लॉस को ट्रैक करने के लिए f_getSupertrend के साथ विलंबित सुपरट्रेंड मानों की गणना करती है।
संकेतकों की गणना करने के बाद, रणनीति f_getBuySellStops को संकेतक मूल्यों के आधार पर प्रवेश स्टॉप और लाभ लक्ष्यों की गणना करने के लिए कॉल करती है। विशेष रूप से, यह एटीआर की गणना करता है और एटीआर को प्रवेश स्टॉप के रूप में स्टॉप लॉस गुणांक से गुणा करता है, और एटीआर को लाभ लक्ष्य के रूप में लाभ गुणांक से गुणा करता है। स्टॉप और लक्ष्य ट्रेंड उलटते समय समायोजित होंगे।
इसके बाद, रणनीति मोमबत्ती की दिशा निर्धारित करती है। अपट्रेंड मोमबत्तियां हरे रंग की होती हैं और डाउनट्रेंड मोमबत्तियां लाल रंग की होती हैं। मोमबत्तियों और संकेतकों को प्लॉट करने के बाद, रणनीति जांचती है कि प्रवेश शर्तें पूरी हो गई हैं या नहीं। प्रवेश शर्तें खरीद रही हैं जब संकेतक ओवरबॉट दिखाता है और कीमत ऊपरी बैंड से ऊपर टूट जाती है, और बेच रही है जब संकेतक ओवरसोल्ड दिखाता है और कीमत निचले बैंड से नीचे टूट जाती है। एक फ़िल्टरिंग शर्त भी है जिसके लिए कीमत को उच्च समय सीमा चलती औसत को तोड़ने की आवश्यकता होती है।
प्रवेश के बाद, स्टॉप लॉस को ऊपरी/निम्न बैंड द्वारा पीछा किया जाता है जो भी करीब है। जब स्टॉप लॉस ट्रिगर किया जाता है, तो स्थिति बंद हो जाती है। जब कीमत लाभ लक्ष्य तक पहुंच जाती है, तो आंशिक लाभ लिया जाता है।
इस रणनीति के लाभ इस प्रकार हैंः
रुझान की दिशा की पहचान करने के लिए ऑसिलेटरों का उपयोग करने से अल्पकालिक उलट अवसरों को समय पर पकड़ लिया जा सकता है।
विलंबित सुपरट्रेंड स्टॉप लॉस लागू करने से हानि बढ़ने से पहले रोक दिया जा सकता है, जिससे एकल व्यापार हानि सीमित हो जाती है।
गतिशील एटीआर के आधार पर स्टॉप लॉस और लाभ लक्ष्य की गणना करने से स्थिति आकार को समायोजित करने में मदद मिलती है।
उच्च समय सीमा वाले चलती औसत के साथ फ़िल्टर करने से समेकन में फंसने से बचा जाता है।
आंशिक लाभ लेने से कुछ लाभ प्राप्त होता है।
क्वांट ट्रेडिंग के शुरुआती लोगों के लिए तर्क सरल और समझने में आसान है।
इस रणनीति के कुछ जोखिमों में शामिल हैंः
ऑसिलेटर में देरी से आने वाले मुद्दे हो सकते हैं, जिससे देरी से प्रवेश और समय से पहले बाहर निकलने के संकेत हो सकते हैं। यह मापदंडों को अनुकूलित करके या ट्रेंड फॉलोइंग संकेतकों को जोड़कर सुधार किया जा सकता है।
स्ट्रेट स्टॉप लॉस को हिट किया जा सकता है। स्टॉप लॉस रेंज को बढ़ाया जा सकता है या चैंडेलर जैसे गतिशील स्टॉप का उपयोग किया जा सकता है।
आंशिक लाभ लेने के बाद शेष स्थिति को बंद किया जा सकता है। आंशिक लाभ अनुपात को कम किया जा सकता है।
बैकटेस्ट ओवरफिट जोखिम। रणनीति को विभिन्न बाजारों में मान्य किया जाना चाहिए।
उच्च समय सीमा चलती औसत फ़िल्टर की विफलता। प्रवृत्ति वर्गीकरण विधियों का उपयोग एक साथ किया जाना चाहिए।
इस रणनीति को निम्नलिखित पहलुओं में अनुकूलित किया जा सकता हैः
ऑसिलेटर मापदंडों के विभिन्न संयोजनों का परीक्षण करें और उन लोगों को खोजें जो गुणवत्ता संकेत प्रदान करते हैं।
ATR या चलती औसत के आधार पर आंशिक लाभ लेने के साथ लाभ बंद करने की कोशिश करें।
प्रवृत्ति विश्लेषण के लिए चलती औसत की जगह लेने और सटीकता में सुधार के लिए मशीन लर्निंग एल्गोरिदम जोड़ें।
अनावश्यक उलटा करने से बचने के लिए फ़िल्टरिंग स्थितियों के रूप में वॉल्यूम संकेतक जोड़ें।
परिसंपत्ति के लिए इष्टतम संयोजन खोजने के लिए संकेतकों को इकट्ठा करें और वजन करें।
गतिशील रूप से स्टॉप, लक्ष्य और स्थिति आकार अनुकूलित करने के लिए मशीन लर्निंग जोखिम नियंत्रण मॉड्यूल जोड़ें।
वायदा और स्पॉट के बीच मूल्य स्प्रेड का उपयोग करके त्रिकोणीय मध्यस्थता या आधार व्यापार संकेत शामिल करें।
कुल मिलाकर, यह सूचक और जोखिम प्रबंधन पर ध्यान केंद्रित करने वाले स्पष्ट तर्क के साथ क्वांट ट्रेडिंग शुरुआती लोगों के लिए एक महान रणनीति है। लेकिन लाइव ट्रेडिंग के लिए अभी भी पैरामीटर अनुकूलन और जोखिम में कमी की आवश्यकता है। यह मजबूती में सुधार के लिए प्रवृत्ति विश्लेषण, स्टॉप लॉस अनुकूलन, एसेम्बल मॉडल आदि जैसे पहलुओं में भी बढ़ाया जा सकता है। एक ट्रेडिंग रणनीति टेम्पलेट के रूप में, यह मूल्यवान संदर्भ प्रदान करता है।
/*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)