Bollinger Bands と DCA を組み合わせた高周波取引戦略

作者: リン・ハーンチャオチャン,日付: 2024-03-29 16:20:13
タグ:

img

概要

DCAブースター (1分) と呼ばれる戦略は,1分間のタイムフレームで動作する高周波取引戦略である.この戦略は,ボリンジャーバンドとドルコスト平均 (DCA) 技術を組み合わせて,多重な購入と売却を行い,利益を生むことを目的として,市場の変動をキャピタライズする.この戦略の主な考えは,価格が2つの連続期間にわたって下のボリンジャーバンドを下回ると,DCAを使用してポジションを構築し始める.価格が上部のボリンジャーバンドを超えると,すべてのポジションを閉鎖する.さらに,この戦略はピラミディングを可能にする.つまり,価格が落ち続けばポジションを追加し続けることができる.

戦略の原則

  1. ボリンジャー帯を計算する: 単純な移動平均値と標準偏差を使用してボリンジャー帯の上下帯を計算する.
  2. DCA パラメータを設定する: 固定金額を複数の部分に分割し,それぞれが各ポジションの資本として機能します.
  3. 入場条件: 閉場価格が連続して2期間のボリンジャー帯の下位を下回ると,ポジション構築を開始する.価格が下の帯下位にとどまるかどうかによって,戦略は最大5つのポジションを確立することができます.
  4. 出口条件:価格がボリンジャーバンド上位を突破すると,すべてのポジションを閉じる.
  5. ピラミッド設定:価格が下がり続ける場合,戦略はポジションを最大5ポジションまで追加し続けます.
  6. ポジション管理: 戦略は,各ポジションのエントリーステータスを記録し,出口条件が満たされると対応するポジションを閉鎖します.

戦略 の 利点

  1. ボリンジャーバンドとDCAの組み合わせにより,この戦略は市場の変動を効果的に把握し,平均購入コストを削減することができます.
  2. ピラミッド型取引を許可することで 価格が下がり続けると 戦略はポジションを継続して構築し 収益性の機会を増やすことができます
  3. 脱出条件は単純で直接的で 迅速な利益を得ることができます
  4. 短時間 (1分) で使用可能で,高周波取引が可能

戦略リスク

  1. 市場が急激に変動し,価格がボリンジャーバンドの上部を突破すると,戦略はタイミングでポジションを閉じることができず,損失を伴う可能性があります.
  2. ピラミッド操作は 価格が下がり続けると 過度な曝露につながり リスクが増加します
  3. この戦略は不安定な市場ではうまく機能しない可能性があります. 頻繁な購入と販売は高い取引コストを生む可能性があります.

戦略の最適化方向

  1. 脱出条件にストップ・ロスを追加することで,取引あたりの最大損失を制御する.
  2. ピラミッドの論理を最適化し,価格減少の大きさに基づいてポジションサイズを調整し,過剰な曝露を避ける.
  3. RSIやMACDなどの他の指標を組み込むことで,入口と出口の正確性を向上させる.
  4. Bollinger Bands の期間と標準偏差倍数などのパラメータを最適化し,異なる市場状況に適応する.

概要

DCAブースター (DCA Booster) は,ボリンジャーバンドとDCAを組み合わせた高周波取引戦略である.価格がボリンジャーバンドの下値を下回り,価格がボリンジャーバンド上値を超えるとポジションを閉じることで市場の変動を把握し,利益を生むことを目的としている.この戦略はピラミダイジングを可能にするが,急激な市場変動や過剰露出などのリスクにも直面する.ストップロスの導入,ピラミダイジング論理の最適化,他の指標の組み込み,パラメータの最適化により,この戦略のパフォーマンスをさらに改善することができる.


/*backtest
start: 2024-02-27 00:00:00
end: 2024-03-28 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("DCA Booster (1 minute)",
  overlay=true )

// Parameters for Bollinger Bands
length = input.int(50, title="BB Length")
mult = input.float(3.0, title="BB Mult")

// Bollinger Bands calculation
basis = ta.sma(close, length)
dev = mult * ta.stdev(close, length)
upper = basis + dev
lower = basis - dev

// Variables for DCA
cantidad_dolares = 50000
orden1 = cantidad_dolares / close
orden2 = orden1 * 1.2
orden3 = orden2 * 1.3
orden4 = orden3 * 1.5
orden5 = orden4 * 1.5

// Variables for tracking purchases
var comprado1 = false
var comprado2 = false
var comprado3 = false
var comprado4 = false
var comprado5 = false

// Buy conditions
condicion_compra1 = close < lower and close[1] < lower[1] and not comprado1
condicion_compra2 = close < lower and close[1] < lower[1] and comprado1 and not comprado2
condicion_compra3 = close < lower and close[1] < lower[1] and comprado2 and not comprado3
condicion_compra4 = close < lower and close[1] < lower[1] and comprado3 and not comprado4
condicion_compra5 = close < lower and close[1] < lower[1] and comprado4 and not comprado5
// Variables de control
var int consecutive_closes_below_lower = 0
var int consecutive_closes_above_upper = 0

// Entry logic
if condicion_compra1 and barstate.isconfirmed
    consecutive_closes_below_lower := consecutive_closes_below_lower + 1
    if consecutive_closes_below_lower >= 2
        strategy.entry("Compra1", strategy.long, qty=orden1)
        comprado1 := true
        consecutive_closes_below_lower := 0

if condicion_compra2 and barstate.isconfirmed
    consecutive_closes_below_lower := consecutive_closes_below_lower + 1
    if consecutive_closes_below_lower >= 2
        strategy.entry("Compra2", strategy.long, qty=orden2)
        comprado2 := true
        consecutive_closes_below_lower := 0

if condicion_compra3 and barstate.isconfirmed
    consecutive_closes_below_lower := consecutive_closes_below_lower + 1
    if consecutive_closes_below_lower >= 2
        strategy.entry("Compra3", strategy.long, qty=orden3)
        comprado3 := true
        consecutive_closes_below_lower := 0

if condicion_compra4 and barstate.isconfirmed
    consecutive_closes_below_lower := consecutive_closes_below_lower + 1
    if consecutive_closes_below_lower >= 2
        strategy.entry("Compra4", strategy.long, qty=orden4)
        comprado4 := true
        consecutive_closes_below_lower := 0

if condicion_compra5 and barstate.isconfirmed
    consecutive_closes_below_lower := consecutive_closes_below_lower + 1
    if consecutive_closes_below_lower >= 2
        strategy.entry("Compra5", strategy.long, qty=orden5)
        comprado5 := true
        consecutive_closes_below_lower := 0


// Sell conditions
if close > upper  and comprado1 and barstate.isconfirmed
    strategy.close("Compra1")
    comprado1 := false

if close > upper  and comprado2 and barstate.isconfirmed
    strategy.close("Compra2")
    comprado2 := false

if close > upper  and comprado3 and barstate.isconfirmed
    strategy.close("Compra3")
    comprado3 := false

if close > upper and comprado4 and barstate.isconfirmed
    strategy.close("Compra4")
    comprado4 := false

if close > upper and comprado5 and barstate.isconfirmed
    strategy.close("Compra5")
    comprado5 := false



もっと