В процессе загрузки ресурсов... загрузка...

Стратегия перекрестного использования экспоненциальной скользящей средней за несколько временных рамок

Автор:Чао Чжан, Дата: 2024-07-30 12:02:23
Тэги:ЕМАSLТПTF

img

Обзор

Эта многочасовая стратегия кроссовера экспоненциальной скользящей средней является автоматизированной торговой системой, основанной на кроссоверных сигналах EMA. Она использует EMA из разных временных рамок для генерации торговых сигналов и включает механизмы стоп-лосса и берущей прибыли для управления рисками. Стратегия в основном опирается на кроссоверы между быстрыми и медленными EMA, а также более высокую временную EMA, для выявления потенциальных торговых возможностей.

Принципы стратегии

Основной принцип этой стратегии заключается в использовании экспоненциальных скользящих средних (EMAs) из нескольких временных рамок для выявления рыночных тенденций и генерации торговых сигналов.

  1. Он использует 9-периодную EMA как быструю линию, 50-периодную EMA как медленную линию и 100-периодную EMA на 15-минутной временной шкале как более высокую временную шкалу.

  2. Условия сигнала покупки:

    • Быстрая EMA пересекает более медленную EMA, а быстрая EMA находится выше более высокой временной EMA; или
    • Быстрая EMA пересекает более высокую временную рамку EMA.
  3. Условия сигнала продажи:

    • Быстрая EMA пересекается ниже медленной EMA, а быстрая EMA находится ниже более высокой временной EMA; или
    • Быстрая EMA пересекается ниже более высокой EMA.
  4. Управление торговлей:

    • Определяет фиксированные уровни стоп-лосса (SL) и прибыли (TP).
    • Когда цена достигает первого уровня получения прибыли (TP1), она закрывает 25% позиции и перемещает стоп-лосс на уровень безубыточности.
    • Оставшаяся позиция продолжает работать до достижения второго уровня получения прибыли (TP2) или стоп-лосса.
  5. Контроль времени торговли:

    • Разрешает устанавливать конкретные часы торговли и дни торговли.

Преимущества стратегии

  1. Анализ нескольких временных рамок: объединение EMA из разных временных рамок помогает уменьшить ложные сигналы и улучшить качество торговли.

  2. Следование за тенденциями: эффективно отражает тенденции рынка через перекрестки EMA и относительные позиции.

  3. Управление рисками: использует фиксированную стратегию стоп-лосса и поэтапную стратегию получения прибыли, ограничивая потенциальные потери, позволяя получать прибыль.

  4. Гибкость: параметры EMA, уровень стоп-лосса и уровень получения прибыли могут быть скорректированы для различных рынков и стилей торговли.

  5. Автоматизация: стратегия может быть полностью автоматизирована с помощью платформы TradingView и PineConnector.

  6. Управление временем: возможность устанавливать конкретные часы и дни торговли, чтобы избежать торговли в неблагоприятных рыночных условиях.

Стратегические риски

  1. Отставание: EMA по своей сути являются отстающими показателями и могут не реагировать достаточно быстро на волатильные рынки.

  2. Ложные сигналы: на рыночных диапазонах перекрестки EMA могут часто вызывать ложные сигналы, что приводит к переоценке.

  3. Фиксированный стоп-лосс: использование стоп-лосса с фиксированной точкой может быть не подходит для всех рыночных условий, иногда слишком большим или слишком маленьким.

  4. Зависимость от исторических данных: эффективность стратегии в значительной степени зависит от поведения рынка в течение периода обратного тестирования, которое может отличаться в будущем.

  5. Приспосабливаемость рынка: в то время как стратегия хорошо работает на некоторых валютных парах, она может быть не так эффективна на других.

Направления оптимизации стратегии

  1. Динамическая корректировка параметров: рассмотреть возможность динамической корректировки периодов EMA, уровней стоп-лосса и уровня прибыли на основе волатильности рынка.

  2. Дополнительные условия фильтрации: внедрить дополнительные технические или настроения индикаторы для фильтрации торговых сигналов и сокращения ложноположительных.

  3. Улучшенная стратегия стоп-лосса: внедрять стоп-лосы или динамические стоп-лосы, основанные на ATR, чтобы лучше адаптироваться к волатильности рынка.

  4. Оптимизировать время торговли: Провести более подробный анализ времени, чтобы найти лучшие часы и даты торговли.

  5. Улучшение размеров позиций: корректировка размеров позиций на основе волатильности рынка и риска счета.

  6. Анализ корреляции между несколькими валютными парами: учитывать корреляции между несколькими валютными парами, чтобы избежать чрезмерного воздействия аналогичных рыночных рисков.

  7. Интеграция машинного обучения: Использование алгоритмов машинного обучения для оптимизации процессов выбора параметров и генерации сигналов.

Заключение

Стратегия кроссовера многочасовых экспоненциальных скользящих средних является автоматизированной торговой системой, которая сочетает в себе следующее за трендом и управление рисками. Используя сигналы 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

Связанные

Больше