Stratégie de fusion de données multisources EMA inFusion Pro

EMA ADX ATR ROC HEIKIN-ASHI VOLUME
Date de création: 2025-09-03 14:23:19 Dernière modification: 2025-09-03 14:23:19
Copier: 0 Nombre de clics: 213
2
Suivre
319
Abonnés

Stratégie de fusion de données multisources EMA inFusion Pro Stratégie de fusion de données multisources EMA inFusion Pro

Une stratégie qui ne regarde pas seulement le prix

Vous savez, la plupart des gens utilisent l’EMA uniquement pour voir le prix, mais où est la puissance de cette stratégie ? Elle peut calculer l’EMA à partir de 6 sources de données différentes ! C’est comme cuisiner avec du sel, du sucre, de la soude, de l’huile d’olive, pour vous donner un signal de transaction plus riche.

Les six sources de données sont les suivantes: prix ordinaire, chiffre d’affaires et taux de variation, prix moyen de la ligne K, chiffre d’affaires moyen de la ligne K et taux de variation moyen de la ligne K. Chacune offre une vision différente du marché!

Le système de triple filtrage de l’acier: un signal plus précis

Cette stratégie n’est pas une stratégie de signalement au hasard !

Première ligne: le jugement des tendances de l’EMA 📈 C’est un peu comme regarder la météo pour savoir si le ciel est clair ou pluvieux.

Deuxième approche: le filtrage de l’intensité ADX 💪
L’ADX est comme un instrument de mesure du vent, il ne donne un signal que si la tendance est assez forte (default 25 ou plus).

Troisième voie: confirmation de la livraison 🔊 L’augmentation des ventes est comme si les actions “parlaient fort”, prouvant que le signal était sérieux et non une blague.

Trois modes de retrait: adaptation à différents styles de négociation

Le plus intéressant, c’est que cette stratégie offre trois sorties, comme si le jeu avait trois difficultés: simple, ordinaire et difficile:

Mode 1: retour à l’arrière 🔄 Le plus simple est grossier, quand il y a un signal à plusieurs têtes, il y a plus de vide, quand il y a un signal à vide, il y a plus de vide.

Modèle 2: ATR dynamique de stop-loss 📏 Adaptation automatique en fonction de la volatilité du marché, point d’assouplissement de stop loss lorsque la volatilité est élevée, point de resserrement lorsque la volatilité est faible

Mode 3: Stop Loss à pourcentage fixe 📊 Il est préférable de comprendre que si vous gagnez 2%, vous partez, et si vous perdez 1,5%, vous perdez (customizable)

Recommandations pour une utilisation au combat

Cycle de validitéLes transactions à court et moyen terme, particulièrement adaptées aux marchés à forte volatilité Un guide pour éviter les fossesLe blogueur a écrit sur le blog de l’opposition: Jeux de progressionLes données de la base de données de la base de données de la base de données de la base de données de la base de données de la base de données de la base de données de la base de données de la base de données de la base de données de la base de données de la base de données de la base de données de la base de données de la base de données.

Le plus grand avantage de cette stratégie est qu’elle est très flexible, vous pouvez choisir la source de données et le mode de sortie qui vous convient le mieux en fonction des différentes conditions du marché.

Code source de la stratégie
/*backtest
start: 2025-01-01 00:00:00
end: 2025-09-01 08:00:00
period: 2h
basePeriod: 2h
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT","balance":500000}]
*/

//@version=5
//@fenyesk
strategy("EMA inFusion Pro - Source Selection", overlay=true, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=10)

// =============================================
// === INPUT PARAMETERS =======================
// =============================================

// Moving Average Source Selection
maSourceSelection = input.string("Price", "Moving Average Source", 
  options=["Price", "Volume", "Rate of Change", "Heikin Ashi Price", "Heikin Ashi Volume", "Heikin Ashi Rate of Change"],
  tooltip="Select data source for EMA calculation")

// EMA Settings
emaLength = input.int(50, title="EMA Length", minval=1, maxval=200)
rocLength = input.int(1, title="Rate of Change Length", minval=1, maxval=50, tooltip="Length for ROC calculation")

// ADX Filter Settings
useAdxFilter = input.bool(true, title="Use ADX Filter", group="ADX Settings")
adxLength = input.int(14, title="ADX Length", minval=1, maxval=50, group="ADX Settings")
adxThreshold = input.float(25, title="ADX Threshold", minval=10, maxval=50, step=0.5, group="ADX Settings")

// Volume Spike Settings
useVolumeFilter = input.bool(true, title="Use Volume Spike Filter", group="Volume Settings")
volumeMultiplier = input.float(1.0, title="Volume Spike Multiplier", minval=1.0, maxval=5.0, step=0.1, group="Volume Settings")
volumeSmaLength = input.int(20, title="Volume SMA Length", minval=5, maxval=100, group="Volume Settings")

// Trading Exit Mode Selector
tradingMode = input.int(2, title="Trading Exit Mode", minval=1, maxval=3, 
  tooltip="1: Exit on reverse signal\n2: ATR based TP/SL\n3: Percent based TP/SL", 
  group="Exit Strategy")

// Mode 3: Percent-Based Settings
takeProfitPercent = input.float(2.0, title="Take Profit %", minval=0.1, maxval=10.0, step=0.1, group="Percent Exit")
stopLossPercent = input.float(1.5, title="Stop Loss %", minval=0.1, maxval=10.0, step=0.1, group="Percent Exit")

// Mode 2: ATR-Based Settings
atrLength = input.int(14, title="ATR Length", minval=1, maxval=50, group="ATR Exit")
atrMultiplierTp = input.float(4.0, title="ATR Take Profit Multiplier", minval=0.1, maxval=10.0, step=0.1, group="ATR Exit")
atrMultiplierSl = input.float(4.0, title="ATR Stop Loss Multiplier", minval=0.1, maxval=10.0, step=0.1, group="ATR Exit")

// =============================================
// === SOURCE CALCULATIONS ====================
// =============================================

// Rate of Change calculation
roc(src, length) =>
    change = src - src[length]
    src[length] != 0 ? (change / src[length] * 100) : 0

// Standard Rate of Change
rocPrice = roc(close, rocLength)
rocVolume = roc(volume, rocLength)

// Heikin Ashi calculations
haClose = (open + high + low + close) / 4
var float haOpen = na
haOpen := na(haOpen[1]) ? (open + close) / 2 : (haOpen[1] + haClose[1]) / 2
haHigh = math.max(high, math.max(haOpen, haClose))
haLow = math.min(low, math.min(haOpen, haClose))

// Heikin Ashi Rate of Change
haRocPrice = roc(haClose, rocLength)
haRocVolume = roc(volume, rocLength)  // Volume remains same for HA

// Define EMA source based on selection
emaSource = switch maSourceSelection
    "Price" => close
    "Volume" => volume
    "Rate of Change" => rocPrice
    "Heikin Ashi Price" => haClose
    "Heikin Ashi Volume" => volume  // Volume doesn't change in HA
    "Heikin Ashi Rate of Change" => haRocPrice
    => close  // Default fallback

// =============================================
// === INDICATOR CALCULATIONS =================
// =============================================

// Core Indicators
emaValue = ta.ema(emaSource, emaLength)
[diPlus, diMinus, adx] = ta.dmi(adxLength, adxLength)
volumeSma = ta.sma(volume, volumeSmaLength)
volumeSpike = volume > (volumeSma * volumeMultiplier)
atrValue = ta.atr(atrLength)

// Trend Conditions (adjusted for different source types)
bullishTrend = switch maSourceSelection
    "Price" => close > emaValue
    "Heikin Ashi Price" => haClose > emaValue
    "Volume" => volume > emaValue
    "Heikin Ashi Volume" => volume > emaValue
    "Rate of Change" => rocPrice > emaValue
    "Heikin Ashi Rate of Change" => haRocPrice > emaValue
    => close > emaValue

bearishTrend = not bullishTrend

// Cross conditions (adjusted for source type)
emaCrossUp = switch maSourceSelection
    "Price" => ta.crossover(close, emaValue)
    "Heikin Ashi Price" => ta.crossover(haClose, emaValue)
    "Volume" => ta.crossover(volume, emaValue)
    "Heikin Ashi Volume" => ta.crossover(volume, emaValue)
    "Rate of Change" => ta.crossover(rocPrice, emaValue)
    "Heikin Ashi Rate of Change" => ta.crossover(haRocPrice, emaValue)
    => ta.crossover(close, emaValue)

emaCrossDown = switch maSourceSelection
    "Price" => ta.crossunder(close, emaValue)
    "Heikin Ashi Price" => ta.crossunder(haClose, emaValue)
    "Volume" => ta.crossunder(volume, emaValue)
    "Heikin Ashi Volume" => ta.crossunder(volume, emaValue)
    "Rate of Change" => ta.crossunder(rocPrice, emaValue)
    "Heikin Ashi Rate of Change" => ta.crossunder(haRocPrice, emaValue)
    => ta.crossunder(close, emaValue)

// Filters
strongTrend = useAdxFilter ? adx >= adxThreshold : true
volumeConfirm = useVolumeFilter ? volumeSpike : true

// Entry Signals
longCondition = emaCrossUp and strongTrend and volumeConfirm
shortCondition = emaCrossDown and strongTrend and volumeConfirm

// =============================================
// === STRATEGY EXECUTION WITH EXIT MODES =====
// =============================================

// MODE 1: EXIT ON REVERSE SIGNAL
if (tradingMode == 1)
    if (longCondition)
        strategy.entry("Long", strategy.long)
        strategy.close("Short")
    if (shortCondition)
        strategy.entry("Short", strategy.short)
        strategy.close("Long")

// MODE 2: ATR-BASED TAKE PROFIT & STOP LOSS
else if (tradingMode == 2)
    if (longCondition)
        strategy.entry("Long", strategy.long)
        strategy.exit("Long TP/SL", "Long", 
          profit=atrMultiplierTp * atrValue / syminfo.mintick, 
          loss=atrMultiplierSl * atrValue / syminfo.mintick)
    
    if (shortCondition)
        strategy.entry("Short", strategy.short)
        strategy.exit("Short TP/SL", "Short", 
          profit=atrMultiplierTp * atrValue / syminfo.mintick, 
          loss=atrMultiplierSl * atrValue / syminfo.mintick)

// MODE 3: PERCENT-BASED TAKE PROFIT & STOP LOSS
else if (tradingMode == 3)
    if (longCondition)
        longTpPrice = close * (1 + takeProfitPercent / 100)
        longSlPrice = close * (1 - stopLossPercent / 100)
        strategy.entry("Long", strategy.long)
        strategy.exit("Long TP/SL", "Long", limit=longTpPrice, stop=longSlPrice)
    
    if (shortCondition)
        shortTpPrice = close * (1 - takeProfitPercent / 100)
        shortSlPrice = close * (1 + stopLossPercent / 100)
        strategy.entry("Short", strategy.short)
        strategy.exit("Short TP/SL", "Short", limit=shortTpPrice, stop=shortSlPrice)

// =============================================
// === VISUALIZATIONS =========================
// =============================================

// Plot EMA with dynamic color based on source type
emaColor = switch maSourceSelection
    "Price" => color.blue
    "Volume" => color.orange
    "Rate of Change" => color.purple
    "Heikin Ashi Price" => color.green
    "Heikin Ashi Volume" => color.red
    "Heikin Ashi Rate of Change" => color.maroon
    => color.blue

plot(emaValue, title="EMA", color=emaColor, linewidth=2)

// Plot source data for reference (in separate pane when not price-based)
sourceColor = maSourceSelection == "Price" or maSourceSelection == "Heikin Ashi Price" ? na : color.gray
plot(str.contains(maSourceSelection, "Price") ? na : emaSource, title="Source Data", color=sourceColor)

// Background color based on trend
bgcolor(bullishTrend ? color.new(color.green, 95) : color.new(color.red, 95), title="Trend Background")

// Entry signals
plotshape(longCondition, title="Long Signal", style=shape.triangleup, location=location.belowbar, color=color.green, size=size.small)
plotshape(shortCondition, title="Short Signal", style=shape.triangledown, location=location.abovebar, color=color.red, size=size.small)

// Volume spikes
plotchar(useVolumeFilter and volumeSpike, title="Volume Spike", char="V", location=location.bottom, color=color.orange, size=size.tiny)

// ATR-based levels for Mode 2
plot(tradingMode == 2 and strategy.position_size > 0 ? strategy.position_avg_price + (atrMultiplierTp * atrValue) : na, 
  title="Long TP Level", color=color.green, style=plot.style_circles, linewidth=1)
plot(tradingMode == 2 and strategy.position_size > 0 ? strategy.position_avg_price - (atrMultiplierSl * atrValue) : na, 
  title="Long SL Level", color=color.red, style=plot.style_circles, linewidth=1)
plot(tradingMode == 2 and strategy.position_size < 0 ? strategy.position_avg_price - (atrMultiplierTp * atrValue) : na, 
  title="Short TP Level", color=color.green, style=plot.style_circles, linewidth=1)
plot(tradingMode == 2 and strategy.position_size < 0 ? strategy.position_avg_price + (atrMultiplierSl * atrValue) : na, 
  title="Short SL Level", color=color.red, style=plot.style_circles, linewidth=1)


// Alert conditions
alertcondition(longCondition, title="Long Entry", message="EMA Fusion Pro: Long entry signal")
alertcondition(shortCondition, title="Short Entry", message="EMA Fusion Pro: Short entry signal")