ボリンジャーバンドとカルキンチャネルに基づくモメンタムスクイーズ戦略


作成日: 2024-01-30 17:33:49 最終変更日: 2024-01-30 17:33:49
コピー: 0 クリック数: 869
1
フォロー
1617
フォロワー

ボリンジャーバンドとカルキンチャネルに基づくモメンタムスクイーズ戦略

概要

これは,LazyBearの動力挤出指標をベースに開発された量化取引戦略である.この戦略は,ブリン帯,カルキン通路,動力指標を統合し,複数の技術指標の組み合わせによって,高い勝利率の動力突破取引を実現している.

戦略原則

この戦略の核心指標は,LazyBearの動力圧縮指標である.この指標は,ブルリン帯がカルキン通路にが押し付けられているかどうかを判断し,圧縮が発生すると,市場が潜在的爆破点に入ることを代表する.動力圧縮指標の判断方向を配合した後,圧縮が放出される時に市場の爆破状況を捉えることができる.

具体的には,この戦略は,まず21周期のブリン帯を計算し,その幅は価格標準差の2倍である.また,20周期のカルキンチャネルを計算し,その幅は価格振幅の1.5倍である.ブリン帯がカルキンチャネルに圧迫されたときに,圧迫信号が発せられる.さらに,この戦略は,一段の期間で価格が自身の価格チャネルの中央点に対してどのように動いているかを計算する.圧迫が起こったとき,動量指標の方向性と組み合わせて,買いまたは売却を判断する.

走行中に,運動量指数の色が灰色に変化し,ポジションを平らげ,圧縮状態の終了を表す時,トレンドは逆転する可能性があります.

戦略的優位性

  1. 複数の技術指標を統合し,取引決定の正確性を向上させる

この戦略はブリン帯,カルキン通路,動力の指標を統合し,これらの指標の総合的な関係を判断することで,取引決定の正確性を高め,誤った取引の確率を低減することができる.

  1. 動力圧縮ポイントの精度,潜在的利益の余地

動力絞り戦略は,市場の爆発の重要なポイントを捉えることができます.これらのポイントは,市場が重要な方向判断をするためのターニングポイントです.正しく判断すると,その後の走行は比較的長くなります.したがって,戦略の潜在的利益の余地は非常に大きい.

  1. 突破的な取引の成功率

ランダムな突破取引と比較して,この戦略が選択したエントリーポイントはブリン帯とカルキン通路の圧迫点にあり,指標の統合によって判断すると取引の成功率は高い.

戦略リスク

  1. ブリン帯とカルキン通路のパラメータ設定リスク

ブリン帯とカルキン通路の周期パラメータと帯域パラメータの設定は,戦略取引結果に大きく影響する.パラメータが正しく設定されていない場合,誤判に繋がる.これには,大量の反省によって最適なパラメータを見つけることが必要である.

  1. 破綻するリスク

突破取引には失敗のリスクがあり,価格が戦略で選択したポイントを突破した後に,再びリコールされ,損失が発生する可能性があります. これは,厳格な止損を制御する必要があります.

  1. トレンド反転リスク

圧縮状態が終了すると,この戦略はすべてのポジションを平らにする。しかし,時には価格の傾向がまだ続く可能性があり,これは戦略が早期に出場するリスクを生じます。これは出場判断の論理を最適化する必要があります。

戦略最適化の方向性

  1. パラメータの設定を最適化

より多くの反測データで,ブルリン帯とカルキン通路のより良いパラメータ周期と帯域幅の設定を探して,戦略の効果を向上させることができます.

  1. ストップ・ロスの策略を増やす

移動ストップまたは振動ストップを設定し,価格の逆転時に迅速にストップして,戦略の最大撤退を制御できます.

  1. 再入学条件が追加された

策略がポジションから退いた後,一定の再入場条件を設定することができ,トレンドが継続する場合は再び入場することができる.

  1. さらに多くの指標を組み合わせて

他の変動性指標,取引量指標など,より多くの異なるタイプの指標を組み合わせて,意思決定の正確性を高めるために,指標を統合した複合戦略を構築することができます.

要約する

この戦略はブリン帯,カルキン通路および動量指標を統合し,これらの指標の関係を判断し,高い成功率の突破点入場点を選択する.パラメータ最適化,止損戦略,再入場条件および複合指標の統合などの複数の面で最適化の余地があり,戦略の効果をさらに向上させることができる.

ストラテジーソースコード
/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
//All credits to LazyBear. All I did was turn it into a strategy!

strategy(title = "SQZMOM STRAT", overlay=false)

// --- GENERAL INPUTS ---
FromMonth = input(defval = 4, title = "From Month", minval = 1, maxval = 12)
FromYear  = input(defval = 2020, title = "From Year", minval = 2012)
ToMonth   = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
ToYear    = input(defval = 9999, title = "To Year", minval = 2017)
FromDay   = 1
ToDay     = 1
start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  // backtest start window
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)        // backtest finish window
window()  => true

get_round(value, precision) => round(value * (pow(10, precision))) / pow(10, precision)
trade_leverage = input(1, title = "Trade - Leverage", step = 0.25)
trade_risk     = input(100, title = "Trade - Risk Percent", type = input.float, step = 0.1, minval = 0.1, maxval = 100)
tradeType   = input("LONG", title="What trades should be taken : ", options=["LONG", "SHORT", "BOTH"])

// --- SQZMOM CODE

length = input(21, title="BB Length")
mult = input(2.0,title="BB MultFactor")
lengthKC=input(20, title="KC Length")
multKC = input(1.5, title="KC MultFactor")

useTrueRange = input(true, title="Use TrueRange (KC)", type=input.bool)

// Calculate BB
source = close
basis = sma(source, length)
dev = multKC * stdev(source, length)
upperBB = basis + dev
lowerBB = basis - dev

// Calculate KC
ma = sma(source, lengthKC)
range = useTrueRange ? tr : (high - low)
rangema = sma(range, lengthKC)
upperKC = ma + rangema * multKC
lowerKC = ma - rangema * multKC

sqzOn  = (lowerBB > lowerKC) and (upperBB < upperKC)
sqzOff = (lowerBB < lowerKC) and (upperBB > upperKC)
noSqz  = (sqzOn == false) and (sqzOff == false)

val = linreg(source  -  avg(avg(highest(high, lengthKC), lowest(low, lengthKC)),sma(close,lengthKC)), lengthKC,0)

bcolor = color.gray
if (val > 0 and val > nz(val[1]))
    bcolor := color.green
if (val < 0 and val < nz(val[1]))
    bcolor := color.red

scolor = noSqz ? color.blue : sqzOn ? color.black : color.gray 
plot(val, color=bcolor, style=plot.style_histogram, linewidth=4)
plot(0, color=scolor, style=plot.style_cross, linewidth=2)

// --- VWMA CODE ---
useVWMA        = input(false, title = "Use VWMA to selectively long/short?", type = input.bool)
lengthVWMA=input(42, title = "VWMA Length", step = 1, minval = 1)
useCV=input(false, type=input.bool, title="Use Cumulative Volume for VWMA?")
nbfs = useCV ? cum(volume) : sum(volume, lengthVWMA)
medianSrc=close

calc_evwma(price, lengthVWMA, nb_floating_shares) => data = (nz(close[1]) * (nb_floating_shares - volume)/nb_floating_shares) + (volume*price/nb_floating_shares)

m=calc_evwma(medianSrc, lengthVWMA, nbfs)


// ---STRATEGY---
if ((tradeType == "LONG" or tradeType == "BOTH") and (m>0 or useVWMA == false))
    longCondition = (val > 0 and noSqz == 0 and sqzOn == 0 and sqzOn[1] == 1)
    if (longCondition)
        contracts = get_round((strategy.equity * trade_leverage / close) * (trade_risk / 100), 4)
        strategy.entry("LONG", strategy.long, qty = contracts, when = window())
        
if((tradeType == "SHORT" or tradeType == "BOTH") and (m<0 or useVWMA == false))
    shortCondition = (val < 0 and noSqz == 0 and sqzOn == 0 and sqzOn[1] == 1)
    if (shortCondition)
        contracts = get_round((strategy.equity * trade_leverage / close) * (trade_risk / 100), 4)
        strategy.entry("SHORT", strategy.short, qty = contracts, when = window())

if (bcolor == color.gray)
    strategy.close("LONG")
    strategy.close("SHORT")