デュアルタイムスケールモメンタム戦略

SMA
作成日: 2024-04-25 17:33:02 最終変更日: 2024-04-25 17:33:02
コピー: 0 クリック数: 592
1
フォロー
1617
フォロワー

デュアルタイムスケールモメンタム戦略

概要

この戦略は,二時間スケールの動量戦略である.これは,上位時間周期で単純な移動平均 ((SMA) を使用してトレンドの方向を判断し,下位時間周期で枢軸ポイント ((PivotLowとPivotHigh) を使用して逆転点を識別する.上位時間周期で上昇傾向があり,下位時間周期で看板枢軸が開くとき,高位時間周期で下降傾向があり,下位時間周期で看板枢軸が開くとき,空いている.

戦略原則

この戦略の主な原理は,上位時間周期のトレンドの方向が下位時間周期の動きに影響するということです.上位時間周期が上昇傾向にあるとき,下位時間周期の回調は買い機会である可能性が高いです.上位時間周期が下位傾向にあるとき,下位時間周期の反転は空き機会である可能性が高いです.この戦略は,単純な移動平均 (SMA) を使用して,上位時間周期のトレンドの方向を判断し,枢軸 (PivotLowとPivotHigh) を使用して,下位時間周期の逆転点を識別します.

戦略的優位性

  1. 2つのタイムスケール分析により,高レベルのタイムサイクルが低レベルのタイムサイクルに与える影響を活用し,取引の成功確率を高めます.
  2. SMAを使ってトレンドの方向を判断する方が信頼性が高く,枢軸ポイントを使って反転点を捕捉する方が精度が高い.
  3. パラメータは調整可能で,適応性が強い。ユーザは,自分のニーズに応じて高低の時間尺度,SMAの周期,枢軸のパラメータ等を調整することができる。
  4. 論理が明確で,理解し,実行しやすい.

戦略リスク

  1. トレンド突破の危険. 高レベルのタイムサイクルで突然トレンドが変化した場合,低レベルのタイムサイクルがまだ反応していない可能性があり,策略が失敗する.
  2. パラメータ設定のリスク。不適切なパラメータ設定は,戦略の不良なパフォーマンスを引き起こす可能性があります。例えば,SMA周期を短すぎる選択は,頻繁な取引を引き起こす可能性があります,長すぎる選択は,トレンド判断の遅延を引き起こす可能性があります。
  3. 極端な状況のリスク. 極端な状況 (暴風雨の暴落など) で,この戦略は効果的ではないかもしれない. この状況では,低レベルのタイムサイクルが高レベルのタイムサイクルの傾向に従わないかもしれないからである.

戦略最適化の方向性

  1. トレンド変化の判断を追加する. 高レベルのタイムサイクルトレンドが変化しているかどうかを判断する論理を追加して,低レベルのタイムサイクルトレンドをより迅速に調整することができる.
  2. 最適化パラメータ選択。いくつかのパラメータ最適化方法 (遺伝的アルゴリズム,格子検索など) を用いて最適化パラメータ組み合わせを探す。
  3. リスクコントロールを増やす 極端な状況での損失を低減するために,リスクコントロールのいくつかの措置 (ストップ・ローズ,ポジション管理など) を追加することができます.
  4. 多要素融合 戦略の安定性を高めるために,他の指標または要因 (例えば波動率,取引量など) を戦略に統合することを検討することができます.

要約する

この二時間尺度動力の戦略は,高低レベルの時間周期の間のつながりを利用し,高レベルの時間周期でトレンドの方向を判断し,低レベルの時間周期で逆転のポイントをキャプチャすることで,トレンドフォローと逆転取引を実現する.この戦略の論理は明確で,優位性は明らかですが,同時にいくつかのリスクもあります.将来,トレンドの変化を判断し,パラメータ最適化,リスク制御,多因子融合などの面でこの戦略を最適化して,その適応性と安定性を向上させることができます.

ストラテジーソースコード
/*backtest
start: 2023-04-19 00:00:00
end: 2024-04-24 00:00:00
period: 1d
basePeriod: 1h
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/
// © Riester

//@version=5
strategy("Dual Timeframe Momentum", overlay=true, precision=6, pyramiding=0, initial_capital=1000, default_qty_type=strategy.percent_of_equity, default_qty_value=25.0, commission_value=0.05)

n = input.int(20, "Moving Average Period", minval=1)
src = input.source(close, "Source")
high_tf = input.timeframe("240", "Resolution")
pivot_l = input.int(5, "Pivot Let Bars")
pivot_r = input.int(2, "Pivot Right Bars")

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
// Calculations
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------

// 1. Define low and high timeframe prices
low_src = src
high_src = request.security(syminfo.tickerid, high_tf, src)

// 2. Use simple moving average to determine trend of higher timeframe (up or down)
high_tf_ma = ta.sma(high_src, n)
plot(high_tf_ma,  color=color.yellow)
high_tf_trend = high_tf_ma > high_tf_ma[1] ? 1 : -1

// 3. Use pivots to identify reversals on the low timeframe
low_tf_pl = ta.pivotlow(high_src, pivot_l, pivot_r)
plot(low_tf_pl, style=plot.style_line, linewidth=3, color= color.green, offset=-pivot_r)

low_tf_ph = ta.pivothigh(high_src, pivot_l, pivot_r)
plot(low_tf_ph, style=plot.style_line, linewidth=3, color= color.red, offset=-pivot_r)

bool long = low_tf_pl and high_tf_trend == 1
bool short = low_tf_ph and high_tf_trend == -1

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
// Plots
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------

// this message is an alert that can be sent to a webhook, which allows for simple automation if you have a server that listens to alerts and trades programmatically.
enter_long_alert = '{"side": "Long", "order": "Enter", "price": ' + str.tostring(open) + ', "timestamp": ' + str.tostring(timenow) + '}'
exit_long_alert = '{"side": "Long", "order": "Exit", "price": ' + str.tostring(open) + ', "timestamp": ' + str.tostring(timenow) + '}'

if long
    strategy.entry(id="Long", direction=strategy.long, limit=open, alert_message=enter_long_alert)

if short
    strategy.close(id="Long", comment="Close Long", alert_message=exit_long_alert)