Strategi Rata-rata Gerak Amplop Dinamis

Penulis:ChaoZhang, Tanggal: 2024-02-05 14:15:40
Tag:

img

Gambaran umum

Strategi ini didasarkan pada rata-rata bergerak dan garis amplop dinamis untuk mengimplementasikan perdagangan panjang dan pendek. Ini melacak harga yang keluar di luar garis amplop untuk membangun posisi dan menutup posisi ketika harga kembali di bawah rata-rata bergerak garis dasar. Strategi ini bekerja dengan baik untuk saham dan cryptocurrency dengan tren yang jelas.

Logika Strategi

Pertama, strategi ini menghitung rata-rata bergerak garis dasar berdasarkan jenis dan panjang rata-rata bergerak yang ditentukan pengguna.

Kemudian, ia menghitung garis amplop atas dan bawah berdasarkan parameter persentase yang didefinisikan pengguna. Misalnya, 5% berarti menetapkan posisi ketika harga berfluktuasi 5% di luar rata-rata bergerak dasar. Jumlah garis amplop dapat disesuaikan.

Mengenai aturan masuk, pergi panjang ketika harga melanggar di bawah garis amplop bawah, pergi pendek ketika harga melanggar di atas garis amplop atas.

Akhirnya, tutup semua posisi ketika harga kembali di bawah rata-rata pergerakan garis dasar.

Secara khusus, strategi ini menerapkan penetapan posisi parsial. Jika ada beberapa baris amplop, modal akan dialokasikan secara proporsional. Ini mencegah risiko taruhan sepihak.

Analisis Keuntungan

Keuntungan terbesar dari strategi ini:

  1. Menggunakan rata-rata bergerak untuk menentukan arah tren adalah metode yang mapan.

  2. Menyaring beberapa kebisingan dengan garis amplop, mencegah perdagangan yang terlalu sensitif. pengaturan parameter yang wajar dapat sangat meningkatkan profitabilitas strategi.

  3. Penetapan posisi parsial meningkatkan ketahanan strategi. Bahkan jika satu sisi gagal, sisi lain dapat terus berjalan dengan baik. Ini mengoptimalkan rasio risiko-manfaat keseluruhan.

  4. Rata-rata bergerak yang dapat disesuaikan dan nomor garis amplop. Ini meningkatkan fleksibilitas untuk penyesuaian parameter berdasarkan produk yang berbeda.

Analisis Risiko

Risiko utama dari strategi ini:

  1. Sistem moving average tidak sensitif terhadap sinyal golden cross.

  2. Pengaturan garis amplop yang terlalu luas dapat meningkatkan frekuensi perdagangan dan risiko slip. Pengaturan yang terlalu sempit dapat melewatkan gerakan yang lebih besar. Menemukan keseimbangan membutuhkan pengujian menyeluruh.

  3. Strategi ini kemungkinan akan menemukan lebih banyak whipsaws di berbagai pasar.

  4. Jika mencari taruhan satu sisi, optimasi lebih lanjut diperlukan.

Arahan Optimasi

Arah utama untuk mengoptimalkan strategi ini:

  1. Ganti dengan indikator masuk/keluar lainnya seperti KDJ dll. Atau tambahkan filter dengan beberapa indikator.

  2. Tambahkan logika stop profit / loss. Ini mengunci beberapa keuntungan dan secara aktif mengurangi beberapa risiko.

  3. Mengoptimalkan parameter untuk menemukan kombinasi rata-rata bergerak dan amplop terbaik.

  4. Mengintegrasikan pembelajaran mendalam dll untuk pengaturan parameter cerdas. Terus belajar dan memperbarui dari waktu ke waktu.

  5. Pertimbangkan perbedaan produk dan pasar, atur beberapa set parameter yang sesuai dengan lingkungan perdagangan yang berbeda.

Kesimpulan

Sebagai kesimpulan, strategi rata-rata bergerak amplop dinamis ini bekerja dengan sangat baik untuk perdagangan tren. Ini sederhana, efisien, mudah dimengerti dan dioptimalkan. Sebagai strategi dasar, ia memiliki plastisitas dan ekstensibilitas yang besar. Ketika dikombinasikan dengan sistem yang lebih kompleks, dapat ditingkatkan lebih lanjut untuk pengembalian yang lebih tinggi dan metrik yang disesuaikan risiko yang lebih baik. Jadi, ini berfungsi sebagai dasar yang sangat baik untuk strategi perdagangan kuantitatif.


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

//@version=5
strategy("Envelope Strategy", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital=1000, pyramiding = 5, commission_type=strategy.commission.percent, commission_value=0.0)

// CopyRight Crypto Robot

src = input(ohlc4, title="Source", group = "Base MA")
ma_base_window = input.int(5, "Base Mooving Average Window", step = 1, group = "Base MA")
ma_type = input.string(defval='1. SMA', options=['1. SMA', '2. PCMA', '3. EMA', '4. WMA', '5. DEMA', '6. ZLEMA', '7. HMA'], title='MA Type', group = "Base MA")


envelope_1_pct = input.float(0.05, "Envelope 1", step = 0.01, group = "Envelopes")
envelope_2_pct = input.float(0.10, "Envelope 2", step = 0.01, group = "Envelopes")
envelope_3_pct = input.float(0.15, "Envelope 3", step = 0.01, group = "Envelopes")
envelope_4_pct = input.float(0.0, "Envelope 4", step = 0.01, group = "Envelopes")
envelope_5_pct = input.float(0.0, "Envelope 5", step = 0.01, group = "Envelopes")

use_longs = input.bool(true, 'Long Positions') 
use_short = input.bool(true, 'Short Positions')

total_envelope = 0
if envelope_1_pct > 0
    total_envelope := total_envelope + 1
if envelope_2_pct > 0
    total_envelope := total_envelope + 1
if envelope_3_pct > 0
    total_envelope := total_envelope + 1
if envelope_4_pct > 0
    total_envelope := total_envelope + 1
if envelope_5_pct > 0
    total_envelope := total_envelope + 1

// ---------------------------------------------
// -------------- INDICATORS -------------------
ma_function(MA_type, MA_length) =>
    zlema_lag = (MA_length - 1) / 2
    hma_src = MA_type == '7. HMA' ? 2 * ta.wma(src, math.floor(MA_length / 2)) - ta.wma(src, MA_length) : na
    MA_type == '1. SMA' ? ta.sma(src, MA_length) : MA_type == '2. PCMA' ? (ta.highest(high, MA_length) + ta.lowest(low, MA_length)) / 2 : MA_type == '3. EMA' ? ta.ema(src, MA_length) : MA_type == '4. WMA' ? ta.wma(src, MA_length) : MA_type == '5. DEMA' ? 2 * ta.ema(src, MA_length) - ta.ema(ta.ema(src, MA_length), MA_length) : MA_type == '6. ZLEMA' ? ta.ema(src + src - src[zlema_lag], MA_length) : MA_type == '7. HMA' ? ta.wma(hma_src, math.floor(math.sqrt(MA_length))) : na

    
ma_base = ma_function(ma_type, ma_base_window)

ma_high_1 = envelope_1_pct > 0 ? ma_base * (1 + envelope_1_pct) : na
ma_high_2 = envelope_2_pct > 0 ? ma_base * (1 + envelope_2_pct) : na
ma_high_3 = envelope_3_pct > 0 ? ma_base * (1 + envelope_3_pct) : na
ma_high_4 = envelope_4_pct > 0 ? ma_base * (1 + envelope_4_pct) : na
ma_high_5 = envelope_5_pct > 0 ? ma_base * (1 + envelope_5_pct) : na

ma_low_1 = envelope_1_pct > 0 ? ma_base * (1 - envelope_1_pct) : na
ma_low_2 = envelope_2_pct > 0 ? ma_base * (1 - envelope_2_pct) : na
ma_low_3 = envelope_3_pct > 0 ? ma_base * (1 - envelope_3_pct) : na
ma_low_4 = envelope_4_pct > 0 ? ma_base * (1 - envelope_4_pct) : na
ma_low_5 = envelope_5_pct > 0 ? ma_base * (1 - envelope_5_pct) : na

// ---------------------------------------------
// --------------- STRATEGY --------------------
if use_longs
    if envelope_1_pct > 0 and strategy.opentrades < 1
        strategy.entry('long 1', strategy.long, limit=ma_low_1, qty=(strategy.equity / ma_low_1) * (1 / total_envelope))
    if envelope_2_pct > 0 and strategy.opentrades < 2
        strategy.entry('long 2', strategy.long, limit=ma_low_2, qty=(strategy.equity / ma_low_2) * (1 / total_envelope))
    if envelope_3_pct > 0 and strategy.opentrades < 3
        strategy.entry('long 3', strategy.long, limit=ma_low_3, qty=(strategy.equity / ma_low_3) * (1 / total_envelope))
    if envelope_4_pct > 0 and strategy.opentrades < 4
        strategy.entry('long 4', strategy.long, limit=ma_low_4, qty=(strategy.equity / ma_low_4) * (1 / total_envelope))
    if envelope_5_pct > 0 and strategy.opentrades < 5
        strategy.entry('long 5', strategy.long, limit=ma_low_5, qty=(strategy.equity / ma_low_5) * (1 / total_envelope))


  
if use_short
    if envelope_1_pct > 0 and strategy.opentrades < 1
        strategy.entry('short 1', strategy.short, limit=ma_high_1, qty=(strategy.equity / ma_high_1) * (1 / total_envelope))
    if envelope_2_pct > 0 and strategy.opentrades < 2
        strategy.entry('short 2', strategy.short, limit=ma_high_2, qty=(strategy.equity / ma_high_2) * (1 / total_envelope))
    if envelope_3_pct > 0 and strategy.opentrades < 3
        strategy.entry('short 3', strategy.short, limit=ma_high_3, qty=(strategy.equity / ma_high_3) * (1 / total_envelope))
    if envelope_4_pct > 0 and strategy.opentrades < 4
        strategy.entry('short 4', strategy.short, limit=ma_high_4, qty=(strategy.equity / ma_high_4) * (1 / total_envelope))
    if envelope_5_pct > 0 and strategy.opentrades < 5
        strategy.entry('short 5', strategy.short, limit=ma_high_5, qty=(strategy.equity / ma_high_5) * (1 / total_envelope))


strategy.exit('close', limit=ma_base)


// ---------------------------------------------
// ------------------ PLOT ---------------------

ma_base_plot = plot(ma_base, title = "Base MA", color = color.orange, linewidth = 3, offset = 1)

ma_high_1_plot = plot(ma_high_1, title = "MA high 1", color = color.red, offset = 1)
ma_high_2_plot = plot(ma_high_2, title = "MA high 2", color = color.red, offset = 1)
ma_high_3_plot = plot(ma_high_3, title = "MA high 3", color = color.red, offset = 1)
ma_high_4_plot = plot(ma_high_4, title = "MA high 4", color = color.red, offset = 1)
ma_high_5_plot = plot(ma_high_5, title = "MA high 5", color = color.red, offset = 1)

ma_low_1_plot = plot(ma_low_1, title = "MA low 1", color = color.green, offset = 1)
ma_low_2_plot = plot(ma_low_2, title = "MA low 2", color = color.green, offset = 1)
ma_low_3_plot = plot(ma_low_3, title = "MA low 3", color = color.green, offset = 1)
ma_low_4_plot = plot(ma_low_4, title = "MA low 4", color = color.green, offset = 1)
ma_low_5_plot = plot(ma_low_5, title = "MA low 5", color = color.green, offset = 1)

plot(ohlc4, color=color.purple)

// use_period = input.bool(false, "Période spécifique ?", group="periode")
// startDate = input.time(timestamp("01 Jan 2020"), "Date de début", group="periode")
// endDate = input.time(timestamp("01 Jan 2025"), "Date de fin", group="periode")


//------------------------------------------
//-------------Indicateurs------------------

// inDateRange = use_period ? ((time >= startDate) and (time < endDate)) : true

// //--------------Backtest-------------------

// strategy_pnl = strategy.netprofit + strategy.openprofit
// bnh_strategy_pnl_pcnt = (strategy_pnl / strategy.initial_capital) * 100

// float bnh_start_bar = na
// bnh_start_bar := na(bnh_start_bar[1]) or inDateRange != true? close : bnh_start_bar[1]
// float bnl_buy_hold_equity = na
// bnl_buy_hold_equity :=  inDateRange == true ? ((close - bnh_start_bar)/bnh_start_bar) * 100 : bnl_buy_hold_equity[1]

// bnh_vs_diff = bnh_strategy_pnl_pcnt - bnl_buy_hold_equity
// bnh_diff_color = bnh_vs_diff > 0 ? color.new(color.green, inDateRange ? 60 : 100) : color.new(color.red, inDateRange ? 60 : 100)

// var Table = table.new(position.top_right, columns = 2, rows = 4, border_width = 1, bgcolor = color.black, border_color = color.gray)
// table.cell(table_id = Table, column = 0, row = 0, text_color=(bnh_strategy_pnl_pcnt>bnl_buy_hold_equity)?color.gray:color.green, text_size = size.normal, text = "Buy & hold profit")
// table.cell(table_id = Table, column = 1, row = 0, text_color=(bnh_strategy_pnl_pcnt>bnl_buy_hold_equity)?color.gray:color.green, text_size = size.normal, text = str.tostring(bnl_buy_hold_equity, '#.##') + ' %')
// table.cell(table_id = Table, column = 0, row = 1, text_color=(bnh_strategy_pnl_pcnt<bnl_buy_hold_equity)?color.gray:color.green, text_size = size.normal, text = "Strategy profit")
// table.cell(table_id = Table, column = 1, row = 1, text_color=(bnh_strategy_pnl_pcnt<bnl_buy_hold_equity)?color.gray:color.green, text_size = size.normal, text = str.tostring(bnh_strategy_pnl_pcnt, '#.##') + ' %')
// table.cell(table_id = Table, column = 0, row = 2, text_color=color.yellow, text_size = size.normal, text = "Date de début")
// table.cell(table_id = Table, column = 1, row = 2, text_color=color.yellow, text_size = size.normal, text = str.format("{0,date,dd-MM-YYYY}",strategy.closedtrades.entry_time(1)))

Lebih banyak