Stratégie d'inversion de la gamme Hibernate


Date de création: 2023-10-30 10:54:00 Dernière modification: 2023-10-30 10:54:00
Copier: 1 Nombre de clics: 569
1
Suivre
1617
Abonnés

Stratégie d’inversion de la gamme Hibernate

Aperçu

La stratégie d’inversion de la zone de dormance utilise les périodes de baisse de la volatilité des prix comme signal de prise de position et de prise de position de plafonnement lorsque la volatilité des prix augmente à nouveau. Elle capture les tendances de prix à venir en identifiant les cas où les prix sont confinés dans une zone de dormance de faible volatilité.

Principe de stratégie

La stratégie identifie d’abord la zone de repos, c’est-à-dire lorsque le prix est restreint à la zone de la journée de négociation précédente. Cela indique que la volatilité actuelle a diminué par rapport aux jours précédents. Nous jugeons la conformité à la zone de repos en comparant le prix le plus élevé de la journée de négociation actuelle avec le prix le plus élevé de la journée précédente (généralement 4 jours) et le prix le plus bas de la journée de négociation actuelle avec le prix le plus bas de la journée précédente.

Une fois que la zone de repos est confirmée, la stratégie ouvre simultanément deux ordres de clôture: un ordre de clôture d’achat est placé près du sommet de la zone et un ordre de clôture de vente est placé près du bas de la zone. Ensuite, il faut attendre que le prix franchisse la zone de repos pour continuer à courir à la hausse ou à la baisse. Si le prix franchit la zone de clôture à la hausse, l’ordre d’achat est déclenché pour créer une position à plusieurs niveaux; si le prix franchit la zone de clôture à la baisse, l’ordre de vente est déclenché pour créer une position à vide.

Une fois la position établie, la stratégie définit un ordre de stop loss et un ordre d’arrêt. L’ordre de stop loss limite le risque de baisse et l’ordre d’arrêt est utilisé pour plafonner après avoir réalisé des bénéfices. L’ordre d’arrêt est à une distance proportionnelle du prix d’entrée, cette distance étant définie par les paramètres de gestion du risque.

Enfin, la stratégie contient un module de gestion des fonds. Il permet d’ajuster le volume des ordres de négociation par le biais d’un multiplicateur fixe, d’augmenter le taux d’utilisation des fonds en cas de profit et de réduire les risques en cas de perte.

Analyse des avantages

Cette stratégie présente les avantages suivants:

  1. Le moment de la baisse de la volatilité peut être utilisé comme signal de prise de position pour saisir les opportunités avant que la tendance des prix ne se déclenche.

  2. Il est possible d’effectuer des ordres de négociation bidirectionnels à plusieurs niveaux pour capturer une tendance à la hausse ou à la baisse.

  3. La stratégie Stop Loss Stop est utilisée pour contrôler efficacement le risque d’une seule transaction.

  4. La gestion des fonds à taux fixe peut améliorer l’efficacité de leur utilisation.

  5. La logique de la stratégie est simple, claire et facile à mettre en œuvre.

Analyse des risques

Cette stratégie comporte également des risques à prendre en compte:

  1. Risque d’erreur de jugement dans la direction de la rupture de la zone de sommeil. La rupture de la zone de sommeil peut ne pas être évidente, ce qui entraîne une erreur dans la direction de l’entrée.

  2. Le risque de ne pas pouvoir continuer à fonctionner dans la direction après la percée. La percée n’est qu’un revirement de courte durée.

  3. Le risque de rupture du stop loss. Dans des cas exceptionnels, le stop loss peut être franchi directement.

  4. Le risque d’accroissement des pertes de l’hypothèque par la méthode des multiples fixes. La valeur du multiplicateur fixe peut être réduite pour réduire le risque.

  5. Une mauvaise définition des paramètres peut entraîner une mauvaise stratégie.

Direction d’optimisation

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

  1. Augmenter le filtrage des signaux de déviation de rupture pour éviter les fausses ruptures.

  2. Améliorer les stratégies de stop-loss, comme le stop-move, le stop-loss en bloc, etc.

  3. Il est important d’augmenter les indicateurs de jugement des tendances et d’éviter les retournements.

  4. Optimiser les valeurs de multiplication fixe et équilibrer le ratio profit/perte.

  5. Les résultats de l’analyse de la rentabilité sont améliorés en combinant plusieurs périodes de temps.

  6. Optimiser automatiquement les paramètres à l’aide de l’apprentissage automatique.

Résumer

L’idée générale de la stratégie de renversement de zone de repos est claire et présente un certain potentiel de profit. La stabilité de la stratégie peut être encore améliorée par des moyens tels que l’optimisation des paramètres, la gestion des risques et le filtrage des signaux.

Code source de la stratégie
/*backtest
start: 2023-09-29 00:00:00
end: 2023-10-29 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 the Narrow Range strategy
//Interactive Broker fees are applied on this strategy
//@version=5
strategy("NARROW RANGE BACKTESTING", shorttitle="NR BACKTESTING", overlay=true, initial_capital=1000, default_qty_type=strategy.fixed, commission_type=strategy.commission.percent, commission_value=0.18)


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

//@function to print label
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------------------------------------//

//Narrow Range Length 
nrLength = input.int(4, minval=2, title="Narrow Range Length", group="Strategy parameters")
//Risk Management
stopLossInput = input.float(0.5, title="Stop Loss (in percentage of reference range)", 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 Janv 2020 00:00:00"), group="Backtesting Period")
endDate = input(title="End Date", defval=timestamp("1 July 2024 00:00:00"), group="Backtesting Period")


//--------------------------------VARIABLES INITIALISATION--------------------------//
strategy.initial_capital = 50000
bool nr = na
var bool long = na
var bool short = na
var float stopPriceLong = na
var float stopLossLong = na
var float takeProfitLong = na
var float stopPriceShort = na
var float stopLossShort = na
var float takeProfitShort = na
var float takeProfit = na
var float stopLoss = na
bool inRange = na
int closedtrades = strategy.closedtrades
equity = math.abs(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

//We check if a trade has been closed to cancel all previous orders
if closedtrades > closedtrades[1]
    strategy.cancel("Long")
    strategy.cancel("Short")
    stopPriceLong := na
    stopPriceShort := na

//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()
    long := na
    short := na
    stopPriceLong := na
    stopLossLong := na
    takeProfitLong := na
    stopPriceShort := na
    stopLossShort := na
    takeProfitShort := na
    takeProfit := na
    stopLoss := na

//----------------------------------FINDING NARROW RANGE DAY------------------------------------------//

// We find the Narrow Range Day
if low > low[nrLength] and high < high[nrLength]
    nr := true 


//------------------------------------STOP ORDERS--------------------------------------------//

// We handle plotting of stop orders and cancellation of other side order if one order is triggered
if strategy.position_size > 0 and not na(stopPriceLong) and not na(stopPriceShort)
    long := true
    strategy.cancel("Short")
    stopPriceLong := na
    stopPriceShort := na
    takeProfit := takeProfitLong
    stopLoss := stopLossLong
if strategy.position_size < 0 and not na(stopPriceLong) and not na(stopPriceShort)
    short := true
    strategy.cancel("Long") 
    stopPriceLong := na
    stopPriceShort := na
    takeProfit := takeProfitShort
    stopLoss := stopLossShort


//------------------------------------STOP LOSS & TAKE PROFIT--------------------------------//

// If an order is triggered we plot TP and SL
if not na(takeProfit) and not na(stopLoss) and long
    if high >= takeProfit and closedtrades == closedtrades[1] + 1
        takeProfit := na
        stopLoss := na
        long := na
    if low <= stopLoss and closedtrades == closedtrades[1] + 1
        takeProfit := na
        stopLoss := na
        long := na
if not na(takeProfit) and not na(stopLoss) and short
    if high >= stopLoss and closedtrades == closedtrades[1] + 1
        takeProfit := na
        stopLoss := na
        short := na
    if low <= takeProfit and closedtrades == closedtrades[1] + 1
        takeProfit := na
        stopLoss := na
        short := na


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

// Conditions to create two stop orders (one for Long and one for Short) and SL & TP calculation
if nr and inRange and strategy.position_size == 0
    stopPriceLong := high[4]
    takeProfitLong := high[4] + (high[4] - low[4])
    stopLossLong := high[4] - (high[4] - low[4])*stopLossInput
    qtyLong = cashOrder/stopPriceLong
    strategy.entry("Long", strategy.long, qtyLong, stop=stopPriceLong)
    strategy.exit("Exit Long", "Long", limit=takeProfitLong ,stop=stopLossLong)
    stopPriceShort := low[4]
    takeProfitShort := low[4] - (high[4] - low[4])
    stopLossShort := low[4] + (high[4] - low[4])*stopLossInput
    qtyShort = cashOrder/stopPriceShort
    strategy.entry("Short", strategy.short, qtyShort, stop=stopPriceShort)
    strategy.exit("Exit Short", "Short", limit=takeProfitShort ,stop=stopLossShort)


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

plotshape(nr, "NR", shape.arrowdown, location.abovebar, color.rgb(255, 132, 0), text= "NR4", size=size.huge)
plot(stopPriceLong, "Stop Order", color.blue, 3, plot.style_linebr)
plot(stopPriceShort, "Stop Order", color.blue, 3, plot.style_linebr)
plot(takeProfit, "Take Profit", color.green, 3, plot.style_linebr)
plot(stopLoss, "Stop Loss", color.red, 3, plot.style_linebr)