Stratégie quantitative basée sur l'indicateur de super tendance et le trading sur courbe d'équité


Date de création: 2024-01-15 11:41:53 Dernière modification: 2024-01-15 11:41:53
Copier: 1 Nombre de clics: 601
1
Suivre
1617
Abonnés

Stratégie quantitative basée sur l’indicateur de super tendance et le trading sur courbe d’équité

Aperçu

L’idée centrale de cette stratégie est de combiner le cours de l’indicateur hypertrend avec le cours de la courbe nette. Lorsque l’indicateur hypertrend émet un signal d’achat ou de vente, nous n’exécutons pas directement la transaction, mais nous jugeons si la courbe nette actuelle est inférieure à sa moyenne mobile.

Principe de stratégie

Cette stratégie est principalement composée de deux parties:

  1. Indicateur de dépassement de la tendance
  2. Traite de la courbe de valeur nette

La formule de calcul de l’indicateur de tendance est la suivante:

La mise en route = le prix à la source - ATR multiplié par ATR La piste inférieure = prix d’origine + ATR multiplié par ATR

L’ATR représente l’amplitude réelle moyenne. L’indicateur de tendance supérieure utilise l’ATR pour régler les hauts et les bas. Il sert de signal de vente lorsque le prix est en hausse et de signal d’achat lorsque le prix est en baisse.

L’idée du trading de la courbe de valeur nette est que nous prenons une moyenne mobile de la courbe de valeur nette de la stratégie, suspendons la négociation de la stratégie en cours lorsque la courbe de valeur nette est inférieure à la courbe de valeur nette, et reprenons la négociation après que la courbe de valeur nette est remontée au-dessus de la courbe de valeur nette.

Cette stratégie combine les deux, et après que l’indicateur de tendance supérieure a généré un signal de négociation, nous ne négocions pas directement, mais nous jugeons si la courbe de valeur nette actuelle est supérieure à la moyenne mobile. Seulement si les deux conditions sont réunies, nous ouvrons une position. Cela permet d’éviter efficacement le risque de l’indicateur de tendance supérieure lui-même et de prévenir les pertes excessives.

Analyse des avantages

Les principaux avantages de cette stratégie sont les suivants:

  1. Les indicateurs de tendance supérieure ne permettent pas d’éviter efficacement les pertes, et les transactions sur la courbe de valeur nette peuvent compenser ce manque.

  2. Lorsque les transactions sont défavorables, il est possible de suspendre les transactions de la stratégie pour éviter de perdre trop de choses. Il est possible d’attendre la reprise du marché pour le rouvrir.

  3. Les positions peuvent être gérées automatiquement, sans intervention humaine. La courbe de valeur nette est automatiquement suspendue lorsque la courbe est inférieure à la moyenne mobile et automatiquement ouverte lorsque la courbe est supérieure.

Analyse des risques

Cette stratégie comporte aussi des risques:

  1. Une mauvaise configuration des paramètres peut entraîner l’inefficacité de la négociation de la courbe de valeur nette. Une période de moyenne mobile appropriée doit être choisie.

  2. Il est possible de ne pas être en mesure d’ajuster sa position en temps opportun lorsque la tendance du marché change. Cela peut entraîner des pertes.

  3. Il est possible de rater de meilleures opportunités d’entrée en attendant que la courbe de la valeur nette remonte.

La réponse:

  1. Optimiser les paramètres et choisir la meilleure période de moyenne mobile.

  2. Il est important de prendre en compte les tendances des autres indicateurs et d’ajuster ses positions en temps opportun.

  3. Réduire le temps de suspension des transactions de manière appropriée pour réduire la probabilité de manquer l’entrée

Direction d’optimisation

Cette stratégie peut être optimisée dans les domaines suivants:

  1. Testez différentes combinaisons de paramètres pour trouver le cycle et le multiplicateur ATR optimaux.

  2. Essayez d’autres types de moyennes mobiles, comme les moyennes mobiles indicielles, les moyennes mobiles Hull, etc.

  3. Ajouter d’autres indicateurs pour juger de la tendance du marché et ajuster la position en temps opportun lorsque la tendance change.

  4. Optimiser les cycles des moyennes mobiles pour trouver le point d’équilibre optimal. Les cycles trop longs sont des occasions manquées, les cycles trop courts sont fréquemment suspendus.

  5. Optimiser les conditions de suspension de la transaction, par exemple en définissant un stop loss, qui ne s’arrête qu’une fois que les pertes ont atteint un certain niveau.

Résumer

Cette stratégie combine habilement l’indicateur hypertrend et la courbe nette. Elle conserve les avantages de la courbe hypertrend et maintient le contrôle efficace des risques par la courbe nette. Les résultats des tests ont montré que, dans la plupart des cas, l’application de la courbe nette réduit le niveau de rentabilité.

Code source de la stratégie
/*backtest
start: 2023-01-14 00:00:00
end: 2024-01-14 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy('Supertrend & Equity curve with EMA', overlay=false, format=format.price, precision=2, initial_capital=100000)

eqlen = input.int(25, "EQ EMA len", group = "New Equity Curve Settings")
shEQandMA = input.bool(true, "Show Original Equity Curve and MA")
shEQfilt = input.bool(true, "Show Filtered Equity Curve by MA")

Periods = input(title='ATR Period', defval=10, group = "SuperTrend Settings")
src = input(hl2, title='Source', group = "SuperTrend Settings")
Multiplier = input.float(title='ATR Multiplier', step=0.1, defval=3.0, group = "SuperTrend Settings")
changeATR = input(title='Change ATR Calculation Method ?', defval=true, group = "SuperTrend Settings")

//SuperTrend Code
atr2 = ta.sma(ta.tr, Periods)
atr = changeATR ? ta.atr(Periods) : atr2
up = src - Multiplier * atr
up1 = nz(up[1], up)
up := close[1] > up1 ? math.max(up, up1) : up
dn = src + Multiplier * atr
dn1 = nz(dn[1], dn)
dn := close[1] < dn1 ? math.min(dn, dn1) : dn
trend = 1
trend := nz(trend[1], trend)
trend := trend == -1 and close > dn1 ? 1 : trend == 1 and close < up1 ? -1 : trend

// Strategy main code
buySignal = trend == 1 and trend[1] == -1
sellSignal = trend == -1 and trend[1] == 1
if buySignal
    strategy.entry('Long', strategy.long)
if sellSignal
    strategy.entry('Short', strategy.short)



//Equity Curve calcs
eq = strategy.netprofit
ch = ta.change(eq)
neq = ch != 0 ? eq : na
mova = ta.ema(neq,eqlen)

// New Equity Curve
var float neweq = 0
var int ttrades = 0
var int wintrades = 0
var int losetrades = 0

switch
    strategy.netprofit == strategy.netprofit[1]  => na
    strategy.netprofit < mova and strategy.netprofit[1] > mova  => neweq := neweq + ch
    strategy.netprofit < mova and strategy.netprofit[1] < mova => na
    strategy.netprofit > mova and strategy.netprofit[1] > mova => neweq := neweq + ch

newch = ta.change(neweq)
switch
    newch == 0 => na
    newch > 0 => 
        wintrades := wintrades +1
        ttrades := ttrades +1
    newch < 0 =>
        losetrades := losetrades +1
        ttrades := ttrades +1

//plot(eq, linewidth = 2)
//plot(mova, color=color.red)
//plot(neweq, color= color.green, linewidth = 3)


//Table 
var testTable = table.new(position = position.top_right, columns = 5, rows = 10, bgcolor = color.green, border_width = 1)
table.cell(table_id = testTable, column = 0, row = 0, text = "Strategy: ", bgcolor=color.white)     
table.cell(table_id = testTable, column = 1, row = 0, text = "Original: ", bgcolor=color.white)     
table.cell(table_id = testTable, column = 2, row = 0, text = "Equity Curve EMA: ", bgcolor=color.white)     

table.cell(table_id = testTable, column = 0, row = 1, text = "Total Trades: ", bgcolor=color.white)     
table.cell(table_id = testTable, column = 0, row = 2, text = "Win Trades: ", bgcolor=color.white)     
table.cell(table_id = testTable, column = 0, row = 3, text = "Lose Trades: ", bgcolor=color.white)     
table.cell(table_id = testTable, column = 0, row = 4, text = "Win Rate: ", bgcolor=color.white)     
table.cell(table_id = testTable, column = 0, row = 5, text = "Net Profit: ", bgcolor=color.white)     

//Equity Curve EMA stat
table.cell(table_id = testTable, column = 2, row = 1, text = str.tostring(ttrades), bgcolor=color.white)     
table.cell(table_id = testTable, column = 2, row = 2, text = str.tostring(wintrades), bgcolor=color.white)
table.cell(table_id = testTable, column = 2, row = 3, text = str.tostring(losetrades), bgcolor=color.white)
table.cell(table_id = testTable, column = 2, row = 4, text = str.tostring(math.round(100*wintrades/ttrades,2)), bgcolor=color.white)
table.cell(table_id = testTable, column = 2, row = 5, text = str.tostring(math.round(neweq)), bgcolor=color.white)

//Original Strategy stat
// table.cell(table_id = testTable, column = 1, row = 1, text = str.tostring(strategy.closedtrades), bgcolor=color.white)     
// table.cell(table_id = testTable, column = 1, row = 2, text = str.tostring(strategy.wintrades), bgcolor=color.white)
// table.cell(table_id = testTable, column = 1, row = 3, text = str.tostring(strategy.losstrades), bgcolor=color.white)
// table.cell(table_id = testTable, column = 1, row = 4, text = str.tostring(math.round(100*strategy.wintrades/strategy.closedtrades,2)), bgcolor=color.white)
// table.cell(table_id = testTable, column = 1, row = 5, text = str.tostring(math.round(strategy.netprofit)), bgcolor=color.white)




//New Equity curve
var newcurve = array.new_float(0)
var int ida = 0
var bool printEQ = false
if newch !=0 
    array.push(newcurve, neweq)
if bar_index > last_bar_index - array.size(newcurve) - 1 - 20  and array.size(newcurve) > 20 
    printEQ := true
else
    printEQ := false

plot(printEQ and ida < strategy.closedtrades and shEQfilt ? array.get(newcurve, ida) : na, color=color.green, linewidth = 2)

if printEQ
    ida := ida + 1
if ida >= array.size(newcurve) and printEQ
    ida := array.size(newcurve) -1



//Original Equity curve
var newcurve2 = array.new_float(0)
var int ida2 = 0
var bool printEQ2 = false
if ch !=0 
    array.push(newcurve2, eq)
if bar_index > last_bar_index - array.size(newcurve2) - 1 - 20  and array.size(newcurve2) > 20 
    printEQ2 := true
else
    printEQ2 := false

plot(printEQ2 and ida2 < strategy.closedtrades and shEQandMA  ? array.get(newcurve2, ida2) : na, color=color.blue, linewidth = 2)

if printEQ2
    ida2 := ida2 + 1
if ida2 >= array.size(newcurve2) and printEQ2
    ida2 := array.size(newcurve2) -1



//Moving Average Array
var marray = array.new_float(0)
if ch
    array.push(marray, mova)

plot(printEQ2 and  array.size(marray) > 40 and shEQandMA ? array.get(marray, ida2-1) : na, color=color.red, linewidth = 1)

hline(0,"0 line", color=color.black, linestyle = hline.style_dotted)


if (last_bar_index-1) and array.size(newcurve2) > 20 and array.size(newcurve) > 20
    l = label.new(bar_index+2, array.get(newcurve2, array.size(newcurve2)-1), "Original Equity Curve", color=color.rgb(33, 149, 243, 85), textcolor = color.black, style = label.style_label_left)
    label.delete(l[1])
    f = label.new(bar_index+2, array.get(newcurve, array.size(newcurve)-1), "Filtered Equity Curve", color=color.rgb(69, 238, 97, 85), textcolor = color.black, style = label.style_label_left)
    label.delete(f[1])