
EMAは6つの異なるデータソースから EMAを計算できます! 料理に塩を添加するだけでなく,砂糖,,油を添加するように,より豊かな取引シグナルを与えます.
6つのデータソースは,平均価格,取引量,変化率,K線平均価格,K線平均取引量,K線平均変化率です.
この戦略は気まぐれに信号を出すのではなく,3つの”セキュリティチェック”があります.
“つ目は EMA の傾向判断 📈 雨が降るか晴れかを予測する気象予報のようです
2つ目:ADXの強度フィルター 💪
ADXは風力測定器のようなもので,傾向が強い (25以上) ならば,信号を発する.
3つ目は 取引の確認です 🔊 売上高の急上昇は株価が”大声で話す”ように,この信号が冗談ではなく真面目であることを証明しています.
この戦略は,ゲームが”簡単”“普通”“難しい”の3つの難易度を持つように, 3つの退出方法を提示しています.
パターン1:逆信号退出 🔄 単純に粗野で,多頭信号が来たら空っぽになる. 空頭信号が来たら空っぽになる.
モード2:ATR 動的止止損 📏 市場変動に応じて自動調整,大波動時に止損緩和ポイント,小波動時に緊縮ポイント
モデル3: 固定パーセントのストップ・ストップ・損失 📊 負けたら負ける,負けたら負ける,負けたら負ける.
適用周期中短取引は,特に変動のある市場に適しています. 洞窟のガイド“ADXフィルター”を有効にする ステップアップ: 試しに様々なデータソースを試してもいいし, 量源は量突破時に特に効果的だ!
この戦略の最大の利点は,柔軟性があり,さまざまな市場状況に応じて最も適切なデータソースと退出方法を選択できるということです. 完璧な戦略はありません,現在の市場に最も適した戦略しかありません!
/*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")