Sembilan Strategi Persilangan Purata Pergerakan


Tarikh penciptaan: 2024-01-02 10:37:21 Akhirnya diubah suai: 2024-01-02 10:37:21
Salin: 0 Bilangan klik: 767
1
fokus pada
1621
Pengikut

Sembilan Strategi Persilangan Purata Pergerakan

Gambaran keseluruhan

Strategi ini menggunakan dua set parameter yang berbeza untuk bergerak rata-rata untuk operasi silang, berdasarkan arah tren yang ditentukan oleh isyarat silang, untuk membuka dan menutup kedudukan. Strategi ini membolehkan memilih 9 jenis rata-rata bergerak yang berbeza, termasuk purata bergerak sederhana (SMA), purata bergerak indeks (EMA), purata bergerak bertimbangan (WMA), purata bergerak Almo (ALMA), purata bergerak nilai kuantitatif (VWMA), dan lain-lain.

Prinsip Strategi

Logik teras strategi ini adalah membandingkan nilai dua purata bergerak dan menilai arah trend pasaran berdasarkan persilangan dua purata bergerak. Secara khusus, kami menetapkan dua purata bergerak, garis cepat dan garis perlahan. Apabila garis cepat melintasi garis perlahan, anggaplah bahawa pasaran memasuki tren naik, dan lakukan lebih banyak; apabila garis cepat melintasi garis perlahan, anggaplah bahawa pasaran memasuki tren menurun, dan buat kosong.

Selepas memasuki kedudukan, keluar dari kedudukan jika harga menyentuh garis henti rugi; jika harga menyentuh garis henti rugi maka keluar dari kedudukan jika keuntungan mencapai jangkaan. Ini dapat mengunci keuntungan dan mencegah kerugian berkembang.

Dari segi kod, strategi ini terdiri daripada empat bahagian:

  1. Hitung purata bergerak. Mengikut jenis purata bergerak yang dipilih oleh pengguna, kira purata bergerak garisan pantas dan garisan perlahan.

  2. Menjana isyarat dagangan. Berdasarkan persilangan garis cepat dan lambat, menghasilkan isyarat melakukan lebih banyak dan melakukan lebih sedikit.

  3. Tetapkan Stop Loss Stop. Berdasarkan harga masuk dan peratusan Stop Loss Stop, harga garis Stop Loss dan garis Stop Loss dihitung dalam masa nyata.

  4. Masuk dan keluar. Masuk mengikut isyarat buat lebih dan buat kosong, keluar mengikut isyarat henti rugi.

Analisis kelebihan

Kelebihan utama strategi ini adalah bahawa anda boleh bebas memilih pelbagai jenis purata bergerak. Jenis purata bergerak yang berbeza mempunyai kepekaan yang berbeza terhadap harga, pengguna boleh memilih purata bergerak yang sesuai mengikut keperluan mereka sendiri. Selain itu, anda boleh menyesuaikan tempoh panjang purata bergerak, untuk mencapai pengoptimuman dimensi masa.

Kelebihan lain ialah penubuhan mekanisme henti rugi. Ini dapat menghalang kerugian daripada berkembang lebih jauh, sambil mengunci keuntungan. Secara keseluruhan, strategi ini lebih fleksibel dan dapat disesuaikan dengan pengguna yang mempunyai keperluan yang berbeza.

Analisis risiko

Risiko utama strategi ini adalah bahawa rata-rata bergerak mempunyai keterlambatan. Apabila harga tiba-tiba bergelombang, rata-rata bergerak tidak dapat bertindak balas dalam masa yang tepat, yang boleh menyebabkan kehilangan masa masuk atau keluar yang terbaik.

Risiko lain ialah penyetempatan kedudukan hentian hentian kerugian. Jika ketinggian yang ditetapkan terlalu kecil, ia mungkin akan dibocorkan; jika terlalu besar, ia boleh menyebabkan keuntungan tidak dikunci pada masa yang tepat. Oleh itu, parameter hentian hentian kerugian harus dioptimumkan mengikut keadaan pasaran di pasaran.

Secara keseluruhan, strategi ini bergantung kepada purata bergerak untuk menentukan arah trend, jadi kesannya akan dikurangkan apabila peristiwa tiba-tiba menyebabkan turun naik harga yang besar. Di samping itu, tetapan parameter juga mempunyai kesan yang besar terhadap keuntungan strategi.

Arah pengoptimuman

Strategi ini boleh dioptimumkan dalam beberapa aspek:

  1. Jenis rata-rata bergerak yang dioptimumkan. Pilih rata-rata bergerak yang lebih sesuai mengikut keadaan pasaran yang berbeza dan jenis perdagangan.

  2. Parameter untuk mengoptimumkan purata bergerak. Sesuaikan tempoh purata bergerak untuk menjadikannya lebih sesuai dengan ciri-ciri pasaran.

  3. Tambahkan penapis indikator lain. Anda boleh memasukkan indikator lain seperti MACD, RSI, dan lain-lain untuk mengelakkan perdagangan yang kerap di pasaran yang tidak sedang tren.

  4. Mengoptimumkan nisbah stop loss. Mengira parameter stop loss yang optimum berdasarkan data sejarah.

  5. Menambah model pembelajaran mesin. Menggunakan algoritma seperti LSTM, hutan rawak untuk meramalkan pergerakan harga, membantu menghasilkan isyarat perdagangan.

  6. Menggunakan algoritma penjejakan hentikan. Membolehkan garisan hentikan bergerak secara beransur-ansur dengan pergerakan harga, mengurangkan kemungkinan hentikan akan dicetuskan.

ringkaskan

Strategi ini secara keseluruhannya agak mudah, langsung, melalui arah trend penilaian silang, dan merupakan strategi mengikuti trend yang tipikal. Kelebihannya adalah mudah difahami, fleksibiliti yang tinggi, dapat memilih sendiri jenis rata-rata bergerak dan parameter. Kelemahannya adalah reaksi yang lambat terhadap kejadian yang tidak dijangka, terdapat beberapa keterlambatan.

Kod sumber strategi
/*backtest
start: 2022-12-26 00:00:00
end: 2024-01-01 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy("Kozlod - Yet Another Moving Average Cross Strategy", shorttitle="kozlod_yamacs", overlay = true)

// 
// author: Kozlod
// date: 2018-03-06
// 

////////////
// INPUTS //
////////////

ma_type      = input(title = "MA Type",          defval = "SMA", options = ['SMA', 'EMA', 'WMA', 'ALMA', 'VWMA', 'HMA', 'LSMA', 'SMMA', 'DEMA'])
short_ma_len = input(title = "Short MA Length",  defval = 5,     minval = 1)
short_ma_src = input(title = "Short MA Source",   defval = close)
long_ma_len  = input(title = "Long MA Length",   defval = 15,    minval = 2)
long_ma_src  = input(title = "Long MA Source",    defval = close)
alma_offset  = input(title = "ALMA Offset",     type = float,   defval = 0.85,  step = 0.01, minval = 0, maxval = 1)
alma_sigma   = input(title = "ALMA Sigma",      type = float,   defval = 6,     step = 0.01)
lsma_offset  = input(title = "LSMA Offset",      defval = 0,     step = 1)

sl_lev_perc  = input(title = "SL Level % (0 - Off)", type = float,   defval = 0,  minval = 0, step = 0.01)
pt_lev_perc  = input(title = "PT Level % (0 - Off)", type = float,   defval = 0,  minval = 0, step = 0.01)

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

// Simple Moving Average (SMA)
if ma_type == 'SMA' 
    short_ma := sma(short_ma_src, short_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)
    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)
    long_ma  := wma(long_ma_src,  long_ma_len)

// Arnaud Legoux Moving Average (ALMA)
if ma_type == 'ALMA'
    short_ma := alma(short_ma_src, short_ma_len,  alma_offset, alma_sigma)
    long_ma  := alma(long_ma_src,  long_ma_len,   alma_offset, alma_sigma)

// 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)))
    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)
    long_ma  := vwma(long_ma_src,  long_ma_len)

// Least Square Moving Average (LSMA)
if ma_type == 'LSMA'
    short_ma := linreg(short_ma_src, short_ma_len, lsma_offset)
    long_ma  := linreg(long_ma_src,  long_ma_len,  lsma_offset)

// 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
    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_long  = ema(long_ma_src,  long_ma_len)
    
    short_ma := 2 * e1_short - ema(e1_short, short_ma_len)
    long_ma  := 2 * e1_long  - ema(e1_long,  long_ma_len)

/////////////
// SIGNALS //
/////////////

long_signal  = crossover( short_ma, long_ma)
short_signal = crossunder(short_ma, long_ma)

// Calculate PT/SL levels 
// Initial values 
last_signal    = 0
prev_tr_price  = 0.0
pt_level       = 0.0
sl_level       = 0.0

// Calculate previous trade price
prev_tr_price := long_signal[1] or short_signal[1] ? open : nz(last_signal[1]) != 0 ? prev_tr_price[1] : na

// Calculate SL/PT levels 
pt_level := nz(last_signal[1]) == 1 ? prev_tr_price * (1 + pt_lev_perc / 100) : nz(last_signal[1]) == -1 ? prev_tr_price * (1 - pt_lev_perc / 100)  : na
sl_level := nz(last_signal[1]) == 1 ? prev_tr_price * (1 - sl_lev_perc / 100) : nz(last_signal[1]) == -1 ? prev_tr_price * (1 + sl_lev_perc / 100)  : na

// Calculate if price hit sl/pt 
long_hit_pt = pt_lev_perc > 0 and nz(last_signal[1]) ==  1 and close >= pt_level
long_hit_sl = sl_lev_perc > 0 and nz(last_signal[1]) ==  1 and close <= sl_level

short_hit_pt = pt_lev_perc > 0 and nz(last_signal[1]) ==  -1 and close <= pt_level
short_hit_sl = sl_lev_perc > 0 and nz(last_signal[1]) ==  -1 and close >= sl_level

// What is last active trade? 
last_signal := long_signal ? 1 : short_signal ? -1 : long_hit_pt or long_hit_sl or short_hit_pt or short_hit_sl ? 0 : nz(last_signal[1])

//////////////
// PLOTTING //
//////////////

// Plot MAs
plot(short_ma, color = red,   linewidth = 2)
plot(long_ma,  color = green, linewidth = 2)


// Plot Levels 
plotshape(prev_tr_price, style = shape.cross, color = gray, location  = location.absolute, size = size.small)


plotshape(sl_lev_perc > 0 ? sl_level : na, style = shape.cross, color = red,   location  = location.absolute, size = size.small)
plotshape(pt_lev_perc > 0 ? pt_level : na, style = shape.cross, color = green, location  = location.absolute, size = size.small)

//////////////
// STRATEGY //
//////////////

strategy.entry("long",  true,  when = long_signal)
strategy.entry("short", false, when = short_signal)

strategy.close("long",  when = long_hit_pt  or long_hit_sl)
strategy.close("short", when = short_hit_pt or short_hit_sl)