Stratégie de trading adaptative par blocs d'ordres de rupture fractale multi-périodes

OB SD MA ATR
Date de création: 2024-12-27 15:49:16 Dernière modification: 2024-12-27 15:49:16
Copier: 8 Nombre de clics: 479
1
Suivre
1617
Abonnés

Stratégie de trading adaptative par blocs d’ordres de rupture fractale multi-périodes

Aperçu

La stratégie est un système de trading adaptatif basé sur la théorie fractale et l’analyse des blocs d’ordres. Il capture des opportunités de trading à haute probabilité en identifiant les niveaux de support et de résistance clés dans la structure du marché, combinés à des signaux de rupture fractale et à des confirmations de blocs d’ordres. La stratégie intègre plusieurs indicateurs techniques, notamment des indicateurs fractals, des blocs d’ordres dynamiques et des systèmes de confirmation de rupture de prix, pour obtenir un positionnement précis des points de retournement du marché et une compréhension précise des opportunités de trading.

Principe de stratégie

La logique de base de la stratégie repose sur trois piliers principaux : premièrement, la surveillance continue des hauts et des bas du marché grâce au module de calcul fractal pour identifier les zones potentielles de retournement de tendance ; deuxièmement, grâce à l’analyse des blocs d’ordres, l’établissement de zones d’offre et de demande à des niveaux de prix clés ; et enfin, via le système de confirmation Breakout pour vérifier la validité des percées de prix. Lorsque le prix franchit la fractale supérieure et est confirmé comme étant valide, le système crée un bloc d’ordre de zone de demande dans la zone de bougie rouge la plus proche et ouvre un ordre long ; lorsque le prix franchit la fractale inférieure et est confirmé comme étant valide , le système créera une zone d’approvisionnement dans la zone de bougie verte la plus proche du bloc de commande et ouvrira une commande courte. La stratégie comprend également une fonction de mise à jour dynamique pour la couleur du bloc de commande, qui est utilisée pour afficher intuitivement la relation de position relative entre le prix et le bloc de commande.

Avantages stratégiques

  1. Forte adaptabilité : la stratégie peut ajuster dynamiquement la position et la taille du bloc d’ordres en fonction des conditions du marché et s’adapter à différents environnements de marché.
  2. Mécanisme de confirmation multiple : combine la percée fractale, la confirmation du bloc d’ordres et l’analyse de l’action des prix pour réduire le risque de faux signaux.
  3. Gestion des risques améliorée : aidez les traders à surveiller l’état de fonctionnement de la stratégie en temps réel grâce à un retour visuel clair et à une liste de contrôle d’état.
  4. Excellente visualisation : fournit une interface graphique intuitive comprenant des marqueurs fractals, un affichage des blocs de commande et une liste de contrôle d’état.
  5. Paramètres flexibles et réglables : permet aux utilisateurs d’ajuster les paramètres clés tels que la période fractale, le type de percée, etc. en fonction de leur style de trading personnel.

Risque stratégique

  1. Risque de volatilité du marché : de faux signaux de rupture peuvent être générés sur des marchés très volatils, nécessitant des mécanismes de filtrage supplémentaires.
  2. Risque de dérapage : Dans un environnement de marché avec une liquidité insuffisante, le prix d’exécution de l’ordre peut s’écarter du point d’entrée idéal.
  3. Dépendance à la tendance : une stratégie peut ne pas être aussi performante sur un marché latéral que sur un marché en tendance.
  4. Sensibilité des paramètres : différents paramètres de période fractale peuvent conduire à des résultats de trading considérablement différents.
  5. Consommation de ressources informatiques : les fonctions de visualisation complexes et les calculs en temps réel peuvent augmenter la charge du système.

Direction d’optimisation

  1. Présentation des filtres de volatilité : optimisez les signaux de trading via l’ATR ou d’autres indicateurs de volatilité.
  2. Ajoutez un mécanisme de confirmation de tendance : combinez-le avec une moyenne mobile ou d’autres indicateurs de tendance pour améliorer la fiabilité du signal.
  3. Améliorer le mécanisme de stop-loss : concevoir une stratégie de stop-loss dynamique basée sur la structure du bloc d’ordres.
  4. Optimiser la taille du bloc d’ordres : ajustez dynamiquement la taille du bloc d’ordres en fonction de la volatilité du marché.
  5. Ajouter une analyse de volume : combinez les données de volume pour vérifier l’efficacité de la percée.

Résumer

Il s’agit d’une stratégie de trading complexe qui intègre plusieurs dimensions de l’analyse technique. Elle construit un système de trading complet avec comme noyau la théorie fractale et l’analyse des blocs d’ordres. Les avantages de la stratégie résident dans son adaptabilité et ses multiples mécanismes de confirmation, mais en même temps, il faut également prêter attention à l’impact de l’environnement de marché sur la performance de la stratégie. Grâce aux orientations d’optimisation recommandées, la fiabilité et la stabilité de la stratégie devraient être encore améliorées.

Code source de la stratégie
/*backtest
start: 2019-12-23 08:00:00
end: 2024-12-25 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Supply and Demand - Order Block Strategy", format=format.price, precision=0, overlay=true)

// Input options for customization
changeColor = input(false, title="Change Box Colors?")
breakType = input.string("Wick+Body", title="Fractal Break Type:", options=["Wick+Body", "Body"])
n = input.int(title="Periods", defval=2, minval=1, tooltip="Number of periods for fractal lookback")

if n <= 0
    runtime.error("Periods input must be greater than zero.")

transGreenClr = input.color(color.new(color.green, 80), title="Bg:", inline="a_1")
greenClr = input.color(color.new(color.green, 0), title="Border:", inline="a_1")

transRedClr = input.color(color.new(color.red, 80), title="Bg:", inline="b_1")
redClr = input.color(color.new(color.red, 0), title="Border:", inline="b_1")

// --- Fractal Calculation ---
upFractal = high[n] == ta.highest(high, 2 * n + 1)
downFractal = low[n] == ta.lowest(low, 2 * n + 1)
// --- End Fractal Calculation ---

var float topValue = na
var float bottomValue = na
var int lastRedIndex = na
var float lastRedLow = na
var float lastRedHigh = na
var int lastGreenIndex = na
var float lastGreenLow = na
var float lastGreenHigh = na
var line topLine = na
var line bottomLine = na
var box demandBox = na
var box supplyBox = na
var topBreakBlock = false
var bottomBreakBlock = false
var isLongBreak = false
var isShortBreak = false
topBreakCheckSource = breakType == "Wick+Body" ? high : close
bottomBreakCheckSource = breakType == "Wick+Body" ? low : close

// Last Red Check
if close < open
    lastRedIndex := bar_index
    lastRedLow := low
    lastRedHigh := high

// Last Green Check
if close > open
    lastGreenIndex := bar_index
    lastGreenLow := low
    lastGreenHigh := high

// Top break
if ta.crossover(topBreakCheckSource, topValue) and not topBreakBlock
    topBreakBlock := true
    isLongBreak := true
    // line.set_x2(topLine, bar_index)
    // demandBox := box.new(lastRedIndex - 1, lastRedHigh, lastRedIndex + 1, lastRedLow, bgcolor=transGreenClr, border_color=greenClr)
    if strategy.position_size <= 0
        strategy.entry("Long", strategy.long)

// Bottom break
if ta.crossunder(bottomBreakCheckSource, bottomValue) and not bottomBreakBlock
    bottomBreakBlock := true
    isShortBreak := true
    // line.set_x2(bottomLine, bar_index)
    // supplyBox := box.new(lastGreenIndex - 1, lastGreenHigh, lastGreenIndex + 1, lastGreenLow, bgcolor=transRedClr, border_color=redClr)
    if strategy.position_size >= 0
        strategy.entry("Short", strategy.short)

// New up fractal
if upFractal
    topBreakBlock := false
    isLongBreak := false
    topValue := high[n]
    // topLine := line.new(bar_index[n], topValue, bar_index, topValue, color=color.teal, style=line.style_dotted, width=2)
    // if not isLongBreak[1]
    //     line.delete(topLine[1])

// New down fractal
if downFractal
    bottomBreakBlock := false
    isShortBreak := false
    bottomValue := low[n]
    // bottomLine := line.new(bar_index[n], bottomValue, bar_index, bottomValue, color=color.maroon, style=line.style_dotted, width=2)
    // if not isShortBreak[1]
    //     line.delete(bottomLine[1])

// Box state update
// activeBoxes = box.all
// if array.size(activeBoxes) > 0 and changeColor
//     for i = 0 to array.size(activeBoxes) - 1
//         boxId = array.get(activeBoxes, i)
//         bVal = box.get_bottom(boxId)
//         tVal = box.get_top(boxId)
//         if close < bVal
//             box.set_bgcolor(boxId, transRedClr)
//             box.set_border_color(boxId, redClr)
//         if close > tVal
//             box.set_bgcolor(boxId, transGreenClr)
//             box.set_border_color(boxId, greenClr)

//PLOTS
plotshape(downFractal ,style=shape.triangleup, location=location.belowbar, offset=-n, color=color.new(color.gray,80), size = size.tiny)
plotshape(upFractal, style=shape.triangledown,   location=location.abovebar, offset=-n, color=color.new(color.gray,80), size = size.tiny)

// --- Checklist Table ---
// var table checklistTable = table.new(position.bottom_right, 2, 8, bgcolor=color.new(color.gray, 80), border_width=1)

// if barstate.islast
//     table.cell(checklistTable, 0, 0, "Condition", text_color=color.white, text_size=size.small, bgcolor=color.teal)
//     table.cell(checklistTable, 1, 0, "Status", text_color=color.white, text_size=size.small, bgcolor=color.teal)

//     table.cell(checklistTable, 0, 1, "Up Fractal", text_size=size.small)
//     table.cell(checklistTable, 1, 1, upFractal ? "✅" : "❌", text_color=upFractal ? color.green : color.red, text_size=size.small)

//     table.cell(checklistTable, 0, 2, "Down Fractal", text_size=size.small)
//     table.cell(checklistTable, 1, 2, downFractal ? "✅" : "❌", text_color=downFractal ? color.green : color.red, text_size=size.small)

//     table.cell(checklistTable, 0, 3, "Top Break", text_size=size.small)
//     table.cell(checklistTable, 1, 3, isLongBreak ? "✅" : "❌", text_color=isLongBreak ? color.green : color.red, text_size=size.small)

//     table.cell(checklistTable, 0, 4, "Bottom Break", text_size=size.small)
//     table.cell(checklistTable, 1, 4, isShortBreak ? "✅" : "❌", text_color=isShortBreak ? color.green : color.red, text_size=size.small)

//     table.cell(checklistTable, 0, 5, "Last Red Candle", text_size=size.small)
//     table.cell(checklistTable, 1, 5, close < open ? "✅" : "❌", text_color=close < open ? color.green : color.red, text_size=size.small)

//     table.cell(checklistTable, 0, 6, "Last Green Candle", text_size=size.small)
//     table.cell(checklistTable, 1, 6, close > open ? "✅" : "❌", text_color=close > open ? color.green : color.red, text_size=size.small)

//     table.cell(checklistTable, 0, 7, "Box Color Change Active", text_size=size.small)
//     table.cell(checklistTable, 1, 7, changeColor ? "✅" : "❌", text_color=changeColor ? color.green : color.red, text_size=size.small)