トリプル・ムービング・平均量的な取引戦略

作者: リン・ハーンチャオチャン開催日:2024-01-23 14:20:50
タグ:

img

この戦略は,異なる期間の3つの移動平均を計算し,価格突破を組み合わせて取引信号を生成する.これは典型的なトレンドフォロー戦略に属している.この戦略は,市場の中期トレンドを追求することを目的とし,パラメータを動的に調整することによって異なる製品や取引環境に適応することができる.

原則

この戦略には,MA1,MA2,MA3という3つの移動平均値が含まれています.MA1とMA2は取引チャネルを形成し,そのクロスオーバーは取引信号を生成します.MA3は信号をフィルタリングするために使用されます.

急速移動平均MA1が中期移動平均MA2を超えると,短期トレンドの強化を示します.この時点で,価格が長期移動平均MA3を超えると,ロング信号が生成されます.逆に,MA1がMA2を下回り,価格がMA3を下回ると,ショート信号が生成されます.

MA3の役割は,短期間の市場騒音をフィルタリングし,トレンドが中期および長期段階に入っていることを決定した後のみシグナルを生成することです. 3つの移動平均値のパラメータを動的に調整することによって,戦略は異なる市場で最適なパラメータ組み合わせを見つけることができます.

利点

  • 複数の移動平均値で異なる周期の傾向を把握する
  • MA3は,シグナルをフィルタリングし,ウィップソーを避ける
  • 調整可能な移動平均の種類とパラメータ,高度な適応性
  • シグナルポイントを識別するためのクロスを視覚化

リスク

  • 主要なトレンドが逆転すると移動平均が遅れる可能性があります.
  • 取引頻度が高く,取引コストが増加し,リスクが上昇する
  • 不適切なパラメータは,オーバートレードまたは遅延信号を引き起こす可能性があります.

異なる製品のためのMA期間を最適化できる. 単一の損失を制御するためにストップ損失を最適化できる. 信号の有効性を確認し,偽信号を減らすために他の技術指標を組み合わせることができる.

オプティマイゼーションの方向性

  • トレンドを決定するための他の指標を追加します.例えばMACD,ボリンジャー帯など.
  • ストップ・ロスト/得益戦略を追加する
  • 最適な組み合わせを見つけるためにパラメータを動的に調整する
  • 異なる製品に対するパラメータ最適化
  • 取引コストを考慮し,取引頻度を最適化

概要

この戦略は,三つの移動平均を計算し,その交差点を観察することによって取引信号を生成する.トレンドを決定するために高速,中等,遅い線を組み合わせるアイデアを使用して,典型的なトレンドフォロー戦略である.この戦略はパラメータ最適化を通じて異なる製品に適応できるが,ウィップソーや欠陥の危険性がある.将来の改善は,信号の有効性を判断するための他の技術指標を導入し,ダイナミックパラメータ最適化メカニズムを開発し,戦略をより柔軟にする可能性がある.


/*backtest
start: 2023-01-16 00:00:00
end: 2024-01-22 00:00:00
period: 1d
basePeriod: 1h
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/
// © Meesemoo

//@version=4
strategy("Custom MA Strategy Tester", overlay = true)
MA1Period = input(13, title="MA1 Period")
MA1Type = input(title="MA1 Type", defval="SMA", options=["RMA", "SMA", "EMA", "WMA", "HMA", "DEMA", "TEMA"])
MA1Source = input(title="MA1 Source", type=input.source, defval=close)
MA1Visible = input(title="MA1 Visible", type=input.bool, defval=true)
MA2Period = input(50, title="MA2 Period")
MA2Type = input(title="MA2 Type", defval="SMA", options=["RMA", "SMA", "EMA", "WMA", "HMA", "DEMA", "TEMA"])
MA2Source = input(title="MA2 Source", type=input.source, defval=close)
MA2Visible = input(title="MA2 Visible", type=input.bool, defval=true) 
MA3Period = input(200, title="MA3 Period")
MA3Type = input(title="MA3 Type", defval="SMA", options=["RMA", "SMA", "EMA", "WMA", "HMA", "DEMA", "TEMA"])
MA3Source = input(title="MA3 Source", type=input.source, defval=close)
MA3Visible = input(title="MA3 Visible", type=input.bool, defval=true)
ShowCrosses = input(title="Show Crosses", type=input.bool, defval=true)

MA1 = if MA1Type == "SMA"
    sma(MA1Source, MA1Period)
else
    if MA1Type == "EMA"
        ema(MA1Source, MA1Period)
    else
        if MA1Type == "WMA"
            wma(MA1Source, MA1Period)
        else
            if MA1Type == "RMA"
                rma(MA1Source, MA1Period)
            else
                if MA1Type == "HMA"
                    wma(2*wma(MA1Source, MA1Period/2)-wma(MA1Source, MA1Period), round(sqrt(MA1Period)))
                else
                    if MA1Type == "DEMA"
                        e = ema(MA1Source, MA1Period)
                        2 * e - ema(e, MA1Period)
                    else
                        if MA1Type == "TEMA"
                            e = ema(MA1Source, MA1Period)
                            3 * (e - ema(e, MA1Period)) + ema(ema(e, MA1Period), MA1Period)

                    
MA2 = if MA2Type == "SMA"
    sma(MA2Source, MA2Period)
else
    if MA2Type == "EMA"
        ema(MA2Source, MA2Period)
    else
        if MA2Type == "WMA"
            wma(MA2Source, MA2Period)
        else
            if MA2Type == "RMA"
                rma(MA2Source, MA2Period)
            else
                if MA2Type == "HMA"
                    wma(2*wma(MA2Source, MA2Period/2)-wma(MA2Source, MA2Period), round(sqrt(MA2Period)))
                else
                    if MA2Type == "DEMA"
                        e = ema(MA2Source, MA2Period)
                        2 * e - ema(e, MA2Period)
                    else
                        if MA2Type == "TEMA"
                            e = ema(MA2Source, MA2Period)
                            3 * (e - ema(e, MA2Period)) + ema(ema(e, MA2Period), MA2Period)
                    
MA3 = if MA3Type == "SMA"
    sma(MA3Source, MA3Period)
else
    if MA3Type == "EMA"
        ema(MA3Source, MA3Period)
    else
        if MA3Type == "WMA"
            wma(MA3Source, MA3Period)
        else
            if MA3Type == "RMA"
                rma(MA3Source, MA3Period)
            else
                if MA3Type == "HMA"
                    wma(2*wma(MA3Source, MA3Period/2)-wma(MA3Source, MA3Period), round(sqrt(MA3Period)))
                else
                    if MA3Type == "DEMA"
                        e = ema(MA3Source, MA3Period)
                        2 * e - ema(e, MA3Period)
                    else
                        if MA3Type == "TEMA"
                            e = ema(MA3Source, MA3Period)
                            3 * (e - ema(e, MA3Period)) + ema(ema(e, MA3Period), MA3Period)
                    


p1 = plot(MA1Visible ? MA1 : na, color=color.green, linewidth=1)
p2 = plot(MA2Visible ? MA2 : na, color=color.yellow, linewidth=1)
p3 = plot(MA3Visible ? MA3 : na, color=color.red, linewidth=2)

fill(p1, p2, color.silver, transp=80, title="Fill")


start = timestamp(2019, 1, 1, 1, 0)
end = timestamp(2025, 1, 1, 1, 0)

if time >= start and time <= end
    longCondition = crossover(MA1, MA2) and close > MA3
    if (longCondition)
        strategy.entry("Long", strategy.long)
        
    shortCondition = crossunder(MA1, MA2) and close < MA3
    if (shortCondition)
        strategy.entry("Short", strategy.short)

もっと