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


Дата создания: 2023-09-21 20:34:43 Последнее изменение: 2023-09-21 20:34:43
Копировать: 0 Количество просмотров: 672
1
Подписаться
1617
Подписчики

Обзор

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

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

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

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

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

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

Стратегия выхода из позиции проста и прямолинейна, и выходит из текущей позиции, когда цена наступает на точку остановки.

Стратегические преимущества

  • Эффективное отслеживание трендов с использованием двухлинейной системы
  • Быстрая средняя линия имеет короткую длину, чтобы вовремя улавливать изменения в тренде.
  • Медленная средняя линия длиннее, чтобы определить главное направление
  • Параметры “bars” фильтруют некоторые ложные прорывы.
  • Крайние значения позволяют избежать случайных прорывов вблизи ключевых точек.
  • Применение мобильных стоп-убытков для управления рисками

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

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

Риски можно снизить следующими способами:

  • Оптимизируйте параметры вставки bars, чтобы найти равновесие
  • Попробуйте отфильтровать другие показатели, например MACD
  • Настройка точки остановки для предотвращения преждевременной остановки
  • Рассматривается возможность вступления в механизм восстановления

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

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

  1. Оптимизация параметров средней линии

Можно тестировать больше комбинаций, чтобы найти средний параметр линии, который лучше подходит для текущего рынка. Например, скорректировать быструю линию на 10 циклов, а медленную на 50 циклов.

  1. Добавить другие показатели

Дополнительные показатели, такие как MACD, KDJ и т. д., могут быть протестированы, чтобы избежать ложных прорывов.

  1. Оптимизация механизма поступления

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

  • Если на скоростной линии есть медленная линия, то нужно, чтобы MACDDIFF тоже надела 0, чтобы попасть в игру.
  • Когда вы пересекаете медленную линию на скоростной линии, вы можете определить, есть ли у KDJ золотой форк, чтобы войти в игру.
  1. Оптимизация механизма хранения убытков

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

  1. Присоединение к механизму восстановления

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

Подвести итог

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

Исходный код стратегии
/*backtest
start: 2023-08-21 00:00:00
end: 2023-09-20 00:00:00
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
strategy(title = "Noro's Trend MAs Strategy v2.3", shorttitle = "Trend MAs str 2.3", overlay=true, default_qty_type = strategy.percent_of_equity, default_qty_value=100.0, pyramiding=0)

//Settings
needlong = input(true, "long")
needshort = input(true, "short")
needstops = input(false, "stops")
stoppercent = input(5, defval = 5, minval = 1, maxval = 50, title = "Stop, %")
usefastsma = input(true, "Use fast MA Filter")
fastlen = input(5, defval = 5, minval = 1, maxval = 50, title = "fast MA Period")
slowlen = input(21, defval = 20, minval = 2, maxval = 200, title = "slow MA Period")
bars = input(2, defval = 2, minval = 0, maxval = 3, title = "Bars Q")
needbg = input(false, defval = false, title = "Need trend Background?")
needex = input(true, defval = true, title = "Need extreme? (crypto/fiat only!!!)")
fromyear = input(1900, defval = 1900, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

src = close

//PriceChannel 1
lasthigh = highest(src, slowlen)
lastlow = lowest(src, slowlen)
center = (lasthigh + lastlow) / 2

//PriceChannel 2
lasthigh2 = highest(src, fastlen)
lastlow2 = lowest(src, fastlen)
center2 = (lasthigh2 + lastlow2) / 2

//Trend
trend = low > center and low[1] > center[1] ? 1 : high < center and high[1] < center[1] ? -1 : trend[1]

//Bars
bar = close > open ? 1 : close < open ? -1 : 0
redbars = bars == 0 ? 1 : bars == 1 and bar == -1 ? 1 : bars == 2 and bar == -1 and bar[1] == -1 ? 1 : bars == 3 and bar == -1 and bar[1] == -1 and bar[2] == -1 ? 1 : 0
greenbars = bars == 0 ? 1 : bars == 1 and bar == 1 ? 1 : bars == 2 and bar == 1 and bar[1] == 1 ? 1 : bars == 3 and bar == 1 and bar[1] == 1 and bar[2] == 1 ? 1 : 0

//Fast RSI
fastup = rma(max(change(close), 0), 2)
fastdown = rma(-min(change(close), 0), 2)
fastrsi = fastdown == 0 ? 100 : fastup == 0 ? 0 : 100 - (100 / (1 + fastup / fastdown))

//CryptoBottom
mac = sma(close, 10)
len = abs(close - mac)
sma = sma(len, 100)
max = max(open, close)
min = min(open, close)

//Signals
up1 = trend == 1 and (low < center2 or usefastsma == false) and redbars == 1
dn1 = trend == -1 and (high > center2 or usefastsma == false) and greenbars == 1
up2 = high < center and high < center2 and bar == -1 and needex
dn2 = low > center and low > center2 and bar == 1 and needex
up3 = close < open and len > sma * 3 and min < min[1] and fastrsi < 10 ? 1 : 0

//Lines
plot(center2, color = red, linewidth = 3, transp = 0, title = "Fast MA")
plot(center, color = blue, linewidth = 3, transp = 0, title = "Slow MA")

//Background
col = needbg == false ? na : trend == 1 ? lime : red
bgcolor(col, transp = 80)

//Trading
stoplong = up1 == 1 and needstops == true ? close - (close / 100 * stoppercent) : stoplong[1]
stopshort = dn1 == 1 and needstops == true ? close + (close / 100 * stoppercent) : stopshort[1]

if up1 or up2 or up3
    strategy.entry("Long", strategy.long, needlong == false ? 0 : na, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
    strategy.exit("Stop Long", "Long", stop = stoplong)

if dn1
    strategy.entry("Short", strategy.short, needshort == false ? 0 : na, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
    strategy.exit("Stop Short", "Short", stop = stopshort)
    
if time > timestamp(toyear, tomonth, today, 23, 59)
    strategy.close_all()