Stratégie de négociation en grille de positions dynamiques longues de Martingale basée sur la grille

Auteur:ChaoZhang est là., Date: 2024-03-22 15:12:33 Je vous en prie.
Les étiquettes:

img

Vue d'ensemble de la stratégie

Cette stratégie est une stratégie de négociation dynamique de position Martingale basée sur la grille. L'idée principale est d'ajuster dynamiquement la taille de la position en fonction du nombre de positions existantes lorsque le prix atteint les lignes de grille, tout en définissant un nombre total maximal de positions ouvertes. Lorsque le prix augmente et atteint le niveau de profit, toutes les positions longues sont fermées.

Principes de stratégie

  1. Divisez le prix en grilles uniformément espacées en fonction du paramètre Grid Size.
  2. Placez des ordres de limite longue à chaque ligne de grille.
  3. Lorsque le prix actuel atteint une ligne de grille:
    • Si le nombre actuel de positions ouvertes est de 0, ouvrir une position avec la taille start_lot.
    • Si le nombre actuel de positions ouvertes est supérieur à 0 et que le prix de la grille actuelle est inférieur au prix d'entrée précédent, ouvrir une nouvelle position longue au prix de la grille actuel avec une taille qui est multifactrice fois la taille de la position précédente.
  4. Le nombre maximal de positions ouvertes est contrôlé par le paramètre Max Open Orders.
  5. Après avoir ouvert une position, définissez un niveau de prise de profit à TakeProfit points au-dessus du prix d'entrée moyen.
  6. Lorsque le prix actuel atteint le niveau de prise de profit, fermez toutes les positions longues et réinitialisez les paramètres.

De cette façon, la taille de la position augmente progressivement pendant les tendances à la baisse et les bénéfices sont réalisés lorsque le prix se redresse et atteint le niveau de prise de profit.

Les avantages de la stratégie

  1. Taille dynamique des positions: ajustez dynamiquement la taille des positions pour chaque entrée en fonction du nombre actuel de positions ouvertes. Cela augmente progressivement l'exposition pendant les tendances à la baisse continues, augmentant le potentiel de profit de la stratégie.
  2. Paramètres flexibles: la taille de la grille, le lot de départ, le multiplicateur et d'autres paramètres permettent un contrôle flexible de la taille de la grille, de la taille de la position initiale, du facteur de mise à l'échelle de la position, etc.
  3. Risque contrôlable: le paramètre Max Open Orders contrôle le nombre maximal de positions ouvertes afin d'éviter une surexposition.

Risques stratégiques

  1. Aucun stop loss: la stratégie n'a pas de stop loss. Si le prix continue à baisser, il peut faire face à des risques de perte importants.
  2. Sensibilité aux paramètres: la performance de la stratégie est très sensible à des paramètres tels que le facteur multiples.
  3. Volatilité élevée: la stratégie peut ouvrir et fermer fréquemment des positions dans des conditions de marché très volatiles, entraînant potentiellement des coûts supplémentaires de glissement et de commission.

Mesures de contrôle des risques:

  1. Les paramètres tels que multifacteur doivent être soigneusement définis en fonction de la tolérance au risque.
  2. Des tests et des échanges de documents sont effectués pour sélectionner les paramètres appropriés.
  3. Évaluer les performances de la stratégie dans des conditions de marché très volatiles.Si nécessaire, le risque peut être atténué en ajustant les paramètres ou en restreignant les scénarios d'utilisation.

Directions d'optimisation

  1. Ajouter la détection de tendance: déterminer la tendance en fonction de l'action des prix lors de l'ouverture de positions.
  2. Prise de profit dynamique: ajustez dynamiquement le niveau de prise de profit en fonction de l'action des prix, de la volatilité et d'autres indicateurs.
  3. Optimiser la gestion des positions: lors de l'ajout de positions, en plus de prendre en compte le facteur de mise à l'échelle, intégrer également le solde du compte, l'exposition courante, etc. pour contrôler plus précisément la taille des positions.
  4. Combiner avec d'autres signaux: Intégrer le trading de la grille avec d'autres signaux de détection de tendance, de détection d'oscillation et d'autres signaux d'indicateur pour juger globalement le marché et guider le trading.

Ces optimisations peuvent améliorer l'adaptabilité de la stratégie pour mieux saisir les mouvements du marché, améliorer le potentiel de profit et la robustesse.

Résumé

Cette stratégie de trading de grille de positions dynamiques basée sur la grille de Martingale tente de réduire le prix moyen de détention pendant les tendances à la baisse en ajoutant progressivement des positions et en réalisant des bénéfices lorsque les prix augmentent. La stratégie offre une forte flexibilité grâce aux paramètres. Cependant, elle comporte également des risques potentiels importants qui nécessitent une évaluation et un contrôle attentifs. Si la détection de tendance, la prise de profit dynamique, l'optimisation de la position et d'autres fonctionnalités peuvent être ajoutées, les performances de la stratégie peuvent être encore améliorées. La stratégie réalise des fonctions pour ouvrir et ajouter automatiquement des positions lorsque les prix atteignent les lignes de grille et fermer automatiquement toutes les positions lorsque les prix atteignent le niveau de prise de profit. La logique globale est relativement claire, mais il y a place à l'optimisation.


/*backtest
start: 2023-03-16 00:00:00
end: 2024-03-21 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/
// © lagerta13
//@version=4
strategy("Grid A.", shorttitle="Grid(A)", overlay=true, format=format.price, precision=4, pyramiding = 100)

input_tf=input("15", "Started TimeFrame", 
 options = ["1", "5", "15", "30", "1H", "4H", "1D", "1W", "1M"],
 group="TimeFrame") 

// avg_tf=input("5", "Average TimeFrame", 
//  options = ["1", "5", "15", "30", "1H", "4H", "1D", "1W", "1M"],
//  group="TimeFrame")

slip_Hilo = input(3.0, "Slippage by open order", group="Strategy Settings")
start_lot = input(0.01, "Start lot", group="Strategy Settings")
start_avg = input(2, "Started average since Order #", group="Strategy Settings")
MaxTrades_Hilo = input(10, "Max Open Orders", group="Strategy Settings")
dropdown_selection = input("Only Long", "Direction", options=["Only Long", "Only Short", "Long & Short"],
 group="Strategy Settings")
type_selection = input("By Close", "Type input", options=["By Close", "By grid line"],
 group="Strategy Settings")

multifactor = input(1.5, "Multifactor", group="Strategy Settings")
precision_lot = input(2, "Number of precision", group="Strategy Settings")
take_profit = input(1, "TakeProfit", group="Strategy Settings")

// PipStep_S1 = input(30)
// PipStepX_S1 = input(1.2)
// dinamicStep = input(false, "Dinamic Step for AVG")

get_size_lot_order(number, multi, prec, avg_from, lot_from) =>
	res = lot_from
	for i = 1 to number
		if i >= avg_from
			res := round(res * multi, precision = prec)
	res

var float[] entry_levels = array.new_float(MaxTrades_Hilo + 1)

for i = 0 to MaxTrades_Hilo
    array.push(entry_levels, 0)

gridSize = input(0.5, title="Grid Size")
gridLevels = int(close / gridSize) * gridSize

var int num_open_orders = 0
var float sum_price_orders = 0
var float entry_lot = 0

buy_condition = num_open_orders < MaxTrades_Hilo and gridLevels[0]<gridLevels[1] and dropdown_selection != "Only Short"

if (buy_condition)

    if num_open_orders == 0
        lot = get_size_lot_order(num_open_orders, multifactor, precision_lot, start_avg, start_lot)
        sum_price_orders := sum_price_orders + gridLevels[1] * lot 

        strategy.entry("buy" + tostring(num_open_orders), true, qty=lot, limit=gridLevels[1]+slip_Hilo) 
        // strategy.order("buy" + tostring(num_open_orders), true, qty=lot, limit=gridLevels[1]) 

        array.set(entry_levels, num_open_orders, gridLevels[1])

        entry_lot := entry_lot + lot
        num_open_orders := num_open_orders + 1

    else
        if gridLevels[1] < (array.get(entry_levels, num_open_orders - 1))
            lot = get_size_lot_order(num_open_orders, multifactor, precision_lot, start_avg, start_lot)
            sum_price_orders := sum_price_orders + gridLevels[1] * lot 
            entry_lot := entry_lot + lot

            strategy.entry("buy" + tostring(num_open_orders), true, qty=lot, limit=gridLevels[1]+slip_Hilo) 

            // +" S:" + tostring(sum_price_orders / (entry_lot)) + " Prev:" + tostring(array.get(entry_levels, num_open_orders - 1))
            // strategy.order("buy" + tostring(num_open_orders), true, qty=lot, limit=gridLevels[1]) 
            array.set(entry_levels, num_open_orders, gridLevels[1])

            num_open_orders := num_open_orders + 1


take = sum_price_orders > 0 and take_profit + (sum_price_orders / entry_lot) < high ? high : na
plotshape(take, location = location.belowbar, color = color.white)


strategy.exit("tp", comment = "TP " + tostring(num_open_orders), qty = entry_lot, limit = take_profit + (sum_price_orders / entry_lot))


if sum_price_orders > 0 and take_profit + (sum_price_orders / entry_lot) <= high
    num_open_orders := 0
    sum_price_orders := 0
    entry_lot := 0
    for i = 0 to MaxTrades_Hilo
        array.set(entry_levels, i, 0)

plot(gridLevels, color=color.blue, style=plot.style_circles, linewidth=2)

 

Plus de