
この戦略は,二重動量指数突破戦略である.これは,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軸を下回ると,平行.
異なるパラメータ設定と組み合わせた二重動量指標を使用すると,取引信号の信頼性が向上し,二重確認は偽信号を低減する.
複数のエントリーのみを行い,空頭は平仓のみに使用され,取引頻度を低下させ,取引コストを削減できます.
動力指標のパラメータは,異なる市場環境に対応して調整できます.
コード構造は明確で,理解し,修正しやすい.
自動取引システムと連携できる取引メッセージ設定が追加されています.
双動量指標は偽信号を減少させても,弱いトレンド信号を逃す可能性があります.
複数の取引を行うだけで,空頭取引の機会を逃す可能性があります.
動量指標のパラメータを正しく設定しない場合,取引が頻度や遅すぎます.
回測データが不十分である場合,パラメータが過適合する可能性があります.
ダブル確認は偽信号を減少させるが,完全に回避することはできません.
異なる長さのパラメータの組み合わせをテストし,パーセントを計算するかどうかをテストして,最適なパラメータを見つけることができます.
トレンドが確認された後,空頭取引のシグナルを追加して,より多くの取引機会を捕捉することを考えることができます.
ROC,RSIなど,異なる動力の指標計算方法をテストして,よりよい効果を探すことができます.
市場が動揺したときに取引を避けるために,トレンドフィルターを組み合わせることができます.
利潤を最大化しながらリスクをコントロールするストップ・ロスの戦略を最適化できます.
この戦略は,典型的な二次動量指標突破戦略である。この戦略は,偽信号を減らすために二重確認を使用し,取引の頻度を減らすために多頭入りをのみ行う。この戦略の優点は,単純明快で,容易に実行でき,パラメータ最適化とリスク管理の際に大きな改善の余地がある。この戦略は,動量突破戦略の基礎的枠組みとして,全体的に実行可能であるが,特定の市場に対して最適化調整を行うことが必要である.
/*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")