Strategi Dagangan Crossover Purata Bergerak Segitiga

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

img

Ringkasan

Triangular Moving Average (TMA) Crossover trading strategy adalah strategi analisis teknikal yang tipikal. Ia menggunakan tiga garis purata bergerak dengan panjang masa yang berbeza untuk menangkap trend dan melaksanakan perdagangan berisiko rendah. Apabila purata bergerak jangka pendek melintasi purata bergerak jangka sederhana ke atas, dan purata bergerak jangka sederhana berada di atas purata bergerak jangka panjang, isyarat beli dihasilkan. Apabila purata bergerak jangka pendek melintasi di bawah purata bergerak jangka sederhana ke bawah, dan purata bergerak jangka sederhana berada di bawah purata bergerak jangka panjang, isyarat jual dihasilkan.

Logika Strategi

Strategi TMA terutamanya bergantung pada tiga garis purata bergerak untuk menentukan arah trend. purata bergerak jangka pendek bertindak balas dengan sensitif terhadap perubahan harga; purata bergerak jangka sederhana memberikan penilaian yang lebih jelas mengenai trend; purata bergerak jangka panjang menapis bunyi pasaran dan menentukan arah trend jangka panjang.

Apabila purata bergerak jangka pendek melintasi purata bergerak jangka sederhana ke atas, ia menunjukkan harga telah mula pecah ke atas. Pada masa ini, jika purata bergerak jangka sederhana di atas purata bergerak jangka panjang, ini bermakna pasaran semasa berada dalam trend menaik. Oleh itu, isyarat beli dihasilkan di sini.

Sebaliknya, apabila purata bergerak jangka pendek melintasi di bawah purata bergerak jangka sederhana ke bawah, ia menunjukkan harga telah mula pecah ke bawah. Pada masa ini, jika purata bergerak jangka sederhana di bawah purata bergerak jangka panjang, ini bermakna pasaran semasa berada dalam trend menurun. Akibatnya, isyarat jual dihasilkan.

Strategi ini juga menetapkan garis stop-loss dan take-profit. Selepas memasuki perdagangan, harga stop-loss dan take-profit akan dikira berdasarkan tetapan peratusan. Jika harga menyentuh mana-mana garis, kedudukan akan ditutup.

Analisis Kelebihan

  • Menggunakan tiga purata bergerak bersama-sama untuk meningkatkan ketepatan penghakiman
  • Tetapkan stop-loss dan take-profit untuk mengawal risiko perdagangan secara berkesan
  • Parameter purata bergerak yang boleh disesuaikan yang sesuai untuk produk yang berbeza
  • Tujuh pilihan untuk jenis purata bergerak, jenis strategi yang pelbagai

Analisis Risiko dan Penyelesaian

  • Isyarat yang salah apabila tiga MA mengumpul

    Penyelesaian: Sesuaikan parameter MA dengan betul untuk mengelakkan isyarat yang salah

  • Peratusan Stop Loss/Take Profit yang terlalu agresif

    Penyelesaian: Peratusan yang halus; tidak boleh terlalu besar atau terlalu kecil

  • Tetapan parameter yang tidak betul yang membawa kepada terlalu banyak atau terlalu sedikit perdagangan

    Penyelesaian: Uji kombinasi parameter yang berbeza untuk mencari optimum

Arahan pengoptimuman

Strategi TMA boleh dioptimumkan dari aspek berikut:

  • Uji kombinasi jenis dan panjang yang berbeza untuk mencari optimum

    Uji kombinasi panjang atau jenis MA yang berbeza untuk hasil terbaik

  • Tambah penunjuk teknikal lain sebagai penapis isyarat

    Tambah penunjuk seperti KDJ, MACD dll untuk pengesahan pelbagai faktor

  • Pilih parameter berdasarkan ciri produk

    Memendekkan tempoh MA untuk produk mudah menguap; Memperpanjang tempoh untuk produk stabil

  • Menggunakan pembelajaran mesin untuk mencari parameter optimum

    Parameter automatik menyapu untuk dengan cepat mencari optimum

Kesimpulan

Strategi TMA Crossover adalah strategi trend berikut yang mudah digunakan secara keseluruhan. Ia menggunakan tiga MA bersama-sama untuk menangkap trend dan menetapkan stop-loss / mengambil keuntungan untuk mengawal risiko, membolehkan keuntungan yang stabil. Penambahbaikan lanjut dapat dicapai melalui pengoptimuman parameter dan mengintegrasikan penunjuk teknikal 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 lanjut