Эта стратегия - стратегия отслеживания тренда, основанная на двойном скрещивании 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