Trend Purata Bergerak Tiga Berikutan Strategi

Penulis:ChaoZhang, Tarikh: 2024-02-01 11:02:17
Tag:

img

Ringkasan

Strategi ini menggabungkan konsep perdagangan penyu dengan analisis fasa Niko Bakker, menggunakan tiga purata bergerak dari kitaran yang berbeza untuk menentukan arah trend untuk trend berikut. Ia pergi lama apabila purata bergerak pantas melintasi purata bergerak sederhana dan ketiga-tiga purata bergerak berada dalam trend menaik atau menurun yang sama; Ia pergi pendek apabila purata bergerak pantas melintasi di bawah purata bergerak sederhana dan ketiga-tiga purata bergerak berada dalam trend menaik atau menurun yang sama.

Logika Strategi

  1. Hitung tiga purata bergerak kitaran yang berbeza: tempoh purata bergerak pantas adalah 8 hari, tempoh purata bergerak sederhana adalah 21 hari, dan tempoh purata bergerak perlahan adalah 55 hari.

  2. Tentukan syarat kemasukan: apabila purata bergerak pantas melintasi di atas purata bergerak sederhana, dan ketiga-tiga purata bergerak berada dalam trend menaik, pergi panjang; apabila purata bergerak pantas melintasi di bawah purata bergerak sederhana, dan ketiga-tiga purata bergerak berada dalam trend menurun, pergi pendek.

  3. Tentukan keadaan keluar: tutup kedudukan apabila purata bergerak pantas melintasi purata bergerak sederhana ke arah yang bertentangan.

  4. Ukuran kedudukan: gunakan saiz kedudukan tetap, buka 1 kontrak setiap kali. ATR juga boleh digunakan untuk menyesuaikan saiz kedudukan secara dinamik.

Analisis Kelebihan

  1. Menggunakan tiga purata bergerak membantu menentukan arah trend dan mengelakkan pecah palsu.

  2. Trend berikut untuk potensi keuntungan.

  3. Menggunakan purata bergerak menghasilkan keuntungan yang stabil dan drawdown yang agak kecil.

  4. Strategi stop loss yang boleh dikawal mengurangkan kemungkinan kerugian besar.

Analisis Risiko

  1. Rendah kepada banyak kerugian kecil, mengurangkan kecekapan keuntungan.

  2. Purata bergerak tertinggal dan mungkin terlepas titik pembalikan trend.

  3. Ukuran kedudukan tetap tidak dapat mengawal risiko dengan berkesan, boleh menyebabkan panggilan margin semasa turun naik pasaran yang ketara.

  4. Pengoptimuman parameter yang tidak betul membawa kepada perdagangan yang berlebihan, meningkatkan kos perdagangan dan slippage.

Pengoptimuman

  1. Mengoptimumkan tempoh purata bergerak sesuai dengan ciri-ciri instrumen dagangan.

  2. Gunakan ATR untuk menyesuaikan saiz kedudukan secara dinamik.

  3. Tambah strategi stop loss.

  4. Menggabungkan penunjuk jumlah dagangan untuk menentukan kebolehpercayaan trend.

Ringkasan

Strategi ini mengintegrasikan penunjuk teknikal tradisional dan falsafah perdagangan penyu, menggunakan tiga purata bergerak untuk mengesan trend. Dengan pengoptimuman parameter yang betul, ia dapat mencapai keuntungan yang baik. Tetapi ia juga mempunyai beberapa risiko. Stop loss, saiz kedudukan dan langkah-langkah lain perlu digunakan untuk mengawal risiko dan mendapatkan keuntungan yang stabil jangka panjang dari strategi perdagangan kuantitatif ini.


/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 00:00:00
period: 3h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// LOVE JOY PEACE PATIENCE KINDNESS GOODNESS FAITHFULNESS GENTLENESS SELF-CONTROL 
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © JoshuaMcGowan

//@version=4

// 1. Define strategy settings
strategy(title="Triple Moving Average", overlay=true,
     pyramiding=0, initial_capital=1000,
     commission_type=strategy.commission.cash_per_order,
     commission_value=4, slippage=2)
     
fastMALen = input(title="Fast MA Length", type=input.integer, defval=8)
medMALen  = input(title="Medium MA Length", type=input.integer, defval=21)
slowMALen = input(title="Slow MA Length", type=input.integer, defval=55)

//endMonth = input(title="End Month Backtest", type=input.integer, defval=11)
//endYear  = input(title="End Year Backtest", type=input.integer, defval=2019)

// === INPUT BACKTEST RANGE ===
FromMonth = input(defval = 12, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2016, title = "From Year", minval = 2017)
ToMonth   = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 9999, title = "To Year", minval = 2017)

// === FUNCTION EXAMPLE ===
start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  // backtest start window
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)        // backtest finish window
window()  => true

usePosSize = input(title="Use Position Sizing?", type=input.bool, defval=true)
riskPerc   = input(title="Risk %", type=input.float, defval=0.5, step=0.25)

// 2. Calculate strategy values
fastMA = sma(close, fastMALen)
medMA  = sma(close, medMALen)
slowMA = sma(close, slowMALen)

//Position Sizing
riskEquity  = (riskPerc / 100) * strategy.equity
atrCurrency = (atr(20) * syminfo.pointvalue)
posSize     = usePosSize ? floor(riskEquity / atrCurrency) : 1

//Backtest Window
//tradeWindow = (time <= timestamp(endYear, endMonth, 1, 0, 0))

// 3. Determine long trading conditions
enterLong = crossover(fastMA, medMA) and
     (fastMA > slowMA) and (medMA > slowMA) and
     window() 

exitLong = crossunder(fastMA, medMA)

// 4. Code short trading conditions
enterShort = crossunder(fastMA, medMA) and
     (fastMA < slowMA) and (medMA < slowMA) and
     window() 

exitShort = crossover(fastMA, medMA)

// 5. Output strategy data
plot(series=fastMA, color=color.green, title="Fast MA")
plot(series=medMA, color=color.purple, title="Medium MA")
plot(series=slowMA, color=color.red, title="Slow MA",
     linewidth=2)
     
bgColour =
     enterLong and (strategy.position_size < 1) ? color.green :
     enterShort and (strategy.position_size > -1) ? color.red :
     exitLong and (strategy.position_size > 0) ? color.lime :
     exitShort and (strategy.position_size < 0) ? color.orange :
     na

bgcolor(color=bgColour, transp=85)

// 6. Submit entry orders
if (enterLong)
    strategy.entry(id="EL", long=true, qty=1)

if (enterShort)
    strategy.entry(id="ES", long=false, qty=1)

// 7. Submit exit orders
strategy.close_all(when=exitLong and
     (strategy.position_size > 0))
strategy.close_all(when=exitShort and
     (strategy.position_size < 0))

strategy.close_all(when=not window())

//END

Lebih lanjut