ボリンジャー・バンド・モメンタム・ブレークアウト・トレード・戦略

作者: リン・ハーンチャオチャン, 日付: 2024-02-05 10:53:46
タグ:

img

概要

この戦略は,トレードボリュームが高く,ロングポジションに入るとき,ボリンガーバンド指標とボリューム指標を組み合わせて,ボリンガー上部バンド以上の強力なモメンタムブレイク機会を特定します.また,トレンド方向を決定し,デッドポジションを保持するリスクを減らすために移動平均指標を使用します.

戦略の論理

  1. ボリンジャー帯の指標を使用して,価格が上部帯を超えると判断します.
  2. 取引量の指標を使用して,現在の取引量が過去期間の平均値よりも著しく高いかどうかを判断します.
  3. 取引量が高く,価格がボリンジャー上位帯を超えるとロングポジションに入ります.
  4. 移動平均指標を使って 短期・中期トレンドを判断して 損失を削減します

この戦略は主に価格レベル,勢い,トレンドという3つの要因を考慮する.価格がボリンジャー上部帯をバイゾーンに突破すると,取引量の急上昇は強い勢いと資本流入を示します.これはロングポジションに入る適切なタイミングです.その後,デッドポジションを保持しないために市場傾向を決定するために移動平均を使用します.価格アクション,勢い,リスク制御を組み合わせることで,強いトレンドから利益を得ることを目指します.

利点

  1. 音量フィルターを組み合わせると リスクを軽減する

  2. 移動平均の傾向を決定することで 損失を時間的に削減できるので 保有損失を減らすことができます

  3. 意思決定のための複数の指標を組み合わせた定量戦略を実施し,異なる製品と時間枠に合わせて柔軟なパラメータを調整する.

  4. 明確なコード構造,読み取りと保守が簡単 指標の計算,信号生成,位置管理のモジュール設計

リスク

  1. ボリンジャー・バンドは 極端な価格変動や 信号が欠落したり 誤った信号を生むときに 失敗する可能性があります

  2. 総取引量が低い場合,利益はありません. 十分な取引量がなければ,買い信号は利益にならないかもしれません.

  3. 移動平均値の動向決定も失敗し,効果的なストップロスを完全に保証できない可能性があります.

  4. パラメータの調節が不適切である場合,戦略の収益性にも影響する.例えば,取引時間窓が短すぎると,トレンドの逆転が見逃される可能性があります.

オプティマイゼーションの方向性

  1. より良いトレンドとサポート/レジスタンスの分析のためにより多くの技術指標を追加し,ストップロスを改善します.例えばキャンドルスタイクパターン,チャネル,主要なサポートレベル.

  2. 機械学習モデルを追加して,実際の突破の可能性を判断し,偽信号を減らす.例えば,LSTMディープラーニングモデル.

  3. ダイナミックなポジションサイジング,ストップロスの追跡などの資本管理戦略を最適化し,単一の取引損失の影響を減らす.

  4. ボリンジャー帯や 戦略の安定性を高めるため 量窓などのパラメータを調整します

結論

この戦略は,ボリンジャーバンドと取引量指標を統合し,強力なモメンタム購入機会を特定し,移動平均が効果的なストップロスを保証する.単一指標戦略と比較して,より高い精度とリスク制御能力を備えています.モジュール式デザイン,トレンドフィルター,ストップロスのメカニズムにより,モメンタムブレイクアウト取引戦略を最適化しやすくします.


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

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © KAIST291

//@version=4
initial_capital=1000
strategy("prototype", overlay=true)
length1=input(1)
length3=input(3)
length7=input(7)
length9=input(9)
length14=input(14)
length20=input(20)
length60=input(60)
length120=input(120)
ma1= sma(close,length1)
ma3= sma(close,length3)
ma7= sma(close,length7)
ma9= sma(close,length9)
ma14=sma(close,length14)
ma20=sma(close,length20)
ma60=sma(close,length60)
ma120=sma(close,length120)
rsi=rsi(close,14)
// BUYING VOLUME AND SELLING VOLUME //
BV = iff( (high==low), 0, volume*(close-low)/(high-low))
SV = iff( (high==low), 0, volume*(high-close)/(high-low))
vol = iff(volume > 0, volume, 1)
dailyLength = input(title = "Daily MA length", type = input.integer, defval = 50, minval = 1, maxval = 100)
weeklyLength = input(title = "Weekly MA length", type = input.integer, defval = 10, minval = 1, maxval = 100)
//-----------------------------------------------------------
Davgvol = sma(volume, dailyLength)
Wavgvol = sma(volume, weeklyLength)
//-----------------------------------------------------------
length = input(20, minval=1)
src = input(close, title="Source")
mult = input(2.0, minval=0.001, maxval=50, title="StdDev")
mult2= input(1.5, minval=0.001, maxval=50, title="exp")
mult3= input(1.0, minval=0.001, maxval=50, title="exp1")
mult4= input(2.5, minval=0.001, maxval=50, title="exp2")
basis = sma(src, length)
dev = mult * stdev(src, length)
upper = basis + dev
lower = basis - dev
dev2= mult2 * stdev(src, length)
Supper= basis + dev2
Slower= basis - dev2
dev3= mult3 * stdev(src, length)
upper1= basis + dev3
lower1= basis - dev3
dev4= mult4 * stdev(src, length)
upper2=basis + dev4
lower2=basis - dev4
offset = input(0, "Offset", type = input.integer, minval = -500, maxval = 500)
plot(basis, "Basis", color=#FF6D00, offset = offset)
p1 = plot(upper, "Upper", color=#2962FF, offset = offset)
p2 = plot(lower, "Lower", color=#2962FF, offset = offset)
fill(p1, p2, title = "Background", color=color.rgb(33, 150, 243, 95))
//----------------------------------------------------
exit=(close-strategy.position_avg_price / strategy.position_avg_price*100)
bull=( BV>SV and BV>Davgvol)
bull2=(BV>SV and BV>Davgvol)
bux =(close>Supper and close>Slower and volume<Davgvol)
bear=(SV>BV and SV>Davgvol)
con=(BV>Wavgvol and rsi>80)
imInATrade = strategy.position_size != 0
highestPriceAfterEntry = valuewhen(imInATrade, high, 0)
// STRATEGY LONG //
if (bull and close>upper1 and close>Supper and high>upper and rsi<80)
    strategy.entry("Long",strategy.long)

if (strategy.position_avg_price*1.02<close)
    strategy.close("Long")
else if (low<ma9 and strategy.position_avg_price<close)
    strategy.close("Long")
else if (ma20>close and strategy.position_avg_price<close )
    strategy.close("Long")
else if (rsi>80 and strategy.position_avg_price<close)
    strategy.close("Long")
else if (strategy.openprofit < strategy.position_avg_price*0.9-close)
    strategy.close("Long")
else if (high<upper and strategy.position_avg_price<close)
    strategy.close("Long")
//////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////
strategy.entry("Short",strategy.short,when=low<ma20 and low<lower1 and close<Slower and crossunder(ma60,ma120))

if (close<strategy.position_avg_price*0.98)
    strategy.close("Short")

else if (rsi<20)
    strategy.close("Short")



もっと