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


Дата создания: 2024-02-05 14:21:18 Последнее изменение: 2024-02-05 14:21:18
Копировать: 0 Количество просмотров: 629
1
Подписаться
1617
Подписчики

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

Обзор

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

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

Стратегия использует три средних значения EMA, которые называются 10-дневными, 20-дневными и 50-дневными линиями.

  1. когда 10-я и 20-я линия ЕМА находятся одновременно над 50-й линией ЕМА, определяется как восходящий тренд;

  2. Определяется как нисходящий тренд, когда 10-я и 20-я линии ЕМА находятся одновременно ниже 50-й линии ЕМА;

  3. Покупательский сигнал генерируется при прохождении долгосрочной линии EMA (линии 10 и 20 дней) через короткую линию EMA (линию 50 дней);

  4. Сигнал продажи производится при прохождении долгосрочной линии EMA (линии 10-ти и 20-ти дней) под короткосрочной линией EMA (линией 50-ти дней);

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

  6. При переходе тренда (короткая линия EMA проникает в длинную линию) выровняет позиции в направлении текущего сигнала.

Эта стратегия используется для совершения многообещающих операций по очереди с помощью “capture profit” и “locking profit” путем своевременного закрытия позиций.

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

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

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

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

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

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

Оптимизируйте эти риски следующими способами:

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

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

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

  1. Параметровая оптимизация. Можно тестировать комбинации параметров различных циклов EMA, чтобы найти оптимальные параметры;

  2. Оптимизация затрат на торговлю. Оптимизация правил открытия позиций, снижение ненужной частоты торговли;

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

  4. В сочетании с другими показателями. Использование других показателей, таких как MACD, KDJ и т. Д., чтобы помочь в определении и оптимизации времени поступления.

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

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

Исходный код стратегии
/*backtest
start: 2024-01-28 00:00:00
end: 2024-01-31 04:00:00
period: 45m
basePeriod: 5m
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/
// © mattehalen

//@version=4
//study("EMA 10,20 59",overlay=true)
strategy("EMA 10,20 59",overlay=true)
infoBox     = input(true, title="infoBox", type=input.bool)
infoBox2    = input(false, title="infoBox2", type=input.bool)
BuySellSignal_Bool = input(false, title="Buy & SellSignal", type=input.bool)
infoBoxSize = input(title="infoBoxSize", defval=size.large, options=[size.auto, size.tiny, size.small, size.normal, size.large, size.huge])
ema1Value   = input(10)
ema2Value   = input(20)
ema3Value   = input(59)
maxLoss = input(3000)
ema1        = ema(close,ema1Value)
ema2        = ema(close,ema2Value)
ema3        = ema(close,ema3Value)
objcnt      = 0
buyTitle    = tostring(close[1])
myProfit    = float(0)

plot(ema1,title="ema1",color=color.red,linewidth=2)
plot(ema2,title="ema2",color=color.green,linewidth=2)
plot(ema3,title="ema3",color=color.black,linewidth=2)

Buytrend = (ema1 and ema2 > ema3) and (ema1[1] and ema2[1] > ema3[1])
BarssinceBuyTrend = barssince(Buytrend)
BarssinceSellTrend = barssince(not Buytrend)
closeAtBuyTrend = close[1]
bgcolor(Buytrend ? color.green : color.red,transp=70)

BuySignal = Buytrend and not Buytrend[1] and BuySellSignal_Bool

BuySignalOut = Buytrend and (crossunder(ema1,ema2)) and BuySellSignal_Bool
BarssinceBuy = barssince(BuySignal)
bgcolor(BuySignal ? color.green : na , transp=30)
bgcolor(BuySignalOut ? color.black : na , transp=30)
plot(BarssinceBuy,title="BarssinceBuy",display=display.none)


SellSignal = not Buytrend and Buytrend[1] and BuySellSignal_Bool
SellSignalOut = not Buytrend and (crossover(ema1,ema2)) and BuySellSignal_Bool
BarssinceSell = barssince(SellSignal)
bgcolor(SellSignal ? color.red : na , transp=30)
bgcolor(SellSignalOut ? color.black : na , transp=30)
plot(BarssinceSell,title="BarssinceSell",display=display.none)


buyProfit   = float(0)
cntBuy      =0
sellProfit  = float(0)
cntSell     =0
buyProfit   := Buytrend and not Buytrend[1]? nz(buyProfit[1]) + (close[BarssinceBuyTrend[1]]-close) : nz(buyProfit[1])
cntBuy      := Buytrend and not Buytrend[1]? nz(cntBuy[1]) + 1: nz(cntBuy[1])
sellProfit  := not Buytrend and Buytrend[1]? nz(sellProfit[1]) + (close-close[BarssinceSellTrend[1]]) : nz(sellProfit[1])
cntSell     := not Buytrend and Buytrend[1]? nz(cntSell[1]) + 1 : nz(cntSell[1])
totalProfit = buyProfit + sellProfit

// if (Buytrend and not Buytrend[1] and infoBox==true)
//     l = label.new(bar_index - (BarssinceBuyTrend[1]/2), na,text="Close = " + tostring(close) + "\n" + "Start = "+tostring(close[BarssinceBuyTrend[1]]) + "\n" + "Profit = "+tostring(close[BarssinceBuyTrend[1]]-close) ,style=label.style_labelup, yloc=yloc.belowbar,color=color.red,size=infoBoxSize)
// if (not Buytrend and Buytrend[1] and infoBox==true)
//     l = label.new(bar_index - (BarssinceSellTrend[1]/2), na,text="Close = " + tostring(close) + "\n" + "Start = "+tostring(close[BarssinceSellTrend[1]]) + "\n" + "Profit = "+tostring(close-close[BarssinceSellTrend[1]]) ,style=label.style_labeldown, yloc=yloc.abovebar,color=color.green,size=infoBoxSize)

// if (BuySignalOut and not BuySignalOut[1] and infoBox2==true)
// //    l = label.new(bar_index - (BarssinceBuy[0]/2), na,text="Close = " + tostring(close) + "\n" + "Start = "+tostring(close[BarssinceBuy[0]]) + "\n" + "Profit = "+tostring(close-close[BarssinceBuy[0]]) ,style=label.style_labelup, yloc=yloc.belowbar,color=color.purple,size=infoBoxSize
//     l = label.new(bar_index, na,text="Close = " + tostring(close) + "\n" + "Start = "+tostring(close[BarssinceBuy[0]]) + "\n" + "Profit = "+tostring(close-close[BarssinceBuy[0]]) ,style=label.style_labelup, yloc=yloc.belowbar,color=color.lime,size=infoBoxSize)
// if (SellSignalOut and not SellSignalOut[1] and infoBox2==true)
// //    l = label.new(bar_index - (BarssinceSell[0]/2), na,text="Close = " + tostring(close) + "\n" + "Start = "+tostring(close[BarssinceSell[0]]) + "\n" + "Profit = "+tostring(close[BarssinceSell[0]]-close) ,style=label.style_labeldown, yloc=yloc.abovebar,color=color.purple,size=infoBoxSize)
//     l = label.new(bar_index, na,text="Close = " + tostring(close) + "\n" + "Start = "+tostring(close[BarssinceSell[0]]) + "\n" + "Profit = "+tostring(close[BarssinceSell[0]]-close) ,style=label.style_labeldown, yloc=yloc.abovebar,color=color.fuchsia,size=infoBoxSize)


// l2 = label.new(bar_index, na, 'buyProfit in pip = '+tostring(buyProfit)+"\n"+  'cntBuy = '+tostring(cntBuy) +"\n"+  'sellProfit in pip = '+tostring(sellProfit)+"\n"+  'cntSell = '+tostring(cntSell) +"\n"+  'totalProfit in pip = '+tostring(totalProfit)     , 
//   color=totalProfit>0 ? color.green : color.red, 
//   textcolor=color.white,
//   style=label.style_labeldown, yloc=yloc.abovebar,
//   size=size.large)

// label.delete(l2[1])



//--------------------------------------------------
//--------------------------------------------------
if (Buytrend)
    strategy.close("short", comment = "Exit short")
    strategy.entry("long", true)
    strategy.exit("Max Loss", "long", loss = maxLoss)

//if BuySignalOut
   // strategy.close("long", comment = "Exit Long")
if (not Buytrend)
    // Enter trade and issue exit order on max loss.
    strategy.close("long", comment = "Exit Long")
    strategy.entry("short", false)
    strategy.exit("Max Loss", "short", loss = maxLoss)
//if SellSignalOut
    // Force trade exit.
    //strategy.close("short", comment = "Exit short")
    
//--------------------------------------------------
//--------------------------------------------------
//--------------------------------------------------