Bipolare Strategie mit monatlicher Rendite


Erstellungsdatum: 2023-11-06 16:06:55 zuletzt geändert: 2023-11-06 16:06:55
Kopie: 0 Klicks: 613
1
konzentrieren Sie sich auf
1617
Anhänger

Bipolare Strategie mit monatlicher Rendite

Übersicht

Die Strategie nutzt die K-Linie, um eine Trendwende zu ermitteln, und signalisiert damit einen Mehrfachhandel. Wenn die Strategie profitabel ist, wird sie die Gewinne des Monats sperren, um zu verhindern, dass die Rücknahme eine größere Verlust verursacht.

Grundlagen der Strategie

  • Nutzungpivothigh()Undpivotlow()Die Funktion berechnet die Achsenpunkte der K-Linie. An den Achsenpunkten kann man eine Trendwende erkennen.
  • Wenn der Preis über den oberen Pfeilpunkt fällt, wird eine Mehrkopfposition eingelegt. Wenn der Preis unter den unteren Pfeilpunkt fällt, wird eine Kurzkopfposition eingelegt.
  • Zu Beginn des Monats berechnet man die Rendite des Vormonats und speichert sie in einem Array.
  • Zu Beginn jedes Jahres berechnet man die Rendite des Vorjahres und speichert sie in Arrays.
  • Eine Tabelle der Ertragsraten, die die Ertragslage für jeden Monat und jedes Jahr visualisiert.

Analyse der Stärken

  • Mit Hilfe von Hubs kann eine Trendwende ermittelt werden, wodurch ein Teil des Noise-Trading-Signals herausgefiltert werden kann.
  • Ein monatliches Locken der Gewinne verringert den Einfluss von verlustreichen Monaten und polarisiert die Gewinne.
  • Die Gewinntabelle zeigt die Monatsgewinnung auf, so dass man die guten und schlechten Zeiten der Strategie sehen kann.

Risikoanalyse

  • Bei Veränderungen der Pivot-Punkte kann es zu falschen Umkehrungspositionen kommen. Die Parameter können entsprechend optimiert oder die Filterbedingungen erhöht werden.
  • Wenn Sie Ihre Position zu Beginn des Monats zwangsweise platzieren, verpassen Sie die Gewinnchancen für den Rest des Monats. Sie können in Betracht ziehen, nur einen Teil Ihrer Position zu sperren.
  • Die Tabelle kann keine Risikoindikatoren wie maximale Rücknahme anzeigen. Es kann in Betracht gezogen werden, andere Indikatoren hinzuzufügen, die das Risiko der Strategie messen.

Optimierungsrichtung

  • Filterbedingungen können in der Nähe von Hubpunkten hinzugefügt werden, um häufige ungültige Umkehrgeschäfte zu vermeiden.
  • Es ist möglich, nur einen Teil der Positionen zu sperren und nicht die gesamte Position zu platzieren, um die Möglichkeit von Verlusten zu verringern.
  • Die Darstellung von quantifizierten Risikoindikatoren wie Maximal-Rücknahme und Sharpe-Ratio in der Tabelle kann erhöht werden.

Zusammenfassung Die Strategie nutzt die Eckpunkte, um die Trendwende zu ermitteln und die Gewinne am Ende der Woche zu sperren, um das Rücktrittsrisiko effektiv zu kontrollieren. Einige Parameter und die Strategielogik können jedoch weiter optimiert werden, um die Handelssignale genauer und die Risikokontrolle stabiler zu machen. Die intuitive Darstellung der monatlichen Erträge in Form von Tabellen ist auch für die Strategieanalyse von Nutzen.

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