Tren Rata-rata Bergerak Tiga Berikut Strategi

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

img

Gambaran umum

Strategi ini menggabungkan konsep perdagangan penyu dengan analisis fase Niko Bakker, menggunakan tiga rata-rata bergerak dari siklus yang berbeda untuk menentukan arah tren untuk mengikuti tren. Ia pergi panjang ketika rata-rata bergerak cepat melintasi rata-rata bergerak menengah dan ketiga rata-rata bergerak berada dalam tren naik atau turun yang sama; Ia pergi pendek ketika rata-rata bergerak cepat melintasi di bawah rata-rata bergerak menengah dan ketiga rata-rata bergerak berada dalam tren naik atau turun yang sama.

Logika Strategi

  1. Hitung tiga rata-rata bergerak dari siklus yang berbeda: periode rata-rata bergerak cepat adalah 8 hari, periode rata-rata bergerak menengah adalah 21 hari, dan periode rata-rata bergerak lambat adalah 55 hari.

  2. Tentukan kondisi masuk: ketika rata-rata bergerak cepat melintasi di atas rata-rata bergerak menengah, dan ketiga rata-rata bergerak berada dalam tren kenaikan, pergi panjang; ketika rata-rata bergerak cepat melintasi di bawah rata-rata bergerak menengah, dan ketiga rata-rata bergerak berada dalam tren penurunan, pergi pendek.

  3. Tentukan kondisi keluar: tutup posisi ketika rata-rata bergerak cepat melintasi rata-rata bergerak menengah ke arah yang berlawanan.

  4. Ukuran posisi: gunakan ukuran posisi tetap, buka 1 kontrak setiap kali.

Analisis Keuntungan

  1. Menggunakan tiga rata-rata bergerak membantu menentukan arah tren dan menghindari pecah palsu.

  2. Tren berikut untuk potensi keuntungan.

  3. Menggunakan rata-rata bergerak menghasilkan keuntungan yang stabil dan drawdown yang relatif kecil.

  4. Strategi stop loss yang terkontrol mengurangi kemungkinan kerugian besar.

Analisis Risiko

  1. Cenderung kehilangan banyak kecil, menurunkan efisiensi keuntungan.

  2. Rata-rata bergerak tertinggal dan mungkin melewatkan titik pembalikan tren.

  3. Ukuran posisi tetap tidak dapat secara efektif mengendalikan risiko, dapat menyebabkan margin call selama fluktuasi pasar yang signifikan.

  4. Optimasi parameter yang tidak tepat menyebabkan over-trading, meningkatkan biaya perdagangan dan slippage.

Optimalisasi

  1. Mengoptimalkan periode rata-rata bergerak agar sesuai dengan karakteristik instrumen perdagangan.

  2. Gunakan ATR untuk menyesuaikan ukuran posisi secara dinamis.

  3. Tambahkan strategi stop loss.

  4. Masukkan indikator volume perdagangan untuk menentukan keandalan tren.

Ringkasan

Strategi ini mengintegrasikan indikator teknis tradisional dan filosofi perdagangan penyu, menggunakan tiga rata-rata bergerak untuk melacak tren. Dengan optimasi parameter yang tepat, dapat mencapai profitabilitas yang baik. Tapi juga memiliki beberapa risiko. Stop loss, ukuran posisi dan langkah-langkah lain perlu digunakan untuk mengendalikan risiko dan mendapatkan keuntungan 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 banyak