Стратегия торговли с пересечением движущейся средней динамики

Автор:Чао Чжан, Дата: 2024-01-24 11:09:58
Тэги:

img

Обзор

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

Логика стратегии

Стратегия использует перекресток между быстрой EMA (8 дней) и медленной EMA (21 день) для определения тенденции рынка.

  1. Расчет 8-дневной и 21-дневной EMA
  2. Когда 8-дневная EMA пересекает 21-дневную EMA, определяется, что рыночная тенденция изменилась и началась восходящая тенденция.
  3. Когда 8-дневная EMA пересекается ниже 21-дневной EMA, определяется, что рыночная тенденция изменилась и началась нисходящая тенденция.
  4. Во время восходящего тренда генерируется сигнал покупки. Во время нисходящего тренда генерируется сигнал продажи
  5. Установите цены стоп-лосса и прибыли для управления рисками для каждой позиции

Стратегия сочетает в себе индикаторы импульса и анализ трендов для эффективного определения направления рынка и точек переворота.

Анализ преимуществ

Основными преимуществами этой стратегии являются:

  1. Быстрые и медленные пересечения EMA могут эффективно определять рыночные тенденции и торговые сигналы
  2. Большое пространство для оптимизации параметров стратегии, где периоды EMA могут быть дополнительно настроены
  3. Сигналы шума могут быть эффективно отфильтрованы путем включения индикаторов импульса
  4. Активное управление рисками путем настройки логики стоп-лосса и логики получения прибыли

В целом, стратегия сочетает в себе индикаторы тренда и импульса. Благодаря настройке параметров она может адаптироваться к различным рыночным условиям и является относительно гибкой краткосрочной торговой стратегией.

Анализ рисков

Эта стратегия также сопряжена с некоторыми рисками:

  1. На рыночных диапазонах частые перекрестные сигналы EMA могут привести к увеличению количества ложных сделок
  2. Неэффективное управление риском дефицита
  3. Долгосрочное направление тенденции не рассматривается

Для устранения этих рисков можно сделать некоторые оптимизации:

  1. Добавьте другие фильтры, такие как полосы Боллинджера, KDJ, чтобы уменьшить ложные сигналы
  2. Для определения долгосрочной тенденции включить более длительные временные индикаторы
  3. Оптимизировать такие параметры, как длины EMA, чтобы адаптироваться к различным рынкам
  4. Ручное вмешательство для предотвращения больших потерь от скольжения из-за пробелов

Руководство по оптимизации

Для оптимизации этой стратегии еще есть много возможностей:

  1. Оптимизировать параметры периода EMA на основе исторических показателей
  2. Добавление других технических показателей для фильтрации сигналов, например, KDJ, MACD для повышения точности
  3. Оптимизировать установку стоп-лосса и прибыли, чтобы лучше соответствовать рыночным характеристикам
  4. Использование методов машинного обучения для автоматической оптимизации параметров

Эти меры могут значительно улучшить стабильность, адаптивность и рентабельность стратегии.

Заключение

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


/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © TradersPostInc

//@version=5
strategy('TradersPost Example MOMO Strategy', overlay=true)

startTime = input(defval = timestamp('01 Jan 2021 00:00 +0000'), title = 'Start Time', group = 'Date Range')
endTime = input(defval = timestamp('31 Dec 2023 23:59 +0000'), title = 'End Time', group = 'Date Range')
timeCondition = true
timeConditionEnd = timeCondition[1] and not timeCondition

fastEmaLength = input.int(defval = 8, title = 'Fast EMA Length')
slowEmaLength = input.int(defval = 21, title = 'Slow EMA Length')
sides = input.string(defval = 'Both', title = 'Sides', options = ['Long', 'Short', 'Both', 'None'])

fastEma = ta.ema(close, fastEmaLength)
slowEma = ta.ema(close, slowEmaLength)

isUptrend = fastEma >= slowEma
isDowntrend = fastEma <= slowEma
trendChanging = ta.cross(fastEma, slowEma)

ema105 = request.security(syminfo.tickerid, '30', ta.ema(close, 105)[1], barmerge.gaps_off, barmerge.lookahead_on)
ema205 = request.security(syminfo.tickerid, '30', ta.ema(close, 20)[1], barmerge.gaps_off, barmerge.lookahead_on)
plot(ema105, linewidth=4, color=color.new(color.purple, 0), editable=true)
plot(ema205, linewidth=2, color=color.new(color.purple, 0), editable=true)

aa = plot(fastEma, linewidth=3, color=color.new(color.green, 0), editable=true)
bb = plot(slowEma, linewidth=3, color=color.new(color.red, 0), editable=true)
fill(aa, bb, color=isUptrend ? color.green : color.red, transp=90)

tradersPostBuy = trendChanging and isUptrend and timeCondition
tradersPostSell = trendChanging and isDowntrend and timeCondition

pips = syminfo.pointvalue / syminfo.mintick

percentOrPipsInput = input.string('Percent', title='Percent or Pips', options=['Percent', 'Pips'])

stopLossLongInput = input.float(defval=0, step=0.01, title='Stop Loss Long', minval=0)
stopLossShortInput = input.float(defval=0, step=0.01, title='Stop Loss Short', minval=0)

takeProfitLongInput = input.float(defval=0, step=0.01, title='Target Profit Long', minval=0)
takeProfitShortInput = input.float(defval=0, step=0.01, title='Target Profit Short', minval=0)

stopLossPriceLong = ta.valuewhen(tradersPostBuy, close, 0) * (stopLossLongInput / 100) * pips
stopLossPriceShort = ta.valuewhen(tradersPostSell, close, 0) * (stopLossShortInput / 100) * pips

takeProfitPriceLong = ta.valuewhen(tradersPostBuy, close, 0) * (takeProfitLongInput / 100) * pips
takeProfitPriceShort = ta.valuewhen(tradersPostSell, close, 0) * (takeProfitShortInput / 100) * pips

takeProfitALong = takeProfitLongInput > 0 ? takeProfitLongInput : na
takeProfitBLong = takeProfitPriceLong > 0 ? takeProfitPriceLong : na

takeProfitAShort = takeProfitShortInput > 0 ? takeProfitShortInput : na
takeProfitBShort = takeProfitPriceShort > 0 ? takeProfitPriceShort : na

stopLossALong = stopLossLongInput > 0 ? stopLossLongInput : na
stopLossBLong = stopLossPriceLong > 0 ? stopLossPriceLong : na

stopLossAShort = stopLossShortInput > 0 ? stopLossShortInput : na
stopLossBShort = stopLossPriceShort > 0 ? stopLossPriceShort : na

takeProfitLong = percentOrPipsInput == 'Pips' ? takeProfitALong : takeProfitBLong
stopLossLong = percentOrPipsInput == 'Pips' ? stopLossALong : stopLossBLong
takeProfitShort = percentOrPipsInput == 'Pips' ? takeProfitAShort : takeProfitBShort
stopLossShort = percentOrPipsInput == 'Pips' ? stopLossAShort : stopLossBShort

buyAlertMessage = '{"ticker": "' + syminfo.ticker + '", "action": "buy", "price": ' + str.tostring(close) + '}'
sellAlertMessage = '{"ticker": "' + syminfo.ticker + '", "action": "sell", "price": ' + str.tostring(close) + '}'

exitLongAlertMessage = '{"ticker": "' + syminfo.ticker + '", "action": "exit", "price": ' + str.tostring(close) + '}'
exitShortAlertMessage = '{"ticker": "' + syminfo.ticker + '", "action": "exit", "price": ' + str.tostring(close) + '}'

if (sides != "None")
    if tradersPostBuy
        strategy.entry('Long', strategy.long, when = sides != 'Short', alert_message = buyAlertMessage)
        strategy.close('Short', when = sides == "Short" and timeCondition, alert_message = exitShortAlertMessage)

    if tradersPostSell
        strategy.entry('Short', strategy.short, when = sides != 'Long', alert_message = sellAlertMessage)
        strategy.close('Long', when = sides == 'Long', alert_message = exitLongAlertMessage)

exitAlertMessage = '{"ticker": "' + syminfo.ticker + '", "action": "exit"}'

strategy.exit('Exit Long', from_entry = "Long", profit = takeProfitLong, loss = stopLossLong, alert_message = exitAlertMessage)
strategy.exit('Exit Short', from_entry = "Short", profit = takeProfitShort, loss = stopLossShort, alert_message = exitAlertMessage)

strategy.close_all(when = timeConditionEnd)

Больше