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