Stratégie de pyramide simple quantitaire en fonction du temps

Auteur:ChaoZhang est là., Date: 2023-12-27 17h39h40
Les étiquettes:

img

Résumé

L'idée principale est d'ouvrir des positions longues tous les jours à des heures fixes, et de définir différents niveaux de prise de profit et d'arrêt de perte pour chaque position pour réaliser une prise de profit et un arrêt de perte par lots.

Principaux

La stratégie repose sur trois logiques clés:

  1. La pyramide par étapes dans le temps

    Utilisez lesessionTimeParamètre permettant de définir une fenêtre de temps de négociation quotidienne, les positions longues pyramidales sont progressivement ouvertes sur le marché pendant cette fenêtre.

  2. L'exposition au risque est calculée comme suit:

    Ensemble correspondant au niveau de prise de profittakeProfitet niveau de stop lossstopLosspour chaque position ouverte, de sorte que chaque position ait sa propre logique de prise de profit et d'arrêt des pertes pour réaliser des exécutions par lots.

  3. Fermer toutes les positions à la fin de la fenêtre de temps

    Choisissez si vous souhaitez fermer toutes les positions ouvertes pendant la fenêtre de temps à la fin de la fenêtre.

Les avantages

La stratégie présente les avantages suivants:

  1. Diversification des risques: allouer le capital de manière uniforme à différentes positions afin de contrôler efficacement les pertes d'une seule position.

  2. Les différentes positions ont des logiques indépendantes pour éviter les pertes massives.

  3. Des paramètres personnalisables tels que les temps de pyramide maximaux, la fenêtre de temps quotidienne, les ratios de prise de profit/arrêt de perte, etc.

  4. Une logique simple et claire, facile à comprendre.

Les risques

Il y a aussi des risques:

  1. Le risque de blocage de tout le capital si toutes les positions déclenchent un stop loss avant de réaliser un profit.

  2. Il n'y a pas de limite au capital total des positions ouvertes par jour. Trop de positions peuvent dépasser la tolérance du capital en cas de situation de marché inhabituelle.

  3. Une configuration incorrecte de la fenêtre de temps peut vous faire rater des opportunités de négociation.

Amélioration

La stratégie peut être améliorée par les aspects suivants:

  1. Ajouter des conditions de position ouverte basées sur des indicateurs techniques pour éviter une pyramide imprudente.

  2. Ajouter la limite de fonds propres totale journalière des positions ouvertes pour éviter de dépasser la tolérabilité des fonds propres.

  3. Définir différents ratios de prise de profit/arrêt de perte pour différentes positions afin de réaliser une prise de profit et un arrêt de perte différenciés.

  4. Ajouter des logiques pour relier le montant de la position au solde du pool de capitaux.

Conclusion

En conclusion, il s'agit d'un modèle de stratégie de trading de quantité très simple utilisant la méthodologie de pyramide par étapes dans le temps.


/*backtest
start: 2022-12-20 00:00:00
end: 2023-12-26 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/
// © A3Sh

//@version=5
strategy("Simple_Pyramiding", overlay=true, pyramiding=99, initial_capital=500, default_qty_type=strategy.percent_of_equity, commission_type=strategy.commission.percent, commission_value=0.075, close_entries_rule='FIFO')

// Study of a Simple DCA strategy that opens a position every day at a specified time.
// A position is opened at the start time of the Timeframe.
// Positions exit individually when the take profit level is triggered.
// Option to activate Stop Loss and/or Position exit at the end of the Timeframe


// Backtest Window
start_time   = input(defval=timestamp("01 April 2021 20:00"), group = "Backtest Window", title="Start Time")
end_time     = input(defval=timestamp("01 Aug 2022 20:00"),  group = "Backtest Window", title="End Time")
window() => true


// Inputs
posCount     = input.int    (6,           group = "Risk",         title = "Max Amount of DCA Entries")
takeProfit   = input.float  (2.5,         group = "Risk",         title = "Take Profit %")
slSwitch     = input.bool   (true,        group = "Risk",         title = "Activate Stop Loss")
stopLoss     = input.float  (9,           group = "Risk",         title = "Stop Loss %")
sessionTime =  input("1800-1700", group = "DCA Settings", title = "DCA Order Timeframe", tooltip="Open order at the start/If ativated, close order at the end")
exitDCA     =  input.bool   (false,       group = "DCA Settings", title = "Exit DCA Entry at end of Timeframe")


// Order size based on max amount of pyramid orders
q = (strategy.equity  / posCount) / open


// Timeframe for opening and closing a DCA order
// example taken from https://stackoverflow.com/questions/69230164/pinescript-basic-question-open-a-trade-at-a-set-time-each-day
t       = time("D", sessionTime)
isStart = na(t[1]) and not na(t) or t[1] < t
isEnd   = na(t) and not na(t[1]) or t[1] < t
bgcolor(t ? color.new(color.blue,95) : na, title = " TimeFrame Color")


// Create DCA Entries
entry_price = 0.0
if isStart and window() 
    for i = 0 to strategy.opentrades
        if strategy.opentrades == i
            entry_price := close
            entry_id = "PE_" + str.tostring(i + 1) 
            strategy.entry(id = entry_id, direction=strategy.long, limit=entry_price, qty=q)
        if strategy.opentrades == posCount
            break
            
 
//Exit DCA Entries when take profit or stop loss is triggered
if strategy.opentrades > 0 and window() 
    for i = 0 to strategy.opentrades 
        exit_from = "PE_" + str.tostring(i + 1)
        exit_id = "Exit_" + str.tostring(i + 1)
        strategy.exit(id= exit_id, from_entry= exit_from, profit = close * takeProfit / 100 / syminfo.mintick, loss = slSwitch ? close * stopLoss /100 / syminfo.mintick :na)
        

//Exit DCA Entries at end of DCA Timeframe
if strategy.opentrades > 0 and exitDCA and isEnd and window() 
    for i = 0 to strategy.opentrades 
        exit_from = "PE_" + str.tostring(i + 1)
        exit_id = "Exit_" + str.tostring(i + 1)
        strategy.exit(id= exit_id, from_entry= exit_from, stop = close)




Plus de