Эта многочасовая стратегия кроссовера экспоненциальной скользящей средней является автоматизированной торговой системой, основанной на кроссоверных сигналах EMA. Она использует EMA из разных временных рамок для генерации торговых сигналов и включает механизмы стоп-лосса и берущей прибыли для управления рисками. Стратегия в основном опирается на кроссоверы между быстрыми и медленными EMA, а также более высокую временную EMA, для выявления потенциальных торговых возможностей.
Основной принцип этой стратегии заключается в использовании экспоненциальных скользящих средних (EMAs) из нескольких временных рамок для выявления рыночных тенденций и генерации торговых сигналов.
Он использует 9-периодную EMA как быструю линию, 50-периодную EMA как медленную линию и 100-периодную EMA на 15-минутной временной шкале как более высокую временную шкалу.
Условия сигнала покупки:
Условия сигнала продажи:
Управление торговлей:
Контроль времени торговли:
Анализ нескольких временных рамок: объединение EMA из разных временных рамок помогает уменьшить ложные сигналы и улучшить качество торговли.
Следование за тенденциями: эффективно отражает тенденции рынка через перекрестки EMA и относительные позиции.
Управление рисками: использует фиксированную стратегию стоп-лосса и поэтапную стратегию получения прибыли, ограничивая потенциальные потери, позволяя получать прибыль.
Гибкость: параметры EMA, уровень стоп-лосса и уровень получения прибыли могут быть скорректированы для различных рынков и стилей торговли.
Автоматизация: стратегия может быть полностью автоматизирована с помощью платформы TradingView и PineConnector.
Управление временем: возможность устанавливать конкретные часы и дни торговли, чтобы избежать торговли в неблагоприятных рыночных условиях.
Отставание: EMA по своей сути являются отстающими показателями и могут не реагировать достаточно быстро на волатильные рынки.
Ложные сигналы: на рыночных диапазонах перекрестки EMA могут часто вызывать ложные сигналы, что приводит к переоценке.
Фиксированный стоп-лосс: использование стоп-лосса с фиксированной точкой может быть не подходит для всех рыночных условий, иногда слишком большим или слишком маленьким.
Зависимость от исторических данных: эффективность стратегии в значительной степени зависит от поведения рынка в течение периода обратного тестирования, которое может отличаться в будущем.
Приспосабливаемость рынка: в то время как стратегия хорошо работает на некоторых валютных парах, она может быть не так эффективна на других.
Динамическая корректировка параметров: рассмотреть возможность динамической корректировки периодов EMA, уровней стоп-лосса и уровня прибыли на основе волатильности рынка.
Дополнительные условия фильтрации: внедрить дополнительные технические или настроения индикаторы для фильтрации торговых сигналов и сокращения ложноположительных.
Улучшенная стратегия стоп-лосса: внедрять стоп-лосы или динамические стоп-лосы, основанные на ATR, чтобы лучше адаптироваться к волатильности рынка.
Оптимизировать время торговли: Провести более подробный анализ времени, чтобы найти лучшие часы и даты торговли.
Улучшение размеров позиций: корректировка размеров позиций на основе волатильности рынка и риска счета.
Анализ корреляции между несколькими валютными парами: учитывать корреляции между несколькими валютными парами, чтобы избежать чрезмерного воздействия аналогичных рыночных рисков.
Интеграция машинного обучения: Использование алгоритмов машинного обучения для оптимизации процессов выбора параметров и генерации сигналов.
Стратегия кроссовера многочасовых экспоненциальных скользящих средних является автоматизированной торговой системой, которая сочетает в себе следующее за трендом и управление рисками. Используя сигналы EMA кроссовера из разных временных рамок, стратегия направлена на захват рыночных тенденций и выполнение сделок в соответствующее время. Хотя стратегия хорошо работает в определенных рыночных условиях, она все еще имеет присущие риски и ограничения. Для дальнейшего повышения надежности и адаптивности стратегии можно рассмотреть возможность внедрения динамических корректировок параметров, дополнительных условий фильтрации и более сложных методов управления рисками. В целом эта стратегия обеспечивает прочную отправной точку для количественных трейдеров, которые могут быть дополнительно оптимизированы и настроены в соответствии с индивидуальными потребностями и характеристиками рынка.
/*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