دو طرفہ حرکت پذیر اوسط ریورس ٹریڈنگ کی حکمت عملی

مصنف:چاؤ ژانگ، تاریخ: 2024-01-15 12:15:14
ٹیگز:

img

جائزہ

دو طرفہ متحرک اوسط ریورس ٹریڈنگ حکمت عملی قیمت کی اوسط ریورس کے نظریے پر مبنی ایک مقداری تجارتی حکمت عملی ہے۔ یہ حکمت عملی متعدد متحرک اوسطوں کو ترتیب دے کر قیمتوں میں الٹ پھیر کے مواقع کو حاصل کرتی ہے اور جب قیمت متحرک اوسط سے نمایاں طور پر انحراف کرتی ہے تو مارکیٹ میں داخل ہوتی ہے ، اور جب یہ واپس لوٹتی ہے تو باہر نکل جاتی ہے۔

حکمت عملی منطق

اس حکمت عملی کا بنیادی خیال قیمتوں کی اوسط ریورسشن ہے ، جس سے پتہ چلتا ہے کہ قیمتیں اوسط قدر کے گرد اتار چڑھاؤ کرتی ہیں ، اور جب وہ اوسط سے بہت دور ہوجاتی ہیں تو ان کی واپسی کا زیادہ امکان ہوتا ہے۔ خاص طور پر ، اس حکمت عملی میں حرکت پذیر اوسط کے تین گروپ قائم کیے جاتے ہیں: انٹری حرکت پذیر اوسط ، ایگزٹ حرکت پذیر اوسط ، اور اسٹاپ نقصان حرکت پذیر اوسط۔ جب قیمتیں انٹری حرکت پذیر اوسط کو مارتی ہیں تو یہ مساوی لمبی یا مختصر پوزیشنیں کھولے گی؛ جب قیمتیں ایگزٹ حرکت پذیر اوسط کو مارتی ہیں تو پوزیشنیں بند کردیں گی؛ اور اس صورت میں اسٹاپ نقصان حرکت پذیر اوسط کے ساتھ نقصانات کو کنٹرول کریں گے جب قیمتیں واپس جانے کے بغیر رجحان جاری رکھتی ہیں۔

کوڈ منطق کے نقطہ نظر سے ، دو انٹری چلتی اوسط ہیں - لمبی اور مختصر - جس میں بالترتیب تیز رفتار اور سست رفتار اوسط شامل ہیں۔ ان کے اور قیمت کے درمیان انحراف پوزیشن کا سائز طے کرتا ہے۔ اس کے علاوہ ، آؤٹ پٹ چلتی اوسط ایک علیحدہ چلتی اوسط ہے جو پوزیشنوں کو بند کرنے کا اشارہ کرتی ہے۔ جب قیمتیں اس لائن کو مارتی ہیں تو ، موجودہ پوزیشنیں برابر ہوجائیں گی۔

فوائد کا تجزیہ

دو طرفہ حرکت پذیر اوسط ریورسشن کی حکمت عملی کے اہم فوائد میں شامل ہیں:

  1. قیمتوں میں ردوبدل کا پتہ لگانا، جو رینج سے منسلک مارکیٹوں کے لئے موزوں ہے
  2. اسٹاپ نقصانات کے ذریعے خطرات پر قابو پانا
  3. موافقت کے لئے انتہائی حسب ضرورت پیرامیٹرز
  4. سمجھنے کے لئے آسان، پیرامیٹر کی اصلاح کے لئے آسان

یہ حکمت عملی کم اتار چڑھاؤ والے آلات کے ساتھ اچھی طرح سے کام کرتی ہے جن کی قیمتوں میں نسبتا small چھوٹی اتار چڑھاؤ ہوتی ہے ، خاص طور پر جب حد سے وابستہ سائیکلوں میں داخل ہوتے ہیں۔ یہ عارضی قیمتوں میں ردوبدل سے مواقع کو مؤثر طریقے سے حاصل کرسکتا ہے۔ دریں اثنا ، رسک کنٹرول کے اقدامات کافی جامع ہیں ، نقصانات کو معقول حدود میں محدود کرتے ہیں یہاں تک کہ اگر قیمتیں واپس نہیں آتی ہیں۔

خطرے کا تجزیہ

اس حکمت عملی سے کچھ خطرات بھی وابستہ ہیں:

  1. رجحانات کا پیچھا کرنے کا خطرہ۔ مسلسل نئی پوزیشنیں مضبوط رجحانات کے دوران معاوضے کا باعث بن سکتی ہیں۔
  2. قیمتوں میں بہت زیادہ اتار چڑھاؤ کا خطرہ۔ سٹاپ نقصانات میں اضافہ ہو سکتا ہے۔
  3. پیرامیٹر کی اصلاح کا خطرہ۔ پیرامیٹر کی نامناسب ترتیبات نمایاں طور پر کم کارکردگی کا باعث بن سکتی ہیں۔

مندرجہ بالا خطرات کو کم کرنے کے کچھ طریقے یہ ہیں:

  1. اوور ٹریڈنگ سے بچنے کے لئے نئے اندراجات کو محدود کرنا
  2. صفائی کے خطرات کو محدود کرنے کے لئے پوزیشن کے سائز کو کم کرنا
  3. پیرامیٹرز کو بہتر بنانا جیسے چلتی اوسط ادوار اور باہر نکلنے والی لائن ضرب

اصلاح کی ہدایات

اس حکمت عملی کو مزید بہتر بنانے کے لئے بھی کافی گنجائش موجود ہے:

  1. رجحان کا پیچھا کرنے سے بچنے کے لئے اضافی انٹری منطق شامل کریں
  2. اتار چڑھاؤ کے مقابلے میں موقف کی موافقت پذیر سائزنگ کو شامل کریں
  3. مختلف اقسام کے چلتے ہوئے اوسط کے ساتھ تجربہ
  4. خودکار پیرامیٹر کی اصلاح کے لئے مشین لرننگ
  5. زیادہ متحرک رسک مینجمنٹ کے لئے ٹریلنگ اسٹاپ کو شامل کریں

نتیجہ

دو طرفہ حرکت پذیر اوسط ریورس ٹریڈنگ حکمت عملی کا مقصد اس کی حرکت پذیر اوسط کی سطح سے نمایاں انحراف کے بعد قیمتوں میں ردوبدل سے فائدہ اٹھانا ہے۔ مناسب رسک کنٹرول اقدامات کے ساتھ ، یہ پیرامیٹر ٹوننگ کے ذریعے مستقل منافع حاصل کرسکتا ہے۔ اگرچہ رجحانات کا پیچھا کرنے اور زیادہ اتار چڑھاؤ جیسے خطرات اب بھی موجود ہیں ، لیکن ان کو انٹری منطق کو بہتر بنانے ، پوزیشن کے سائز کو کم کرنے اور بہت کچھ کے ذریعے حل کیا جاسکتا ہے۔ یہ سمجھنے میں آسان حکمت عملی مقداری تاجروں کی طرف سے مزید تحقیق اور اصلاح کے مستحق ہے۔


/*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()

مزید