دو طرفہ موونگ ایوریج ریگریشن ٹریڈنگ حکمت عملی


تخلیق کی تاریخ: 2024-01-15 12:15:14 آخر میں ترمیم کریں: 2024-01-15 12:15:14
کاپی: 0 کلکس کی تعداد: 393
1
پر توجہ دیں
1237
پیروکار

دو طرفہ موونگ ایوریج ریگریشن ٹریڈنگ حکمت عملی

جائزہ

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

حکمت عملی کا اصول

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

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

طاقت کا تجزیہ

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

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

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

خطرے کا تجزیہ

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

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