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

Автор:Чао Чжан, Дата: 2024-04-01 11:53:14
Тэги:

img

Обзор

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

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

  1. Для определения основного направления тренда вычисляются 8-периодные и 21-периодные EMA.
  2. Определить три последовательных высоких минимума (HL) и три последовательных низких максимума (LH) как ранние сигналы о потенциальном изменении тренда.
  3. Сгенерировать сигнал покупки, когда 8-периодная EMA пересекает 21-периодную EMA и происходит прорыв HL; генерировать сигнал продажи, когда 8-периодная EMA пересекает 21-периодную EMA и происходит прорыв LH.
  4. Установьте уровень стоп-лосса на уровне 5% от входной цены и уровень получения прибыли на уровне 16% от входной цены для управления рисками и закрепления прибыли.
  5. Закройте позицию и откройте обратную позицию, когда появится противоположный сигнал.

Преимущества стратегии

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

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

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

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

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

Резюме

Эта стратегия использует перекрестное использование 8-периодических и 21-периодических EMA, в сочетании с ценовыми моделями HL и LH, для выявления обратных тенденций и генерации торговых сигналов. Ясные правила стоп-лосса и тека прибыли помогают управлять рисками и блокировать прибыль. Однако стратегия может генерировать ложные сигналы на нестабильных рынках, а фиксированные уровни стоп-лосса и тека прибыли могут не хорошо адаптироваться к различным рыночным условиям. Для дальнейшего улучшения следует рассмотреть возможность введения адаптивных стоп-лосса и тека прибыли, включения других индикаторов, оптимизации параметров и внедрения мер управления рисками. В целом стратегия обеспечивает основу для динамики и трендосообразной торговли, но требует корректировки и оптимизации на основе конкретных рынков и индивидуальных предпочтений.


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


Больше