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