スプレッシュ・モメンタム・ブレイクアウト戦略

作者: リン・ハーンチャオチャン,日付: 2024年1月30日 17:33:49
タグ:

img

概要

これは,LazyBearのモメンタム・スクリーズ指標に基づいて開発された定量的な取引戦略である.この戦略は,複数の技術指標の組み合わせを通じて,高勝率のモメンタム・ブレイクアウト取引を達成するために,ボリンジャー・バンド,ケルトナー・チャネル,モメンタム・インディケーターを統合している.

戦略の論理

この戦略のコアインジケーターは,レジーベアのモメントスプレイスインジケーターである.このインジケーターは,ボリンジャー帯がケルトナーチャネルによって圧縮されているかどうかを決定する.圧縮が起こると,市場は潜在的なブレイクポイントに入ったことを表す.モメントスプレイスインジケーターの方向性を組み合わせることで,圧縮がリリースされると,市場ブレイクを捕捉するために取引を行うことができます.

ストラテジーは,21期ボリンジャーバンドを計算し,価格の標準偏差が2倍になる.同時に,価格幅の1.5倍の幅の20期ケルターチャンネルを計算する.ボルリンジャーバンドがケルターチャンネルに圧縮されると,圧縮信号が起動する.また,ストラテジーは,一定の期間で価格の自分の価格チャネルの真ん中点との関係で価格の勢いを計算する.圧縮が発生すると,勢力の指標の方向性と組み合わせて,購入するか売却するかを決定する.

出口の場合,モメントインジケーターの色が灰色に変わると,圧縮状態が終了し,トレンドが逆転する可能性があります.

利点

  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")

もっと