逆転の二重移動平均のクロスオーバー戦略

作者: リン・ハーンチャオチャン開催日:2023年12月28日 12:00:27
タグ:

img

概要: この戦略は,移動平均クロスオーバーのクラシックな取引戦略に基づいています. 単純な移動平均 (SMA),指数的な移動平均 (EMA),変動重量移動平均 (VWMA),ハル移動平均 (HMA) を含む二重移動平均を使用します.

原則:戦略の核心論理は,二重移動平均クロスオーバーである.異なるパラメータを持つ2つの移動平均を計算することによって,速い移動平均が遅い平均を横切ると購入信号が生成され,速い移動平均が遅い平均を下回ると販売信号が生成される.移動平均クロスオーバーは,短期および長期の価格動向のターニングポイントを表す.

優位性分析:ダブル移動平均クロスオーバー戦略の主な利点は,単純性と操作の容易さである.たった1つの信号で,パラメータの選択と調整があまりにも多くなく,最も基本的なトレンド判断を得ることができる.これは初心者トレーダーに非常に適している.また,異なる組み合わせを最適化するために,さまざまなタイプの移動平均がテストされる.

リスク分析:この戦略の主なリスクは,一般的な移動平均クロスオーバー戦略が多くの誤ったシグナルを持ち,複数の小さな利益とフラットポジションをもたらし,全体的な収益に影響を与える.さらに,固定した高速および遅い移動平均長度設定は特定のサイクルで失敗する可能性があります.

最適化方向: 1) 移動平均交差の最適な組み合わせを決定するために異なる期間をテストする. 2) 誤った信号を減らす判断を支援するために,移動平均パラメータとRSI指標の2つ目のセットを導入することを検討する. 3) より信頼性の高い交差判断を得るために,単純な交差ではなく,MA指標の漸進的な変化に基づいた状態判断を導入する.

概要: この戦略は,移動平均期間の最適な組み合わせを見つけるために二重移動平均をテストするために,伝統的な移動平均クロスオーバー戦略の枠組みを採用している.同時に,移動平均のROCと価格に基づいてストップ損失判断を追加している.全体として,定量的な取引論理に適合するシンプルで使いやすい二重移動平均戦略である.さらに,豊富な最適化アイデアは,この戦略のさらなる開発にも余地を提供します.


/*backtest
start: 2023-11-27 00:00:00
end: 2023-12-27 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
//study(title="MA Crossover Strategy", overlay = true)
strategy("MA Crossover Strategy with MA Turning Point Exits", overlay=true)
src = input(close, title="Source")

price = request.security(syminfo.tickerid, timeframe.period, src)
ma1 = input(5, title="1st MA Length")
type1 = input("HMA", "1st MA Type", options=["SMA", "EMA", "HMA", "VWMA"])

ma2 = input(7, title="2nd MA Length")
type2 = input("HMA", "2nd MA Type", options=["SMA", "EMA", "HMA", "VWMA"])

f_hma(_src, _length)=>
    _return = wma((2*wma(_src, _length/2))-wma(_src, _length), round(sqrt(_length)))
price1 = if (type1 == "SMA")
    sma(price, ma1)
else
    if (type1 == "EMA")
        ema(price, ma1)
    else
        if (type1 == "VWMA")
            vwma(price, ma1)
        else
            f_hma(price, ma1)
    
price2 = if (type2 == "SMA")
    sma(price, ma2)
else
    if (type2 == "EMA")
        ema(price, ma2)
    else
        if (type2 == "VWMA")
            vwma(price, ma2)
        else
            f_hma(price, ma2)

//plot(series=price, style=line,  title="Price", color=black, linewidth=1, transp=0)
plot(series=price1, style=line,  title="1st MA", color=blue, linewidth=2, transp=0)
plot(series=price2, style=line, title="2nd MA", color=green, linewidth=2, transp=0)


longCondition = crossover(price1, price2)
if (longCondition) // and time>timestamp(2018,6,1,9,30)
    strategy.entry("Long", strategy.long)

shortCondition = crossunder(price1, price2)
if (shortCondition) // and time>timestamp(2018,6,1,9,30)
    strategy.entry("Short", strategy.short)

lookback1 = input(1, "Lookback 1")
roc1 = roc(price1, lookback1)

ma1up = false
ma1down = false
ma2up = false
ma2down = false

ma1up := nz(ma1up[1])
ma1down := nz(ma1down[1])
ma2up := nz(ma2up[1])
ma2down := nz(ma2down[1])

trendStrength1 = input(2, title="Minimum slope magnitude * 100", type=float) * 0.01

if crossover(roc1, trendStrength1)
    ma1up := true
    ma1down := false
    
if crossunder(roc1, -trendStrength1) 
    ma1up := false
    ma1down := true

shortexitCondition = ma1up and ma1down[1]
if (shortexitCondition)
    strategy.close("Short")

longexitCondition = ma1down and ma1up[1]
if (longexitCondition)
    strategy.close("Long")



もっと