Strategi Perdagangan Rata-rata Pergerakan Ganda Golden Cross dan Death Cross


Tanggal Pembuatan: 2023-12-01 14:36:33 Akhirnya memodifikasi: 2023-12-01 14:36:33
menyalin: 9 Jumlah klik: 617
1
fokus pada
1621
Pengikut

Strategi Perdagangan Rata-rata Pergerakan Ganda Golden Cross dan Death Cross

Ringkasan

Strategi perdagangan dua rata-rata menghasilkan sinyal perdagangan dengan menghitung rata-rata bergerak indeks dari periode yang berbeda, membentuk garis cepat dan lambat, dan mengamati bentuk garpu emas dan garpu mati mereka. Ketika garis cepat melewati garis lambat dari bawah, lakukan lebih banyak; ketika garis cepat melewati garis lambat dari atas ke bawah, kosong. Strategi ini menangkap titik balik tren rata-rata, merupakan strategi pelacakan tren yang lebih umum.

Prinsip Strategi

Indikator inti dari strategi perdagangan dua rata-rata adalah menghitung garis cepat dan lambat. Garis cepat menunjukkan rata-rata pergerakan indeks periode pendek, parameter default adalah garis 12 hari; garis lambat menunjukkan rata-rata pergerakan indeks periode panjang, parameter default adalah garis 26 hari.

EMA(t) = (C(t) - EMA(t-1)) * SF + EMA(t-1)

Di antaranya, C (t) adalah harga penutupan hari dan SF adalah faktor peredam. Perbedaan antara rata-rata bergerak indeks dan rata-rata bergerak aritmatika adalah bahwa rata-rata bergerak indeks memberikan bobot yang lebih besar pada data terbaru dan dapat merespons perubahan harga dengan lebih cepat.

Aturan perdagangan strategi dua garis lurus adalah:

  • Ketika garis cepat melewati garis lambat dari bawah, yaitu golden cross berupa garpu emas, maka akan terjadi penambahan;
  • Ketika garis cepat melewati garis lambat dari atas ke bawah, yaitu, dead cross dead fork terbentuk, membuat ruang masuk;
  • Pada saat garis cepat dan lambat berselisih, pemain yang berposisi lurus harus berangkat dari lapangan.

Dengan menangkap dan memantau bentuk persilangan garis rata, dan bereaksi tepat waktu terhadap perubahan hubungan penawaran dan permintaan pasar dan tren, untuk mencapai keuntungan.

Analisis Keunggulan

Strategi perdagangan biner sebagai strategi indikator teknis yang lebih matang memiliki keuntungan sebagai berikut:

  1. Pikiran yang jelas, mudah dipahami dan diimplementasikan;
  2. Keputusan yang akurat tentang hubungan penawaran dan permintaan di pasar, tingkat kemenangan yang lebih tinggi;
  3. Ini adalah salah satu cara yang paling efektif untuk memfilter kebisingan pasar dan menangkap tren utama.
  4. Aplikasi yang dapat diterapkan dalam berbagai pasar dan kerangka waktu;
  5. Strategi yang dapat digabungkan dengan indikator teknis lainnya;
  6. Tingkat pemanfaatan dana yang tinggi sesuai dengan kebutuhan dana yang besar.

Analisis risiko

Strategi perdagangan dua arah juga memiliki beberapa kelemahan dan risiko:

  1. Tidak mampu menanggapi situasi yang ekstrim, seperti pasar beruang yang cepat;
  2. Ini adalah salah satu faktor yang memicu terjadinya perdagangan intensif, dengan kemungkinan sinyal palsu dan sering terjadi getaran kecil.
  3. Parameter harus dioptimalkan untuk varietas dan periode waktu yang berbeda.
  4. Tidak dapat menentukan posisi yang tepat untuk membalikkan tren tersebut.

Untuk risiko di atas, dapat dioptimalkan dengan menyesuaikan parameter siklus rata-rata, memperkenalkan filter tambahan, dan lain-lain, untuk memastikan strategi lebih kuat.

Arah optimasi

Strategi perdagangan biner dapat dioptimalkan dari beberapa aspek:

  1. Memperkenalkan indikator MACD untuk menilai tren yang kuat dan lemah, menghindari kesalahan perdagangan pada situasi yang bergejolak di posisi lemah;
  2. Meningkatkan volume transaksi sebagai indikator konfirmasi untuk menghindari false breakout yang membalikkan tren;
  3. Terkait dengan indikator teknis lainnya seperti garis Brin, garis K, dan lain-lain, untuk menetapkan kondisi masuk dan keluar yang lebih tepat;
  4. Menggunakan metode pembelajaran mesin seperti LSTM untuk mengoptimalkan parameter rata-rata secara otomatis, untuk mencapai adaptasi pasar yang lebih baik.

Meringkaskan

Strategi perdagangan dua garis sejajar dengan menangkap peluang perdagangan forks emas dan forks mati di garis sejajar, menilai titik balik tren harga, dan mencapai keuntungan yang stabil. Keunggulan strategi ini adalah ringkas dan jelas, efisiensi dana yang tinggi, dan merupakan strategi pilihan untuk masuk kuantitatif. Namun, ada juga kekurangan tertentu, seperti menghasilkan sinyal palsu, perlu diperkenalkan lebih banyak indikator untuk dioptimalkan, sehingga lebih cocok untuk varietas tertentu dan lingkungan perdagangan.

Kode Sumber Strategi
/*backtest
start: 2022-11-24 00:00:00
end: 2023-11-30 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/
// © antondmt

//@version=5
strategy("Returns & Drawdowns Table", "R & DD", true, calc_on_every_tick = false, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, process_orders_on_close = true)
i_eq_to_dd =            input.string("Compound Equity", "Mode", ["Simple Equity", "Compound Equity", "Drawdown"], group = "R & DD Table")
i_precision =           input.int(2, "Return Precision", group = "R & DD Table")
i_headers_col =         input.color(#D4D4D4, "Headers Color", group = "R & DD Table")
i_headers_text_col =    input.color(color.black, "Headers Text Color", group = "R & DD Table")
i_pos_col =             input.color(color.green, "Positive Color", group = "R & DD Table")
i_neg_col =             input.color(color.red, "Negative Color", group = "R & DD Table")
i_zero_col =            input.color(#DDDDDD, "Zero Color", group = "R & DD Table")
i_cell_text_col =       input.color(color.white, "Cell Text Color", group = "R & DD Table")

// TIME {
var month_times = array.new_int(0)                                                              // Array of all month times  
new_month = month(time) != month(time[1]) 
if(new_month or barstate.isfirst)
    array.push(month_times, time)

var year_times = array.new_int(0)                                                               
new_year = year(time) != year(time[1])  
if (new_year or barstate.isfirst)
    array.push(year_times, time)
//}

// SIMPLE EQUITY CALCULATIONS {
// Simple equity is strictly calculated from start to end of each month/year equity. There is no compound
var monthly_simp_pnls = array.new_float(0)                                                      // Array of all monthly profits and losses
var yearly_simp_pnls = array.new_float(0)                                                       

if(i_eq_to_dd == "Simple Equity")
    var initial_monthly_equity = strategy.equity                                                // Starting equity for each month
    cur_month_pnl = nz((strategy.equity - initial_monthly_equity) / initial_monthly_equity)     // Current month's equity change
    if(new_month or barstate.isfirst)
        initial_monthly_equity := strategy.equity
        array.push(monthly_simp_pnls, cur_month_pnl)
    else 
        array.set(monthly_simp_pnls, array.size(monthly_simp_pnls) - 1, cur_month_pnl)
    
    var initial_yearly_equity = strategy.equity
    cur_year_pnl = nz((strategy.equity - initial_yearly_equity) / initial_yearly_equity)
    if (new_year or barstate.isfirst)
        initial_yearly_equity := strategy.equity
        array.push(yearly_simp_pnls, cur_year_pnl)
    else 
        array.set(yearly_simp_pnls, array.size(yearly_simp_pnls) - 1, cur_year_pnl)
// }

// COMPOUND EQUITY CALCULATIONS {
// Compound equity is strictly calculated based on equity state from the beginning of time until the end of each month/year equity. It shows the exact equity movement through time
var monthly_comp_pnls = array.new_float(0)                                                      // Array of all monthly profits and losses
var yearly_comp_pnls = array.new_float(0)                                                       

if(i_eq_to_dd == "Compound Equity")
    var initial_equity = strategy.equity                                                
    cur_month_pnl = nz((strategy.equity - initial_equity) / initial_equity)                     // Current month's equity change
    if(new_month or barstate.isfirst)
        array.push(monthly_comp_pnls, cur_month_pnl)
    else 
        array.set(monthly_comp_pnls, array.size(monthly_comp_pnls) - 1, cur_month_pnl)
    
    cur_year_pnl = nz((strategy.equity - initial_equity) / initial_equity)
    if (new_year or barstate.isfirst)
        array.push(yearly_comp_pnls, cur_year_pnl)
    else 
        array.set(yearly_comp_pnls, array.size(yearly_comp_pnls) - 1, cur_year_pnl)
// }
    
// DRAWDOWN CALCULATIONS {
// Drawdowns are calculated from highest equity to lowest trough for the month/year
var monthly_dds = array.new_float(0)                                                            // Array of all monthly drawdowns
var yearly_dds = array.new_float(0)                                                             

if (i_eq_to_dd == "Drawdown")
    total_equity = strategy.equity - strategy.openprofit                        
    
    var cur_month_dd = 0.0  
    var m_ATH = total_equity                                                                    // Monthly All-Time-High (ATH). It is reset each month
    m_ATH := math.max(total_equity, nz(m_ATH[1]))
    m_drawdown = -math.abs(total_equity / m_ATH * 100 - 100) / 100                              // Drawdown at current bar
    if(m_drawdown < cur_month_dd)
        cur_month_dd := m_drawdown
    if(new_month or barstate.isfirst)
        cur_month_dd := 0.0
        m_ATH := strategy.equity - strategy.openprofit
        array.push(monthly_dds, 0)
    else 
        array.set(monthly_dds, array.size(monthly_dds) - 1, cur_month_dd)
    
    var cur_year_dd = 0.0
    var y_ATH = total_equity
    y_ATH := math.max(total_equity, nz(y_ATH[1]))
    y_drawdown = -math.abs(total_equity / y_ATH * 100 - 100) / 100
    if(y_drawdown < cur_year_dd)
        cur_year_dd := y_drawdown
    if (new_year or barstate.isfirst)
        cur_year_dd := 0.0
        y_ATH := strategy.equity - strategy.openprofit
        array.push(yearly_dds, 0)
    else 
        array.set(yearly_dds, array.size(yearly_dds) - 1, cur_year_dd) 
// }

// TABLE LOGIC { 
var main_table = table(na)
table.clear(main_table, 0, 0, 13, new_year ? array.size(year_times) - 1 : array.size(year_times))
main_table := table.new(position.bottom_right, columns = 14, rows = array.size(year_times) + 1, border_width = 1)

t_set_headers() =>                                                                              // Sets time headers of the table
    // Set month headers
    table.cell(main_table, 0,  0, "",     text_color = i_headers_text_col, bgcolor = i_headers_col)
    table.cell(main_table, 1,  0, "Jan",  text_color = i_headers_text_col, bgcolor = i_headers_col)
    table.cell(main_table, 2,  0, "Feb",  text_color = i_headers_text_col, bgcolor = i_headers_col)
    table.cell(main_table, 3,  0, "Mar",  text_color = i_headers_text_col, bgcolor = i_headers_col)
    table.cell(main_table, 4,  0, "Apr",  text_color = i_headers_text_col, bgcolor = i_headers_col)
    table.cell(main_table, 5,  0, "May",  text_color = i_headers_text_col, bgcolor = i_headers_col)
    table.cell(main_table, 6,  0, "Jun",  text_color = i_headers_text_col, bgcolor = i_headers_col)
    table.cell(main_table, 7,  0, "Jul",  text_color = i_headers_text_col, bgcolor = i_headers_col)
    table.cell(main_table, 8,  0, "Aug",  text_color = i_headers_text_col, bgcolor = i_headers_col)
    table.cell(main_table, 9,  0, "Sep",  text_color = i_headers_text_col, bgcolor = i_headers_col)
    table.cell(main_table, 10, 0, "Oct",  text_color = i_headers_text_col, bgcolor = i_headers_col)
    table.cell(main_table, 11, 0, "Nov",  text_color = i_headers_text_col, bgcolor = i_headers_col)
    table.cell(main_table, 12, 0, "Dec",  text_color = i_headers_text_col, bgcolor = i_headers_col)
    table.cell(main_table, 13, 0, str.tostring(i_eq_to_dd), text_color = i_headers_text_col, bgcolor = i_headers_col)

    // Set year headers
    for i = 0 to array.size(year_times) - 1
        table.cell(main_table, 0,  i + 1, str.tostring(year(array.get(year_times, i))), text_color = i_headers_text_col, bgcolor = i_headers_col)

t_set_months() =>                                                                               // Sets inner monthly data of the table
    display_array = switch i_eq_to_dd 
        "Simple Equity" => monthly_simp_pnls 
        "Compound Equity" => monthly_comp_pnls
        => monthly_dds
    for i = 0 to array.size(month_times) - 1
        m_row = year(array.get(month_times, i)) - year(array.get(year_times, 0)) + 1
        m_col = month(array.get(month_times, i)) 
        m_color = array.get(display_array, i) == 0 ? color.new(i_zero_col, transp = 30) : array.get(display_array, i) > 0 ? color.new(i_pos_col, transp = 30) : color.new(i_neg_col, transp = 30)
        table.cell(main_table, m_col, m_row, str.tostring(math.round(array.get(display_array, i) * 100, i_precision)), bgcolor = m_color, text_color = i_cell_text_col)
        
t_set_years() =>                                                                                // Sets inner yearly data of the table
    display_array = switch i_eq_to_dd 
        "Simple Equity" => yearly_simp_pnls 
        "Compound Equity" => yearly_comp_pnls
        => yearly_dds
    for i = 0 to array.size(year_times) - 1
        y_color = array.get(display_array, i) == 0 ? color.new(i_zero_col, transp = 30) : array.get(display_array, i) > 0 ? color.new(i_pos_col, transp = 20) : color.new(i_neg_col, transp = 20)
        table.cell(main_table, 13, i + 1, str.tostring(math.round(array.get(display_array, i) * 100, i_precision)), bgcolor = y_color, text_color = i_cell_text_col)

t_set_headers() 
t_set_months()
t_set_years()
// }

// PLACE YOUR STRATEGY CODE HERE {
// This is a sample code of a working strategy to show the table in action
fastLength = input(12)
slowlength = input(26)
MACDLength = input(9)
MACD = ta.ema(close, fastLength) - ta.ema(close, slowlength)
aMACD = ta.ema(MACD, MACDLength)
delta = MACD - aMACD
if (ta.crossover(delta, 0))
	strategy.entry("MacdLE", strategy.long, comment = "MacdLE")
if (ta.crossunder(delta, 0))
	strategy.entry("MacdSE", strategy.short, comment = "MacdSE")
// }