이 문서에서는 촛불 패턴에 기반한 모멘텀 브레이크아웃 거래 전략을 소개합니다. 이 전략은 촛불 형성을 인식함으로써 시장 추세와 진입 기회를 식별합니다.
모멘텀 브레이크아웃 전략은 주로 시장 진출을 위한 상승 추세 또는 하락 추세를 파악하여 잠재적인 반전 신호를 판단합니다. 신호를 확인한 후, 과도한 수익을 달성하는 추세를 빠르게 추적합니다.
모멘텀 브레이크오웃 전략의 핵심 논리는 상승률과 하락률을 포함한 포용 패턴을 식별하는 데 기반합니다.
올림 패턴은 현재 기간의 종료 가격이 개시 가격보다 높고 이전 기간의 종료 가격이 이전 기간의 개시 가격보다 낮을 때 형성됩니다. 이 패턴은 종종 시장 정서가 하락에서 올림으로 전환되는 것을 신호하여 상승 추세를 쫓는 좋은 기회를 제공합니다.
하향적 포용 패턴은 현재 기간의 종료 가격이 개시 가격보다 낮고 이전 기간의 종료 가격이 이전 기간의 개시 가격보다 높을 때 형성됩니다. 이것은 또한 시장 정서 변화의 신호로 시장 단축을 할 수있는 기회를 제공합니다.
포용 패턴을 확인 한 후, 모멘텀 브레이크아웃 전략은 잠재적인 반전 추세를 추적하기 위해 과도한 레버리지를 가진 위치를 빠르게 설정합니다. 또한 수익을 잠금하면서 위험을 제어하기 위해 스톱 로스를 동적으로 조정하고 수익을 취합니다.
전략은 다음과 같은 방법으로 최적화 될 수 있습니다.
모멘텀 브레이크아웃 전략은 전형적인 평균 반전 전략이다. 주요 촛불 신호를 캡처함으로써 시장 트렌드 반전을 신속하게 판단하고 추적합니다. 위험이 있음에도 불구하고 전략은 위험-상금 비율을 제어하기 위해 여러 최적화 기술을 통해 효과적으로 향상 될 수 있습니다. 중재와 같은 수익을 추구하는 공격적인 투자자에게 적합합니다.
/*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)