Торговля на импульсе: стратегия пересечения двойных скользящих средних


Дата создания: 2024-04-01 11:53:14 Последнее изменение: 2024-04-01 11:53:14
Копировать: 4 Количество просмотров: 597
1
Подписаться
1617
Подписчики

Торговля на импульсе: стратегия пересечения двойных скользящих средних

Обзор

Стратегия использует 8-циклические и 21-циклические индикаторные скользящие средние ((EMA) для идентификации изменений в рыночных тенденциях. Когда более короткие циклические ЭМА пересекают более длинные циклические ЭМА, создается сигнал покупки; наоборот, когда более короткие циклические ЭМА пересекают более длинные циклические ЭМА, создается сигнал продажи. Стратегия также сочетает в себе три последовательных более высоких низких ((HLL) и три последовательных более низких высоких ((LLH) в качестве сигналов для дальнейшего подтверждения обратного тренда. Кроме того, стратегия устанавливает уровни стоп-лосса и стоп-стопа для контроля риска и блокирования прибыли.

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

  1. Расчет EMA на 8 и 21 циклов для определения основных направлений тренда.
  2. Выявление трех последовательных более высоких низких ((HLL) и трех последовательных более низких высоких ((LLH), которые служат ранним сигналом об обратном тренде.
  3. Когда 8-циклическая EMA сверху проходит 21-циклическую EMA, и происходит прорыв HLL, генерируется сигнал продажи.
  4. Уровень стоп-лосса составляет 5% от цены входа, а уровень стоп-стоп - 16% от цены входа для контроля риска и блокировки прибыли.
  5. Когда появляется обратный сигнал, позиции закрываются и открываются обратно.

Стратегические преимущества

  1. В сочетании с EMA и моделью поведения цены ((HLL и LLH) для подтверждения тенденции, повышение надежности сигнала.
  2. Установка четких уровней стоп-лосса и стоп-стоп помогает контролировать риски и блокировать прибыль.
  3. Применяется в разных временных рамках и на разных рынках с определенной универсальностью.
  4. Логика ясна, легко понятна и реализуема.

Стратегический риск

  1. Частые перекрестки могут привести к многократным ложным сигналам, что может привести к убыткам на рынке.
  2. Фиксированные уровни стоп-лосса и стоп-стоп могут быть не адаптированы к различным рыночным условиям, что приводит к потенциальным убыткам или большим потерям.
  3. Стратегии, основанные на исторических данных, могут плохо адаптироваться к внезапным событиям или фундаментальным изменениям.

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

  1. Введение адаптивных механизмов остановки и остановки, например, на основе волатильности (например, ATR), чтобы скорректировать уровень остановки и остановки, чтобы лучше адаптироваться к различным рыночным условиям.
  2. В сочетании с другими показателями или факторами, такими как объем сделок, относительно сильный индекс (RSI) и т. д., для дальнейшей фильтрации сигналов и повышения надежности.
  3. Оптимизация параметров (например, циклов EMA, стоп-стоп-рентабельности и т. д.) для поиска оптимального сочетания параметров для конкретного рынка или показателя.
  4. Рассмотреть возможность внедрения мер по управлению рисками, таких как размещение позиций, чтобы контролировать рискованность одноразовых сделок.

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

Стратегия использует пересечение 8-циклических и 21-циклических EMA в сочетании с HLL и LLH ценовыми моделями для выявления обратных тенденций и получения торговых сигналов. Четкие правила стоп-ложа помогают контролировать риски и блокировать прибыль. Однако, стратегия может создавать ложные сигналы на колеблющихся рынках, а фиксированный уровень стоп-ложа может не адаптироваться к различным рыночным условиям.

Исходный код стратегии
/*backtest
start: 2023-03-26 00:00:00
end: 2024-03-31 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy('Trend Following 8&21EMA with strategy tester [ukiuro7]', overlay=true, process_orders_on_close=true, calc_on_every_tick=true, initial_capital = 10000)

//INPUTS
lh3On = true
hl3On = true
emaOn = input(title='105ema / 30min', defval=true) 
assistantOn = input(title='Assistant', defval=true)
textOn = input(title='Text', defval=true)

showRiskReward = input.bool(true, title='Show Risk/Reward Area', group="TP/SL")
stopPerc = input.float(5.0, step=0.1, minval=0.1, title='Stop-Loss %:',group="TP/SL") / 100
tpPerc = input.float(16.0, step=0.1, minval=0.1, title='Take-Profit %:',group="TP/SL") / 100

backtestFilter = input(false, title='Backtest Entries to Date Range',group="Backtest Date Range")
i_startTime = input(defval=timestamp('01 Jan 2022 00:00'), inline="b_1", title='Start',group="Backtest Date Range")
i_endTime = input(defval=timestamp('01 Jan 2029 00:00'), inline="b_1", title='End',group="Backtest Date Range")
inDateRange = true

message_long_entry = input.string(title='Alert Msg: LONG Entry', defval ='', group='Alert Message')
message_short_entry = input.string(title='Alert Msg: SHORT Entry', defval='', group='Alert Message')
message_long_exit = input.string(title='Alert Msg: LONG SL/TP', defval='', group='Alert Message')
message_short_exit = input.string(title='Alert Msg: SHORT SL/TP', defval='', group='Alert Message')  

//CALCS
threeHigherLows() =>
    low[0] >= low[1] and low[1] >= low[2]

threeLowerHighs() =>
    high[2] >= high[1] and high[1] >= high[0]

breakHigher() =>
    padding = timeframe.isintraday ? .02 : .1
    high >= high[1] + padding

breakLower() =>
    padding = timeframe.isintraday ? .02 : .1
    low <= low[1] - padding

lh3 = threeLowerHighs() and lh3On
lh3bh = lh3[1] and breakHigher() and lh3On

hl3 = threeHigherLows() and hl3On
hl3bl = hl3[1] and breakLower() and hl3On

ema8 = ta.ema(close, 8)
ema21 = ta.ema(close, 21)

//VARS
var float longStop = na, var float longTp = na
var float shortStop = na, var float shortTp = na

//CONDS
isUptrend = ema8 >= ema21
isDowntrend = ema8 <= ema21
trendChanging = ta.cross(ema8, ema21)

buySignal = lh3bh and lh3[2] and lh3[3] and isUptrend and timeframe.isintraday
sellSignal = hl3bl and hl3[2] and hl3[3] and isDowntrend and timeframe.isintraday

goingDown = hl3 and isDowntrend and timeframe.isintraday
goingUp = lh3 and isUptrend and timeframe.isintraday

projectXBuy = trendChanging and isUptrend
projectXSell = trendChanging and isDowntrend

longCond = trendChanging and isUptrend and assistantOn
shortCond = trendChanging and isDowntrend and assistantOn

//STRATEGY
if shortCond and strategy.position_size > 0 and barstate.isconfirmed
    strategy.close('Long', comment='CLOSE LONG', alert_message=message_long_exit)

if longCond and strategy.position_size < 0 and barstate.isconfirmed
    strategy.close('Short', comment='CLOSE SHORT', alert_message=message_short_exit) 

if longCond and strategy.position_size <= 0 and barstate.isconfirmed and inDateRange
    longStop := close * (1 - stopPerc)
    longTp := close * (1 + tpPerc)
    strategy.entry('Long', strategy.long, comment='LONG', alert_message=message_long_entry)
    strategy.exit('Long Exit', 'Long', comment_loss="SL LONG", comment_profit = "TP LONG", stop=longStop, limit=longTp, alert_message=message_long_exit)

if shortCond and strategy.position_size >= 0 and barstate.isconfirmed and inDateRange
    shortStop := close * (1 + stopPerc)
    shortTp := close * (1 - tpPerc)
    strategy.entry('Short', strategy.short, comment='SHORT', alert_message=message_short_entry)
    strategy.exit('Short Exit', 'Short', comment_loss="SL SHORT", comment_profit="TP SHORT", stop=shortStop, limit=shortTp, alert_message=message_short_exit)

//PLOTS
plotshape(longCond, style=shape.triangleup, location=location.belowbar, color=color.new(color.green, 0), size=size.small, text='Buy')
plotshape(shortCond, style=shape.triangledown, location=location.abovebar, color=color.new(color.red, 0), size=size.small, text='Sell')
plotchar(trendChanging and isUptrend and close < open and assistantOn, char='!', location=location.abovebar, color=color.new(color.green, 0), size=size.small)

aa = plot(ema8, linewidth=3, color=color.new(color.green, 0), editable=true)
bb = plot(ema21, linewidth=3, color=color.new(color.red, 0), editable=true)
fill(aa, bb, color=isUptrend ? color.new(color.green,90) : color.new(color.red,90))
buyZone = isUptrend and lh3 and high < ema21 and timeframe.isintraday
sellZone = isDowntrend and hl3 and low > ema21 and timeframe.isintraday

L1 = plot(showRiskReward and strategy.position_size > 0 ? strategy.position_avg_price : na, color=color.new(color.green, 0), linewidth=1, style=plot.style_linebr, title='Long Entry Price')
L2 = plot(showRiskReward and strategy.position_size > 0 ? longTp : na, color=color.new(color.green, 0), linewidth=1, style=plot.style_linebr, title='Long TP Price')
L3 = plot(showRiskReward and strategy.position_size > 0 ? longStop : na, color=color.new(color.red, 0), linewidth=1, style=plot.style_linebr, title='Long Stop Price')

S1 = plot(showRiskReward and strategy.position_size < 0 ? strategy.position_avg_price : na, color=color.new(color.teal, 0), linewidth=1, style=plot.style_linebr, title='Short Entry Price')
S2 = plot(showRiskReward and strategy.position_size < 0 ? shortTp : na, color=color.new(color.teal, 0), linewidth=1, style=plot.style_linebr, title='Short TP Price')
S3 = plot(showRiskReward and strategy.position_size < 0 ? shortStop : na, color=color.new(color.maroon, 0), linewidth=1, style=plot.style_linebr, title='Short Stop Price')

fill(L1, L2, color=color.new(color.green, 90))
fill(L1, L3, color=color.new(color.red, 90))
fill(S1, S2, color=color.new(color.teal, 90))
fill(S1, S3, color=color.new(color.maroon, 90))

bgcolor(inDateRange == false ? color.new(color.red,90) : na, title="Backtest Off-Range")