Stratégie bipolaire à rendement mensuel


Date de création: 2023-11-06 16:06:55 Dernière modification: 2023-11-06 16:06:55
Copier: 0 Nombre de clics: 347
1
Suivre
1141
Abonnés

Stratégie bipolaire à rendement mensuel

Résumé

La stratégie utilise les points cardinaux de la ligne K pour déterminer le renversement de tendance et pour signaler des transactions à plusieurs têtes. En cas de gain, la stratégie se bloque sur les gains réalisés ce mois-là pour éviter de causer de plus grandes pertes pendant la période de retrait.

Les principes de la stratégie

  • Utilisationpivothigh()etpivotlow()La fonction calcule le pivot de la ligne K. Le pivot permet de déterminer le renversement de tendance.
  • Lorsque le prix dépasse le sommet de l’axe supérieur, il est placé en position plus élevée. Lorsque le prix dépasse le sommet de l’axe inférieur, il est placé en position plus basse.
  • Au début de chaque mois, le taux de rendement du mois précédent est calculé et sauvegardé dans un tableau.
  • Au début de chaque année, le taux de rendement de l’année précédente est calculé et enregistré dans un tableau.
  • Vous pouvez également créer un tableau de rendement pour visualiser les rendements mensuels et annuels.

Analyse des avantages

  • Les pivots permettent de détecter une inversion de tendance et de filtrer certains signaux de trading bruyants.
  • Le verrouillage des bénéfices sur une base mensuelle peut réduire l’impact des mois de pertes et de la polarisation des bénéfices.
  • Le tableau des bénéfices est un aperçu des bénéfices mensuels, permettant de voir clairement les hauts et les bas de la stratégie.

Analyse des risques

  • Des changements dans les pivots peuvent entraîner une erreur de rétrogradation. Les paramètres peuvent être optimisés ou les conditions de filtrage peuvent être ajoutées.
  • En effet, si vous êtes obligé de fermer votre position au début du mois, vous risquez de rater des opportunités de profit pour le reste du mois.
  • Les tableaux ne peuvent pas afficher les indicateurs de risque tels que le retrait maximal. Il est possible d’envisager d’ajouter d’autres pour mesurer le risque stratégique.

Optimiser la direction

  • Des conditions de filtrage peuvent être ajoutées à proximité des pôles afin d’éviter de fréquentes inversions inefficaces.
  • Il est possible de verrouiller une partie de la position plutôt que la totalité, ce qui réduit le risque de manquements.
  • Il est possible d’ajouter des indicateurs de risque quantifiables tels que le maximum de rétractation, le Sharpe ratio, etc. dans le tableau.

Résumé

La stratégie utilise des pivots pour déterminer le renversement de la tendance et pour bloquer les gains à la fin de l’année, ce qui permet de contrôler efficacement le risque de retrait. Cependant, certains paramètres et la logique de la stratégie peuvent encore être optimisés pour rendre les signaux de trading plus précis et les contrôles de risque plus stables.

Code source de la stratégie
/*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)