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


Дата создания: 2023-12-06 11:52:10 Последнее изменение: 2023-12-06 11:52:20
Копировать: 0 Количество просмотров: 741
1
Подписаться
1619
Подписчики

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

Обзор

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

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

Стратегия использует два движущихся средних, EMA и SMA. EMA длиной 200 дней, SMA длиной 100 дней. При повышении цены, когда она пробивает два средних, создается сигнал покупки. При снижении цены, когда она пробивает два средних, создается сигнал продажи.

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

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

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

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

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

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

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

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

  4. Установка стоп-стоп-стоп-стоп-стоп-стоп-стоп-стоп-стоп-стоп-стоп-стоп-стоп-стоп-стоп-стоп-стоп-стоп-стоп-стоп-стоп-стоп-стоп-стоп-стоп-стоп-стоп-стоп-стоп-стоп-стоп-стоп-стоп-стоп-стоп-стоп-стоп-стоп-стоп-стоп-стоп Слишком высокий риск потерь в одиночку. Умеренный процент, установленный для хранения, может блокировать часть прибыли, снижая рыночный риск после получения прибыли.

  5. Параметры стратегии могут быть настроены гибко и могут быть скорректированы в зависимости от результатов оптимизации.

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

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

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

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

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

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

В соответствии с этим, решение было следующим:

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

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

  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)