Strategi Perdagangan Kuantitatif Rata-rata Bergerak Tiga

Penulis:ChaoZhang, Tanggal: 2024-01-23 14:20:50
Tag:

img

Strategi ini menghasilkan sinyal perdagangan dengan menghitung tiga rata-rata bergerak dari periode yang berbeda dan menggabungkan terobosan harga. Strategi ini termasuk dalam strategi trend-following yang khas. Strategi ini bertujuan untuk mengikuti tren jangka menengah di pasar dan dapat disesuaikan dengan produk dan lingkungan perdagangan yang berbeda dengan menyesuaikan parameter secara dinamis.

Prinsip

Strategi ini berisi tiga rata-rata bergerak: MA1, MA2 dan MA3. MA1 dan MA2 membentuk saluran perdagangan, dan silangannya menghasilkan sinyal perdagangan; MA3 digunakan untuk menyaring sinyal.

Ketika rata-rata bergerak cepat MA1 melintasi di atas rata-rata bergerak jangka menengah MA2, ini menunjukkan penguatan tren jangka pendek. Pada saat ini, jika harga di atas rata-rata bergerak jangka panjang MA3, sinyal panjang dihasilkan; sebaliknya, jika MA1 melintasi di bawah MA2 dan harga di bawah MA3, sinyal pendek dihasilkan.

Peran MA3 adalah untuk menyaring kebisingan pasar jangka pendek dan hanya menghasilkan sinyal setelah menentukan bahwa tren telah memasuki tahap jangka menengah dan panjang. Dengan menyesuaikan secara dinamis parameter dari tiga rata-rata bergerak, strategi dapat menemukan kombinasi parameter optimal di pasar yang berbeda.

Keuntungan

  • Menangkap tren dari siklus yang berbeda melalui beberapa rata-rata bergerak
  • MA3 menyaring sinyal untuk menghindari whipsaws
  • Jenis dan parameter rata-rata bergerak yang dapat disesuaikan, kemampuan beradaptasi yang tinggi
  • Visualisasikan salib untuk mengidentifikasi titik sinyal

Risiko

  • Rata-rata bergerak mungkin tertinggal ketika tren utama berbalik
  • Potensi frekuensi perdagangan yang tinggi, peningkatan biaya perdagangan dan risiko slippage
  • Parameter yang tidak tepat dapat menyebabkan sinyal overtrading atau lag

Dapat mengoptimalkan periode MA untuk produk yang berbeda; mengoptimalkan stop loss untuk mengendalikan kerugian tunggal; menggabungkan indikator teknis lainnya untuk mengkonfirmasi validitas sinyal dan mengurangi sinyal palsu.

Arahan Optimasi

  • Tambahkan indikator lain untuk menentukan tren, misalnya MACD, Bollinger Bands, dll.
  • Tambahkan strategi stop loss/take profit
  • Mengatur parameter secara dinamis untuk menemukan kombinasi optimal
  • Optimasi parameter untuk produk yang berbeda
  • Pertimbangkan biaya perdagangan, mengoptimalkan frekuensi perdagangan

Ringkasan

Strategi ini menghasilkan sinyal perdagangan dengan menghitung tiga rata-rata bergerak dan mengamati persilangan mereka. Menggunakan gagasan menggabungkan garis cepat, menengah dan lambat untuk menentukan tren, ini adalah strategi trend-mengikuti khas. Strategi dapat disesuaikan dengan produk yang berbeda melalui optimasi parameter, tetapi risiko whipsaws dan kehilangan belokan. Peningkatan di masa depan dapat memperkenalkan indikator teknis lainnya untuk menilai validitas sinyal, mengembangkan mekanisme optimasi parameter dinamis, dll untuk membuat strategi lebih fleksibel.


/*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)

Lebih banyak