移動平均線のクロスオーバーに基づくトレンドフォロー戦略


作成日: 2024-02-23 12:21:40 最終変更日: 2024-02-23 12:21:40
コピー: 4 クリック数: 619
1
フォロー
1617
フォロワー

移動平均線のクロスオーバーに基づくトレンドフォロー戦略

概要

この戦略は,2つの異なるパラメータセットの移動平均を計算し,その交差を比較して価格のトレンド方向を判断し,トレンドを追跡する取引を実現します. 急速な移動平均が下からゆっくりとした移動平均を破るときは,看板の信号として判断し,急速な移動平均が上からゆっくりとした移動平均を破るときは,看板の信号として判断します. この戦略は,パラメータセットによって異なる周期のトレンド判断を実現します.

戦略原則

この策略は,異なるパラメータ設定の2組の移動平均を比較する.最初の移動平均パラメータはlen1とtype1によって設定され,第二の移動平均パラメータはlen2とtype2によって設定されている.その中でlen1とlen2は,それぞれ2つの移動平均の周期長さを表し,type1とtype2は移動平均のアルゴリズムのタイプを表しています.

急速移動平均が下から突破してゆっくり移動平均を形成すると金叉は看板信号と判断し,急速移動平均が上から下から突破してゆっくり移動平均を形成するとデッドフォークは看板信号と判断する.

交差信号の方向に応じて,多行または空行操作を実行する.看板信号が触発されたとき,needlongパラメータがtrueであれば,default_qty_valueの数またはポジション%_of_equityのパーセントに従って多行する.看板信号が触発されたとき,needshortパラメータがtrueであれば,default_qty_valueの数またはポジション%_of_equityのパーセントに従って空行する.

戦略的優位性

  1. 7種類の異なる移動平均の組み合わせをサポートし,市場環境に柔軟に対応します.
  2. 長期トレンドと中短期トレンドの判断を可能にする2つの移動平均のカスタマイズ可能なパラメータ
  3. 戦略信号の判断規則はシンプルで明確で,容易に理解できる.
  4. トレンドトラッキングの為の多引数と空白の操作をサポートします.

リスクと解決

  1. 移動平均は遅滞しており,価格の転換点を逃している可能性があります. 解決策:移動平均の周期を適切に短縮するか,他の指標と組み合わせて使用する

  2. 高波動性で頻繁に反転する市場には適用されない 解決策: フィルタリング条件を増やして 変動の交易を避ける

  3. 偽信号の危険性がある 解決策:他のフィルタリング指標を組み合わせて,信号の信頼性を向上させる

最適化の方向

  1. 移動平均の周期组合を最適化し,戦略のリターンに対する長短周期パラメータの影響をそれぞれテストする
  2. 異なる種類の移動平均のパフォーマンスをテストし,最適な移動平均アルゴリズムを見つけます.
  3. VARIABLEやブリンチャネルなどの指標を組み合わせて信号の質を向上させる
  4. ポジション管理戦略の最適化,固定ポジションの%_of_equityの改善方法

要約する

この戦略は,2つの移動平均の交差状況を比較して価格の傾向を判断し,相応の看板・下向き操作を行うことで,トレンドの捕捉と追跡を可能にします.戦略の優点は,シグナル規則がシンプルで明確で,パラメータは調整可能で,適用性が強く,複数の市場環境に最適に調整することができます.移動平均の遅れや震動のリスクを防ぐことに注意する必要があります.他の指標を加えることでシグナル品質を向上させるためにフィルタリングすることができます.

ストラテジーソースコード
/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
strategy(title = "Noro's MAs Cross Tests v1.0", shorttitle = "MAs Cross tests 1.0", overlay=true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100.0, pyramiding = 0)

needlong = input(true, "long")
needshort = input(true, "short")

len2 = input(15, defval = 15, minval = 2, maxval = 1000, title = "Fast MA length")
type2 = input(1, defval = 1, minval = 1, maxval = 7, title = "Fast MA Type")
src2 = input(close, defval = close, title = "Fast MA Source")

len1 = input(30, defval = 30, minval = 2, maxval = 1000, title = "Slow MA length")
type1 = input(1, defval = 1, minval = 1, maxval = 7, title = "Slow MA Type")
src1 = input(close, defval = close, title = "Slow MA Source")

col = input(false, defval = false, title = "Color of bar")

o = input(false, title = "1 SMA, 2 EMA, 3 VWMA, 4 DEMA, 5 TEMA, 6 KAMA, 7 Price Channel") 

//DEMA 1
dema1 = 2 * ema(src1, len1) - ema(ema(close, len1), len1)

//TEMA 1
xEMA1 = ema(src1, len1)
xEMA2 = ema(xEMA1, len1)
xEMA3 = ema(xEMA2, len1)
tema1 = 3 * xEMA1 - 3 * xEMA2 + xEMA3

//KAMA 1
xvnoise = abs(src1 - src1[1])
nfastend = 0.20
nslowend = 0.05
nsignal = abs(src1 - src1[len1])
nnoise = sum(xvnoise, len1)
nefratio = iff(nnoise != 0, nsignal / nnoise, 0)
nsmooth = pow(nefratio * (nfastend - nslowend) + nslowend, 2) 
kama1 = nz(kama1[1]) + nsmooth * (src1 - nz(kama1[1]))

//PriceChannel 1
lasthigh1 = highest(src1, len1)
lastlow1 = lowest(src1, len1)
center1 = (lasthigh1 + lastlow1) / 2

//DEMA 2
dema2 = 2 * ema(src2, len2) - ema(ema(close, len2), len2)

//TEMA 2
xEMA12 = ema(src2, len2)
xEMA22 = ema(xEMA12, len2)
xEMA32 = ema(xEMA22, len2)
tema2 = 3 * xEMA12 - 3 * xEMA22 + xEMA32

//KAMA 2
xvnoise2 = abs(src2 - src2[1])
nfastend2 = 0.20
nslowend2 = 0.05
nsignal2 = abs(src2 - src2[len2])
nnoise2 = sum(xvnoise2, len2)
nefratio2 = iff(nnoise2 != 0, nsignal2 / nnoise2, 0)
nsmooth2 = pow(nefratio2 * (nfastend2 - nslowend2) + nslowend2, 2) 
kama2 = nz(kama2[1]) + nsmooth2 * (src2 - nz(kama2[1]))

//PriceChannel 2
lasthigh2 = highest(src2, len2)
lastlow2 = lowest(src2, len2)
center2 = (lasthigh2 + lastlow2) / 2

//MAs
ma1 = type1 == 1 ? sma(src1, len1) : type1 == 2 ? ema(src1, len1) : type1 == 3 ? vwma(src1, len1) : type1 == 4 ? dema1 : type1 == 5 ? tema1 : type1 == 6 ? kama1 : type1 == 7 ? center1 : 0
ma2 = type2 == 1 ? sma(src2, len2) : type2 == 2 ? ema(src2, len2) : type2 == 3 ? vwma(src2, len2) : type2 == 4 ? dema2 : type2 == 5 ? tema2 : type2 == 6 ? kama2 : type2 == 7 ? center2 : 0
plot(ma1, color = blue, linewidth = 3, transp = 0)
plot(ma2, color = red, linewidth = 3, transp = 0)

//Signals
trend = ma2 > ma1 ? 1 : ma2 < ma1 ? -1 : trend[1]
up = trend == 1 and ((close < open and close[1] < open[1]) or col == false)
dn = trend == -1 and ((close > open and close[1] > open[1]) or col == false)

if up
    strategy.entry("Long", strategy.long, needlong == false ? 0 : na)

if dn
    strategy.entry("Short", strategy.short, needshort == false ? 0 : na)