Tendance de l'indice de risque suivant la stratégie

Auteur:ChaoZhang est là., Date: 2023-11-16 15h33h40
Les étiquettes:

Résumé

Cette stratégie combine l'indicateur RSI et la moyenne mobile pondérée pour la tendance suivant le trading. Il va long lorsque le RSI est supérieur à 60 et court lorsque le RSI est inférieur à 40, la moyenne mobile vérifiant l'état de la tendance. Le RSI à 40 périodes agit comme un indicateur suivant la tendance.

La logique de la stratégie

La stratégie calcule d'abord le RSI et la moyenne mobile pondérée. La longueur du RSI est de 20 périodes et la longueur pondérée du MA est de 20 avec des poids plus élevés qui réduisent l'impact de la volatilité à court terme. Elle devient longue lorsque le RSI est supérieur à 60 et le taux de variation pondéré du MA est inférieur à -1%. Elle devient courte lorsque le RSI est inférieur à 40 et le taux de variation pondéré du MA est supérieur à 1%.

Après avoir ouvert long ou court, les ordres stop loss et trailing take profit sont placés simultanément. Le stop loss est défini à 3 ATR par rapport au prix actuel. L'activation initiale de la prise de profit est à 4 ATR et s'effectue en incréments de 3%. Lorsque le prix atteint soit le stop loss, soit la prise de profit, la position sera fermée.

La stratégie intègre également des règles de gestion de l'argent basées sur l'approche de taille de position fractionnelle fixe.

Analyse des avantages

  • L'indicateur RSI peut suivre efficacement les tendances
  • L'AM pondérée réduit l'impact des fluctuations à court terme, en évitant les sacs à manches
  • Le suivi des bénéfices permet de maximiser les bénéfices.
  • Les contrôles de dimensionnement de la position de fraction fixe sont efficaces

L'avantage global est la capacité de suivre les tendances, tout en prenant des mesures de stop loss et de profit pour contrôler les risques, capturant ainsi des gains significatifs dans des tendances fortes.

Analyse des risques

  • Les signaux erronés du RSI peuvent entraîner des transactions inutiles
  • Forcé de s'arrêter lorsque les écarts de prix s'arrêtent ou que les niveaux de bénéfices baissent, incapable de suivre les tendances
  • Des règles agressives en matière de gestion de l'argent peuvent entraîner des pertes importantes

Les principaux risques proviennent de la fiabilité des signaux RSI et des paramètres de stop loss/trailing take profit. Des paramètres incorrects peuvent entraîner une fermeture inutile des transactions ou des pertes au-delà de l'appétit pour le risque.

Les solutions comprennent l'optimisation des paramètres du RSI ou l'ajout d'autres indicateurs pour la confirmation du signal. Ajustez les niveaux d'arrêt / suivi des bénéfices en fonction des différents produits et des conditions de volatilité. Soyez également prudent avec les règles de gestion de l'argent pour éviter les risques excessifs.

Directions d'optimisation

  • Testez d'autres indicateurs avec le RSI pour confirmer le signal, par exemple KD, MACD, etc.
  • Optimiser les paramètres d'arrêt des pertes et de prise de bénéfices en fonction des caractéristiques du produit et de la fourchette de volatilité
  • Essayez d'autres techniques de gestion de l'argent comme le trading à taille fixe, la formule Kelly, etc.
  • Ajouter des conditions d'entrée comme les écarts de Bollinger, les divergences du RSI, etc.
  • Envisager d'ajouter des positions sur les tendances fortes

Il y a beaucoup d'aspects à optimiser. Premièrement, il s'agit d'identifier d'autres indicateurs pour compléter les signaux RSI. L'étape critique suivante consiste à optimiser les paramètres de stop loss / trailing take profit basés sur les performances historiques. La gestion de l'argent peut également passer à d'autres types. Enfin, les conditions d'entrée et d'ajout peuvent être améliorées pour placer des positions pyramidales dans des tendances fortes.

Résumé

La stratégie de suivi de la tendance du RSI a une logique claire, en utilisant le RSI pour la direction de la tendance et le MA pondéré pour la confirmation. Sa force réside dans le trading de tendance, en maximisant les profits avec des arrêts / gestion de l'argent contrôlant les risques. Mais la fiabilité du RSI et l'optimisation des paramètres doivent être améliorées. Nous pouvons examiner l'amélioration des indicateurs de signal, des paramètres d'arrêt / suivi, des méthodes de gestion de l'argent, etc. pour rendre la stratégie plus robuste sur différents produits.

Je ne sais pas.


/*backtest
start: 2023-01-01 00:00:00
end: 2023-06-24 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © gsanson66


//This code is based on RSI and a backed weighted MA
//@version=5
strategy("RSI + MA BACKTESTING", overlay=true, initial_capital=1000, default_qty_type=strategy.fixed, commission_type=strategy.commission.percent, commission_value=0.18)


//------------------------FUNCTIONS---------------------------//

//@function which calculate a retro weighted moving average to minimize the impact of short term reversal
rwma(source, length) =>
    sum = 0.0
    denominator = 0.0
    weight = 0.0
    weight_x = 100/(4+(length-4)*1.30)
    weight_y = 1.30*weight_x
    for i=0 to length - 1
        if i <= 3
            weight := weight_x
        else
            weight := weight_y
        sum := sum + source[i] * weight
        denominator := denominator + weight
    rwma = sum/denominator

//@function which permits the user to choose a moving average type
ma(source, length, type) =>
    switch type
        "SMA" => ta.sma(source, length)
        "RWMA" => rwma(source, length)

//@function Displays text passed to `txt` when called.
debugLabel(txt, color) =>
    label.new(bar_index, high, text = txt, color=color, style = label.style_label_lower_right, textcolor = color.black, size = size.small)

//@function which looks if the close date of the current bar falls inside the date range
inBacktestPeriod(start, end) => (time >= start) and (time <= end)


//--------------------------------USER INPUTS-------------------------------//

//Technical parameters
rsiLengthInput = input.int(20, minval=1, title="RSI Length", group="RSI Settings")
maTypeInput = input.string("RWMA", title="MA Type", options=["SMA", "RWMA"], group="MA Settings", inline="1")
maLenghtInput = input.int(20, minval=1, title="MA Length", group="MA Settings", inline="1")
rsiLongSignalValue = input.int(60, minval=1, maxval=99, title="RSI Long Signal", group="Strategy parameters", inline="3")
rsiShortSignalValue = input.int(40, minval=1, maxval=99, title="RSI Short Signal", group="Strategy parameters", inline="3")
rocMovAverLongSignalValue = input.float(-1, maxval=0, title="ROC MA Long Signal", group="Strategy parameters", inline="4")
rocMovAverShortSignalValue = input.float(1, minval=0, title="ROC MA Short Signal", group="Strategy parameters", inline="4")
//TP Activation and Trailing TP
takeProfitActivationInput = input.float(4, minval=1.0, title="TP activation in multiple of ATR", group="Strategy parameters")
trailingStopInput = input.float(3, minval=0, title="Trailing TP in percentage", group="Strategy parameters")
//Money Management
fixedRatio = input.int(defval=400, minval=1, title="Fixed Ratio Value ($)", group="Money Management")
increasingOrderAmount = input.int(defval=200, minval=1, title="Increasing Order Amount ($)", group="Money Management")
//Backtesting period
startDate = input(title="Start Date", defval=timestamp("1 Jan 2018 00:00:00"), group="Backtesting Period")
endDate = input(title="End Date", defval=timestamp("1 July 2024 00:00:00"), group="Backtesting Period")

strategy.initial_capital = 50000

//------------------------------VARIABLES INITIALISATION-----------------------------//

float rsi = ta.rsi(close, rsiLengthInput)
float ma = ma(close, maLenghtInput, maTypeInput)
float roc_ma = ((ma/ma[maLenghtInput]) - 1)*100
float atr = ta.atr(20)
var float trailingStopOffset = na
var float trailingStopActivation = na
var float trailingStop = na
var float stopLoss = na
var bool long = na
var bool short = na
var bool bufferTrailingStopDrawing = na
float theoreticalStopPrice = na
bool inRange = na
equity = strategy.equity - strategy.openprofit
var float capital_ref = strategy.initial_capital
var float cashOrder = strategy.initial_capital * 0.95


//------------------------------CHECKING SOME CONDITIONS ON EACH SCRIPT EXECUTION-------------------------------//

//Checking if the date belong to the range
inRange := true

//Checking performances of the strategy
if equity > capital_ref + fixedRatio
    spread = (equity - capital_ref)/fixedRatio
    nb_level = int(spread)
    increasingOrder = nb_level * increasingOrderAmount
    cashOrder := cashOrder + increasingOrder
    capital_ref := capital_ref + nb_level*fixedRatio
if equity < capital_ref - fixedRatio
    spread = (capital_ref - equity)/fixedRatio
    nb_level = int(spread)
    decreasingOrder = nb_level * increasingOrderAmount
    cashOrder := cashOrder - decreasingOrder
    capital_ref := capital_ref - nb_level*fixedRatio

//Checking if we close all trades in case where we exit the backtesting period
if strategy.position_size!=0 and not inRange
    debugLabel("END OF BACKTESTING PERIOD : we close the trade", color=color.rgb(116, 116, 116))
    strategy.close_all()
    bufferTrailingStopDrawing := false
    stopLoss := na
    trailingStopActivation := na
    trailingStop := na
    short := false
    long := false


//------------------------------STOP LOSS AND TRAILING STOP ACTIVATION----------------------------//

// We handle the stop loss and trailing stop activation 
if (low <= stopLoss or high >= trailingStopActivation) and long
    if high >= trailingStopActivation
        bufferTrailingStopDrawing := true
    else if low <= stopLoss
        long := false
    stopLoss := na
    trailingStopActivation := na
if (low <= trailingStopActivation or high >= stopLoss) and short
    if low <= trailingStopActivation
        bufferTrailingStopDrawing := true
    else if high >= stopLoss
        short := false
    stopLoss := na
    trailingStopActivation := na


//-------------------------------------TRAILING STOP--------------------------------------//

// If the traling stop is activated, we manage its plotting with the bufferTrailingStopDrawing
if bufferTrailingStopDrawing and long
    theoreticalStopPrice := high - trailingStopOffset * syminfo.mintick
    if na(trailingStop)
        trailingStop := theoreticalStopPrice
    else if theoreticalStopPrice > trailingStop
        trailingStop := theoreticalStopPrice
    else if low <= trailingStop
        trailingStop := na
        bufferTrailingStopDrawing := false
        long := false
if bufferTrailingStopDrawing and short
    theoreticalStopPrice := low + trailingStopOffset * syminfo.mintick
    if na(trailingStop)
        trailingStop := theoreticalStopPrice
    else if theoreticalStopPrice < trailingStop
        trailingStop := theoreticalStopPrice
    else if high >= trailingStop
        trailingStop := na
        bufferTrailingStopDrawing := false
        short := false


//---------------------------------LONG CONDITION--------------------------//

if rsi >= 60 and roc_ma <= rocMovAverLongSignalValue and inRange and not long
    if short
        bufferTrailingStopDrawing := false
        stopLoss := na
        trailingStopActivation := na
        trailingStop := na
        short := false
    trailingStopActivation := close + takeProfitActivationInput*atr
    trailingStopOffset := (trailingStopActivation * trailingStopInput/100) / syminfo.mintick
    stopLoss := close - 3*atr
    long := true
    qty = cashOrder/close
    strategy.entry("Long", strategy.long, qty)
    strategy.exit("Exit Long", "Long", stop = stopLoss, trail_price = trailingStopActivation,
                 trail_offset = trailingStopOffset)


//--------------------------------SHORT CONDITION-------------------------------//

if rsi <= 40 and roc_ma >= rocMovAverShortSignalValue and inRange and not short
    if long
        bufferTrailingStopDrawing := false
        stopLoss := na
        trailingStopActivation := na
        trailingStop := na
        long := false
    trailingStopActivation := close - takeProfitActivationInput*atr
    trailingStopOffset := (trailingStopActivation * trailingStopInput/100) / syminfo.mintick
    stopLoss := close + 3*atr
    short := true
    qty = cashOrder/close
    strategy.entry("Short", strategy.short, qty)
    strategy.exit("Exit Short", "Short", stop = stopLoss, trail_price = trailingStopActivation,
                 trail_offset = trailingStopOffset)


//--------------------------------PLOTTING ELEMENT---------------------------------//

// Plotting of element in the graph
plotchar(rsi, "RSI", "", location.top, color.rgb(0, 214, 243))
plot(ma, "MA", color.rgb(219, 219, 18))
plotchar(roc_ma, "ROC MA", "", location.top, color=color.orange)
// Visualizer trailing stop and stop loss movement
plot(stopLoss, "SL", color.red, 3, plot.style_linebr)
plot(trailingStopActivation, "Trigger Trail", color.green, 3, plot.style_linebr)
plot(trailingStop, "Trailing Stop",  color.blue, 3, plot.style_linebr)


Plus de