مومنٹم بریک آؤٹ ریورس ٹریڈنگ حکمت عملی

مصنف:چاؤ ژانگ، تاریخ: 2023-10-27 17:04:48
ٹیگز:

img

جائزہ

یہ حکمت عملی رجحان کی سمت کا تعین کرنے کے لئے سادہ چلتی اوسط کا استعمال کرتی ہے اور ریورس ٹریڈنگ کو لاگو کرنے کے لئے ایک اپ ٹرینڈ میں طویل اور ایک ڈاؤن ٹرینڈ میں مختصر جاتا ہے.

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

یہ حکمت عملی مارکیٹ کے رجحان کی سمت کا تعین کرنے کے لئے وزن شدہ چلتی اوسط (وی ڈبلیو ایم اے) کا استعمال کرتی ہے۔ جب وی ڈبلیو ایم اے بڑھ رہا ہے تو یہ طویل ہوجاتا ہے اور جب وی ڈبلیو ایم اے گر رہا ہے تو مختصر ہوجاتا ہے۔

خاص طور پر ، یہ پہلے ایک خاص مدت کے VWMA کا حساب لگاتا ہے ، اور پھر فیصلہ کرتا ہے کہ آیا VWMA 5 دن سے زیادہ بڑھ گیا ہے۔ اگر ایسا ہے تو ، یہ ایک طویل پوزیشن کھولتا ہے۔ اگر VWMA 5 دن سے زیادہ گر گیا ہے تو ، یہ ایک مختصر پوزیشن کھولتا ہے۔ بندش کی شرط یہ ہے کہ جب VWMA کی سمت 5 دن سے زیادہ کے لئے الٹ جاتی ہے۔

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

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

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

  1. رجحان کا تعین کرنے کے لئے وی ڈبلیو ایم اے کا استعمال مارکیٹ شور کو مؤثر طریقے سے فلٹر کرسکتا ہے اور اہم رجحانات کو پکڑ سکتا ہے۔

  2. رجحان کی تصدیق کے بعد ہی پوزیشن کھولنے سے رجحان کے الٹ جانے سے متعلق خطرات سے بچا جاسکتا ہے۔

  3. ریورس ٹریڈنگ اپ ٹرینڈ اور ڈاؤن ٹرینڈ دونوں سے فائدہ اٹھا سکتی ہے۔

  4. ماہانہ اور سالانہ واپسی کی ریکارڈنگ حکمت عملی کی کارکردگی کا اندازہ لگانے میں آسانی پیدا کرتی ہے۔

  5. مارکیٹ کے ریفرنس ریٹرن کو شامل کرنے سے حکمت عملی اور مارکیٹ کے درمیان براہ راست موازنہ ممکن ہوتا ہے۔

خطرے کا تجزیہ

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

  1. رجحان کا تعین کرنے کے لئے VWMA کا استعمال کرتے ہوئے رجحان کے آغاز میں تاخیر اور مواقع کو یاد کر سکتا ہے.

  2. صرف تصدیق کے بعد پوزیشن کھولنے سے کچھ حرکتیں نظر انداز ہوسکتی ہیں۔

  3. ریورس ٹریڈنگ کو سٹاپ نقصان مقرر کرنے کی ضرورت ہے، ورنہ نقصان بڑھا سکتا ہے.

  4. مارکیٹ کی اہم اتار چڑھاؤ سٹاپ نقصان کو متحرک کر سکتی ہے اور پورے رجحان کو برقرار رکھنے میں قاصر ہوسکتی ہے۔

  5. رجحان کی تبدیلی کا فیصلہ غلط ہوسکتا ہے، نقصانات کو بڑھانے کے لۓ.

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

کچھ پہلو جو حکمت عملی کو بہتر بنا سکتے ہیں:

  1. رجحان کے تعین کو بہتر بنانے کے لئے VWMA مدت پیرامیٹر کو بہتر بنائیں.

  2. رجحان کی تصدیق کے لئے دنوں کی تعداد کو ایڈجسٹ کریں، داخلہ اور باہر نکلنے کے وقت کو بہتر بنائیں.

  3. ایک ہی تجارت کے نقصان کو کنٹرول کرنے کے لئے سٹاپ نقصان کی حکمت عملی شامل کریں.

  4. معاوضے میں تبدیلی کا تعین کرنے کے لیے دیگر اشارے شامل کریں، جس سے یقین میں اضافہ ہوگا۔

  5. مارکیٹ کی حالت کی بنیاد پر پوزیشن سائزنگ کو بہتر بنائیں.

  6. تجارتی لاگت پر غور کریں، کم سے کم منافع کا ہدف مقرر کریں.

خلاصہ

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


/*backtest
start: 2023-01-01 00:00:00
end: 2023-10-26 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title="Monthly Returns in Strategies with Market Benchmark", shorttitle="Monthly P&L With Market", initial_capital= 1000, overlay=true,default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, commission_value = 0.1)
maLength= input(400)

wma= vwma(hl2,maLength)
uptrend= rising(wma, 5)
downtrend= falling(wma,5)

plot(wma)

if uptrend
    strategy.entry("Buy", strategy.long)
else
    strategy.close("Buy")//

///////////////////
// MONTHLY TABLE //

new_month = month(time) != month(time[1])
new_year  = year(time)  != year(time[1])

eq = strategy.equity

bar_pnl = eq / eq[1] - 1
bar_bh = (close-close[1])/close[1]

cur_month_pnl = 0.0
cur_year_pnl  = 0.0
cur_month_bh = 0.0
cur_year_bh  = 0.0

// Current Monthly P&L
cur_month_pnl := new_month ? 0.0 : 
                 (1 + cur_month_pnl[1]) * (1 + bar_pnl) - 1 
cur_month_bh := new_month ? 0.0 : 
                 (1 + cur_month_bh[1]) * (1 + bar_bh) - 1

// Current Yearly P&L
cur_year_pnl := new_year ? 0.0 : 
                 (1 + cur_year_pnl[1]) * (1 + bar_pnl) - 1
cur_year_bh := new_year ? 0.0 : 
                 (1 + cur_year_bh[1]) * (1 + bar_bh) - 1

// Arrays to store Yearly and Monthly P&Ls
var month_pnl  = array.new_float(0)
var month_time = array.new_int(0)
var month_bh  = array.new_float(0)

var year_pnl  = array.new_float(0)
var year_time = array.new_int(0)
var year_bh  = array.new_float(0)

last_computed = false

if (not na(cur_month_pnl[1]) and (new_month or time_close + (time_close - time_close[1]) > timenow or barstate.islastconfirmedhistory))
    if (last_computed[1])
        array.pop(month_pnl)
        array.pop(month_time)
        
    array.push(month_pnl , cur_month_pnl[1])
    array.push(month_time, time[1])
    array.push(month_bh , cur_month_bh[1])

if (not na(cur_year_pnl[1]) and (new_year or time_close + (time_close - time_close[1]) > timenow or barstate.islastconfirmedhistory))
    if (last_computed[1])
        array.pop(year_pnl)
        array.pop(year_time)
        
    array.push(year_pnl , cur_year_pnl[1])
    array.push(year_time, time[1])
    array.push(year_bh , cur_year_bh[1])

last_computed := (time_close + (time_close - time_close[1]) > timenow or barstate.islastconfirmedhistory) ? true : nz(last_computed[1])

// Monthly P&L Table    
var monthly_table = table(na)

getCellColor(pnl, bh)  => 
    if pnl > 0
        if bh < 0 or pnl > 2 * bh
            color.new(color.green, transp = 20)
        else if pnl > bh
            color.new(color.green, transp = 50)
        else
            color.new(color.green, transp = 80)
    else
        if bh > 0
            color.new(color.red, transp = 20)
        else if pnl < bh
            color.new(color.red, transp = 50)
        else
            color.new(color.red, transp = 80)

if last_computed
    monthly_table := table.new(position.bottom_right, columns = 14, rows = array.size(year_pnl) + 1, border_width = 1)

    table.cell(monthly_table, 0,  0, "",     bgcolor = #cccccc)
    table.cell(monthly_table, 1,  0, "Jan",  bgcolor = #cccccc)
    table.cell(monthly_table, 2,  0, "Feb",  bgcolor = #cccccc)
    table.cell(monthly_table, 3,  0, "Mar",  bgcolor = #cccccc)
    table.cell(monthly_table, 4,  0, "Apr",  bgcolor = #cccccc)
    table.cell(monthly_table, 5,  0, "May",  bgcolor = #cccccc)
    table.cell(monthly_table, 6,  0, "Jun",  bgcolor = #cccccc)
    table.cell(monthly_table, 7,  0, "Jul",  bgcolor = #cccccc)
    table.cell(monthly_table, 8,  0, "Aug",  bgcolor = #cccccc)
    table.cell(monthly_table, 9,  0, "Sep",  bgcolor = #cccccc)
    table.cell(monthly_table, 10, 0, "Oct",  bgcolor = #cccccc)
    table.cell(monthly_table, 11, 0, "Nov",  bgcolor = #cccccc)
    table.cell(monthly_table, 12, 0, "Dec",  bgcolor = #cccccc)
    table.cell(monthly_table, 13, 0, "Year", bgcolor = #999999)


    for yi = 0 to array.size(year_pnl) - 1
        table.cell(monthly_table, 0,  yi + 1, tostring(year(array.get(year_time, yi))), bgcolor = #cccccc)
        
        y_color = getCellColor(array.get(year_pnl, yi), array.get(year_bh, yi))
        table.cell(monthly_table, 13, yi + 1, tostring(round(array.get(year_pnl, yi) * 100)) + " (" + tostring(round(array.get(year_bh, yi) * 100)) + ")", bgcolor = y_color)
        
    for mi = 0 to array.size(month_time) - 1
        m_row   = year(array.get(month_time, mi))  - year(array.get(year_time, 0)) + 1
        m_col   = month(array.get(month_time, mi)) 
        m_color = getCellColor(array.get(month_pnl, mi), array.get(month_bh, mi))
        
        table.cell(monthly_table, m_col, m_row, tostring(round(array.get(month_pnl, mi) * 100)) + " (" + tostring(round(array.get(month_bh, mi) * 100)) +")", bgcolor = m_color)

مزید