Стратегия отслеживания трендов на основе средней линии EMA

Автор:Чао Чжан, Дата: 2024-02-05 14:21:18
Тэги:

基于EMA平均线的趋势跟踪策略

Обзор

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

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

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

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

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

  3. Покупательный сигнал возникает, когда короткие линии ЕМА (линии 10 и 20) пересекают длинные линии ЕМА (линии 50);

  4. Когда короткая ЕМА (линия 10 и 20 дней) проходит через длинную ЕМА (линия 50 дней), появляется сигнал продажи;

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

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

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

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

В частности, в частности:

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

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

В то же время в этой стратегии есть некоторые риски:

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

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

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

Оптимизация

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

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

  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")
    
//--------------------------------------------------
//--------------------------------------------------
//--------------------------------------------------



Больше информации