Nバーブレイクアウト戦略


作成日: 2024-04-12 16:57:15 最終変更日: 2024-04-12 16:57:15
コピー: 0 クリック数: 572
1
フォロー
1617
フォロワー

Nバーブレイクアウト戦略

概要

N Bars破盤戦略は,価格破盤に基づく量化取引戦略である.この戦略の主な考え方は,閉盘価格が過去N取引日の最高価格を破るときに多ポジションを開くこと,閉盘価格が過去N取引日の最低価格を下回るときに平ポジションを打つことである.この戦略は,現在の価格と過去N取引日の最高最低価格を比較して,強力な破盤の動きを捕捉し,トレンド追跡の効果を達成する.

戦略原則

  1. 過去N取引日の最高値 (highest) と最低値 (lowest) を計算する.
  2. 長期 (long) ポジションは,現在の閉店価格が最高値より高い場合,開きます.
  3. 現在の閉店価格がlowestより低い場合は,平多ポジション ((short) 。
  4. 終了価格 ((close) または高低価格 ((high/low) を信号源として使用することもできます.
  5. 信号源によって,ta.highestとta.lowestを使用して最高価格と最低価格を計算します.
  6. 価格突破を判断するために,ta.crossoverとta.crossunderを使用します.

戦略的優位性

  1. 論理はシンプルで明快で,実装・最適化も簡単です.
  2. 強い突破を捉え,トレンドを追跡する能力がある.
  3. 参数調整の余地があり,異なる品種と周期に応じて最適化することができる.
  4. 適用範囲は広く,ほとんどの品種と周期に良好なパフォーマンスを発揮しています.
  5. フレキシブルな信号源の選択により,戦略の適応性が向上します.

戦略リスク

  1. 振動や小波動の状況に劣った対応で,頻繁に平仓を取ると取引コストが高くなります.
  2. パラメータの選択を誤った場合,過適合のリスクが生じます.
  3. 傾向が逆転すると,大きな後退が起こる可能性があります.
  4. 単一の信号源は,信号の誤認の危険にさらされる可能性があります.

戦略最適化の方向性

  1. トレンドフィルター条件 (ma,adxなど) を追加し,波動下での取引を減らす.
  2. N値,信号源などの最適化パラメータの選択により,戦略の安定性と収益性が向上する.
  3. 単一取引のリスクを制御するストップ・ロズと移動ストップ・ロジックを増やす.
  4. 複数の信号源を組み合わせて信号の信頼性を向上させ,例えば,閉盘価格と高低価格の突破を同時に考慮する.
  5. 異なる品種と周期に応じて,それぞれパラメータとロジックを最適化する.

要約する

N Barsの突破策は,価格突破の動きを捉えることで,優れたトレンド追跡効果を実現するシンプルで実用的量化取引策である.この戦略は,論理が明確で,最適化スペースが広く,適用範囲が広大で,さらなる研究と最適化の価値のある量化戦略である.合理的なパラメータ最適化と論理的改善により,この戦略の安定性と収益性をさらに高め,異なる市場環境によりよく適応することができる.

ストラテジーソースコード
/*backtest
start: 2023-04-06 00:00:00
end: 2024-04-11 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Breakout", overlay=true, precision=6, pyramiding=0, initial_capital=1000, default_qty_type=strategy.percent_of_equity, default_qty_value=25.0, commission_value=0.05)

n = input.int(5, "N Bars", minval=1)
src_input = input.string("Close", "Source", ["Close", "High/Low"])

bull_src = switch src_input
	"Close" => close
	"High/Low" => high
	=>
		runtime.error("Invalid source input")
		na

bear_src = switch src_input
	"Close" => close
	"High/Low" => low
	=>
		runtime.error("Invalid source input")
		na

highest = ta.highest(bull_src[1], n)
lowest = ta.lowest(bear_src[1], n)

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
// Plots
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------

bool long = ta.crossover(bull_src, highest)
bool short = ta.crossunder(bear_src, lowest)

//Plots
lowest_plot  = plot(lowest,  color=color.red, title="Lowest")
highest_plot  = plot(highest,  color=color.green, title="Highest")
bull_src_plot = plot(bull_src, color=color.blue, title="Bull")
bear_src_plot = plot(bear_src, color=color.orange, title="Bear")

// this message is an alert that can be sent to a webhook, which allows for simple automation if you have a server that listens to alerts and trades programmatically.
enter_long_alert = '{"side": "Long", "order": "Enter", "price": ' + str.tostring(open) + ', "timestamp": ' + str.tostring(timenow) + '}'
exit_long_alert = '{"side": "Long", "order": "Exit", "price": ' + str.tostring(open) + ', "timestamp": ' + str.tostring(timenow) + '}'

if long
    strategy.entry(id="Long", direction=strategy.long, limit=open, alert_message=enter_long_alert)

if short
    strategy.close(id="Long", comment="Close Long", alert_message=exit_long_alert)