
Die Multi-Time-Periode-Index-Moving-Average-Kreuzungsstrategie ist ein automatisiertes Handelssystem, das auf EMA-Kreuzungssignalen basiert. Es nutzt EMAs für verschiedene Zeitperioden, um Handelssignale zu erzeugen, und kombiniert Stop-Loss- und Take-Profit-Schließmechanismen, um das Risiko zu verwalten. Die Strategie hängt hauptsächlich davon ab, potenzielle Handelschancen zwischen schnellen EMAs und Kreuzungen zwischen langsamen EMAs und höheren Zeitperioden zu identifizieren.
Das Kernprinzip dieser Strategie ist die Verwendung von Index-Moving Averages (EMA) für mehrere Zeiträume, um Markttrends zu erkennen und Handelssignale zu erzeugen.
Mit einem 9-Zyklus-EMA als Schnelllinie, einem 50-Zyklus-EMA als Schnelllinie und einem 100-Zyklus-EMA auf 15-Minuten-Zeiträumen als Referenz für eine höhere Zeitspanne.
Kaufbedingungen für das Signal:
Die Bedingungen für den Verkauf des Signals:
Transaktionsmanagement:
Zeitkontrolle:
Multi-Zeit-Perioden-Analyse: Die Kombination von EMAs in verschiedenen Zeit-Perioden hilft, falsche Signale zu reduzieren und die Qualität des Handels zu verbessern.
Trend-Tracking: Durch EMA-Kreuzungen und Positionsbeziehungen können wir Markttrends effektiv erfassen.
Risikomanagement: Die Verwendung von festen Stop-Loss- und Schritt-to-Profit-Strategien begrenzt potenzielle Verluste und ermöglicht es den Gewinnen, weiter zu wachsen.
Flexibilität: EMA-Parameter, Stop-Loss- und Profit-Level können je nach Markt und Handelsstil angepasst werden.
Automation: Die Strategie ermöglicht vollautomatische Transaktionen über die TradingView-Plattform und PineConnector.
Zeitmanagement: Sie können bestimmte Handelszeiten und -tage festlegen, um den Handel in ungünstigen Marktbedingungen zu vermeiden.
Verzögerung: Die EMA ist im Wesentlichen ein Verzögerungsindikator, der in einem stark schwankenden Markt möglicherweise nicht reagiert.
Falsche Signale: In den Overshooting-Märkten können EMA-Kreuzungen häufig falsche Signale erzeugen, was zu Überhändlungen führt.
Fixed Stop Loss: Die Verwendung eines festen Punktes kann nicht für alle Marktbedingungen geeignet sein und kann zu groß oder zu klein sein.
Abhängig von historischen Daten: Die Effektivität der Strategie ist stark abhängig von der Marktbewegung während der Rückmessphase. Die zukünftige Performance kann unterschiedlich sein.
Marktadaptivität: Die Strategie funktioniert gut für einige Währungspaare, kann aber schlecht für andere sein.
Anpassung der dynamischen Parameter: Berücksichtigung der Anpassung der EMA-Zyklen, Stop-Loss- und Gewinnspanne an die dynamische Marktvolatilität.
Erhöhung der Filterbedingungen: Einführung zusätzlicher Technik- oder Marktstimmungskennzahlen, um Handelssignale zu filtern und Falschsignale zu reduzieren.
Verbesserte Stop-Loss-Strategien: Tracking-Stops oder ATR-basierte dynamische Stop-Loss-Strategien zur besseren Anpassung an Marktschwankungen.
Optimierung der Handelszeiten: Eine detailliertere Zeitanalyse, um die besten Handelszeiten und -termine zu finden.
Erhöhung des Volumenmanagements: Anpassung der Positionsgröße an die Marktvolatilität und das Konto-Risiko.
Analyse der Wechselkurse: Berücksichtigung der Wechselkurse zwischen mehreren Währungspaaren, um eine übermäßige Exposition gegenüber ähnlichen Marktrisiken zu vermeiden.
Maschinelle Lernintegration: Optimierung der Parameterwahl und der Signalgenerierung mit Hilfe von Machine Learning-Algorithmen.
Die Multi-Zeitraum-Index-Moving-Average-Cross-Strategie ist ein automatisiertes Handelssystem, das Trendverfolgung und Risikomanagement kombiniert. Durch die Nutzung von EMA-Cross-Signalen in verschiedenen Zeitabschnitten soll die Strategie Markttrends erfassen und zu geeigneten Zeiten handeln. Obwohl die Strategie unter bestimmten Marktbedingungen gut funktioniert, gibt es einige inhärente Risiken und Einschränkungen.
/*backtest
start: 2023-07-30 00:00:00
end: 2024-07-29 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("Miles Multi TF EMA Strategy v 1", overlay=true)
Fast = input.int(9, "Fast EMA")
Xslow = input.int(50, "Slow EMA")
var bool inTrade = false // Ensure inTrade is declared and initialized
var int tradeDirection = 0
var float buy_slPrice = na
var float buy_tp1Price = na
var float buy_tp2Price = na
var float sell_slPrice = na
var float sell_tp1Price = na
var float sell_tp2Price = na
var bool tp1Hit = false
var bool buytp1Hit = false
var bool selltp1Hit = false
var float entryPrice = na
var float lastSignalBar = na
fastEMA = ta.ema(close, Fast)
XslowEMA = ta.ema(close, Xslow)
var int step = 0
// Example SL and TP settings (adjust according to your strategy)
slPips = input.int(150, "Stop Loss")
tp1Pips = input.int(75, "Take Profit 1")
tp2Pips = input.int(150, "Take Profit 2")
beoff = input.int(25, "Breakeven Offset")
// Define the higher time frame
higherTimeFrame = input.timeframe("15", "Higher Timeframe EMA")
// Fetch the EMA from the higher time frame
higherTimeFrameEMA = request.security(syminfo.tickerid, higherTimeFrame, ta.ema(close, 100))
// Input for trading start and end times, allowing end time to extend beyond midnight
startHour = input.int(1, "Start Hour", minval=0, maxval=23)
endHour = input.int(25, "End Hour", minval=0, maxval=47) // Extend maxval to 47 to allow specifying times into the next day
// Adjust endHour to be within 24-hour format using modulo operation
adjustedEndHour = endHour % 24
// Function to determine if the current time is within the trading hours
isTradingTime(currentHour) =>
if startHour < adjustedEndHour
currentHour >= startHour and currentHour < adjustedEndHour
else
currentHour >= startHour or currentHour < adjustedEndHour
// Get the current hour in the exchange's timezone
currentHour = hour(time, "Australia/Sydney")
// Check if the current time is within the trading hours
trading = isTradingTime(currentHour)
// Plot background color if within trading hours
bgcolor(trading ? color.new(color.blue, 90) : na)
// Inputs for trading days
tradeOnMonday = input.bool(true, "Trade on Monday")
tradeOnTuesday = input.bool(true, "Trade on Tuesday")
tradeOnWednesday = input.bool(true, "Trade on Wednesday")
tradeOnThursday = input.bool(true, "Trade on Thursday")
tradeOnFriday = input.bool(true, "Trade on Friday")
// Current time checks
currentDayOfWeek = dayofweek(time, "Australia/Sydney")
// Check if current time is within trading hours
isTradingHour = (currentHour >= startHour and currentHour < endHour)
// Check if trading is enabled for the current day of the week
isTradingDay = (currentDayOfWeek == dayofweek.monday and tradeOnMonday) or
(currentDayOfWeek == dayofweek.tuesday and tradeOnTuesday) or
(currentDayOfWeek == dayofweek.wednesday and tradeOnWednesday) or
(currentDayOfWeek == dayofweek.thursday and tradeOnThursday) or
(currentDayOfWeek == dayofweek.friday and tradeOnFriday)
// Combined check for trading time and day
isTradingTime = isTradingHour and isTradingDay
buySignal = false
sellSignal = false
// Conditions
if (step == 0 or step == 4) and ta.crossover(fastEMA, XslowEMA) and fastEMA > higherTimeFrameEMA
step := 1
if (step == 0 or step == 4) and ta.crossover(fastEMA, higherTimeFrameEMA)
step := 1
if step == 3 and ta.crossover(fastEMA, XslowEMA) and fastEMA > higherTimeFrameEMA
step := 3
if step == 2 and ta.crossover(fastEMA, XslowEMA) and fastEMA > higherTimeFrameEMA
step := 1
if (step == 0 or step == 3) and ta.crossunder(fastEMA, XslowEMA) and fastEMA < higherTimeFrameEMA
step := 2
if (step == 0 or step == 3) and ta.crossunder(fastEMA, higherTimeFrameEMA)
step := 2
if step == 4 and ta.crossunder(fastEMA, XslowEMA) and fastEMA < higherTimeFrameEMA
step := 4
if step == 1 and ta.crossunder(fastEMA, XslowEMA) and fastEMA < higherTimeFrameEMA
step := 2
// For buy signals
if step == 1 and isTradingTime and fastEMA > ta.ema(close, Xslow) and fastEMA > higherTimeFrameEMA
buySignal := true
inTrade := true
entryPrice := close
tradeDirection := 1
buytp1Hit := false
lastSignalBar := bar_index
buy_slPrice := entryPrice - slPips * syminfo.mintick
buy_tp1Price := entryPrice + tp1Pips * syminfo.mintick // Set TP1
buy_tp2Price := entryPrice + tp2Pips * syminfo.mintick // Set TP2
tp1Hit := false
step := 3
strategy.entry("Buy", strategy.long, stop=buy_slPrice, limit=buy_tp1Price)
if step == 2 and isTradingTime and fastEMA < ta.ema(close, Xslow) and fastEMA < higherTimeFrameEMA
sellSignal := true
inTrade := true
entryPrice := close
tradeDirection := -1
lastSignalBar := bar_index
selltp1Hit := false
sell_slPrice := entryPrice + slPips * syminfo.mintick
sell_tp1Price := entryPrice - tp1Pips * syminfo.mintick // Set TP1
sell_tp2Price := entryPrice - tp2Pips * syminfo.mintick // Set TP2
tp1Hit := false
step := 4
strategy.entry("Sell", strategy.short, stop=sell_slPrice, limit=sell_tp1Price)
// Move SL to breakeven once TP1 is hit and close 25% of the trade
if (ta.valuewhen(strategy.position_size != 0, strategy.position_size, 0) > 0)
if high >= buy_tp1Price and not tp1Hit
tp1Hit := true
buy_slPrice := entryPrice + beoff * syminfo.mintick
strategy.close("Buy", qty_percent = 25, comment = "TP1 Hit")
strategy.exit("Close", from_entry="Buy", stop=buy_slPrice, limit=buy_tp2Price)
if (ta.valuewhen(strategy.position_size != 0, strategy.position_size, 0) < 0)
if low <= sell_tp1Price and not tp1Hit
tp1Hit := true
sell_slPrice := entryPrice - beoff * syminfo.mintick
strategy.close("Sell", qty_percent = 25, comment = "TP1 Hit")
strategy.exit("Close", from_entry="Sell", stop=sell_slPrice, limit=sell_tp2Price)
// Managing the trade after it's initiated
if inTrade and tradeDirection == 1 and sellSignal
inTrade := false
tradeDirection := 0
buy_slPrice := na
buy_tp1Price := na
buy_tp2Price := na
tp1Hit := false
step := 2
if inTrade and tradeDirection == -1 and buySignal
inTrade := false
tradeDirection := 0
sell_slPrice := na
sell_slPrice := na
sell_tp2Price := na
tp1Hit := false
step := 1
if inTrade and tradeDirection == 1 and step == 1
step := 0
if inTrade and tradeDirection == -1 and step == 2
step := 0
if inTrade and tradeDirection == 1 and (bar_index - lastSignalBar) >= 1
if high >= buy_tp1Price and not tp1Hit
tp1Hit := true
buytp1Hit := true
lastSignalBar := bar_index
buy_slPrice := entryPrice + beoff * syminfo.mintick
step := 3
if low <= buy_slPrice and not tp1Hit and (bar_index - lastSignalBar) >= 1
strategy.close("Buy", qty_percent = 100, comment = "SL Hit")
inTrade := false
tradeDirection := 0
buy_slPrice := na
buy_tp1Price := na
buy_tp2Price := na
tp1Hit := false
buytp1Hit := false
step := 0
if inTrade and tradeDirection == 1 and tp1Hit and (bar_index - lastSignalBar) >= 1
if low <= buy_slPrice
inTrade := false
tradeDirection := 0
buy_slPrice := na
buy_tp1Price := na
buy_tp2Price := na
tp1Hit := false
buytp1Hit := false
step := 0
if high >= buy_tp2Price and (bar_index - lastSignalBar) >= 1
inTrade := false
tradeDirection := 0
buy_slPrice := na
buy_tp1Price := na
buy_tp2Price := na
tp1Hit := false
buytp1Hit := false
step := 0
if inTrade and tradeDirection == -1 and (bar_index - lastSignalBar) >= 1
if low <= sell_tp1Price and not tp1Hit
tp1Hit := true
lastSignalBar := bar_index
selltp1Hit := true
sell_slPrice := entryPrice - beoff * syminfo.mintick
step := 4
if high >= sell_slPrice and not tp1Hit and (bar_index - lastSignalBar) >= 1
strategy.close("Sell", qty_percent = 100, comment = "SL Hit")
inTrade := false
tradeDirection := 0
sell_slPrice := na
sell_tp1Price := na
sell_tp2Price := na
tp1Hit := false
selltp1Hit := false
step := 0
if inTrade and tradeDirection == -1 and tp1Hit and (bar_index - lastSignalBar) >= 1
if high >= sell_slPrice
inTrade := false
tradeDirection := 0
sell_slPrice := na
sell_tp1Price := na
sell_tp2Price := na
tp1Hit := false
selltp1Hit := false
step := 0
if low <= sell_tp2Price
inTrade := false
tradeDirection := 0
sell_slPrice := na
sell_tp1Price := na
sell_tp2Price := na
tp1Hit := false
selltp1Hit := false
step := 0