移動平均交差信号戦略

作者: リン・ハーンチャオチャン,日付: 2024-01-08 15:54:32
タグ:

img

概要

この戦略では,異なる種類の移動平均を計算し,購入・販売信号を生成するために移動平均のクロス信号を実装します.

戦略原則

  1. この戦略では,SMA,EMA,WMAなど,様々な種類の移動平均値を選択できます.
  2. この戦略は,主要な移動平均値を計算し,また,第2の移動平均値を選択することができます.
  3. 主動平均と第二の移動平均の交差状況に基づいて市場傾向を判断する.
  4. 主動平均が自社の指定されたサイクル移動平均を超えると,購入信号が生成され,主動平均が自社の指定されたサイクル移動平均を下回ると,販売信号が生成されます.
  5. したがって,移動平均の交差状況により,市場の動向はより明確に判断できます.

戦略 の 利点

  1. 異なるニーズを満たすための移動平均値のタイプをカスタマイズできます.
  2. 2番目の移動平均値を追加して より明確な信号を得る.
  3. 移動平均値の調整可能なサイクル,異なる時間サイクルに適しています.
  4. より明確なグラフのための滑らかな色レンダリングです
  5. トレンドを正確に判断するために 交差信号メカニズムを使用します

リスクと戦略の最適化

  1. 移動平均値は遅延特性があり,誤った信号が発生することがあります.曲線適合移動平均値は適切に使用できます.
  2. 移動平均サイクルの不適切な設定は,取引機会を逃す可能性があります.最適なパラメータを見つけるためにより多くの組み合わせをテストすることができます.
  3. リスクを減らすため,取引量のエネルギーなどの他の指標を使用することが推奨されます.
  4. 信号の精度を向上させるために 移動平均をカール平均に変更することを検討します
  5. LSTMのようなモデルは戦略を最適化するために使用できます

結論

戦略の全体的な考え方は,市場動向を判断するために移動平均クロスの原則を使用して,異なるニーズを満たすためにカスタマイズ可能なパラメータを使用することで明確です.いくつかの問題もありますが,モデルとパラメータを最適化することで改善することができます.全体として,この戦略は移動平均に基づいた取引戦略の典型的な代表です.


/*backtest
start: 2023-01-01 00:00:00
end: 2024-01-07 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy("Moving averages-Strategy", overlay=true)
//Created by user ChrisMoody 4-24-2014
//Plots The Majority of Moving Averages
//Defaults to Current Chart Time Frame --- But Can Be Changed to Higher Or Lower Time Frames
//2nd MA Capability with Show Crosses Feature

//inputs
src = close
useCurrentRes = input(true, title="Use Current Chart Resolution?")
resCustom = input(title="Use Different Timeframe? Uncheck Box Above",defval="D")
len = input(20, title="Moving Average Length - LookBack Period")
atype = input(1,minval=1,maxval=7,title="1=SMA, 2=EMA, 3=WMA, 4=HullMA, 5=VWMA, 6=RMA, 7=TEMA")
cc = input(true,title="Change Color Based On Direction?")
smoothe = input(2, minval=1, maxval=10, title="Color Smoothing - 1 = No Smoothing")
doma2 = input(false, title="Optional 2nd Moving Average")
len2 = input(50, title="Moving Average Length - Optional 2nd MA")
atype2 = input(1,minval=1,maxval=7,title="1=SMA, 2=EMA, 3=WMA, 4=HullMA, 5=VWMA, 6=RMA, 7=TEMA")
cc2 = input(true,title="Change Color Based On Direction 2nd MA?")
warn = input(false, title="***You Can Turn On The Show Dots Parameter Below Without Plotting 2nd MA to See Crosses***")
warn2 = input(false, title="***If Using Cross Feature W/O Plotting 2ndMA - Make Sure 2ndMA Parameters are Set Correctly***")
sd = input(false, title="Show Dots on Cross of Both MA's")


res = useCurrentRes ? timeframe.period : resCustom
//hull ma definition
hullma = wma(2*wma(src, len/2)-wma(src, len), round(sqrt(len)))
//TEMA definition
ema1 = ema(src, len)
ema2 = ema(ema1, len)
ema3 = ema(ema2, len)
tema = 3 * (ema1 - ema2) + ema3

avg = atype == 1 ? sma(src,len) : atype == 2 ? ema(src,len) : atype == 3 ? wma(src,len) : atype == 4 ? hullma : atype == 5 ? vwma(src, len) : atype == 6 ? rma(src,len) : tema
//2nd Ma - hull ma definition
hullma2 = wma(2*wma(src, len2/2)-wma(src, len2), round(sqrt(len2)))
//2nd MA TEMA definition
sema1 = ema(src, len2)
sema2 = ema(sema1, len2)
sema3 = ema(sema2, len2)
stema = 3 * (sema1 - sema2) + sema3

avg2 = atype2 == 1 ? sma(src,len2) : atype2 == 2 ? ema(src,len2) : atype2 == 3 ? wma(src,len2) : atype2 == 4 ? hullma2 : atype2 == 5 ? vwma(src, len2) : atype2 == 6 ? rma(src,len2) : tema

out = avg 
out_two = avg2

out1 = request.security(syminfo.tickerid, res, out)
out2 = request.security(syminfo.tickerid, res, out_two)

ma_up = out1 >= out1[smoothe]
ma_down = out1 < out1[smoothe]

col = cc ? ma_up ? lime : ma_down ? red : aqua : aqua
col2 = cc2 ? ma_up ? lime : ma_down ? red : aqua : aqua

circleYPosition = out2

plot(out1, title="Multi-Timeframe Moving Avg", style=line, linewidth=4, color = col)
plot(doma2 and out2 ? out2 : na, title="2nd Multi-TimeFrame Moving Average", style=circles, linewidth=4, color=col2)
plot(sd and cross(out1, out2) ? circleYPosition : na,style=cross, linewidth=5, color=yellow)


longCondition = crossover(out1, out1[smoothe])
if (longCondition)
    strategy.entry("My Long Entry Id", strategy.long)

shortCondition = crossunder(out1, out1[smoothe])
if (shortCondition)
    strategy.entry("My Short Entry Id", strategy.short)

もっと