Ini adalah strategi perdagangan yang menetapkan limit order berdasarkan beberapa moving average. Ini akan menetapkan jumlah yang berbeda dari order limit panjang atau pendek ketika harga memecahkan melalui tingkat MA yang berbeda, membentuk multi-posisi berbentuk piramida. Ketika harga memecahkan melalui MA lagi, order limit terbalik akan dibuka. Ketika memegang posisi, posisi akan ditutup dengan order pasar terbalik jika harga melanggar MA tengah.
Strategi ini menggunakan moving average untuk menentukan arah tren. Secara khusus, strategi ini menentukan jumlah order limit panjang berdasarkan apakah harga menembus 3 garis MA ke atas. dan menentukan jumlah order limit pendek berdasarkan apakah harga menembus 3 garis MA ke bawah.
Dengan demikian, semakin kuat tren, semakin banyak perintah batas yang sama arah yang akan ditetapkan. Ketika harga menunjukkan sinyal pembalikan, posisi terbalik akan dibuka. MA tengah digunakan untuk menilai terobosan posisi yang ada dan menghasilkan sinyal dekat.
Seluruh strategi menggabungkan pembukaan gaya piramida dengan penutupan gaya terobosan untuk membentuk logika perdagangan. Ini bertujuan untuk membuka posisi dengan harga rata-rata yang lebih baik untuk mengurangi biaya, dan menggunakan MA tengah untuk stop loss untuk mengendalikan risiko.
Keuntungan dari strategi ini meliputi:
Menggunakan MAs untuk menentukan tren, sederhana dan intuitif untuk beroperasi.
Pembukaan gaya piramida dapat mendapatkan harga rata-rata yang lebih baik pada tahap awal tren.
Stop loss MA tengah dapat menghentikan kerugian tepat waktu dan mengendalikan risiko.
Perintah batas menghindari tergelincir.
Parameter yang dapat disesuaikan menyesuaikan dengan produk yang berbeda.
Struktur yang jelas, mudah dimengerti dan diperluas.
Risiko dari strategi ini meliputi:
Keterlambatan MA dapat menyebabkan penilaian yang salah.
Perintah batas gagal mungkin kehilangan kesempatan masuk.
Stop loss MA tengah mungkin terlalu mentah untuk menilai terobosan.
Pengaturan parameter yang tidak benar dapat mengakibatkan posisi yang terlalu besar.
Periode backtest yang tidak cukup dapat menyebabkan overfitting.
Tidak mempertimbangkan biaya transaksi.
Solusinya adalah:
Tambahkan indikator lain untuk konfirmasi, optimalkan parameter.
Atur batas harga.
Tambahkan profit taking atau logika di tengah MA stop loss.
Mengoptimalkan parameter, mengevaluasi rasio risiko-manfaat.
Perpanjang periode backtest, backtest multi-pasar.
Tambahkan biaya transaksi dan logika slip.
Strategi dapat dioptimalkan dalam aspek berikut:
Mengoptimalkan parameter untuk lebih banyak produk, menggunakan metode pembelajaran mesin.
Tambahkan indikator lain untuk konfirmasi, misalnya MACD, KDJ dll.
Tambahkan keuntungan mengambil logika di tengah garis MA.
Secara dinamis menyesuaikan ukuran posisi dan tingkat stop loss.
Mengoptimalkan harga batas untuk biaya masuk yang lebih baik, misalnya berdasarkan volatilitas.
Mengelola biaya untuk mencegah kecenderungan yang berlebihan.
Uji parameter pada produk yang berbeda untuk membangun kumpulan parameter.
Strategi ini membuka posisi berbentuk piramida dengan limit order untuk mencapai biaya rata-rata yang lebih baik. Ini menggunakan MA tengah untuk stop loss untuk mengendalikan risiko. Struktur strategi sederhana dan jelas, mudah dimengerti dan diperluas. Tetapi dapat ditingkatkan dengan memperkenalkan indikator lain, mengoptimalkan parameter, meningkatkan logika limit order dll untuk membuatnya lebih kuat. Secara keseluruhan, strategi ini memberikan ide sederhana dan praktis tentang perdagangan limit order yang memegang beberapa nilai referensi.
/*backtest start: 2022-09-15 00:00:00 end: 2023-09-21 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //Noro //2019 //@version=4 strategy(title = "Robot WhiteBox MultiMA", shorttitle = "Robot WhiteBox MultiMA", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 3) //Settings capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Lot") len = input(3, minval = 1, title = "MA Length") s = input(defval = "7. OHLC4", options = ["1. Open", "2. High", "3. Low", "4. Close", "5. HL2", "6. HLC3", "7. OHLC4", "8. OC2", "9. PCMA"], title = "Data") short3 = input(true, title = "short 3") short2 = input(true, title = "short 2") short1 = input(true, title = "short 1") long1 = input(true, title = "long 1") long2 = input(true, title = "long 2") long3 = input(true, title = "long 3") shortlevel3 = input(15.0, title = "Short line 3") shortlevel2 = input(10.0, title = "Short line 2") shortlevel1 = input(5.0, title = "Short line 1") longlevel1 = input(-5.0, title = "Long line 1") longlevel2 = input(-10.0, title = "Long line 2") longlevel3 = input(-15.0, title = "Long line 3") needoffset = input(true, title = "Offset") fromyear = input(1900, defval = 1900, minval = 1900, maxval = 2100, title = "From Year") toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year") frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month") tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month") fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day") today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day") //Variables size = strategy.position_size mult = 1 / syminfo.mintick needtime = time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59) //MA oc2 = (open + close) / 2 pcma = (highest(high, len) + lowest(low, len)) / 2 src = s == "1. Open" ? open : s == "2. High" ? high : s == "3. Low" ? low : s == "4. Close" ? close : s == "5. HL2" ? hl2 : s == "6. HLC3" ? hlc3 : s == "7. OHLC4" ? ohlc4 : s == "8. OC2" ? oc2: close sma = sma(src, len) ma = s == "9. PCMA" ? round(pcma * mult) / mult : round(sma * mult) / mult //Levels longline1 = long1 ? round(ma * ((100 + longlevel1) / 100) * mult) / mult : close longline2 = long2 ? round(ma * ((100 + longlevel2) / 100) * mult) / mult : close longline3 = long3 ? round(ma * ((100 + longlevel3) / 100) * mult) / mult : close shortline1 = short1 ? round(ma * ((100 + shortlevel1) / 100) * mult) / mult : close shortline2 = short2 ? round(ma * ((100 + shortlevel2) / 100) * mult) / mult : close shortline3 = short3 ? round(ma * ((100 + shortlevel3) / 100) * mult) / mult : close //Lines colorlong1 = long1 ? color.lime : na colorlong2 = long2 ? color.lime : na colorlong3 = long3 ? color.lime : na colorshort1 = short1 ? color.red : na colorshort2 = short2 ? color.red : na colorshort3 = short3 ? color.red : na offset = needoffset ? 1 : 0 plot(shortline3, offset = offset, color = colorshort3, title = "Short line 3") plot(shortline2, offset = offset, color = colorshort2, title = "Short line 2") plot(shortline1, offset = offset, color = colorshort1, title = "Short line 1") plot(ma, offset = offset, color = color.blue, title = "MA line") plot(longline1, offset = offset, color = colorlong1, title = "Long line 1") plot(longline2, offset = offset, color = colorlong2, title = "Long line 2") plot(longline3, offset = offset, color = colorlong3, title = "Long line 3") //Trading lot = 0.0 lot := size == 0 ? strategy.equity / close * capital / 100 : lot[1] lots = 0.0 if ma > 0 lots := round(size / lot) strategy.entry("L1", strategy.long, lot, limit = longline1, when = (lots == 0 and long1 and needtime)) lots := round(size / lot) strategy.entry("L2", strategy.long, lot, limit = longline2, when = (lots <= 1 and long2 and needtime)) lots := round(size / lot) strategy.entry("L3", strategy.long, lot, limit = longline3, when = (lots <= 2 and long3 and needtime)) lots := round(size / lot) strategy.entry("S1", strategy.short, lot, limit = shortline1, when = (lots == 0 and short1 and needtime)) lots := round(size / lot) strategy.entry("S2", strategy.short, lot, limit = shortline2, when = (lots >= -1 and short2 and needtime)) lots := round(size / lot) strategy.entry("S3", strategy.short, lot, limit = shortline3, when = (lots >= -2 and short3 and needtime)) if size > 0 strategy.entry("TPL", strategy.short, 0, limit = ma) if size < 0 strategy.entry("TPS", strategy.long, 0, limit = ma) if time > timestamp(toyear, tomonth, today, 23, 59) strategy.close_all()