Cette stratégie est un système de négociation dynamique basé sur l'indicateur TTM, qui détermine la direction de la tendance du marché en calculant des moyennes mobiles exponentielles (EMA) des hauts et des bas, et déploie un système de négociation en réseau autour d'un prix de base dynamiquement mis à jour.
La logique de base réside dans le calcul de l'état TTM, mis en œuvre à travers les étapes suivantes: 1. Calculer deux EMAs basées sur le paramètre ttmPeriod: EMA des plus bas (lowMA) et des plus hauts (highMA) 2. Définir deux niveaux de seuil entre l'AMC élevé et l'AMC bas: - basTroisième:1⁄3position depuis le bas - haut Troisième:2⁄3position depuis le bas 3. Déterminez l'état de la MTP en fonction de la position de prix de clôture par rapport à ces seuils: - Retourne 1 (tendance haussière) lorsque la clôture est supérieure à la hausseThird - Retourne 0 (baisse de tendance) lorsque la clôture est inférieure à la basseThird - Retourne -1 (état neutre) lorsque close est entre lowThird et highThird
Le système de négociation de grille s'ajuste dynamiquement en fonction de l'état TTM: 1. met à jour le prix et la direction de base de la grille lorsque l'état du TTM change 2. Calcule les niveaux de prix d'achat/de vente en fonction de la direction et de l'espacement de la grille 3. Exécute les opérations d'achat ou de vente correspondantes lorsque le prix dépasse les niveaux de la grille
Cette stratégie combine la détection de tendance TTM avec le trading dynamique de la grille pour créer un système de trading adaptatif et contrôlé par les risques.
/*backtest start: 2024-12-04 00:00:00 end: 2024-12-11 00:00:00 period: 1m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("TTM Grid Strategy", overlay=true) // Input parameters int ttmPeriod = input.int(6, minval=1, title="TTM Period") int gridLevels = input.int(5, minval=2, title="Grid Levels") float gridSpacing = input.float(0.01, minval=0.0001, title="Grid Spacing (%)") // Calculate TTM State ttmState() => lowMA = ta.ema(low, ttmPeriod) highMA = ta.ema(high, ttmPeriod) lowThird = (highMA - lowMA) / 3 + lowMA highThird = 2 * (highMA - lowMA) / 3 + lowMA if close > highThird 1 else if close < lowThird 0 else -1 // State tracking variables var float gridBasePrice = 0.0 var int gridDirection = -1 // Determine grid state updateGridState(float currentClose, int currentState) => float newBasePrice = gridBasePrice int newDirection = gridDirection if currentState != -1 and currentState != gridDirection newBasePrice := currentClose newDirection := currentState [newBasePrice, newDirection] // Calculate grid levels calcGridLevels(float basePrice, int direction, int levels) => float[] buyLevels = array.new_float(levels) float[] sellLevels = array.new_float(levels) for i = 1 to levels multiplier = i * gridSpacing if direction == 1 // Buy grid array.set(buyLevels, i-1, basePrice * (1 - multiplier)) array.set(sellLevels, i-1, basePrice * (1 + multiplier)) else // Sell grid array.set(buyLevels, i-1, basePrice * (1 + multiplier)) array.set(sellLevels, i-1, basePrice * (1 - multiplier)) [buyLevels, sellLevels] // Execute grid trades executeGridTrades(float basePrice, int direction, int levels) => [buyLevels, sellLevels] = calcGridLevels(basePrice, direction, levels) for i = 0 to levels - 1 float buyLevel = array.get(buyLevels, i) float sellLevel = array.get(sellLevels, i) if direction == 1 // Buy grid if low <= buyLevel strategy.entry("GridBuy" + str.tostring(i), strategy.long, comment="Buy Level " + str.tostring(i)) if high >= sellLevel strategy.entry("GridSell" + str.tostring(i), strategy.short, comment="Sell Level " + str.tostring(i)) else // Sell grid if high >= buyLevel strategy.entry("GridBuy" + str.tostring(i), strategy.long, comment="Buy Level " + str.tostring(i)) if low <= sellLevel strategy.entry("GridSell" + str.tostring(i), strategy.short, comment="Sell Level " + str.tostring(i)) // Main strategy logic currentState = ttmState() [newGridBasePrice, newGridDirection] = updateGridState(close, currentState) // Update global variables if newGridBasePrice != gridBasePrice gridBasePrice := newGridBasePrice if newGridDirection != gridDirection gridDirection := newGridDirection // Execute grid trades executeGridTrades(newGridBasePrice, newGridDirection, gridLevels) // Visualization plotColor = newGridDirection == 1 ? color.green : color.red plot(newGridBasePrice, color=plotColor, style=plot.style_cross)