トレーディングVMA戦略は,変動移動平均線に基づいた定量的な取引戦略である.市場動向を把握し,それに応じて取引シグナルを生成するために,変化する移動平均を活用する.
トレーディングVMA戦略の核心は,変数長移動平均値 (Variable Moving Average, VMA) の計算である.移動平均値は,特定の期間における平均価格を計算する広く知られている技術指標である.トレディングVMA戦略で使用されるVMAには,異なる期間長さがある.
具体的には,戦略はまず,価格方向動向指標 (PDM,MDIM),スムーズデータ (PDM,MDMs) などの一連の中間数値を計算する.これらのデータは最終的に指標強度 (iS) を得るために使用される.この指標は価格変動の強度を反映する.
その後,TradingVMA戦略は,指標強度に基づいて移動平均期間を動的に調整します.市場の変動が増加すると,移動平均期間が短くなって逆になります. これにより,市場の変化により迅速に対応できます.
最後に,この戦略は,現在の価格とVMAを比較して取引信号を生成します.価格がVMAを超えるとロングになり,価格がVMAを下回るとショートになります.
トレーディングVMA戦略には以下の主な利点があります.
変動期間のシミュレーションによりノイズが安定します 変動期間のシミュレーションによりノイズと傾向のシグナルが安定します
価格変化に対する迅速な反応は反応力を向上させる
取引頻度を減らす 過剰取引を減らす - 固定期間の指標と比較して,TradingVMAは不要な取引を減らすことができます.
カスタマイズ可能なパラメータ 柔軟性 - 戦略は,ユーザーが異なる市場環境に合わせて自分の好みに基づいてパラメータを選択することを可能にします.
また,TradingVMA戦略には次の主要なリスクがあります.
急速な逆転が欠けている場合 傾向が急速に逆転すると,継続的に調整される移動平均が反応に遅れることがあります.
遅延バイアス
誤ったシグナル
難しいパラメータ最適化
これらのリスクは,ストップ損失,パラメータの組み合わせの調整などの方法によって制御できます.
また,TradingVMA戦略は以下の側面で強化される可能性があります.
他の指標を組み合わせる
パラメータ最適化 バックテストと最適化によって最適なパラメータを発見する.
適応的な取引規則 市場制度ごとに異なるエントリールール,ストップ損失を使用します.
システム化 楽に最適化するために戦略をアルゴリズム化しシステム化します.
トレーディングVMAは,適応可能な定量戦略である.特に設計されたVMAインジケーターを使用して市場のトレンドを把握し,反応性があり,ノイズをフィルタリングする利点を備えている.より良いパフォーマンスのために戦略は複数の方法でアップグレードすることができます.しかし,遅延バイアスなどの固有の問題が持続する可能性があります.全体として,トレディングVMAは,トレンドフォローする有望な戦略です.
/*backtest start: 2024-01-01 00:00:00 end: 2024-01-24 23:59:59 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © laptevmaxim92 //@version=4 strategy("Variable Moving Average Strategy", overlay=true) src=close l =input(5, title="VMA Length") std=input(true, title="Show Trend Direction Colors") utp = input(false, "Use take profit?") pr = input(100, "Take profit pips") usl = input(false, "Use stop loss?") sl = input(100, "Stop loss pips") fromday = input(01, defval=01, minval=01, maxval=31, title="From Day") frommonth = input(01, defval=01, minval= 01, maxval=12, title="From Month") fromyear = input(2000, minval=1900, maxval=2100, title="From Year") today = input(31, defval=01, minval=01, maxval=31, title="To Day") tomonth = input(12, defval=12, minval=01, maxval=12, title="To Month") toyear = input(2019, minval=1900, maxval=2100, title="To Year") use_date = (time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 00, 00)) k = 1.0/l pdm = 0.0 pdm := max((src - src[1]), 0) mdm = 0.0 mdm := max((src[1] - src), 0) pdmS = 0.0 pdmS := ((1 - k)*nz(pdmS[1]) + k*pdm) mdmS = 0.0 mdmS := ((1 - k)*nz(mdmS[1]) + k*mdm) s = pdmS + mdmS pdi = pdmS/s mdi = mdmS/s pdiS = 0.0 pdiS := ((1 - k)*nz(pdiS[1]) + k*pdi) mdiS = 0.0 mdiS := ((1 - k)*nz(mdiS[1]) + k*mdi) d = abs(pdiS - mdiS) s1 = pdiS + mdiS iS = 0.0 iS := ((1 - k)*nz(iS[1]) + k*d/s1) hhv = highest(iS, l) llv = lowest(iS, l) d1 = hhv - llv vI = (iS - llv)/d1 vma = 0.0 vma := (1 - k*vI)*nz(vma[1]) + k*vI*src vmaC=(vma > vma[1]) ? color.lime : (vma<vma[1]) ? color.red : (vma==vma[1]) ? color.yellow : na plot(vma, color=std?vmaC:color.white, linewidth=3, title="VMA") longCondition = vma > vma[1] if (longCondition) strategy.entry("BUY", strategy.long and use_date) shortCondition = vma < vma[1] if (shortCondition) strategy.entry("SELL", strategy.short and use_date) if (utp and not usl) strategy.exit("TP", "BUY", profit = pr) strategy.exit("TP", "SELL", profit = pr) if (usl and not utp) strategy.exit("SL", "BUY", loss = sl) strategy.exit("SL", "SELL", loss = sl) if (usl and utp) strategy.exit("TP/SL", "BUY", loss = sl, profit = pr) strategy.exit("TP/SL", "SELL", loss = sl, profit = pr)