デュアルモメンタムインジケーターブレイクアウト戦略


作成日: 2023-11-16 17:00:54 最終変更日: 2023-12-01 14:59:44
コピー: 1 クリック数: 648
1
フォロー
1617
フォロワー

デュアルモメンタムインジケーターブレイクアウト戦略

概要

この戦略は,二重動量指数突破戦略である.これは,2つの異なるパラメータの設定の動量指数を使用して,両動量指数がゼロ軸を突破すると取引信号を生成する.この戦略は,多頭エントリーのみを行い,空頭は平仓のみに使用される.

戦略原則

まず,そのコードは,委託モード,手数料モードなどのポリシー属性を設定します. そして,次の2つの動向指標を計算します.

// Momentum settings

i_len           = input(defval = 12, title = "Length", minval = 1) 
i_src           = input(defval = close, title = "Source")
i_percent       = input(defval = true, title = "Percent?")
i_mom           = input(defval = "MOM2", title = "MOM Choice", options = ["MOM1", "MOM2"])

// Momentum code

mom0 = momentum(i_src, i_len, i_percent) 
mom1 = momentum(mom0, 1, i_percent)
mom2 = momentum(i_src, 1, i_percent)

momX = mom1 

if i_mom == "MOM2"
    momX := mom2

mom0は基礎動量指標で,長さはi_lenで,データソースはi_srcで,パーセントを計算するかどうかはi_percentによって決定される.

mom1は,mom0をデータ源として,長さが1の動量指標である.

mom2は,原始データ i_src を元に,長さ 1 の動量指標である.

最終的に使用される動量指標momXは,デフォルトではmom1で,またmom2を選択することもできます.

mom0とmomXが同時に0軸を超えると,多行; mom0とmomXが同時に0軸を下回ると,平行.

戦略的優位性

  1. 異なるパラメータ設定と組み合わせた二重動量指標を使用すると,取引信号の信頼性が向上し,二重確認は偽信号を低減する.

  2. 複数のエントリーのみを行い,空頭は平仓のみに使用され,取引頻度を低下させ,取引コストを削減できます.

  3. 動力指標のパラメータは,異なる市場環境に対応して調整できます.

  4. コード構造は明確で,理解し,修正しやすい.

  5. 自動取引システムと連携できる取引メッセージ設定が追加されています.

戦略リスク

  1. 双動量指標は偽信号を減少させても,弱いトレンド信号を逃す可能性があります.

  2. 複数の取引を行うだけで,空頭取引の機会を逃す可能性があります.

  3. 動量指標のパラメータを正しく設定しない場合,取引が頻度や遅すぎます.

  4. 回測データが不十分である場合,パラメータが過適合する可能性があります.

  5. ダブル確認は偽信号を減少させるが,完全に回避することはできません.

戦略最適化の方向性

  1. 異なる長さのパラメータの組み合わせをテストし,パーセントを計算するかどうかをテストして,最適なパラメータを見つけることができます.

  2. トレンドが確認された後,空頭取引のシグナルを追加して,より多くの取引機会を捕捉することを考えることができます.

  3. ROC,RSIなど,異なる動力の指標計算方法をテストして,よりよい効果を探すことができます.

  4. 市場が動揺したときに取引を避けるために,トレンドフィルターを組み合わせることができます.

  5. 利潤を最大化しながらリスクをコントロールするストップ・ロスの戦略を最適化できます.

要約する

この戦略は,典型的な二次動量指標突破戦略である。この戦略は,偽信号を減らすために二重確認を使用し,取引の頻度を減らすために多頭入りをのみ行う。この戦略の優点は,単純明快で,容易に実行でき,パラメータ最適化とリスク管理の際に大きな改善の余地がある。この戦略は,動量突破戦略の基礎的枠組みとして,全体的に実行可能であるが,特定の市場に対して最適化調整を行うことが必要である.

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

//@version=4
strategy("Momentum Long Strategy", overlay = false, precision = 2, initial_capital = 10000, default_qty_value = 10000, default_qty_type = strategy.cash, commission_type = strategy.commission.percent, commission_value = 0, calc_on_every_tick = true)

// There will be no short entries, only exits from long.
strategy.risk.allow_entry_in(strategy.direction.long)

// Calculate start/end date and time condition
startDate  = input(timestamp("2021-01-02T00:00:00"), title = "Start Date", type = input.time)
finishDate = input(timestamp("2021-12-31T00:00:00"), title = "End Date",type = input.time)
 
time_cond  =true

// Momentum settings

i_len           =       input(defval = 12,      title = "Length",       minval = 1)
i_src           =       input(defval = close,   title = "Source")
i_percent       =       input(defval = true,    title = "Percent?")
i_mom           =       input(defval = "MOM2",  title = "MOM Choice",   options = ["MOM1", "MOM2"])

// Messages for buy and sell
message_buy  = input("{{strategy.order.alert_message}}", title="Buy message")
message_sell = input("{{strategy.order.alert_message}}", title="Sell message")

// Momentum code

momentum(seria, length, percent) =>
	_mom        =       percent ? ( (seria / seria[length]) - 1) * 100 : seria - seria[length]
	_mom

mom0        =       momentum(i_src, i_len, i_percent)
mom1        =       momentum(mom0, 1, i_percent)
mom2        =       momentum(i_src, 1, i_percent)

momX        =       mom1

if i_mom == "MOM2"
    momX    :=     mom2
    
// Strategy Alerts    

if (mom0 > 0 and momX > 0 and time_cond)
    strategy.entry("MomLE", strategy.long, stop = high + syminfo.mintick, comment = "MomLE", alert_message = message_buy)
else
	strategy.cancel("MomLE")
if (mom0 < 0 and momX < 0 and time_cond)
	strategy.entry("MomExit", strategy.short, stop = low - syminfo.mintick, comment = "MomSE", alert_message = message_sell)
else
	strategy.cancel("MomExit")
	
// Plotting

plot(0, color = #5d606b, title = "ZERO")
plot(mom0, color = #00bcd4, title = "MOM")
plot(mom1, color = #00FF00, title = "MOM1", display = display.none)
plot(mom2, color = #00FF00, title = "MOM2")