द्विध्रुवीय मासिक रिटर्न रणनीति

लेखक:चाओझांग, दिनांकः 2023-11-06 16:06:55
टैगः

img

##समीक्षा यह रणनीति रुझान उलटने की पहचान करने और तदनुसार लंबी/छोटी स्थिति लेने के लिए पिवोट पॉइंट्स का उपयोग करती है। यह घाटे की अवधि के दौरान बड़े ड्रॉडाउन को रोकने के लिए मासिक लाभ में लॉक करती है।

यह कैसे काम करता है

  • उपयोगpivothigh()औरpivotlow()पिवोट पॉइंट्स की गणना करने के लिए, जो ट्रेंड रिवर्स को इंगित करते हैं।
  • जब कीमत पिवोट हाई से ऊपर टूटती है तब लंबी जाती है. जब कीमत पिवोट लो से नीचे टूटती है तब छोटी जाती है.
  • प्रत्येक महीने की शुरुआत में मासिक रिटर्न की गणना करता है और सरणी में सहेजता है.
  • प्रत्येक वर्ष की शुरुआत में वार्षिक वापसी की गणना करता है और सरणी में सहेजता है.
  • मासिक और वार्षिक प्रदर्शन के सहज दृश्य के लिए रिटर्न की तालिका तैयार करता है।

##लाभ विश्लेषण

  • पिवोट पॉइंट्स कुछ झूठे रिवर्स सिग्नल को फ़िल्टर करते हैं।
  • मासिक मुनाफे को लॉक करने से महीने के नुकसान का असर कम होता है - द्विध्रुवीय रिटर्न।
  • रिटर्न तालिका प्रदर्शन के रुझानों को स्पष्ट रूप से दिखाती है।

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

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

##अनुकूलन दिशाएं

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

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


/*backtest
start: 2022-11-05 00:00:00
end: 2023-03-23 05:20:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Monthly Returns in PineScript Strategies", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 25, calc_on_every_tick = true, commission_type = strategy.commission.percent, commission_value = 0.1)

// Inputs 
leftBars  = input(2)
rightBars = input(1)
prec      = input(2, title = "Return Precision")

// Pivot Points 
swh = pivothigh(leftBars, rightBars)
swl = pivotlow(leftBars, rightBars)

hprice = 0.0
hprice := not na(swh) ? swh : hprice[1]

lprice = 0.0
lprice := not na(swl) ? swl : lprice[1]

le = false
le := not na(swh) ? true : (le[1] and high > hprice ? false : le[1])

se = false
se := not na(swl) ? true : (se[1] and low < lprice ? false : se[1])

if (le)
	strategy.entry("PivRevLE", strategy.long, comment="PivRevLE", stop=hprice + syminfo.mintick)

if (se)
	strategy.entry("PivRevSE", strategy.short, comment="PivRevSE", stop=lprice - syminfo.mintick)

plot(hprice, color = color.green, linewidth = 2)
plot(lprice, color = color.red,   linewidth = 2)

///////////////////
// 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

cur_month_pnl = 0.0
cur_year_pnl  = 0.0

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

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

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

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

if (not na(cur_month_pnl[1]) and (new_month or barstate.islast))
    array.push(month_pnl , cur_month_pnl[1])
    array.push(month_time, time[1])

if (not na(cur_year_pnl[1]) and (new_year or barstate.islast))
    array.push(year_pnl , cur_year_pnl[1])
    array.push(year_time, time[1])

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

if (barstate.islast)
    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 = array.get(year_pnl, yi) > 0 ? color.new(color.green, transp = 50) : color.new(color.red, transp = 50)
        table.cell(monthly_table, 13, yi + 1, tostring(round(array.get(year_pnl, yi) * 100, prec)), 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 = array.get(month_pnl, mi) > 0 ? color.new(color.green, transp = 70) : color.new(color.red, transp = 70)
        
        table.cell(monthly_table, m_col, m_row, tostring(round(array.get(month_pnl, mi) * 100, prec)), bgcolor = m_color)

अधिक