Strategi ini adalah berdasarkan pada garis purata bergerak dan garis purata dinamik, yang mewujudkan perdagangan dua hala yang berbilang ruang. Ia akan mengikuti harga untuk memecahkan garis purata atas dan bawah untuk membina kedudukan, dan berdamai apabila harga kembali ke bawah garis purata rujukan. Strategi ini digunakan untuk saham dan mata wang digital yang mempunyai trend yang lebih jelas.
Pertama, strategi ini mengira garis purata rujukan berdasarkan jenis dan panjang garis purata yang dipilih oleh pengguna; garis purata biasa termasuk SMA, EMA, dan lain-lain.
Kemudian, berdasarkan parameter peratusan yang ditetapkan oleh pengguna, garis pembungkus ke atas dan ke bawah dikira. Sebagai contoh, 5% mewakili pergerakan harga ALLOWED_BRACKET105% untuk mencetuskan kedudukan. Bilangan baris pembungkus boleh disesuaikan.
Dalam peraturan masuk ke pasaran, jika anda melanggar garis pembungkus bawah, lakukan lebih banyak; jika anda melanggar garis pembungkus atas, lakukan kosong.
Akhirnya, apabila harga jatuh semula di bawah garis rata asas, semua kedudukan dipadamkan.
Perlu diperhatikan bahawa strategi ini mencapai perpecahan. Jika terdapat beberapa garis pembungkusan, maka dana akan diedarkan secara proporsional. Ini mengelakkan risiko pertaruhan secara sepihak.
Di samping itu, ia juga akan memberi peluang kepada pengguna untuk mendapatkan lebih banyak maklumat mengenai produk yang mereka beli.
Fungsi untuk mengesan trend secara automatik telah dilaksanakan. Menggunakan garis rata untuk menentukan arah trend adalah sangat biasa, jadi ini adalah kaedah yang berkesan.
Menggunakan rangkaian yang berpusat untuk menapis sebahagian daripada bunyi bising, ini mengelakkan masalah yang terlalu sensitif dan menimbulkan transaksi yang tidak penting; tetapan parameter yang munasabah dapat mengoptimumkan keuntungan strategi secara besar-besaran.
Pembinaan saham terpecah meningkatkan ketangguhan strategik. Walaupun kegagalan satu pihak, arah lain mungkin terus berjalan dengan baik. Ini mengoptimumkan nisbah risiko-balasan keseluruhan.
Membolehkan jumlah garis rata dan berpusat yang disesuaikan. Ini meningkatkan fleksibiliti strategi, pengguna boleh menyesuaikan parameter untuk pelbagai jenis.
Risiko utama strategi ini ialah:
Sistem rata-rata tidak sensitif kepada isyarat jenis silang emas. Jika tidak ada trend yang jelas, strategi ini mungkin kehilangan sebahagian peluang.
Jarak yang terlalu luas boleh meningkatkan jumlah dagangan dan risiko titik litar. Jarak yang terlalu sempit boleh terlepas pasaran yang lebih besar. Menemui titik keseimbangan memerlukan ujian yang mencukupi.
Dalam pasaran yang goyah, strategi ini mungkin lebih cenderung untuk disertakan. Oleh itu, pilihan varieti adalah lebih baik dengan varieti yang mempunyai kecenderungan yang jelas.
Pembinaan saham terpecah-belah akan mengehadkan setiap keuntungan tunggal.
Strategi ini boleh dioptimumkan dari beberapa arah:
Menggantikan penunjuk lain untuk menentukan pembinaan dan pembinaan; contohnya, penunjuk KDJ dan lain-lain; atau menggabungkan beberapa penunjuk untuk menetapkan syarat penapisan.
Menambah logik stop loss. Ini boleh mengunci sebahagian keuntungan dan secara proaktif mengelakkan sebahagian risiko.
Mengoptimumkan parameter untuk mencari kombinasi garis purata dan garis lingkaran yang terbaik. Ini memerlukan pengulangan dan pengoptimuman yang mencukupi untuk mencari pasangan parameter yang terbaik.
Dengan menggunakan teknologi seperti pembelajaran mendalam untuk mencapai pengoptimuman parameter pintar. Belajar terus dan mengemas kini tetapan parameter dari masa ke masa.
Mengambil kira perbezaan jenis dan pasaran, menetapkan pelbagai set parameter untuk menyesuaikan diri dengan persekitaran perdagangan yang berbeza. Ini akan meningkatkan kestabilan strategi dengan ketara.
Strategi ini secara keseluruhan sangat sesuai untuk perdagangan trend. Ia mudah, cekap, mudah difahami dan dioptimumkan. Sebagai strategi asas, ia mempunyai fleksibiliti dan skalabiliti yang sangat kuat. Melalui penggabungan dengan sistem yang lebih kompleks, penunjuk penyesuaian keuntungan dan risiko keseluruhan dapat dioptimumkan lebih lanjut.
/*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)))