Стратегия торговли скользящей средней Momentum


Дата создания: 2024-01-24 11:09:58 Последнее изменение: 2024-01-24 11:09:58
Копировать: 0 Количество просмотров: 614
1
Подписаться
1617
Подписчики

Стратегия торговли скользящей средней Momentum

Обзор

Эта стратегия основана на перекрестке быстрых и медленных движущихся средних для определения рыночных тенденций и точек покупки и продажи. Когда быстрые ЭМА пересекают медленные ЭМА, они оцениваются как находящиеся в восходящем тренде и создают сигнал покупки; когда быстрые ЭМА пересекают медленные ЭМА, они оцениваются как находящиеся в нисходящем тренде и создают сигнал продажи.

Стратегический принцип

Эта стратегия использует крест быстрого ЭМА (линия 8 дней) и медленного ЭМА (линия 21 дней) для определения тенденций рынка. Конкретная логика заключается в следующем:

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

Эта стратегия, в сочетании с динамическими индикаторами и анализом тенденций, эффективно улавливает направление рынка и точки разворота. Быстрое пересечение EMA и сочетание с гладкой скользящей средней фильтруют некоторые шумные торговые сигналы.

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

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

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

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

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

Однако эта стратегия несет в себе определенные риски:

  1. В шокирующих ситуациях часто встречаются перекрестные сигналы EMA, что приводит к большему количеству ошибочных сделок.
  2. Неспособность эффективно реагировать на возникновение пробелов в воздухе
  3. Не принимая во внимание долгосрочные тенденции на большом уровне.

Мы можем оптимизировать эти риски в следующих областях:

  1. Добавление фильтров на другие индикаторы, такие как Brinband, 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)