빠른 EMA 크로스오버와 느린 EMA 크로스오버를 기반으로 한 5분 트렌드 팔로잉 전략


생성 날짜: 2023-11-16 15:36:36 마지막으로 수정됨: 2023-11-16 15:36:36
복사: 0 클릭수: 828
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

빠른 EMA 크로스오버와 느린 EMA 크로스오버를 기반으로 한 5분 트렌드 팔로잉 전략

개요

이 전략은 5분 시간 프레임에 기반한 빠른 EMA 교차 시스템으로, 제한 가격 주문과 추적 스톱 로드 자동으로 트렌드를 잡는다. 이 전략은 중단계 트렌드 거래에 적합하며, EMA 필터링을 통해 전반적인 트렌드 방향을 판단하고, 빠른 EMA 교차와 결합하여 특정 진입 시점을 위치시킨다. 이 전략의 장점은 트렌드 판단에 정확하고, 트렌드를 효과적으로 추적할 수 있다는 것이다.

전략 원칙

  1. 빠른 EMA와 느린 EMA를 사용하여, 빠른 EMA 위에 착용할 때 느린 EMA를 더하고, 아래 착용할 때 비어
  2. EMA 매크로 필터를 사용하여 가격이 EMA 위에 있을 때만 더 많은 것을 할 수 있으며, 가짜 돌파구를 피하기 위해 EMA 아래에 공백을 만들 수 있습니다.
  3. 입시 시 제한 가격 표를 사용해서, 가격이 원하는 위치에 도달한 후에 다시 입시하십시오.
  4. 진입 후 동적 추적 스톱로스, 수익 잠금, 스톱로스 퇴출

특히:

  1. 빠른 EMA와 느린 EMA의 길이에 따라 각각 빠른 EMA를 계산합니다.
  2. EMA 필터를 활성화하면 가격이 EMA보다 높을 때만 더 많이 할 수 있고, EMA보다 낮을 때만 더 많이 할 수 있습니다.
  3. 빠른 EMA 위에 느린 EMA를 뚫을 때, 더 많이; 빠른 EMA 아래에서 느린 EMA를 뚫을 때, 공백
  4. 다중 입장할 때 하위권, 빈 입장할 때 상위권
  5. 진입 후 트래킹 중지, 운영 최고 가격에 따라 트래킹, 중지 및 중지

이 전략의 기본 거래 논리는 다음과 같습니다.

전략적 이점

  1. 전체 트렌드 방향을 판단하기 위해 EMA를 사용해서 역동적인 거래를 피하십시오.
  2. EMA와 한계표가 합쳐진다면, 상하를 막는 데 도움이 될 것이다.
  3. 동적 트래킹 스톱로스는 수익을 잘 고정시킬 수 있습니다.
  4. 리스크가 통제되고, 단위 손실이 2% 정도로 고정되어 있습니다.
  5. 하지만, 이 경우, 이 추세에 따라 추세가 바뀌는 경향이 있습니다.
  6. 전략은 간단하고 명확하며 이해하기 쉽고 최적화 가능합니다.

전략적 위험

  1. 트렌드 허위 돌파의 위험성이 존재하고, 그 위험성이 억제될 수 있습니다.
  2. 잘못된 EMA 주기적 설정으로 미스 트렌드가 발생할 수 있습니다.
  3. 정지폭이 너무 커서 정상 변동 범위를 초과할 수 있습니다.
  4. 트래킹 중단이 너무 급진적이어서 조기 퇴장할 수도 있다.
  5. 스톱 및 스톱 비율이 부합치 않아 더 큰 상황을 놓칠 수 있습니다.

대책:

  1. 최적의 주기 길이를 찾기 위해 EMA 변수를 최적화합니다.
  2. 적절히 느슨한 중지 범위, 너무 자주 중지 방지
  3. 정지 추적의 시작점과 추적폭을 신중하게 설정합니다.
  4. 다양한 스톱 스톱 비율을 테스트하여 최적의 매개 변수를 찾습니다.

전략 최적화 방향

  1. EMA 주기 변수를 최적화하여 최적의 변수 조합을 찾습니다.
  2. 다른 EMA 타입을 시도해 보세요.
  3. MACD와 같은 다른 지표들을 테스트하여 효과를 높일 수 있는지 확인하세요.
  4. 더 높은 시간 프레임에서 EMA 필터링을 시도합니다.
  5. 입시 시 제한 가격 범위를 최적화합니다.
  6. 정지 스탠드 지점과 비율을 최적화
  7. 더 복잡한 손실 추적 방법을 시도해 보세요.
  8. 트렌드 지표에 트렌드 강점을 추가합니다.
  9. 더 많은 필터를 추가하는 것을 고려하여 가짜 침입을 방지하십시오.

요약하다

이 전략은 전체적으로 중·중간 단선 트렌드 거래에 매우 적합한 전략으로, 빠른 속도 EMA 교차 판단 출전 시기를, 제한 가격 단독을 피하고, 동적으로 스톱 로스를 추적하여 수익을 잠금하는 프로세스는 매우 명확하고 합리적이며, 작동하기 쉽습니다. 특정 변수를 최적화하면 전략의 승률과 수익성을 더욱 향상시킬 수 있습니다. 물론, 부적절한 EMA 주기, 너무 빈번한 스톱 로즈 등의 위험을 예방하는 데 주의가 필요합니다.

전략 소스 코드
/*backtest
start: 2022-11-09 00:00:00
end: 2023-11-15 00:00:00
period: 1d
basePeriod: 1h
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/
// © jordanfray

//@version=5
strategy(title="5 Minute EMA Strategy", overlay=true, max_bars_back=500, default_qty_type=strategy.percent_of_equity, default_qty_value=100,initial_capital=100000, commission_type=strategy.commission.percent, commission_value=0.05, backtest_fill_limits_assumption=2)

// Indenting Classs
indent_1 = " "
indent_2 = "  "
indent_3 = "   "
indent_4 = "    "

// Group Titles
group_one_title = "EMA Settings"
group_two_title = "Entry Settings"
group_three_title = "Trade Filters"

// Input Tips

ocean_blue = color.new(#0C6090,0)
sky_blue = color.new(#00A5FF,0)
green = color.new(#2DBD85,0)
red = color.new(#E02A4A,0)
light_blue = color.new(#00A5FF,85)
light_green = color.new(#2DBD85,85)
light_red = color.new(#E02A4A,85)
light_yellow = color.new(#FFF900,85)
white = color.new(#ffffff,0)
light_gray = color.new(#000000,70)
transparent = color.new(#000000,100)

// Strategy Settings - EMA
fast_EMA_length = input.int(defval=20, minval=1, title="Fast Length", group=group_one_title)
fast_EMA_type = input.string(defval="EMA", options = ["EMA", "SMA", "RMA", "WMA"], title=indent_4+"Type", group=group_one_title)
fast_EMA_source = input.source(defval=close, title=indent_4+"Source", group=group_one_title)
fast_EMA = switch fast_EMA_type
    "EMA" => ta.ema(fast_EMA_source, fast_EMA_length)
    "SMA" => ta.sma(fast_EMA_source, fast_EMA_length)
    "RMA" => ta.rma(fast_EMA_source, fast_EMA_length)
    "WMA" => ta.wma(fast_EMA_source, fast_EMA_length)
    => na
plot(fast_EMA, title="Fast EMA", linewidth=1, color=green, editable=true)

slow_EMA_length = input.int(defval=100, minval=1, title="Slow Length", group=group_one_title)
slow_EMA_type = input.string(defval="EMA", options = ["EMA", "SMA", "RMA", "WMA"], title=indent_4+"Type", group=group_one_title)
slow_EMA_source = input.source(defval=close, title=indent_4+"Source", group=group_one_title)
slow_EMA = switch slow_EMA_type
    "EMA" => ta.ema(slow_EMA_source, slow_EMA_length)
    "SMA" => ta.sma(slow_EMA_source, slow_EMA_length)
    "RMA" => ta.rma(slow_EMA_source, slow_EMA_length)
    "WMA" => ta.wma(slow_EMA_source, slow_EMA_length)
    => na
plot(slow_EMA, title="Slow EMA", linewidth=1, color=sky_blue, editable=true)


// EMA Macro Filter
enable_EMA_filter = input.bool(defval=false, title="Use EMA Filter", group=group_three_title)
EMA_filter_timeframe = input.timeframe(defval="", title=indent_4+"Timeframe", group=group_three_title)
EMA_filter_length = input.int(defval=300, minval=1, step=10, title=indent_4+"Length", group=group_three_title)
EMA_filter_source = input.source(defval=hl2, title=indent_4+"Source", group=group_three_title)
ema_filter = ta.ema(EMA_filter_source, EMA_filter_length)
ema_filter_smoothed = request.security(syminfo.tickerid, EMA_filter_timeframe, ema_filter[barstate.isrealtime ? 1 : 0], gaps=barmerge.gaps_on)
plot(enable_EMA_filter ? ema_filter_smoothed: na, title="EMA Macro Filter", linewidth=2, color=white, editable=true)


// Entry Settings
stop_loss_val = input.float(defval=2.0, title="Stop Loss (%)", step=0.1, group=group_two_title)/100
take_profit_val = input.float(defval=2.0, title="Take Profit (%)", step=0.1, group=group_two_title)/100
long_entry_limit_lookback = input.int(defval=3, title="Long Entry Limit Lookback", minval=1, step=1, group=group_two_title)
short_entry_limit_lookback = input.int(defval=3, title="Short Entry Limit Lookback", minval=1, step=1, group=group_two_title)
limit_order_long_price = ta.lowest(low, long_entry_limit_lookback)
limit_order_short_price = ta.highest(high, short_entry_limit_lookback)
start_trailing_after = input.float(defval=1, title="Start Trailing After (%)", step=0.1, group=group_two_title)/100
trail_behind = input.float(defval=1, title="Trail Behind (%)", step=0.1, group=group_two_title)/100
long_start_trailing_val = strategy.position_avg_price + (strategy.position_avg_price * start_trailing_after)
short_start_trailing_val = strategy.position_avg_price - (strategy.position_avg_price * start_trailing_after)
long_trail_behind_val = close - (strategy.position_avg_price * (trail_behind/100))
short_trail_behind_val = close + (strategy.position_avg_price * (trail_behind/100))
currently_in_a_long_postion = strategy.position_size > 0
currently_in_a_short_postion = strategy.position_size < 0
long_profit_target = strategy.position_avg_price * (1 + take_profit_val)
long_stop_loss = strategy.position_avg_price * (1.0 - stop_loss_val)
short_profit_target = strategy.position_avg_price * (1 - take_profit_val)
short_stop_loss = strategy.position_avg_price * (1 + stop_loss_val)

bars_since_entry = bar_index - strategy.opentrades.entry_bar_index(strategy.opentrades - 1)
plot(bars_since_entry, editable=false, title="Bars Since Entry", color=green)

long_run_up = currently_in_a_long_postion and bars_since_entry > 0 ? ta.highest(high, bars_since_entry) : high
long_trailing_stop = currently_in_a_long_postion and bars_since_entry > 0 and long_run_up > long_start_trailing_val ? long_run_up - (long_run_up * trail_behind) : long_stop_loss
long_run_up_line = plot(long_run_up, style=plot.style_stepline, editable=false, color=currently_in_a_long_postion ? green : transparent)
long_trailing_stop_line = plot(long_trailing_stop, style=plot.style_stepline, editable=false, color=currently_in_a_long_postion ? long_trailing_stop > strategy.position_avg_price ? green : red : transparent)

short_run_up = currently_in_a_short_postion and bars_since_entry > 0 ? ta.lowest(low, bars_since_entry) : low
short_trailing_stop = currently_in_a_short_postion and bars_since_entry > 0 and short_run_up < short_start_trailing_val ? short_run_up + (short_run_up * trail_behind) : short_stop_loss
// short_run_up_line = plot(short_run_up, style=plot.style_stepline, editable=false, color=currently_in_a_short_postion ? green : transparent)
short_trailing_stop_line = plot(short_trailing_stop, style=plot.style_stepline, editable=false, color=currently_in_a_short_postion ? short_trailing_stop < strategy.position_avg_price ? green : red : transparent)


// Trade Conditions
fast_EMA_cross_down_slow_EMA = ta.crossunder(fast_EMA,slow_EMA)
fast_EMA_cross_up_slow_EMA = ta.crossover(fast_EMA,slow_EMA)
plotshape(fast_EMA_cross_down_slow_EMA ? close : na, title="Short Entry Symbol", color=red, style=shape.triangledown, location=location.belowbar)
plotshape(fast_EMA_cross_up_slow_EMA ? close : na, title="Long Entry Symbol", color=green, style=shape.triangleup, location=location.abovebar)
fast_EMA_is_above_slow_EMA = fast_EMA > slow_EMA
fast_EMA_is_below_slow_EMA = fast_EMA < slow_EMA
ema_macro_filter_longs_only = fast_EMA > ema_filter_smoothed and slow_EMA > ema_filter_smoothed
ema_macro_filter_shorts_only = fast_EMA < ema_filter_smoothed and slow_EMA < ema_filter_smoothed

long_position_take_profit = ta.cross(close, long_trailing_stop) or close > long_profit_target
short_position_take_profit = ta.cross(close, short_trailing_stop) or close > short_profit_target

long_conditions_met = enable_EMA_filter ? ema_macro_filter_longs_only and fast_EMA_cross_up_slow_EMA and fast_EMA_is_above_slow_EMA and not currently_in_a_short_postion : fast_EMA_cross_up_slow_EMA and not currently_in_a_short_postion
short_conditions_met = enable_EMA_filter ? ema_macro_filter_shorts_only and fast_EMA_cross_down_slow_EMA and fast_EMA_is_below_slow_EMA and not currently_in_a_long_postion : fast_EMA_cross_down_slow_EMA and fast_EMA_is_below_slow_EMA and not currently_in_a_long_postion

// Long Entry
strategy.entry(id="Long", direction=strategy.long, limit=limit_order_long_price, when=long_conditions_met)
strategy.cancel(id="Cancel Long", when=ta.crossover(fast_EMA,slow_EMA))
strategy.exit(id="Close Long", from_entry="Long", stop=long_trailing_stop, limit=long_profit_target, when=long_position_take_profit)

// Short Entry 
strategy.entry(id="Short", direction=strategy.short, limit=limit_order_short_price, when=short_conditions_met)
strategy.cancel(id="Cancel Short", when=ta.crossunder(fast_EMA,slow_EMA))
strategy.exit(id="Close Short", from_entry="Short", stop=short_trailing_stop, limit=short_profit_target, when=short_position_take_profit)

entry = plot(strategy.position_avg_price, editable=false, title="Entry", style=plot.style_stepline, color=currently_in_a_long_postion or currently_in_a_short_postion ? color.blue : transparent, linewidth=1)
fill(entry,long_trailing_stop_line, editable=false, color=currently_in_a_long_postion ? long_trailing_stop > strategy.position_avg_price ? light_green : light_red : transparent)
fill(entry,short_trailing_stop_line, editable=false, color=currently_in_a_short_postion ? short_trailing_stop < strategy.position_avg_price ? light_green : light_red : transparent)
//ltp = plot(currently_in_a_long_postion ? long_profit_target : na, style=plot.style_stepline, title="Take Profit", color=currently_in_a_long_postion ? green : transparent, linewidth=1)
//lsl = plot(currently_in_a_long_postion ? long_stop_loss : na, style=plot.style_stepline, title="Take Profit", color=currently_in_a_long_postion ? red : transparent, linewidth=1)
//fill(entry,ltp, color= currently_in_a_long_postion ? light_green : light_red)
//fill(entry,lsl, color= currently_in_a_long_postion ? light_red : light_green)

//stp = plot(currently_in_a_short_postion ? short_profit_target : na, style=plot.style_stepline, title="Take Profit", color=currently_in_a_short_postion ? green : transparent, linewidth=1)
//ssl = plot(currently_in_a_short_postion ? short_stop_loss : na, style=plot.style_stepline, title="Take Profit", color=currently_in_a_short_postion ? red : transparent, linewidth=1)
//fill(entry,stp, color= currently_in_a_short_postion ? light_green : light_red)
//fill(entry,ssl, color= currently_in_a_short_postion ? light_red : light_green)