На основе анализа стратегии двойной EMA


Дата создания: 2024-02-28 18:07:59 Последнее изменение: 2024-02-28 18:07:59
Копировать: 1 Количество просмотров: 550
1
Подписаться
1617
Подписчики

На основе анализа стратегии двойной EMA

Обзор

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

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

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

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

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

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

Эта стратегия имеет следующие преимущества:

  1. Стратегическая концепция проста и понятна, легко понятна и реализуема.
  2. Умение эффективно идентифицировать ценовые тенденции, своевременно строить позиции и отслеживать тенденции.
  3. Используйте EMA, чтобы отфильтровывать шум и избежать помех от краткосрочных колебаний цен.
  4. Можно настроить параметры EMA, чтобы скорректировать чувствительность стратегии.

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

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

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

Оптимизация стратегии

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

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

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

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

Исходный код стратегии
/*backtest
start: 2023-02-21 00:00:00
end: 2024-02-27 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
// This can only draw so many lines. Use bar replay to go back further
strategy("Strategy Lines", shorttitle="Strategy Lines", overlay=true, max_lines_count=500)

//###########################################################################################################################################
// Replace your strategy here
//###########################################################################################################################################

shortEMA = ta.ema(close, input(9, title="Short EMA Length"))
longEMA = ta.ema(close, input(21, title="Long EMA Length"))

// Entry conditions for long and short positions
longCondition = ta.crossover(shortEMA, longEMA)
shortCondition = ta.crossunder(shortEMA, longEMA)

//###########################################################################################################################################
// Strategy Lines
//###########################################################################################################################################

var timeLow = bar_index
var line li = na
var openLPrice = 0.0000
var openSPrice = 0.0000

LongWColor = input.color(color.rgb(0,255,0,0),"Long Win Color", group="Strategy Lines")
LongLColor = input.color(color.rgb(0,0,255,0),"Long Loss Color", group="Strategy Lines")
ShortWColor = input.color(color.rgb(255,255,0,0),"Short Win Color", group="Strategy Lines")
ShortLColor = input.color(color.rgb(255,0,0,0),"Short Loss Color", group="Strategy Lines")
WinFontColor = input.color(color.rgb(0,0,0,0),"Win Font Color", group="Strategy Lines")
LossFontColor = input.color(color.rgb(255,255,255,0),"Loss Font Color", group="Strategy Lines")
LinesShowLabel = input(false,"Show Labels?",group = "Strategy Lines")

// // Start new line when we go long
// if strategy.position_size >0
//     line.delete(li)
//     li := line.new(timeLow, close[bar_index-timeLow], bar_index, close, width=2, color=close>openLPrice?LongWColor:LongLColor)

// // Start new line when we go short
// if strategy.position_size <0
//     line.delete(li)
//     li := line.new(timeLow, close[bar_index-timeLow], bar_index, close, width=2, color=close<openSPrice?ShortWColor:ShortLColor)

// //Delete Lines if we don't have a position open
// if strategy.position_size ==0
//     li := line.new(timeLow, close[bar_index-timeLow], bar_index, close, width=2, color=color.rgb(0,0,0,100))
//     line.delete(li)

if LinesShowLabel
    // Short Label
    if strategy.position_size>=0 and strategy.position_size[1] <0
        label.new(
             timeLow, na, 
             text=str.tostring((openSPrice-close[1])/(syminfo.mintick*10)), 
             color=close[1]<openSPrice?ShortWColor:ShortLColor, 
             textcolor=close[1]<openSPrice?WinFontColor:LossFontColor,
             size=size.small, 
             style=label.style_label_down, yloc=yloc.abovebar)
    // Long Label
    if strategy.position_size<=0 and strategy.position_size[1] >0
        label.new(
             timeLow, na,
             text=str.tostring((close[1]-openLPrice)/(syminfo.mintick*10)), 
             color=close[1]>openLPrice?LongWColor:LongLColor, 
             textcolor=close[1]>openLPrice?WinFontColor:LossFontColor,
             size=size.small, 
             style=label.style_label_down, yloc=yloc.abovebar)

// Open long position and draw line
if (longCondition)
    //strategy.entry("Long", strategy.long)
    // timeLow := bar_index
    // li := line.new(timeLow, close[bar_index-timeLow], bar_index, close, width=2, color=close>openLPrice?LongWColor:LongLColor)
    openLPrice := close

// Open short position and draw line
if (shortCondition)
    //strategy.entry("Short", strategy.short)
    // timeLow := bar_index
    // li := line.new(timeLow, close[bar_index-timeLow], bar_index, close, width=2, color=close<openSPrice?ShortWColor:ShortLColor)
    openSPrice := close

//###########################################################################################################################################
// Strategy Execution (Replace this as well)
//###########################################################################################################################################

if (longCondition)
    strategy.entry("Long", strategy.long)

if (shortCondition)
    strategy.entry("Short", strategy.short)