
दोहरी चलती औसत प्रतिगमन रणनीति एक विशिष्ट अल्पकालिक प्रतिगमन ट्रेडिंग रणनीति है। यह रणनीति दो अलग-अलग पैरामीटर सेट की समानताओं का उपयोग करती है और ट्रेडिंग सिग्नल भेजती है और जब रुझान में प्रतिगमन होता है तो लाभ प्राप्त करती है।
इस रणनीति में ट्रेडिंग सिग्नल उत्पन्न करने के लिए दो समानांतर रेखाओं का उपयोग किया जाता है। पहली समानांतर रेखा का उद्घाटन प्रवृत्ति की दिशा का निर्धारण करने के लिए किया जाता है, और दूसरी समानांतर रेखा का समापन एक व्यापारिक संकेत देने के लिए किया जाता है।
जब maopening बढ़ता है, तो यह दर्शाता है कि यह वर्तमान में ट्रेंडिंग चरण में है; जब maopening गिरता है, तो यह दर्शाता है कि यह वर्तमान में ट्रेंडिंग चरण में है। मैकलोसिंग को 1 से अधिक के गुणांक से गुणा किया जाता है, जिससे यह अधिक संवेदनशील हो जाता है और पूर्ववर्ती रिवर्स सिग्नल दे सकता है।
विशेष रूप से, जब maopening ऊपर जाता है और maclosing नीचे maopening के माध्यम से जाता है, तो यह एक प्रवृत्ति उलट है, और इस रणनीति को खोला जाता है; जब maopening नीचे जाता है और maclosing पर maopening के माध्यम से जाता है, तो यह प्रवृत्ति उलट है, और इस रणनीति को खोला जाता है।
इस रणनीति के पैरामीटर में औसत रेखा प्रकार, लंबाई, डेटा स्रोत आदि शामिल हैं, जिन्हें इन पैरामीटर को समायोजित करके बेहतर व्यापारिक प्रभाव प्राप्त किया जा सकता है। इसके अलावा, रणनीति में कुछ विकल्प भी हैं, जैसे कि स्थिति खोलने का तरीका, स्टॉप लॉस का तरीका आदि, जिन्हें आवश्यकता के अनुसार सेट किया जा सकता है।
द्वि-समान-रेखा प्रतिवर्तन रणनीतियों के प्रमुख लाभों में शामिल हैंः
छोटी वापसी, शॉर्ट-लाइन ट्रेडिंग के लिए उपयुक्त. दो तेज औसत रेखाओं का उपयोग करके, अल्पकालिक रुझानों के उलट को जल्दी से पकड़ सकते हैं, छोटी वापसी।
सरल और आसान लागू करना. द्वि-समान रेखाओं का क्रॉसिंग एक ट्रेडिंग सिग्नल है, यह बहुत सरल और स्पष्ट है.
कई समायोज्य पैरामीटर हैं जिन्हें अनुकूलित किया जा सकता है। इसमें 2 औसत रेखाओं के पैरामीटर और कारक शामिल हैं जिन्हें अनुकूलित करके सबसे अच्छा पैरामीटर संयोजन पाया जा सकता है।
अनुसूचित, स्वचालित ट्रेडिंग के लिए उपयुक्त. रणनीति तर्क सरल और स्पष्ट है, निष्पादन आवृत्ति उच्च है, स्वचालित ट्रेडिंग के लिए बहुत उपयुक्त है।
नियंत्रित जोखिम, एक स्टॉप-लॉस तंत्र के साथ. एक मोबाइल स्टॉप-लॉस या एक संख्यात्मक स्टॉप-लॉस सेट किया जा सकता है, और एक एकल नुकसान को नियंत्रित किया जा सकता है.
हालांकि, इस तरह की रणनीति के साथ कुछ जोखिम भी हैं:
द्विवार्षिक क्रॉसिंग में विलंब होता है। औसत रेखा स्वयं मूल्य से पीछे है, और क्रॉसिंग होने पर प्रवृत्ति कुछ समय के लिए उलट हो सकती है।
फंसने के लिए आसान। रुझान में बदलाव स्थायी नहीं हो सकता है, और यह जल्द ही फिर से वापस आ सकता है, और एक फंसने का कारण बन सकता है।
निकासी अभी भी मौजूद है। समय पर रोकना एक व्यक्ति के नुकसान को कम कर सकता है, लेकिन लगातार रोकना एक बड़ी निकासी का कारण बन सकता है।
डेटा अनुकूलन जोखिम. अति-अनुकूलन पैरामीटर, ऐतिहासिक डेटा में अच्छा प्रदर्शन करते हैं, लेकिन वास्तविक डिस्क में खराब प्रदर्शन करते हैं.
जोखिम के समाधानों में शामिल हैंः
पैरामीटर को अनुकूलित करें और त्वरित प्रतिक्रिया के लिए एक समान-रेखा सेटिंग का पता लगाएं
अन्य सूचकांकों के साथ संयोजन से बचें, जैसे कि मूल्य सूचकांक, अस्थिरता सूचकांक आदि।
लगातार स्टॉप की संभावना को कम करने के लिए स्टॉप पोजीशन को समायोजित करें।
बहु-समूह पैरामीटर अनुकूलन परीक्षण, पैरामीटर की मजबूती का आकलन करना।
द्वि-समान-रेखा प्रतिगमन रणनीतियों को निम्नलिखित पहलुओं से अनुकूलित किया जा सकता हैः
विभिन्न प्रकार की औसत रेखाओं का परीक्षण करें और अधिक संवेदनशील औसत रेखाओं की तलाश करें। जैसे कि कामा, ज़ेलेमा आदि।
औसत रेखा पैरामीटर का अनुकूलन करें और सबसे अच्छा लंबाई संयोजन ढूंढें। आमतौर पर, कम अवधि के औसत रेखा प्रभाव बेहतर होते हैं।
विभिन्न डेटा स्रोतों का परीक्षण करें, जैसे कि समापन मूल्य, औसत मूल्य, विशिष्ट मूल्य आदि।
प्रवृत्ति फ़िल्टर को बढ़ाएं, अनुचित रिवर्स सिग्नल से बचें। Donchian चैनल आदि उपलब्ध हैं।
अन्य सूचकांकों के साथ पुष्टि करें, जैसे कि मात्रा-मूल्य सूचकांक (MACD), ओबीवी आदि।
जोखिम प्रबंधन तंत्र जैसे कि मोबाइल स्टॉप लॉस, खाता अधिकतम हानि आदि को बढ़ाया गया है।
पोर्टफोलियो का अनुकूलन करें और सर्वोत्तम परिसंपत्ति विनियोग अनुपात की तलाश करें।
पैरामीटर्स के लिए मजबूत परीक्षण जोड़ें, पैरामीटर्स के अति-अनुकूलन के जोखिम का आकलन करें।
द्वि-समान-रेखा प्रतिगमन रणनीति एक सरल व्यावहारिक लघु-रेखा रणनीति है, जो बाजार में अल्पकालिक प्रतिगमन को पकड़ने के लिए उपयुक्त है। यह रणनीति छोटी, आसान है और मात्रा में व्यापार के लिए उपयुक्त है। लेकिन कुछ समस्याएं भी हैं, जैसे कि जोखिम, जैसे कि जोखिम, और अन्य। रणनीति की प्रभावशीलता में सुधार करने के लिए, पैरामीटर को अनुकूलित करने, संकेतक फ़िल्टरिंग को बढ़ाने और जोखिम नियंत्रण में सुधार करने जैसे तरीकों से रणनीति की प्रभावशीलता में सुधार किया जा सकता है, जिससे एक स्थिर, प्रभावी रणनीति विकसित की जा सकती है।
/*backtest
start: 2023-10-17 00:00:00
end: 2023-11-16 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy(title = "hamster-bot MRS 2", overlay = true, default_qty_type = strategy.percent_of_equity, initial_capital = 100, default_qty_value = 100, pyramiding = 9, commission_value = 0.045, backtest_fill_limits_assumption = 1)
info_options = "Options"
on_close = input(false, title = "Entry on close", inline=info_options, group=info_options)
OFFS = input.int(0, minval = 0, maxval = 1, title = "| Offset View", inline=info_options, group=info_options)
trade_offset = input.int(0, minval = 0, maxval = 1, title = "Trade", inline=info_options, group=info_options)
use_kalman_filter = input.bool(false, title="Use Kalman filter", group=info_options)
//MA Opening
info_opening = "MA Opening"
maopeningtyp = input.string("SMA", title="Type", options=["SMA", "EMA", "TEMA", "DEMA", "ZLEMA", "WMA", "Hma", "Thma", "Ehma", "H", "L", "DMA"], title = "", inline=info_opening, group=info_opening)
maopeningsrc = input.source(ohlc4, title = "", inline=info_opening, group=info_opening)
maopeninglen = input.int(3, minval = 1, maxval = 200, title = "", inline=info_opening, group=info_opening)
//MA Closing
info_closing = "MA Closing"
maclosingtyp = input.string("SMA", title="Type", options=["SMA", "EMA", "TEMA", "DEMA", "ZLEMA", "WMA", "Hma", "Thma", "Ehma", "H", "L", "DMA"], title = "", inline=info_closing, group=info_closing)
maclosingsrc = input.source(ohlc4, title = "", inline=info_closing, group=info_closing)
maclosinglen = input.int(3, minval = 1, maxval = 200, title = "", inline=info_closing, group=info_closing)
maclosingmul = input.float(1, step = 0.005, title = "mul", inline=info_closing, group=info_closing)
long1on = input(true, title = "", inline = "long1")
long1shift = input.float(0.96, step = 0.005, title = "Long", inline = "long1")
long1lot = input.int(10, minval = 0, maxval = 10000, step = 10, title = "Lot 1", inline = "long1")
short1on = input(true, title = "", inline = "short1")
short1shift = input.float(1.04, step = 0.005, title = "short", inline = "short1")
short1lot = input.int(10, minval = 0, maxval = 10000, step = 10, title = "Lot 1", inline = "short1")
startTime = input(timestamp("01 Jan 2010 00:00 +0000"), "Start date", inline = "period")
finalTime = input(timestamp("31 Dec 2030 23:59 +0000"), "Final date", inline = "period")
HMA(_src, _length) => ta.wma(2 * ta.wma(_src, _length / 2) - ta.wma(_src, _length), math.round(math.sqrt(_length)))
EHMA(_src, _length) => ta.ema(2 * ta.ema(_src, _length / 2) - ta.ema(_src, _length), math.round(math.sqrt(_length)))
THMA(_src, _length) => ta.wma(ta.wma(_src,_length / 3) * 3 - ta.wma(_src, _length / 2) - ta.wma(_src, _length), _length)
tema(sec, length)=>
tema1= ta.ema(sec, length)
tema2= ta.ema(tema1, length)
tema3= ta.ema(tema2, length)
tema_r = 3*tema1-3*tema2+tema3
donchian(len) => math.avg(ta.lowest(len), ta.highest(len))
ATR_func(_src, _len)=>
atrLow = low - ta.atr(_len)
trailAtrLow = atrLow
trailAtrLow := na(trailAtrLow[1]) ? trailAtrLow : atrLow >= trailAtrLow[1] ? atrLow : trailAtrLow[1]
supportHit = _src <= trailAtrLow
trailAtrLow := supportHit ? atrLow : trailAtrLow
trailAtrLow
f_dema(src, len)=>
EMA1 = ta.ema(src, len)
EMA2 = ta.ema(EMA1, len)
DEMA = (2*EMA1)-EMA2
f_zlema(src, period) =>
lag = math.round((period - 1) / 2)
ema_data = src + (src - src[lag])
zl= ta.ema(ema_data, period)
f_kalman_filter(src) =>
float value1= na
float value2 = na
value1 := 0.2 * (src - src[1]) + 0.8 * nz(value1[1])
value2 := 0.1 * (ta.tr) + 0.8 * nz(value2[1])
lambda = math.abs(value1 / value2)
alpha = (-math.pow(lambda, 2) + math.sqrt(math.pow(lambda, 4) + 16 * math.pow(lambda, 2)))/8
value3 = float(na)
value3 := alpha * src + (1 - alpha) * nz(value3[1])
//SWITCH
ma_func(modeSwitch, src, len, use_k_f=true) =>
modeSwitch == "SMA" ? use_kalman_filter and use_k_f ? f_kalman_filter(ta.sma(src, len)) : ta.sma(src, len) :
modeSwitch == "RMA" ? use_kalman_filter and use_k_f ? f_kalman_filter(ta.rma(src, len)) : ta.rma(src, len) :
modeSwitch == "EMA" ? use_kalman_filter and use_k_f ? f_kalman_filter(ta.ema(src, len)) : ta.ema(src, len) :
modeSwitch == "TEMA" ? use_kalman_filter and use_k_f ? f_kalman_filter(tema(src, len)) : tema(src, len):
modeSwitch == "DEMA" ? use_kalman_filter and use_k_f ? f_kalman_filter(f_dema(src, len)) : f_dema(src, len):
modeSwitch == "ZLEMA" ? use_kalman_filter and use_k_f ? f_kalman_filter(f_zlema(src, len)) : f_zlema(src, len):
modeSwitch == "WMA" ? use_kalman_filter and use_k_f ? f_kalman_filter(ta.wma(src, len)) : ta.wma(src, len):
modeSwitch == "VWMA" ? use_kalman_filter and use_k_f ? f_kalman_filter(ta.vwma(src, len)) : ta.vwma(src, len):
modeSwitch == "Hma" ? use_kalman_filter and use_k_f ? f_kalman_filter(HMA(src, len)) : HMA(src, len):
modeSwitch == "Ehma" ? use_kalman_filter and use_k_f ? f_kalman_filter(EHMA(src, len)) : EHMA(src, len):
modeSwitch == "Thma" ? use_kalman_filter and use_k_f ? f_kalman_filter(THMA(src, len/2)) : THMA(src, len/2):
modeSwitch == "ATR" ? use_kalman_filter and use_k_f ? f_kalman_filter(ATR_func(src, len)): ATR_func(src, len) :
modeSwitch == "L" ? use_kalman_filter and use_k_f ? f_kalman_filter(ta.lowest(len)): ta.lowest(len) :
modeSwitch == "H" ? use_kalman_filter and use_k_f ? f_kalman_filter(ta.highest(len)): ta.highest(len) :
modeSwitch == "DMA" ? donchian(len) : na
//Var
sum = 0.0
maopening = 0.0
maclosing = 0.0
os = maopeningsrc
cs = maclosingsrc
pos = strategy.position_size
p = 0.0
p := pos == 0 ? (strategy.equity / 100) / close : p[1]
truetime = true
loss = 0.0
maxloss = 0.0
equity = 0.0
//MA Opening
maopening := ma_func(maopeningtyp, maopeningsrc, maopeninglen)
//MA Closing
maclosing := ma_func(maclosingtyp, maclosingsrc, maclosinglen) * maclosingmul
long1 = long1on == false ? 0 : long1shift == 0 ? 0 : long1lot == 0 ? 0 : maopening == 0 ? 0 : maopening * long1shift
short1 = short1on == false ? 0 : short1shift == 0 ? 0 : short1lot == 0 ? 0 : maopening == 0 ? 0 : maopening * short1shift
//Colors
maopeningcol = maopening == 0 ? na : color.blue
maclosingcol = maclosing == 0 ? na : color.fuchsia
long1col = long1 == 0 ? na : color.green
short1col = short1 == 0 ? na : color.red
//Lines
plot(maopening, offset = OFFS, color = maopeningcol)
plot(maclosing, offset = OFFS, color = maclosingcol)
long1line = long1 == 0 ? close : long1
short1line = short1 == 0 ? close : short1
plot(long1line, offset = OFFS, color = long1col)
plot(short1line, offset = OFFS, color = short1col)
//Lots
lotlong1 = p * long1lot
lotshort1 = p * short1lot
//Entry
if maopening > 0 and maclosing > 0 and truetime
//Long
sum := 0
strategy.entry("L", strategy.long, lotlong1, limit = on_close ? na : long1, when = long1 > 0 and pos <= sum and (on_close ? close <= long1[trade_offset] : true))
sum := lotlong1
//Short
sum := 0
pos := -1 * pos
strategy.entry("S", strategy.short, lotshort1, limit = on_close ? na : short1, when = short1 > 0 and pos <= sum and (on_close ? close >= short1[trade_offset] : true))
sum := lotshort1
strategy.exit("Exit", na, limit = maclosing)
if time > finalTime
strategy.close_all()