Тенденция после стратегии, основанной на линиях EMA

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

img

Обзор

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

Логика стратегии

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

  1. Если 10-дневная EMA и 20-дневная EMA превышают 50-дневную EMA, она определяется как восходящий тренд;

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

  3. При пересечении краткосрочных линий EMA (10-дневных и 20-дневных) выше долгосрочной линии EMA (50-дневных) генерируется сигнал покупки;

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

  5. Удерживать длинную позицию во время восходящего тренда и удерживать короткую позицию во время нисходящего тренда;

  6. Закрыть текущую направленную позицию при обратном тренде (короткосрочная EMA пересекает долгосрочную EMA).

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

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

Преимущества этой стратегии:

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

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

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

  1. На рынках с ограниченным диапазоном, линии EMA могут часто пересекаться, что приводит к высоким затратам на торговлю от частого открытия и закрытия позиций;

  2. Определение тенденции EMA может потерпеть неудачу после разрыва цен, упустив хорошие возможности для входа.

Для оптимизации рисков можно использовать несколько методов:

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

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



Больше