Strategi perdagangan lintas rata-rata bergerak segitiga

Penulis:ChaoZhang, Tanggal: 2024-01-16 18:18:02
Tag:

img

Gambaran umum

Triangular Moving Average (TMA) Crossover trading strategy adalah strategi analisis teknis yang khas. Strategi ini menggunakan tiga garis rata-rata bergerak dengan panjang waktu yang berbeda untuk menangkap tren dan menerapkan perdagangan berisiko rendah. Ketika rata-rata bergerak jangka pendek melintasi rata-rata bergerak jangka menengah ke atas, dan rata-rata bergerak jangka menengah berada di atas rata-rata bergerak jangka panjang, sinyal beli dihasilkan. Ketika rata-rata bergerak jangka pendek melintasi di bawah rata-rata bergerak jangka menengah ke bawah, dan rata-rata bergerak jangka menengah berada di bawah rata-rata bergerak jangka panjang, sinyal jual dihasilkan.

Logika Strategi

Strategi TMA terutama mengandalkan tiga garis rata-rata bergerak untuk menentukan arah tren. Rata-rata bergerak jangka pendek merespons secara sensitif terhadap perubahan harga; rata-rata bergerak jangka menengah memberikan penilaian yang lebih jelas tentang tren; rata-rata bergerak jangka panjang menyaring kebisingan pasar dan menentukan arah tren jangka panjang.

Ketika rata-rata bergerak jangka pendek melintasi rata-rata bergerak jangka menengah ke atas, itu menunjukkan harga telah mulai keluar ke atas. Pada saat ini, jika rata-rata bergerak jangka menengah berada di atas rata-rata bergerak jangka panjang, itu berarti pasar saat ini berada dalam tren naik. Oleh karena itu, sinyal beli dihasilkan di sini.

Sebaliknya, ketika rata-rata bergerak jangka pendek melintasi di bawah rata-rata bergerak jangka menengah ke bawah, itu menunjukkan harga telah mulai pecah ke bawah. Pada saat ini, jika rata-rata bergerak jangka menengah berada di bawah rata-rata bergerak jangka panjang, itu berarti pasar saat ini berada dalam tren penurunan. Akibatnya, sinyal jual dihasilkan.

Strategi ini juga menetapkan garis stop-loss dan take-profit. Setelah memasuki perdagangan, harga stop-loss dan take-profit akan dihitung berdasarkan pengaturan persentase. Jika harga menyentuh salah satu garis, posisi akan ditutup.

Analisis Keuntungan

  • Menggunakan tiga rata-rata bergerak bersama-sama untuk meningkatkan keakuratan penilaian
  • Atur stop loss dan take profit untuk mengontrol risiko perdagangan secara efektif
  • Parameter rata-rata bergerak yang dapat disesuaikan yang cocok untuk produk yang berbeda
  • Tujuh pilihan untuk jenis rata-rata bergerak, jenis strategi diversifikasi

Analisis Risiko dan Solusi

  • Sinyal yang salah ketika tiga MA mengkonsolidasikan

    Solusi: Sesuaikan parameter MA dengan benar untuk menghindari sinyal yang salah

  • Persentase stop loss/take profit yang terlalu agresif

    Solusi: Persentase penyesuaian halus; tidak bisa terlalu besar atau terlalu kecil

  • Pengaturan parameter yang tidak benar menyebabkan terlalu banyak atau terlalu sedikit perdagangan

    Solusi: Uji kombinasi parameter yang berbeda untuk menemukan optimal

Arahan Optimasi

Strategi TMA dapat dioptimalkan dari aspek berikut:

  • Uji kombinasi jenis dan panjang yang berbeda untuk menemukan optimal

    Uji kombinasi panjang atau jenis MA yang berbeda untuk hasil terbaik

  • Tambahkan indikator teknis lain sebagai filter sinyal

    Tambahkan indikator seperti KDJ, MACD dll untuk verifikasi multi-faktor

  • Pilih parameter berdasarkan karakteristik produk

    Memperpendek periode MA untuk produk volatil; Memperpanjang periode untuk produk stabil

  • Menggunakan pembelajaran mesin untuk menemukan parameter yang optimal

    Parameter otomatis menyapu untuk dengan cepat menemukan optimal

Kesimpulan

Strategi TMA Crossover adalah strategi yang mudah digunakan untuk mengikuti tren secara keseluruhan. Strategi ini menggunakan tiga MAs bersama untuk menangkap tren dan menetapkan stop-loss / take-profit untuk mengendalikan risiko, memungkinkan keuntungan yang stabil. Perbaikan lebih lanjut dapat dicapai melalui optimasi parameter dan integrasi indikator teknis tambahan.


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

//@version=3
strategy("Kozlod - 3 MA strategy with SL/PT", shorttitle="kozlod_3ma", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 5)

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

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

ma_type        = input(title = "MA Type",            defval = "SMA", options = ['SMA', 'EMA', 'WMA', 'VWMA', 'HMA', 'SMMA', 'DEMA'])
short_ma_len   = input(title = "Short MA Length",    defval = 5,     minval = 1)
short_ma_src   = input(title = "Short MA Source",    defval = close)
medium_ma_len  = input(title = "Medium MA Length",   defval = 20,    minval = 2)
medium_ma_src  = input(title = "Medium MA Source",   defval = close)
long_ma_len    = input(title = "Long MA Length",     defval = 100,   minval = 3)
long_ma_src    = input(title = "Long MA Source",     defval = close)

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
medium_ma = 0.0

// Simple Moving Average (SMA)
if ma_type == 'SMA' 
    short_ma  := sma(short_ma_src,  short_ma_len)
    medium_ma := sma(medium_ma_src, medium_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)
    medium_ma := ema(medium_ma_src, medium_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)
    medium_ma := wma(medium_ma_src, medium_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)))
    medium_ma := wma(2*wma(medium_ma_src, medium_ma_len / 2) - wma(medium_ma_src, medium_ma_len), round(sqrt(medium_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)
    medium_ma := vwma(medium_ma_src, medium_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
    medium_ma := na(medium_ma[1]) ? sma(medium_ma_src, medium_ma_len) : (medium_ma[1] * (medium_ma_len - 1) + medium_ma_src) / medium_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_medium = ema(medium_ma_src, medium_ma_len)
    e1_long   = ema(long_ma_src,   long_ma_len)
    
    short_ma  := 2 * e1_short  - ema(e1_short,  short_ma_len)
    medium_ma := 2 * e1_medium - ema(e1_medium, medium_ma_len)
    long_ma   := 2 * e1_long   - ema(e1_long,   long_ma_len)

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

long_signal  = crossover( short_ma, medium_ma) and medium_ma > long_ma
short_signal = crossunder(short_ma, medium_ma) and medium_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] and nz(last_signal[2]) != 1) or (short_signal[1] and nz(last_signal[2]) != -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(medium_ma, color = green,  linewidth = 2)
plot(long_ma,   color = yellow, 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)

Lebih banyak