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

Автор:Чао Чжан, Дата: 2023-12-29 16:03:55
Тэги:

img

Обзор

Эта стратегия - стратегия отслеживания тренда, основанная на двойном скрещивании 10EMA и 50EMA. Она включает 10EMA в часовой график в качестве вспомогательного суждения для динамического поиска направления тренда на чередующемся рынке быка и медведя и достижения автоматического отслеживания стоп-лосса.

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

Основная логика стратегии основана на золотом кресте и смертном кресте 10EMA и 50EMA. В частности, когда 10EMA пересекает 50EMA, чтобы сформировать золотой крест, считается, что рынок вступил в восходящий тренд; когда 10EMA пересекает 50EMA, чтобы сформировать смертельный крест, считается, что рынок вступил в нисходящий тренд.

Открыть длинные или короткие позиции в пределах 1-5 бар после золотого креста или креста смерти. Кроме того, стратегия также вводит 10EMA на часовом графике в качестве вспомогательного решения. Длинные позиции открываются только тогда, когда 10EMA на часовом графике находится в восходящем тренде после золотого креста, а короткие позиции открываются только тогда, когда 10EMA на часовом графике находится в нисходящем тренде после креста смерти, таким образом фильтруя некоторые ложные сигналы.

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

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

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

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

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

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

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

Руководство по оптимизации

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

Резюме

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


/*backtest
start: 2022-12-22 00:00:00
end: 2023-12-28 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("10ema Strat 9", overlay=true, format=format.price)
//#region // inputs for candles
//time
t1 = time(timeframe.period,"0930-1500") //last hour of market is not ideal for trading
// candle status
bullish = close > open and barstate.isconfirmed
bearish = open > close and barstate.isconfirmed
bullcandle = ta.valuewhen(bullish, close, 0)
bearcandle = ta.valuewhen(bearish, close, 0)
ema1 = input.int(10, minval=1, title="short ema")
ema2 = input.int(50, minval=1, title="long ema")
ema3 = input.int(200, minval=1, title="hourly 10 ema")
//@variable Input for source
src = input(close, title="Source")
offsetema = input.int(title="Offset", defval=0, minval=-500, maxval=500)
sema = ta.ema(src, ema1)//@variable Input for smaller ema1
lema = ta.ema(src, ema2)//@variable Input for longer ema2
hema = ta.ema(src, ema3)// @variable Input for hourly ema3
bullcrosscount = ta.barssince(ta.crossover(sema,lema)) //@variable Input 10/50 cross higher
bearcrosscount = ta.barssince(ta.crossunder(sema,lema)) //@variable Input 10/50 cross lower
ideallong = bullcrosscount <= 5 //number of candles after the cross
idealshort = bearcrosscount <= 5 //number of candles after the cross

emabull = (sema > lema) and bearish and close > sema and close > hema and ideallong and t1 and barstate.isconfirmed
xemabull = ta.barssince(emabull)
dbullema = emabull and emabull[1] and xemabull <=1
bullentry = if dbullema
    ta.valuewhen(emabull[1], high + 0.05, 0)
else 
    ta.valuewhen(emabull, high + 0.05, 0)
bullentryh = dbullema ? bullentry[1] : bullentry
bullentrylow = ta.valuewhen(emabull, low - 0.05, 0)
bullstop = (bullentryh - bullentrylow) <= 1.00 ? bullentryh - 1.00 : (bullentryh - bullentrylow) <= 10.40 ? bullentrylow : na
bulltarget = (bullentryh - bullstop) * 1.62 + bullentryh

// bear setup
emabear = (sema < lema) and bullish and close < sema and close < hema and idealshort and t1 and barstate.isconfirmed
xemabear = ta.barssince(emabear)
dbearema = emabear and emabear [1] and xemabear <=1
bearentry = if dbearema
    ta.valuewhen(emabear[1], low - 0.05, 0)
else
    ta.valuewhen(emabear, low - 0.05, 0)
bearentryh = dbearema ? bearentry[1] : bearentry
bearentryhigh = ta.valuewhen(emabear, high + 0.05, 0)
bearstop = (bearentryhigh - bearentryh) <= 1.00 ? bearentryh + 1.00 : (bearentryh - bearentryhigh) <= 10.40 ? bearentryhigh : na
beartarget = bearentryh - (bearstop-bearentryh) * 1.62

bullclose = (xemabull <=7) and bullish and bullcrosscount >=1 and barstate.isconfirmed //number of candles for a close above
bearclose = (xemabear <=7) and bearish and bearcrosscount >=1 and barstate.isconfirmed //number of candles for a close below
buyzone = ta.barssince(bullclose)
shortzone =  ta.barssince(bearclose)
idealbuy = close >= bullentryh and bullclose and (buyzone<=7)
idealsell = close <= bearentryh and bearclose and (shortzone<=7)

// // bull setup on chart
// if sema > lema and xemabull < 50
//     var line line_bullentry = line.new(bar_index, na, bar_index + 1, na, color=color.rgb(0, 200, 0), style=line.style_solid, width=1)
//     if emabull
//         line.set_xy1(line_bullentry, x=bar_index, y=bullentryh)
//         line.set_xy2(line_bullentry, x=bar_index, y=bullentryh)
//         alert("EMA-bullish", alert.freq_once_per_bar_close)
//     line.set_x2(line_bullentry, x=bar_index)
//     var line line_bullstop = line.new(bar_index, na, bar_index + 1, na, color=color.rgb(250, 0, 0), style=line.style_solid, width=1)
//     if emabull
//         line.set_xy1(line_bullstop, x=bar_index, y=bullstop)
//         line.set_xy2(line_bullstop, x=bar_index, y=bullstop)
//     line.set_x2(line_bullstop, x=bar_index)    
//     var line line_bulltarget = line.new(bar_index, na, bar_index + 1, na, color=color.rgb(200, 100, 200), style=line.style_solid, width=1)
//     if emabull
//         line.set_xy1(line_bulltarget, x=bar_index, y=bulltarget)
//         line.set_xy2(line_bulltarget, x=bar_index, y=bulltarget)
//     line.set_x2(line_bulltarget, x=bar_index)

// //bear setup on chart
// if sema < lema and xemabear < 50
//     var line line_bearentry = line.new(bar_index, na, bar_index, na, color=color.rgb(0, 200, 0), style=line.style_solid, width=1)
//     if emabear
//         line.set_xy1(line_bearentry, x=bar_index, y=bearentryh)
//         line.set_xy2(line_bearentry, x=bar_index, y=bearentryh)
//         alert("EMA-bearish", alert.freq_once_per_bar_close)
//     line.set_x2(line_bearentry, x=bar_index)
//     var line line_bearstop = line.new(bar_index, na, bar_index, na, color=color.rgb(250, 0, 0), style=line.style_solid, width=1)
//     if emabear
//         line.set_xy1(line_bearstop, x=bar_index, y=bearstop)
//         line.set_xy2(line_bearstop, x=bar_index, y=bearstop)
//     line.set_x2(line_bearstop, x=bar_index)
//     var line line_beartarget = line.new(bar_index, na, bar_index, na, color=color.rgb(200, 100, 200), style=line.style_solid, width=1)
//     if emabear
//         line.set_xy1(line_beartarget, x=bar_index, y=beartarget)
//         line.set_xy2(line_beartarget, x=bar_index, y=beartarget)
//     line.set_x2(line_beartarget, x=bar_index)

//#endregion
//execution 
if idealbuy
    strategy.close("sell", comment=na)	
    strategy.entry("buy", strategy.long, limit=bullentryh, stop=bullstop, comment="buy")
strategy.exit("exit","buy", trail_points = low, trail_offset = 5, qty_percent=100, limit=bulltarget, stop=bullstop)

if idealsell
	strategy.close("buy",comment=na)
    strategy.entry("sell", strategy.short, limit=bearentryh, stop=bearstop, comment="sell")
strategy.exit("exit","sell", trail_points = low, trail_offset = 5, qty_percent=100, limit=beartarget, stop=bearstop)
// strategy.close_all(time == close_day) 
//#region // graphical analysis
//Plots
plotshape(emabull, location=location.belowbar, title='emabull')
plotshape(idealbuy, style=shape.circle, color=color.green, title="bull close")
plotshape(emabear, title='emabear')
plotshape(idealsell, location=location.belowbar, style=shape.circle, color=color.red, title="bear close")

// //Dashboard
// var label id = na
// label.delete(id)   // Delete last label
// i_offsetLabel = input(15, "Data Dashboard Offset") 
// offset = i_offsetLabel * (time - time[1])
// dynamicText = "= Bull Setup ="
// id := label.new(x=time + offset, y=open, xloc=xloc.bar_time, text=dynamicText, color=color.rgb(255, 255, 255), size=size.normal)
// label.set_textcolor(id, color.rgb(0, 0, 0))
// label.set_text(id=id, text=dynamicText)
// label.set_textalign(id, text.align_left)
// label.set_text(id=id, text=dynamicText)
// f_round( _val, _decimals) => 
//     _p = math.pow(10, _decimals)
//     math.round(math.abs(_val) * _p) / _p * math.sign(_val)
// dynamicText := dynamicText + "\n" + str.tostring(f_round(bulltarget,2)) + "  :Target"
// label.set_text(id=id, text=dynamicText)
// dynamicText := dynamicText + "\n" + str.tostring(f_round(bullentryh,2)) + "  :Entry"
// label.set_text(id=id, text=dynamicText)
// dynamicText := dynamicText + "\n" + str.tostring(f_round(bullstop,2)) + "  :Stop"
// label.set_text(id=id, text=dynamicText)
// dynamicText := dynamicText + "\n"
// label.set_text(id=id, text=dynamicText)
// dynamicText := dynamicText + "\n" + "= Bear Setup ="
// label.set_text(id=id, text=dynamicText)
// dynamicText := dynamicText + "\n" + str.tostring(f_round(bearstop,2)) + "  :Stop"
// label.set_text(id=id, text=dynamicText)
// dynamicText := dynamicText + "\n" + str.tostring(f_round(bearentryh,2)) + "  :Entry"
// label.set_text(id=id, text=dynamicText)
// dynamicText := dynamicText + "\n" + str.tostring(f_round(beartarget,2)) + "  :Target"
// label.set_text(id=id, text=dynamicText)
// //#endregion

Больше