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

Автор:Чао Чжан, Дата: 2023-12-06 11:52:10
Тэги:

img

Обзор

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

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

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

Для дальнейшего улучшения надежности сигналов также вводится индикатор MACD. Когда цена проходит через EMA и SMA, чтобы сформировать сигнал, быстрая линия MACD должна прорваться через медленную линию снизу, а гистограмма MACD должна быть выше оси 0, чтобы вызвать реальный сигнал покупки.

Кроме того, в стратегии устанавливаются стоп-лосс и точка прибыли. После того, как стратегия открывает позицию, точка стоп-лосса и точка прибыли будут рассчитаны и установлены в соответствии с процентом, установленным пользователем. Это может эффективно контролировать риск одной сделки.

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

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

Стратегия перекрестного тренда двойной скользящей средней имеет следующие преимущества:

  1. Объединение нескольких индикаторов, всестороннее рассмотрение цены, тенденции и импульса и установление строгих условий фильтрации сигналов могут эффективно предотвратить ложные сигналы и повысить надежность сигнала.

  2. Использование двух скользящих средних с различными параметрами может лучше идентифицировать рыночные тенденции и фильтровать колеблющиеся рынки. Быстрая линия EMA используется для своевременного отслеживания изменений цен; медленная линия SMA используется для определения долгосрочных тенденций. Комбинация двух линий работает лучше.

  3. Индикатор MACD вводит настраиваемые параметры, которые могут быть настроены в соответствии с особенностями различных рынков и имеет высокую гибкость.

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

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

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

Стратегия перекрестного тренда двойных скользящих средних также сопряжена с определенными рисками, главным образом в следующих областях:

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

  2. Индикаторы MACD могут иметь ложные прорывы, особенно в процессе, когда импульс все еще неясен.

  3. Положение и соотношение настроек стоп-лосса оказывают большое влияние на результаты прибыли и убытка. Если стоп-лосс установлен слишком маленьким, существует риск быть пойманным; если стоп-лосс установлен слишком большим, то одиночный убыток может быть слишком тяжелым. Это требует достаточного тестирования для поиска оптимальных параметров.

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

Соответствующие решения следующие:

  1. Для волатильных рынков необходимо соответствующим образом корректировать параметры скользящих средних, используя более низкие параметры EMA и SMA для снижения частоты перекрестного движения.

  2. Увеличить условия фильтрации, такие как перелом MACD выше и ниже нулевой линии, что может в некоторой степени уменьшить ложные прорывы.

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

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

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

Стратегия двойного скользящего среднего перекрестного тренда по-прежнему может быть оптимизирована, главным образом в следующих аспектах:

  1. Проверить больше показателей для комбинации, чтобы найти лучшие параметры, такие как включение канала BOLL и учет влияния волатильности.

  2. Оптимизировать параметры скользящих средних длин для поиска наилучшей комбинации параметров в различных рыночных условиях.

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

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

  5. Расширять торговые сорта, такие как валюты, криптовалюты и другие сорта.

  6. Оптимизировать стратегии управления капиталом, такие как торговля фиксированной суммой, коэффициент фиксированной позиции и т. д. Контролировать риск потери одной сделки, делая общую кривую капитала более стабильной.

Заключение

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

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

В целом, стратегия двойного движущегося среднего кроссовера формирует относительно полную и строгую торговую систему.


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

//@version=4
// Hi,
// This is my first strategy made by myself(except for the MACD indicator). I'm publishing this to get myself out there and for some newer people to see how a basic strategy works. All credits go to Zen&TheArtofTrading, for teaching me almost everything I know about Pinescript
// The strategy is basically an MACD crossover trend strategy. If the MACD line crosses the signal line upward, above the zero point of the histogram, while the price is above 200 EMA and 100 SMA it's a buy signal
// If the MACD line crosses the signal line downward, while below zero point of the histogram, as well as the price being below 200 EMA and 100 SMA it's a sell signal
// I used the 200 EMA and 100 SMA because I wanted to filter weak signals as much as possible when the market is ranging, if you have any suggestions to go around this better, please let me know, still learning everyday

// If you have any suggestions, tips or tricks please let me know. I'm still new to Pinescript, but having a lot of fun trying stuff out. If you see something in my code that you don't understand, feel free to ask, I'll try to answer as best as I can

// I opened the strategy with predetermined backtesting pyramiding, currency etc. This made the progress of backtesting multiple TP and SL easier. Also the commission value is from Binance Futures, I just left it in there for anyone who wants to just copy this strategy
strategy("MACD Crossover Trend Strategy Template", overlay = true )

// Determining inputs and values, I just copied the built-in MACD strategy and removed everything I didn't need, just needed the barebone indicator and added EMA + SMA inputs
fast_length = input(title = "Fast Length", type = input.integer, defval = 12, group = "MACD Values")
slow_length = input(title = "Slow Length", type = input.integer, defval = 26, group = "MACD Values")
src = input(title = "Source", type = input.source, defval = close, group = "MACD Values")
signal_length = input(title = "Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9, group = "MACD Values")
sma_source = input(title = "Simple MA (Oscillator)", type = input.bool, defval = false, group = "MACD Values")
sma_signal = input(title = "Simple MA (Signal Line)", type = input.bool, defval = false, group = "MACD Values")
fast_ma = sma_source ? sma(src, fast_length) : ema(src, fast_length)
slow_ma = sma_source ? sma(src, slow_length) : ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal ? sma(macd, signal_length) : ema(macd, signal_length)
hist = macd - signal
emaLength = input(title = "EMA", type = input.integer, defval = 200, step = 10, group = "Moving Averages")
smaLength = input(title = "SMA", type = input.integer, defval = 100, step = 10, group = "Moving Averages")

// Input backtest range, you can adjust this here or in the input options
fromMonth = input(defval = 1,    title = "From Month",      type = input.integer, minval = 1, maxval = 12, group = "Backtest Date Range")
fromDay   = input(defval = 1,    title = "From Day",        type = input.integer, minval = 1, maxval = 31, group = "Backtest Date Range")
fromYear  = input(defval = 2000, title = "From Year",       type = input.integer, minval = 1970, group = "Backtest Date Range")
thruMonth = input(defval = 1,    title = "Thru Month",      type = input.integer, minval = 1, maxval = 12, group = "Backtest Date Range")
thruDay   = input(defval = 1,    title = "Thru Day",        type = input.integer, minval = 1, maxval = 31, group = "Backtest Date Range")
thruYear  = input(defval = 2099, title = "Thru Year",       type = input.integer, minval = 1970, group = "Backtest Date Range")

// Inputs for EMA, SMA and to adjust your take profit and stop losses in the input options while backtesting, it's result of your input is calculated back to percentages
ema = ema(close, emaLength)
sma = sma(close, smaLength)
profitlong = input(title = "Profit Long %", type = input.float, defval = 2, minval = 0.1, maxval = 100, step = 0.1, group = "TP / SL %") * 0.01
losslong = input(title = "Loss Long %", type = input.float, defval = 1, minval = 0.1, maxval = 100, step = 0.1, group = "TP / SL %") * 0.01
profitshort = input(title = "Profit Short %", type = input.float, defval = 2, minval = 0.1, maxval = 100, step = 0.1, group = "TP / SL %") * 0.01
lossshort = input(title = "Loss Short %", type = input.float, defval = 1, minval = 0.1, maxval = 100, step = 0.1, group = "TP / SL %") * 0.01

// Check EMA and SMA also check the backtest range. inDataRange is a true or false statement, true if the date right now is between the parameters that's filled at the corresponding inputs
// (for example 1-1-2020 till 12-12-2020, if that specific bar is between these dates, statement is true and trade will be executed)
// If the date is not in between the given parameters, statement turns to false and it won't allow new trades and closes all current trades as seen with the strategy.close_all function
inDataRange = (time >= timestamp(syminfo.timezone, fromYear, fromMonth, fromDay, 0, 0)) and (time < timestamp(syminfo.timezone, thruYear, thruMonth, thruDay, 0, 0))
long = close > ema and close > sma and inDataRange
short = close < ema and close < sma and inDataRange

// Entry and exit signals + checking backtest date range, what the signals are supposed to do is noted at the beginning of the code
// I want a way to filter out weak signals that are ranging around the zero point of the histogram. 
// So far couldn't think of a decent way to do this over multiple symbols since the range of the histogram changes with every symbol, sometimes ranging between 0 and 1 or sometimes ranging between 0 and 1000
// I could probably use a cofficiency or something, but that's beyond my grasp at the moment
// Also I wanted a way to let my strategy determine a stop loss based on the pullback and having a 1.5 risk/reward TP on top of that. Couldn't really figure out a way to determine the pullback
if (crossover(macd, signal) and macd > 0)
    strategy.entry("Long", long = strategy.long,
     comment = "Long Buy",
     when = long)

strategy.exit("Exit Long", "Long", profit = close * profitlong / syminfo.mintick, loss = close * losslong / syminfo.mintick)


if (crossunder(macd, signal) and macd < 0)
    strategy.entry("Short", long = strategy.short,
     comment = "Short Buy",
     when = short)

strategy.exit("Exit Short", "Short", profit = close * profitshort / syminfo.mintick, loss = close * lossshort / syminfo.mintick)

// To make sure the backtesting doesn't leave a position open beyond, or before, our applied dates
if (not inDataRange)
    strategy.close_all()

// plot(strategy.equity, title="equity", color=color.red, linewidth=2, style=plot.style_areabr)

Больше