この記事では,キャンドルスタイクパターンをベースにしたモメンタムブレークアウト取引戦略を紹介する.この戦略は,キャンドルスタイク形成を認識することによって市場動向とエントリー機会を特定する.
モメントブレイクストラテジーは,主に市場への入場のための上昇傾向または下落傾向を特定することによって,潜在的な逆転信号を判断します.信号を特定した後,過剰な収益を達成するための傾向を迅速に追跡します.
モメントブレイクストラテジーの基本的な論理は,上昇傾向と下落傾向を含む,浸透パターンの特定に基づいています.
このパターンは,現在の期間の閉盤価格が開盤価格よりも高く,前の期間の閉盤価格が前期の開盤価格よりも低いときに形成される.このパターンは,しばしば市場情勢の逆転を,下落から上昇へと示す.これは上向きの傾向を追求するための良い機会である.
この傾向は,現在の期間の閉店価格が開店価格より低く,前の期間の閉店価格が前期の開店価格より高くなったときに形成される.これはまた,市場情勢の変化を示し,市場をショートにする機会を提供します.
浸透パターンを特定した後,モメンタム・ブレークアウト戦略は,潜在的な逆転傾向を追跡するために過剰なレバレッジを持つポジションを迅速に確立します.また,利益をロックしながらリスクを制御するためにストップ・ロスを動的に調整します.
戦略は以下の方法で最適化できます.
モメントブレイクアウト戦略は,典型的な平均逆転戦略である.主要キャンドルスティック信号を捕獲することで,市場のトレンド逆転を迅速に判断し追跡する.リスクは存在するが,リスク・リターン比率を制御するための複数の最適化技術によって戦略を効果的に強化することができる.それは仲介のようなリターンを求める積極的な投資家に適している.
/*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)