دو طرفہ متحرک اوسط ریورس ٹریڈنگ حکمت عملی قیمت کی اوسط ریورس کے نظریے پر مبنی ایک مقداری تجارتی حکمت عملی ہے۔ یہ حکمت عملی متعدد متحرک اوسطوں کو ترتیب دے کر قیمتوں میں الٹ پھیر کے مواقع کو حاصل کرتی ہے اور جب قیمت متحرک اوسط سے نمایاں طور پر انحراف کرتی ہے تو مارکیٹ میں داخل ہوتی ہے ، اور جب یہ واپس لوٹتی ہے تو باہر نکل جاتی ہے۔
اس حکمت عملی کا بنیادی خیال قیمتوں کی اوسط ریورسشن ہے ، جس سے پتہ چلتا ہے کہ قیمتیں اوسط قدر کے گرد اتار چڑھاؤ کرتی ہیں ، اور جب وہ اوسط سے بہت دور ہوجاتی ہیں تو ان کی واپسی کا زیادہ امکان ہوتا ہے۔ خاص طور پر ، اس حکمت عملی میں حرکت پذیر اوسط کے تین گروپ قائم کیے جاتے ہیں: انٹری حرکت پذیر اوسط ، ایگزٹ حرکت پذیر اوسط ، اور اسٹاپ نقصان حرکت پذیر اوسط۔ جب قیمتیں انٹری حرکت پذیر اوسط کو مارتی ہیں تو یہ مساوی لمبی یا مختصر پوزیشنیں کھولے گی؛ جب قیمتیں ایگزٹ حرکت پذیر اوسط کو مارتی ہیں تو پوزیشنیں بند کردیں گی؛ اور اس صورت میں اسٹاپ نقصان حرکت پذیر اوسط کے ساتھ نقصانات کو کنٹرول کریں گے جب قیمتیں واپس جانے کے بغیر رجحان جاری رکھتی ہیں۔
کوڈ منطق کے نقطہ نظر سے ، دو انٹری چلتی اوسط ہیں - لمبی اور مختصر - جس میں بالترتیب تیز رفتار اور سست رفتار اوسط شامل ہیں۔ ان کے اور قیمت کے درمیان انحراف پوزیشن کا سائز طے کرتا ہے۔ اس کے علاوہ ، آؤٹ پٹ چلتی اوسط ایک علیحدہ چلتی اوسط ہے جو پوزیشنوں کو بند کرنے کا اشارہ کرتی ہے۔ جب قیمتیں اس لائن کو مارتی ہیں تو ، موجودہ پوزیشنیں برابر ہوجائیں گی۔
دو طرفہ حرکت پذیر اوسط ریورسشن کی حکمت عملی کے اہم فوائد میں شامل ہیں:
یہ حکمت عملی کم اتار چڑھاؤ والے آلات کے ساتھ اچھی طرح سے کام کرتی ہے جن کی قیمتوں میں نسبتا small چھوٹی اتار چڑھاؤ ہوتی ہے ، خاص طور پر جب حد سے وابستہ سائیکلوں میں داخل ہوتے ہیں۔ یہ عارضی قیمتوں میں ردوبدل سے مواقع کو مؤثر طریقے سے حاصل کرسکتا ہے۔ دریں اثنا ، رسک کنٹرول کے اقدامات کافی جامع ہیں ، نقصانات کو معقول حدود میں محدود کرتے ہیں یہاں تک کہ اگر قیمتیں واپس نہیں آتی ہیں۔
اس حکمت عملی سے کچھ خطرات بھی وابستہ ہیں:
مندرجہ بالا خطرات کو کم کرنے کے کچھ طریقے یہ ہیں:
اس حکمت عملی کو مزید بہتر بنانے کے لئے بھی کافی گنجائش موجود ہے:
دو طرفہ حرکت پذیر اوسط ریورس ٹریڈنگ حکمت عملی کا مقصد اس کی حرکت پذیر اوسط کی سطح سے نمایاں انحراف کے بعد قیمتوں میں ردوبدل سے فائدہ اٹھانا ہے۔ مناسب رسک کنٹرول اقدامات کے ساتھ ، یہ پیرامیٹر ٹوننگ کے ذریعے مستقل منافع حاصل کرسکتا ہے۔ اگرچہ رجحانات کا پیچھا کرنے اور زیادہ اتار چڑھاؤ جیسے خطرات اب بھی موجود ہیں ، لیکن ان کو انٹری منطق کو بہتر بنانے ، پوزیشن کے سائز کو کم کرنے اور بہت کچھ کے ذریعے حل کیا جاسکتا ہے۔ یہ سمجھنے میں آسان حکمت عملی مقداری تاجروں کی طرف سے مزید تحقیق اور اصلاح کے مستحق ہے۔
/*backtest start: 2023-12-15 00:00:00 end: 2024-01-14 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 = 30, pyramiding = 1, commission_value = 0.1, 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 Long" maopeningtyp_l = 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_l = input.source(ohlc4, title = "", inline=info_opening, group=info_opening) maopeninglen_l = input.int(3, minval = 1, title = "", inline=info_opening, group=info_opening) 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") info_opening_s = "MA Opening Short" maopeningtyp_s = input.string("SMA", title="Type", options=["SMA", "EMA", "TEMA", "DEMA", "ZLEMA", "WMA", "Hma", "Thma", "Ehma", "H", "L", "DMA"], title = "", inline=info_opening_s, group=info_opening_s) maopeningsrc_s = input.source(ohlc4, title = "", inline=info_opening_s, group=info_opening_s) maopeninglen_s = input.int(3, minval = 1, title = "", inline=info_opening_s, group=info_opening_s) 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") //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) 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_l = 0.0 maopening_s = 0.0 maclosing = 0.0 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_l := ma_func(maopeningtyp_l, maopeningsrc_l, maopeninglen_l) maopening_s := ma_func(maopeningtyp_s, maopeningsrc_s, maopeninglen_s) //MA Closing maclosing := ma_func(maclosingtyp, maclosingsrc, maclosinglen) * maclosingmul long1 = long1on == false ? 0 : long1shift == 0 ? 0 : long1lot == 0 ? 0 : maopening_l == 0 ? 0 : maopening_l * long1shift short1 = short1on == false ? 0 : short1shift == 0 ? 0 : short1lot == 0 ? 0 : maopening_s == 0 ? 0 : maopening_s * short1shift //Colors long1col = long1 == 0 ? na : color.green short1col = short1 == 0 ? na : color.red //Lines // plot(maopening_l, offset = OFFS, color = color.new(color.green, 50)) // plot(maopening_s, offset = OFFS, color = color.new(color.red, 50)) plot(maclosing, offset = OFFS, color = color.fuchsia) 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 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()