संसाधन लोड हो रहा है... लोड करना...

मोमेंटम ब्रेकआउट रिवर्सल ट्रेडिंग रणनीति

लेखक:चाओझांग, दिनांकः 2023-10-27 17:04:48
टैगः

img

अवलोकन

यह रणनीति रुझान की दिशा निर्धारित करने के लिए सरल चलती औसत का उपयोग करती है और रिवर्स ट्रेडिंग को लागू करने के लिए अपट्रेंड में लंबी और डाउनट्रेंड में छोटी जाती है।

रणनीति तर्क

यह रणनीति बाजार की प्रवृत्ति की दिशा निर्धारित करने के लिए भारित चलती औसत (वीडब्ल्यूएमए) का उपयोग करती है। जब वीडब्ल्यूएमए बढ़ रहा है तो यह लंबा हो जाता है और जब वीडब्ल्यूएमए गिर रहा है तो यह छोटा हो जाता है।

विशेष रूप से, यह पहले एक निश्चित अवधि के वीडब्ल्यूएमए की गणना करता है, और फिर यह आंकता है कि क्या वीडब्ल्यूएमए 5 दिनों से अधिक समय तक बढ़ी है। यदि हां, तो यह लंबी स्थिति खोलता है। यदि वीडब्ल्यूएमए 5 दिनों से अधिक समय तक गिर गया है, तो यह छोटी स्थिति खोलता है। समापन की स्थिति तब होती है जब वीडब्ल्यूएमए दिशा 5 दिनों से अधिक समय तक उलट जाती है।

मासिक और वार्षिक रिटर्न की गणना करने के लिए, रणनीति प्रत्येक महीने और वर्ष के लाभ / हानि को रिकॉर्ड करती है। इस रणनीति के रिटर्न की तुलना बाजार के बेंचमार्क के साथ करके, हम सापेक्ष प्रदर्शन को नेत्रहीन देख सकते हैं।

लाभ विश्लेषण

इस रणनीति के लाभों में निम्नलिखित शामिल हैंः

  1. रुझान निर्धारित करने के लिए वीडब्ल्यूएमए का उपयोग करने से बाजार शोर को प्रभावी ढंग से फ़िल्टर किया जा सकता है और प्रमुख रुझानों को कैप्चर किया जा सकता है।

  2. रुझान की पुष्टि के बाद ही स्थिति खोलने से रुझान के उलट से जुड़े जोखिमों से बचा जा सकता है।

  3. रिवर्स ट्रेडिंग अपट्रेंड और डाउनट्रेंड दोनों से लाभ उठा सकती है।

  4. मासिक और वार्षिक रिटर्न दर्ज करने से रणनीति के प्रदर्शन का मूल्यांकन करना आसान हो जाता है।

  5. बाजार बेंचमार्क रिटर्न जोड़ने से रणनीति और बाजार के बीच प्रत्यक्ष तुलना संभव हो जाती है।

जोखिम विश्लेषण

इस रणनीति के कुछ जोखिमः

  1. प्रवृत्ति निर्धारित करने के लिए वीडब्ल्यूएमए का उपयोग करने से प्रवृत्ति की शुरुआत में अवसरों में देरी और चूक हो सकती है।

  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)

अधिक