이멘텀 브레이크오웃 거래 전략

저자:차오장, 날짜: 2023-11-28 10:33:31
태그:

img

이 문서에서는 촛불 패턴에 기반한 모멘텀 브레이크아웃 거래 전략을 소개합니다. 이 전략은 촛불 형성을 인식함으로써 시장 추세와 진입 기회를 식별합니다.

전략 개요

모멘텀 브레이크아웃 전략은 주로 시장 진출을 위한 상승 추세 또는 하락 추세를 파악하여 잠재적인 반전 신호를 판단합니다. 신호를 확인한 후, 과도한 수익을 달성하는 추세를 빠르게 추적합니다.

전략 원칙

모멘텀 브레이크오웃 전략의 핵심 논리는 상승률과 하락률을 포함한 포용 패턴을 식별하는 데 기반합니다.

올림 패턴은 현재 기간의 종료 가격이 개시 가격보다 높고 이전 기간의 종료 가격이 이전 기간의 개시 가격보다 낮을 때 형성됩니다. 이 패턴은 종종 시장 정서가 하락에서 올림으로 전환되는 것을 신호하여 상승 추세를 쫓는 좋은 기회를 제공합니다.

하향적 포용 패턴은 현재 기간의 종료 가격이 개시 가격보다 낮고 이전 기간의 종료 가격이 이전 기간의 개시 가격보다 높을 때 형성됩니다. 이것은 또한 시장 정서 변화의 신호로 시장 단축을 할 수있는 기회를 제공합니다.

포용 패턴을 확인 한 후, 모멘텀 브레이크아웃 전략은 잠재적인 반전 추세를 추적하기 위해 과도한 레버리지를 가진 위치를 빠르게 설정합니다. 또한 수익을 잠금하면서 위험을 제어하기 위해 스톱 로스를 동적으로 조정하고 수익을 취합니다.

장점

  1. 시장 전환의 기회를 신속하게 식별
  2. 적당한 스톱 로스와 수익을 취하는 균형 잡힌 리스크/이익 비율
  3. 각기 다른 리스크 욕구에 맞는 조정 가능한 레버리지
  4. 자동화 거래로 높은 효율성

위험성

  1. 뒤집기를 완전히 보장하지 않는 포착 패턴
  2. 실패한 브레이크오프 및 시가 변동의 확률
  3. 과잉 레버리지로 인한 청산 위험
  4. 적당한 포지션 크기를 지원하기 위해 충분한 자본이 필요합니다.

개선

전략은 다음과 같은 방법으로 최적화 될 수 있습니다.

  1. 신호를 필터링하기 위해 다른 지표를 포함
  2. 리스크를 제한하기 위해 레버리지 조정
  3. 더 낮은 비용 기준으로 확장
  4. 손해를 멈추고 수익을 확보하기 위해 수익을 최적화하십시오.

요약

모멘텀 브레이크아웃 전략은 전형적인 평균 반전 전략이다. 주요 촛불 신호를 캡처함으로써 시장 트렌드 반전을 신속하게 판단하고 추적합니다. 위험이 있음에도 불구하고 전략은 위험-상금 비율을 제어하기 위해 여러 최적화 기술을 통해 효과적으로 향상 될 수 있습니다. 중재와 같은 수익을 추구하는 공격적인 투자자에게 적합합니다.


/*backtest
start: 2022-11-27 00:00:00
end: 2023-11-09 05:20:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy(title = "MomGulfing", shorttitle = "MomGulfing", overlay = true, initial_capital=10000, pyramiding=3, calc_on_order_fills=false, calc_on_every_tick=false, currency="USD", default_qty_type=strategy.cash, default_qty_value=1000, commission_type=strategy.commission.percent, commission_value=0.04)

syear = input(2021)
smonth = input(1)
sday = input(1)
fyear = input(2022)
fmonth = input(12)
fday = input(31)
start = timestamp(syear, smonth, sday, 01, 00)
finish = timestamp(fyear, fmonth, fday, 23, 59)
date = time >= start and time <= finish ? true : false

longs = input(true)
shorts = input(true)
rr = input(2.5)
position_risk_percent = input(1)/100
signal_bar_check = input.string(defval="3", options=["1", "2", "3"])
margin_req = input(80)
sl_increase_factor = input(0.2)
tp_decrease_factor = input(0.0)
check_for_volume = input(true)
var long_sl = 0.0
var long_tp = 0.0
var short_sl = 0.0
var short_tp = 0.0
var long_lev = 0.0
var short_lev = 0.0

initial_capital = strategy.equity
position_risk = initial_capital * position_risk_percent

bullishEngulfing_st = close[1] < open[1] and close > open and high[1] < close and (check_for_volume ? volume[1]<volume : true)
bullishEngulfing_nd = close[2] < open[2] and close[1] > open[1] and close > open and high[2] > close[1] and high[2] < close and (check_for_volume ? volume[2]<volume : true)
bullishEngulfing_rd = close[3] < open[3] and close[2] > open[2] and close[1] > open[1] and close > open and high[3] > close[2] and high[3] > close[1] and high[3] < close and (check_for_volume ? volume[3]<volume : true)
bullishEngulfing = signal_bar_check == "1" ? bullishEngulfing_st : signal_bar_check == "2" ? bullishEngulfing_st or bullishEngulfing_nd : bullishEngulfing_st or bullishEngulfing_nd or bullishEngulfing_rd
long_stop_level = bullishEngulfing_st ? math.min(low[1], low) : bullishEngulfing_nd ? math.min(low[2], low[1], low) : bullishEngulfing_rd ? math.min(low[3], low[2], low[1], low) : na
rr_amount_long = close-long_stop_level
long_exit_level = close + rr*rr_amount_long
long_leverage = math.floor(margin_req/math.floor((rr_amount_long/close)*100))

bearishEngulfing_st = close[1] > open[1] and close < open and low[1] > close and (check_for_volume ? volume[1]<volume : true)
bearishEngulfing_nd = close[2] > open[2] and close[1] < open[1] and close < open and low[2] < close[1] and low[2] > close and (check_for_volume ? volume[2]<volume : true)
bearishEngulfing_rd = close[3] > open[3] and close[2] < open[2] and close[1] < open[1] and close < open and low[3] < close[2] and low[3] < close[1] and low[3] > close and (check_for_volume ? volume[3]<volume : true)
bearishEngulfing = signal_bar_check == "1" ? bearishEngulfing_st : signal_bar_check == "2" ? bearishEngulfing_st or bearishEngulfing_nd : bearishEngulfing_st or bearishEngulfing_nd or bearishEngulfing_rd
short_stop_level = bearishEngulfing_st ? math.max(high[1], high) : bearishEngulfing_nd ? math.max(high[2], high[1], high) : bearishEngulfing_rd ? math.max(high[3], high[2], high[1], high) : na
rr_amount_short = short_stop_level-close
short_exit_level = close - rr*rr_amount_short
short_leverage = math.floor(margin_req/math.floor((rr_amount_short/short_stop_level)*100))

long = longs and date and bullishEngulfing
short = shorts and date and bearishEngulfing
bgcolor(long[1] ? color.new(color.teal, 80) : (short[1] ? color.new(color.purple, 80) : na))

if long and strategy.position_size <= 0
    long_lev := long_leverage

if short and strategy.position_size >= 0
    short_lev := short_leverage

long_pos_size = long_lev * position_risk
long_pos_qty = long_pos_size/close
short_pos_size = short_lev * position_risk
short_pos_qty = short_pos_size/close

if long
    if strategy.position_size <= 0
        long_sl := long_stop_level
        long_tp := long_exit_level

    else if strategy.position_size > 0
        long_sl := long_stop_level + sl_increase_factor*rr_amount_long
        long_tp := long_exit_level - tp_decrease_factor*rr_amount_long

    strategy.entry("L"+str.tostring(long_lev)+"X", strategy.long, qty=long_pos_qty)
    label_text = str.tostring(long_lev)+"X\nSL:"+str.tostring(long_sl)+"\nTP:"+str.tostring(long_tp)
    label.new(bar_index+1, na, text=label_text, color=color.green, style=label.style_label_up, xloc=xloc.bar_index, yloc=yloc.belowbar)

else if short
    if strategy.position_size >= 0
        short_sl := short_stop_level
        short_tp := short_exit_level

    else if strategy.position_size < 0
        short_sl := short_stop_level - sl_increase_factor*rr_amount_short
        short_tp := short_exit_level + tp_decrease_factor*rr_amount_short

    strategy.entry("S"+str.tostring(short_lev)+"X", strategy.short, qty=short_pos_qty)
    label_text = str.tostring(short_lev)+"X\nSL:"+str.tostring(short_sl)+"\nTP:"+str.tostring(short_tp)
    label.new(bar_index+1, na, text=label_text, color=color.red, style=label.style_label_down, xloc=xloc.bar_index, yloc=yloc.abovebar)

if (strategy.position_size > 0)
    strategy.exit(id="L TP/SL", stop=long_sl, limit=long_tp)

if (strategy.position_size < 0)
    strategy.exit(id="S TP/SL", stop=short_sl, limit=short_tp)

sl_level = strategy.position_size > 0 ? long_sl : strategy.position_size < 0 ? short_sl : na
plot(sl_level, color=color.red, style=plot.style_linebr)

tp_level = strategy.position_size > 0 ? long_tp : strategy.position_size < 0 ? short_tp : na
plot(tp_level, color=color.green, style=plot.style_linebr)


더 많은