Strategi perdagangan lintas multi moving average

Penulis:ChaoZhang, Tanggal: 2023-12-06 17:10:00
Tag:

img

Tinjauan Strategi

Strategi ini menghasilkan sinyal perdagangan berdasarkan beberapa indikator rata-rata bergerak. Ini memantau rata-rata bergerak jangka pendek, jangka menengah dan jangka panjang secara bersamaan, dan menghasilkan sinyal perdagangan sesuai dengan situasi silang mereka untuk menentukan arah tren.

Nama Strategi

Strategi Crossover Multi Moving Average

Logika Strategi

Strategi ini menggunakan 3 moving average dengan periode yang berbeda, termasuk garis 7 hari, 13 hari dan 21 hari.

  1. Ketika MA jangka pendek 7 hari melintasi MA jangka menengah 13 hari ke atas, sementara MA jangka panjang 21 hari berada dalam tren kenaikan, sinyal panjang dihasilkan.
  2. Ketika MA jangka pendek 7 hari melintasi di bawah MA jangka menengah 13 hari ke bawah, sementara MA jangka panjang 21 hari berada dalam tren menurun, sinyal pendek dihasilkan.

Dengan menggabungkan rata-rata bergerak dalam jangka waktu yang berbeda, strategi dapat menilai tren pasar dengan lebih tepat dan menghindari perdagangan palsu.

Keuntungan

  1. Menggunakan beberapa garis MA dapat lebih baik menentukan pergerakan pasar dan menghindari tertipu oleh kebocoran palsu atau fluktuasi jangka pendek di pasar.
  2. Sinyal hanya dihasilkan ketika tren jelas, sehingga mengurangi perdagangan yang tidak perlu dan menurunkan biaya transaksi.
  3. Pengaturan parameter yang fleksibel - periode AP dapat disesuaikan berdasarkan preferensi pribadi agar sesuai dengan produk dan lingkungan pasar yang berbeda.

Risiko

  1. Sinyal-sinyal palsu sering terjadi di pasar yang berputar-putar dan bergolak.
  2. MAs sebagai indikator yang mengikuti tren tidak dapat dengan tepat menemukan titik balik.
  3. Sinyal yang tertunda oleh MA crossovers mungkin kehilangan sebagian keuntungan.
  4. Risiko dapat dikurangi dengan memperkenalkan indikator teknis lain untuk validasi sinyal dan mengoptimalkan parameter MA.

Arahan Optimasi

  1. Pertimbangkan untuk memasukkan indikator volatilitas untuk mengukur kekuatan tren dan menghindari perdagangan di pasar yang bergolak.
  2. Cobalah menerapkan model pembelajaran mesin untuk mengoptimalkan parameter MA secara otomatis.
  3. Tambahkan strategi stop loss untuk memotong kerugian tepat waktu ketika penarikan meningkat.
  4. Gunakan perintah batas ketika MA crossover terjadi untuk mengurangi slippage.

Kesimpulan

Strategi ini menggabungkan MAs jangka pendek, jangka menengah dan jangka panjang untuk menentukan tren pasar berdasarkan hubungan silang mereka, menjadikannya strategi tren yang relatif stabil dan efisien.


/*backtest
start: 2022-11-29 00:00:00
end: 2023-12-05 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/
// © Crypto-Oli

//@version=4
strategy("CryptOli 3 MAs long/short Backtest", initial_capital=5000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, overlay=true)

// this is an educational Script - basicly its very simple - you can see how minimal changes impact results, thats why i posted it
// Credits to Quantnomad to publish tons of free educational script
// this Script is based on https://www.tradingview.com/script/0NgUadGr-Ultimate-MA-Cross-Indicator/ Quantnomads Ultimate MA Indicator 
// HA - Option for calcucaltion based on HA-Candles (very famous recently)
// Source Input - Option (Candletype for calculation, close, ohlc4 ect.) --- there are huge differences --- try it by your own

////////////////////////////////////////////////////////////////////////////////
// BACKTESTING RANGE

// From Date Inputs
fromDay = input(defval=1, title="From Day", minval=1, maxval=31)
fromMonth = input(defval=1, title="From Month", minval=1, maxval=12)
fromYear = input(defval=2015, title="From Year", minval=1970)

// To Date Inputs
toDay = input(defval=1, title="To Day", minval=1, maxval=31)
toMonth = input(defval=1, title="To Month", minval=1, maxval=12)
toYear = input(defval=2030, title="To Year", minval=1970)

// Calculate start/end date and time condition
startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear, toMonth, toDay, 00, 00)
time_cond = time >= startDate and time <= finishDate

////////////////////////////////////////////////////////////////////////////////

h = input(false, title = "Signals from Heikin Ashi Candles")

ma_type      = input(title = "MA Type",         type = input.string,  defval = "SMMA", options = ['SMA', 'EMA', 'WMA', 'VWMA', 'HMA', 'SMMA', 'DEMA'])
src = input(ohlc4)

short_ma_len = input(title = "Short MA Length", type = input.integer, defval = 7,     minval = 1)
short_ma_src = h ? security(heikinashi(syminfo.tickerid), timeframe.period, src, lookahead = false) : close
middle_ma_len  = input(title = "Middle MA Length",  type = input.integer, defval = 13,    minval = 2)
middle_ma_src = h ? security(heikinashi(syminfo.tickerid), timeframe.period, src, lookahead = false) : close
long_ma_len  = input(title = "Long MA Length",  type = input.integer, defval = 21,    minval = 2)
long_ma_src = h ? security(heikinashi(syminfo.tickerid), timeframe.period, src, lookahead = false) : close


tick_round(x) => 
    round(x / syminfo.mintick) * syminfo.mintick

// Set initial values to 0
short_ma = 0.0
middle_ma = 0.0
long_ma  = 0.0

// Simple Moving Average (SMA)
if ma_type == 'SMA' 
    short_ma := sma(short_ma_src, short_ma_len)
    middle_ma := sma(middle_ma_src, middle_ma_len)
    long_ma  := sma(long_ma_src,  long_ma_len)

// Exponential Moving Average (EMA)
if ma_type == 'EMA'
    short_ma := ema(short_ma_src, short_ma_len)
    middle_ma := ema(middle_ma_src, middle_ma_len)
    long_ma  := ema(long_ma_src,  long_ma_len)

// Weighted Moving Average (WMA)
if ma_type == 'WMA'
    short_ma := wma(short_ma_src, short_ma_len)
    middle_ma := wma(middle_ma_src, middle_ma_len)
    long_ma  := wma(long_ma_src,  long_ma_len)

// Hull Moving Average (HMA)
if ma_type == 'HMA'
    short_ma := wma(2*wma(short_ma_src, short_ma_len/2)-wma(short_ma_src, short_ma_len), round(sqrt(short_ma_len)))
    middle_ma := wma(2*wma(middle_ma_src, middle_ma_len/2)-wma(middle_ma_src, middle_ma_len), round(sqrt(middle_ma_len)))
    long_ma  := wma(2*wma(long_ma_src,  long_ma_len /2)-wma(long_ma_src,  long_ma_len),  round(sqrt(long_ma_len)))

// Volume-weighted Moving Average (VWMA)
if ma_type == 'VWMA'
    short_ma := vwma(short_ma_src, short_ma_len)
    middle_ma := vwma(middle_ma_src, middle_ma_len)
    long_ma  := vwma(long_ma_src,  long_ma_len)


// Smoothed Moving Average (SMMA)    
if ma_type == 'SMMA'
    short_ma := na(short_ma[1]) ? sma(short_ma_src, short_ma_len) : (short_ma[1] * (short_ma_len - 1) + short_ma_src) / short_ma_len
    middle_ma := na(middle_ma[1]) ? sma(middle_ma_src, middle_ma_len) : (middle_ma[1] * (middle_ma_len - 1) + middle_ma_src) / middle_ma_len
    long_ma  := na(long_ma[1])  ? sma(long_ma_src,  long_ma_len)  : (long_ma[1]  * (long_ma_len  - 1) + long_ma_src)  / long_ma_len

// Double Exponential Moving Average (DEMA)
if ma_type == 'DEMA'
    e1_short = ema(short_ma_src, short_ma_len)
    e1_middle = ema(middle_ma_src, middle_ma_len)
    e1_long  = ema(long_ma_src,  long_ma_len)
    
    short_ma := 2 * e1_short - ema(e1_short, short_ma_len)
    middle_ma := 2 * e1_middle - ema(e1_middle, middle_ma_len)
    long_ma  := 2 * e1_long  - ema(e1_long,  long_ma_len)

// Plot MAs
plot(short_ma, color = color.green,   linewidth = 1)
plot(middle_ma, color = color.yellow,   linewidth = 1)
plot(long_ma,  color = color.red, linewidth = 1)

if close>long_ma and short_ma>middle_ma and time_cond
    strategy.entry("Long", strategy.long)


if close<long_ma and short_ma<middle_ma and time_cond
    strategy.entry("Short", strategy.short)


Lebih banyak