
ڈبل موونگ ایوریج ریورشن اسٹریٹجی (انگریزی: Dual Moving Average Reversion Strategy) ایک عام قلیل مدتی ریورشن ٹریڈنگ حکمت عملی ہے۔ یہ حکمت عملی دو مختلف پیرامیٹرز کی ترتیبات پر مشتمل میڈین لائن کا استعمال کرتی ہے جس سے ٹریڈنگ سگنل جاری ہوتا ہے ، اور جب رجحان میں ردوبدل ہوتا ہے تو منافع حاصل ہوتا ہے۔
اس حکمت عملی میں دو مساوی لائنوں کا استعمال کیا جاتا ہے جو ٹریڈنگ سگنل پیدا کرتی ہیں۔ پہلی مساوی لائن ما اوپننگ کا استعمال رجحان کی سمت کا تعین کرنے کے لئے کیا جاتا ہے ، اور دوسری مساوی لائن میکلوسنگ کا استعمال تجارتی سگنل دینے کے لئے کیا جاتا ہے۔
جب ما اوپننگ بڑھتی ہے تو ، اس کا مطلب ہے کہ یہ فی الحال رجحان میں اضافے کے مرحلے میں ہے۔ جب ما اوپننگ گرتی ہے تو ، اس کا مطلب یہ ہے کہ یہ فی الحال رجحان میں کمی کے مرحلے میں ہے۔ میکلوسیجنگ کو 1 سے زیادہ کے ایک عنصر سے ضرب دیا جاتا ہے ، جس سے یہ زیادہ حساس ہوتا ہے ، اور اس سے قبل الٹ جانے کا اشارہ مل سکتا ہے۔
خاص طور پر ، جب maopening بڑھتا ہے اور maclosing نیچے maopening سے گزرتا ہے تو ، اس کا مطلب یہ ہے کہ رجحان الٹ جاتا ہے ، اس وقت حکمت عملی خالی ہوجاتی ہے۔ جب maopening گرتا ہے اور maclosing maopening سے گزرتا ہے تو ، اس کا مطلب یہ ہے کہ رجحان الٹ جاتا ہے ، اس وقت حکمت عملی زیادہ پوزیشن کھولتی ہے۔
اس حکمت عملی کے پیرامیٹرز میں اوسط لائن کی قسم ، لمبائی ، ڈیٹا کا ماخذ وغیرہ شامل ہیں۔ ان پیرامیٹرز کو ایڈجسٹ کرکے بہتر تجارتی اثر حاصل کیا جاسکتا ہے۔ اس کے علاوہ ، اس حکمت عملی میں کچھ اختیارات بھی شامل ہیں ، جیسے پوزیشن کھولنے کا طریقہ ، اسٹاپ نقصان کا طریقہ وغیرہ ، جو ضرورت کے مطابق ترتیب دیا جاسکتا ہے۔
دوہری مساوی الٹ کی حکمت عملی کے فوائد میں شامل ہیں:
چھوٹی واپسی ، شارٹ لائن ٹریڈنگ کے لئے موزوں ہے۔ دو تیز اوسط لائنوں کا استعمال ، مختصر مدت کے رجحان کے الٹ کو جلدی سے پکڑ سکتا ہے ، چھوٹی واپسی۔
یہ آسان ہے اور اس پر قابو پانا آسان ہے۔ دو یکساں لائنوں کے ساتھ کراسنگ ایک تجارتی سگنل ہے ، یہ بہت آسان اور واضح ہے۔
بہت سارے پیرامیٹرز کو ایڈجسٹ کیا جاسکتا ہے ، بہتر بنایا جاسکتا ہے۔ پیرامیٹرز اور فیکٹرز جن میں 2 اوسط لائنیں شامل ہیں ، بہتر بنانے کے ذریعہ بہترین پیرامیٹرز کا مجموعہ تلاش کیا جاسکتا ہے۔
شیڈولیبل ، خودکار تجارت کے لئے موزوں۔ حکمت عملی کی منطق سادہ اور واضح ہے ، عملدرآمد کی اعلی تعدد ، خودکار تجارت کے لئے پروگرامنگ کے لئے بہت موزوں ہے۔
کنٹرول کرنے والا خطرہ ، جس میں اسٹاپ نقصان کا طریقہ کار ہے۔ متحرک اسٹاپ یا عددی اسٹاپ کو ترتیب دیا جاسکتا ہے ، جس میں ایک ہی نقصان پر قابو پایا جاسکتا ہے۔
اس کے علاوہ، اس میں کچھ خطرات بھی ہیں:
ڈبل مساوی لائن کراسنگ میں تاخیر ہوتی ہے۔ مساوی لائن خود قیمت سے پیچھے رہ جاتی ہے ، اور جب کراسنگ ہوتی ہے تو رجحان کچھ عرصے سے پلٹ سکتا ہے۔
ٹرینڈ ریورس کو برقرار رکھنے کے لئے ضروری نہیں ہے، یہ جلد ہی ایک اور ریورس واپس آ سکتا ہے، اور اس کے نتیجے میں ٹرینڈ ریورس.
انخلا جاری ہے۔ وقت پر روکنے والے نقصانات کو کم کیا جاسکتا ہے ، لیکن لگاتار روکنے والے نقصانات بھی زیادہ انخلا کا سبب بن سکتے ہیں۔
اعداد و شمار کو بہتر بنانے کا خطرہ۔ زیادہ سے زیادہ اصلاح کے پیرامیٹرز ، تاریخی اعداد و شمار میں اچھی کارکردگی کا مظاہرہ کرتے ہیں لیکن ریئل ڈسک میں خراب کارکردگی کا مظاہرہ کرتے ہیں۔
خطرے سے نمٹنے کے لئے اقدامات میں شامل ہیں:
پیرامیٹرز کو بہتر بنانے کے لئے، فوری ردعمل کے لئے اوسط لائن کی ترتیب تلاش کریں.
دوسرے اشارے کے ساتھ مل کر قید سے بچنے کے لئے، جیسے پیمائش کی قیمت اشارے، اتار چڑھاؤ کی شرح اشارے وغیرہ۔
سٹاپ نقصان کی پوزیشن کو ایڈجسٹ کریں تاکہ مسلسل نقصان کی شرح کم ہوجائے.
کثیر گروپ پیرامیٹرز کی اصلاح ٹیسٹ ، پیرامیٹرز کی مضبوطی کا اندازہ لگانا۔
ڈبل مساوی الٹ حکمت عملی کو مندرجہ ذیل پہلوؤں سے بہتر بنایا جاسکتا ہے:
مختلف اقسام کی اوسط لائنوں کی جانچ کریں ، زیادہ ردعمل کے لئے زیادہ حساس اوسط لائنوں کی تلاش کریں۔ جیسے کاما ، زیلیما وغیرہ۔
اوسط لکیری پیرامیٹرز کو بہتر بنائیں اور لمبائی کا بہترین مجموعہ تلاش کریں۔ اوسط لکیری اثر عام طور پر کم دورانیے میں بہتر ہوتا ہے۔
مختلف اعداد و شمار کے ذرائع جیسے اختتامی قیمت، اوسط قیمت، عام قیمت وغیرہ کی جانچ پڑتال کریں.
رجحان فلٹر کو شامل کریں اور غیر موزوں ریورس سگنل سے بچیں۔ ڈونچیئن چینل وغیرہ دستیاب ہیں۔
دوسرے اشارے کے ساتھ مل کر تصدیق کریں ، جیسے مقدار اور قیمت کا اشارے MACD ، OBV وغیرہ۔
خطرے کے انتظام کے طریقہ کار کو بڑھانا ، جیسے موبائل اسٹاپ ، اکاؤنٹ میں زیادہ سے زیادہ نقصان وغیرہ۔
پورٹ فولیو کو بہتر بنانے کے لئے، بہترین اثاثہ تعیناتی کا تناسب تلاش کریں.
پیرامیٹرز کی فٹنس ٹیسٹنگ میں اضافہ کریں تاکہ پیرامیٹرز کو زیادہ بہتر بنانے کے خطرے کا اندازہ لگایا جاسکے۔
ڈبل مساوی لائن الٹ حکمت عملی ایک سادہ عملی شارٹ لائن حکمت عملی ہے جو مارکیٹ میں قلیل مدتی الٹ کو پکڑنے کے لئے موزوں ہے۔ یہ حکمت عملی چھوٹی ہے ، اس پر عمل درآمد آسان ہے ، اور یہ مقدار میں تجارت کے لئے موزوں ہے۔ لیکن اس میں کچھ مسائل بھی ہیں ، جیسے پسماندہ ، قید اور دیگر خطرات۔ اسٹریٹجک افادیت کو بہتر بنانے کے لئے پیرامیٹرز کو بہتر بنانا ، اشارے کی فلٹرنگ میں اضافہ کرنا ، اور خطرے کے کنٹرول کو بہتر بنانا ، ایک مستحکم ، موثر حکمت عملی تیار کرنا ہے۔
/*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()