Strategi ini memungkinkan konfigurasi yang fleksibel dari beberapa pasangan rata-rata bergerak cepat / lambat. Ini pergi panjang ketika semua MA cepat menyeberang di atas MA lambat, dan keluar ketika setiap MA cepat menyeberang di bawah MA lambat. Mekanisme pemungutan suara dengan beberapa MA bertujuan untuk membentuk keputusan kepemilikan posisi yang kuat.
Komponen dan aturan utama adalah:
Multiple fast/slow MA: Menggunakan SMA, WMA, VWMA dll.
Sinyal panjang: Semua MAs cepat melintasi di atas MAs lambat.
Sinyal keluar: Setiap penyeberangan MA cepat di bawah MA lambat.
Nilai laba rugi: Nilai tetap berdasarkan ATR.
Konfigurasi: Konfigurasi fleksibel dari beberapa pasangan MA.
Masukan berbasis pemungutan suara dengan beberapa MA meningkatkan keandalan sinyal. Konfigurasi khusus memberikan fleksibilitas.
Dibandingkan dengan strategi MA tunggal, keuntungannya adalah:
Multiple MAs memberikan penilaian tren yang lebih komprehensif.
Pemungutan suara menghindari sinyal palsu dari kebisingan.
Ruang penyesuaian besar dari konfigurasi MA khusus.
Dukungan untuk berbagai jenis MA meningkatkan kemampuan beradaptasi.
Kontrol poin laba/rugi yang ditentukan per risiko/pemberian perdagangan.
Berfungsi lebih baik pada jangka waktu yang lebih lama, kurang curve whipsaws.
Logika sederhana dan intuitif, mudah diterapkan dan dioperasikan.
Secara keseluruhan lebih stabil dengan umur panjang yang lebih besar dibandingkan dengan MA tunggal.
Namun, ada beberapa risiko:
Meningkatnya kompleksitas dengan beberapa MA.
Risiko dari over-optimasi.
Kelemahan mendasar dalam mengidentifikasi perubahan tren.
Tidak ada volume yang dipertimbangkan, risiko terjebak.
Poin keuntungan/kerugian dapat menyebabkan keluar yang tidak perlu.
Kinerja tunduk pada perubahan rezim pasar.
Perlu memantau rasio reward/risiko dan kelancaran kurva.
Kekuatan di seluruh instrumen membutuhkan validasi.
Berdasarkan analisis, peningkatan dapat mencakup:
Uji ketahanan parameter di instrumen yang berbeda.
Menambahkan konfirmasi volume atau volatilitas.
Mengoptimalkan poin profit/loss.
Menetapkan batas maksimum pengambilan yang dapat ditoleransi.
Membangun model ukuran posisi dinamis.
Mengevaluasi efek dari pengenalan pembelajaran mesin.
Memantau penarikan maksimum dan kelancaran kurva.
Iterasi terus menerus untuk menghindari overfitting.
Pendekatan multi-MA yang dapat dikonfigurasi membentuk mekanisme kepemilikan posisi yang kuat. Tetapi mencegah overfit dan adaptasi dinamis terhadap perubahan pasar adalah kunci untuk umur panjang strategi. Hanya melalui optimasi dan pengujian berkelanjutan yang ketat strategi kuantitas dapat mempertahankan kesuksesan.
/*backtest start: 2022-09-16 00:00:00 end: 2023-09-22 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/ // © levieux //@version=5 strategy(title='Configurable Multi MA Crossover Voting System', shorttitle='Configurable Multi MA Crossover Voting System', initial_capital=1000, overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.1) crossoverConfig= input.string(defval="2x4,3x5,4x6", title="Crossover Config") source= input.source(high) maType= input.string("WMA", title="Moving Average Type", options=["WMA","SMA","VWMA"]) atrPeriod= input(14, title="ATR Period") profitAtr = input(10, title="Profit ATR x") lossAtr = input(5, title="Loss ATR x") ma(src,length,type) => float ma = switch type "SMA" => ta.sma(src, length) "WMA" => ta.wma(src, length) "VWMA" => ta.vwma(src, length) crossoverGroups= str.split(crossoverConfig, ",") crossoverCount= array.size(crossoverGroups) crossovers= array.new_string(crossoverCount) positions= array.new_int(crossoverCount, 0) longVotes= 0 for i= 0 to crossoverCount-1 crossover= str.tostring(array.get(crossoverGroups, i)) crossoverBoundaries= str.split(crossover, "x") int fastLength= math.round(str.tonumber(array.get(crossoverBoundaries, 0))) int slowLength= math.round(str.tonumber(array.get(crossoverBoundaries, 1))) wmaFast= ma(source,fastLength,maType) wmaSlow= ma(source,slowLength,maType) if wmaFast>wmaSlow longVotes:= longVotes + 1 array.set(positions, i, 1) longCondition= longVotes==crossoverCount and strategy.position_size==0 //profitTicks = profitAtr*ta.atr(atrPeriod)/syminfo.mintick //lossTicks = lossAtr*ta.atr(atrPeriod)/syminfo.mintick profitPrice= close+profitAtr*ta.atr(atrPeriod) lossPrice= close-lossAtr*ta.atr(atrPeriod) if strategy.position_size>0 profitPrice:= profitPrice[1] lossPrice:= lossPrice[1] plot(profitPrice, color=color.green) plot(lossPrice, color=color.red) if longCondition and profitPrice>0 strategy.entry("Long", strategy.long) if longVotes<crossoverCount and strategy.position_size>0 and (high>profitPrice or low<lossPrice) strategy.close("Long") longVotes:= 0