VWMA-ADX モメンタムとトレンドベースのビットコイン・ロング戦略

作者: リン・ハーンチャオチャン開催日:2024年4月3日17時47分49秒
タグ:VWMAADXDMISMAエイマRMAWMAHMASMMA

img

概要

この戦略は,複数の移動平均値 (VWMA),平均方向指数 (ADX),および方向動向指標 (DMI) を活用して,ビットコイン市場における長期機会を把握する.価格の勢い,トレンドの方向,取引量の組み合わせにより,戦略は,リスクを厳格に制御しながら,強い上昇傾向と十分な勢いを有するエントリーポイントを見つけることを目指しています.

戦略の原則

  1. 長期トレンドを決定するために9日および14日VWMAを使用します.短期移動平均が長期移動平均を上回るときに上昇信号が生成されます.
  2. トレンドフィルターとして89日間の最高値と最低値VWMAから構築された適応移動平均を導入する. 閉値または開値がこの移動平均以上である場合にのみポジションを開設することを検討する.
  3. ADX と DMI の指標を用いてトレンド強さを確認します. ADX が 18 以上で, +DI と -DI の差が 15 以上である場合にのみトレンドが十分に強くなると考えられます.
  4. 取引量が少ない期間を避けるために,取引量の60%から95%のパーセンチルを含むバーを,ボリュームパーセンチル関数を使用してフィルタリングします.
  5. ストップ・ロスのレベルを0.96から0.99倍に設定し,リスクを制御する時間枠が増加するにつれて減少します.
  6. 前もって設定された保持時間に達するか,価格が適応移動平均値を下回るとポジションを閉じる.

利点分析

  1. 複数の技術指標を組み合わせることで,戦略はトレンド,モメンタム,取引量などの様々な次元から市場状況を評価し,シグナルをより信頼性のあるものにします.
  2. アダプティブ・ムービング・平均値と取引量フィルタリングメカニズムは,誤った信号を効果的にフィルタリングし,無効な取引を減らす.
  3. ストップ・ロスの厳格な設定と保持期間制限は 戦略のリスクを大幅に削減します
  4. コードのモジュール式設計により,読みやすさと保守性が向上し,さらなる最適化と拡張が容易になります.

リスク分析

  1. 市場が変動しているときや 傾向が不明であるとき 戦略はより多くの誤った信号を生む可能性があります
  2. ストップ・ロスのレベルは比較的狭いため,早期のストップ・アウトを誘発し,市場の大きな変動時に損失を増やす可能性があります.
  3. この戦略は,マクロ経済状況や重要な出来事の考慮を欠くため",ブラック・スワン"の出来事に直面すると失敗する可能性があります.
  4. パラメータの設定は比較的固定されており,適応性が欠如しており,異なる市場環境で不安定なパフォーマンスを生み出す可能性があります.

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

  1. 信号の信頼性を高めるため,相対強度指数 (RSI) やボリンジャー帯などの市場状況を把握できるより多くの指標を導入する.
  2. ストップ・ロスのレベルを動的に最適化します.例えば,平均真差 (ATR) または百分比ベースのストップ・ロスを使って,異なる市場の変動条件に適応します.
  3. 戦略のリスク管理モジュールを強化し,マクロ経済データと感情分析を組み込む.
  4. 機械学習アルゴリズムを利用してパラメータを自動的に最適化し,戦略の適応性と安定性を向上させる.

概要

VWMA-ADXのビットコインロング戦略は,価格動向,勢い,取引量,その他の技術指標を包括的に考慮することによって,ビットコイン市場の上向きの機会を効果的に把握する.同時に,厳格なリスク管理措置と明確な退出条件は,戦略のリスクが適切に制御されることを保証する.しかし,この戦略には,変化する市場環境への適応性が不十分であり,最適化されたストップロスの戦略の必要性など,いくつかの制限もあります.将来,シグナル信頼性,リスク管理,パラメータ最適化に関して改善が進められ,戦略の強度と収益性をさらに高めることができます.全体として,VWMA-ADX ロング戦略は,投資家に勢いとトレンドに基づいた体系的な取引アプローチを提供し,さらに探求と精錬に値します.


/*backtest
start: 2024-03-01 00:00:00
end: 2024-03-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Q_D_Nam_N_96

//@version=5
strategy("Long BTC Strategy", overlay=true, 
     default_qty_type = strategy.percent_of_equity, 
     default_qty_value = 100, initial_capital = 1000, currency = currency.USD)

Volume_Quartile(vol) =>
    qvol1 = ta.percentile_linear_interpolation(vol, 60,15)
    qvol2 = ta.percentile_linear_interpolation(vol, 60,95)
    vol > qvol1 and vol < qvol2

smma(src, length) =>
	smma =  0.0
	smma := na(smma[1]) ? ta.sma(src, length) : (smma[1] * (length - 1) + src) / length
	smma

ma(source, length, type) =>
    switch type
        "SMA" => ta.sma(source, length)
        "EMA" => ta.ema(source, length)
        "RMA" => ta.rma(source, length)
        "WMA" => ta.wma(source, length)
        "VWMA" => ta.vwma(source, length)
        "HMA" => ta.hma(source, length)
        "SMMA" => smma(source, length)

DMI(len, lensig) =>
    up = ta.change(high)
    down = -ta.change(low)
    plusDM = na(up) ? na : (up > down and up > 0 ? up : 0)
    minusDM = na(down) ? na : (down > up and down > 0 ? down : 0)
    trur = ta.rma(ta.tr, len)
    plus = fixnan(100 * ta.rma(plusDM, len) / trur)+11
    minus = fixnan(100 * ta.rma(minusDM, len) / trur)-11
    sum = plus + minus
    adx = 100 * ta.vwma(math.abs(plus - minus-11) / (sum == 0 ? 1 : sum), lensig)

    [adx, plus, minus]

cond1 = Volume_Quartile(volume*hlcc4)

ma1 = ma(close,9, "VWMA")
// plot(ma1, color = color.blue)
ma2 = ma(close,14, "VWMA")
// plot(ma2, color = color.orange)

n = switch timeframe.period
    "240" => 0.997
    => 0.995

ma3 = (0.1*ma(ta.highest(close,89),89, "VWMA") + 
     0.9*ma(ta.lowest(close,89),89, "VWMA"))*n

plot(ma3, color = color.white)

[adx, plus, minus] = DMI(7, 10)


cond2 = adx > 18 and plus - math.abs(minus) > 15

var int count = 0

if barstate.isconfirmed and strategy.position_size != 0
    count += 1
else
    count := 0

p_roc = 0
if timeframe.period == '240'
    p_roc := 14
else
    p_roc := 10

longCondition = ta.crossover(ma1, ma2) and (close > open ? close > ma3 : open > ma3) and ((ma3 - ma3[1])*100/ma3[1] >= -0.2) and ((close-close[p_roc])*100/close[p_roc] > -2.0)
float alpha = 0.0
float sl_src = high[1]
if (longCondition and cond1 and cond2 and strategy.position_size == 0)
    strategy.entry("buy", strategy.long)
    if timeframe.period == '240'
        alpha := 0.96
        strategy.exit("exit-buy","buy", stop = sl_src*alpha)
        // line.new(bar_index, sl_src*alpha, bar_index+5, sl_src*alpha, width = 2, color = color.white)
    else if timeframe.period == '30'
        alpha := 0.985
        strategy.exit("exit-buy","buy", stop = sl_src*alpha)
        // line.new(bar_index, sl_src*alpha, bar_index+20, sl_src*alpha, width = 2, color = color.white)
    else if timeframe.period == '45'
        alpha := 0.985
        strategy.exit("exit-buy","buy", stop = sl_src*alpha)
        // line.new(bar_index, sl_src*alpha, bar_index+20, sl_src*alpha, width = 2, color = color.white)
    else if timeframe.period == '60'
        alpha := 0.98
        strategy.exit("exit-buy","buy", stop = sl_src*alpha)
        // line.new(bar_index, sl_src*alpha, bar_index+20, sl_src*alpha, width = 2, color = color.white)
    else if timeframe.period == '120'
        alpha := 0.97
        strategy.exit("exit-buy","buy", stop = sl_src*alpha)
        // line.new(bar_index, sl_src*alpha, bar_index+20, sl_src*alpha, width = 2, color = color.white)
    else if timeframe.period == '180'
        alpha := 0.96
        strategy.exit("exit-buy","buy", stop = sl_src*alpha)
        // line.new(bar_index, sl_src*alpha, bar_index+20, sl_src*alpha, width = 2, color = color.white)
    else if timeframe.period == 'D'
        alpha := 0.95
        strategy.exit("exit-buy","buy", stop = sl_src*alpha)
        // line.new(bar_index, sl_src*alpha, bar_index+20, sl_src*alpha, width = 2, color = color.white)
    else 
        alpha := 0.93
        strategy.exit("exit-buy","buy", stop = sl_src*alpha)
        // line.new(bar_index, sl_src*alpha, bar_index+20, sl_src*alpha, width = 2, color = color.white)

period = switch timeframe.period
    "240" => 90
    "180" => 59
    "120" => 35
    "30" => 64
    "45" => 40
    "60" => 66
    "D" => 22
    => 64

if (count > period or close < ma3)
    strategy.close('buy', immediately = true) 

関連性

もっと

カズズ888移動式ストップはもっといいでしょう.