Strategi Kuantitatif Double Moving Average Golden Cross dan Dead Cross


Tanggal Pembuatan: 2023-12-05 10:24:34 Akhirnya memodifikasi: 2023-12-05 10:24:34
menyalin: 0 Jumlah klik: 704
1
fokus pada
1619
Pengikut

Strategi Kuantitatif Double Moving Average Golden Cross dan Dead Cross

Ringkasan

Strategi ini didasarkan pada sinyal Gold Fork Dead Fork dari ALMA Moving Average ganda, yang dikombinasikan dengan sinyal MACD indicator, untuk memungkinkan otomatis melakukan lebih banyak blanko. Strategi ini berlaku untuk periode waktu 4 jam atau lebih, data uji adalah BNB/USDT, periode waktu dari 2017 hingga saat ini, biaya setelan 0,03% .

Prinsip Strategi

Strategi menggunakan ALMA garis cepat dan garis lambat untuk membangun dua rata-rata bergerak. Panjang garis cepat adalah 20, panjang garis lambat adalah 40, masing-masing menggunakan 0,9 offset, dengan standard deviasi 5.

Sementara itu, strategi yang menggabungkan sinyal grafik lurus dengan indikator MACD. Hanya jika grafik lurus MACD adalah positif (,) naik, sinyal multiply akan efektif; hanya jika grafik lurus MACD adalah negatif (,) turun, sinyal shorting akan efektif.

Strategi ini juga menetapkan kondisi stop loss. Stop loss adalah 2 kali lebih banyak dan stop loss adalah 0,2 kali lebih banyak. Stop loss adalah 0,05 kali lebih banyak dan stop loss adalah 1 kali lebih banyak.

Analisis Keunggulan

Strategi ini menggabungkan penilaian tren dari dua rata-rata bergerak dan penilaian energi dari indikator MACD, yang dapat secara efektif memfilter sinyal palsu, meningkatkan akurasi masuk. Pengaturan stop loss yang masuk akal, maksimal mengunci keuntungan, menghindari kerugian besar.

Data retrospektif yang diadopsi sejak tahun 2017, termasuk beberapa kali konversi bullish dan bearish, menunjukkan bahwa strategi ini masih berkinerja baik dalam kondisi lintas-siklus. Ini membuktikan bahwa strategi ini beradaptasi dengan karakteristik linier dan non-linier pasar.

Analisis risiko

Strategi ini memiliki risiko sebagai berikut:

  1. Dalam beberapa kasus, rata-rata bergerak ganda sendiri terlambat dan mungkin kehilangan kesempatan untuk garis pendek.
  2. Strategi tidak akan menghasilkan sinyal jika grafik MACD adalah nol
  3. Stop Loss Ratio adalah preset dan mungkin menyimpang dari situasi yang sebenarnya

Solusi:

  1. Mempersingkat siklus rata-rata bergerak dengan tepat dan meningkatkan sensitivitas terhadap garis pendek
  2. Mengoptimalkan parameter MACD untuk membuat grafik vertikal berfluktuasi lebih sering
  3. Pengaturan stop loss yang disesuaikan secara dinamis

Arah optimasi

Strategi ini juga dapat dioptimalkan dalam beberapa hal:

  1. Mencoba berbagai jenis moving average untuk mendapatkan hasil yang lebih halus
  2. Optimalkan parameter moving average dan MACD untuk varietas dan periode yang berbeda
  3. Menambahkan kondisi tambahan, seperti perubahan volume transaksi, filter sinyal
  4. Adaptasi real-time dari Stop Loss Ratio untuk Strategi yang Lebih Adaptif

Meringkaskan

Strategi ini berhasil menggabungkan penilaian tren dari moving averages dan penilaian tambahan dari MACD, dan menetapkan stop loss yang masuk akal, yang dapat menghasilkan keuntungan yang stabil dalam berbagai situasi. Dengan cara terus-menerus mengoptimalkan pengaturan parameter, menambahkan kondisi filter tambahan, stabilitas dan profitabilitas strategi dapat ditingkatkan lebih lanjut.

Kode Sumber Strategi
/*backtest
start: 2023-11-04 00:00:00
end: 2023-12-04 00:00:00
period: 1h
basePeriod: 15m
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/
// © exlux99

//@version=4
strategy(title = "Full Crypto Swing Strategy ALMA Cross", overlay = true,  pyramiding=1,initial_capital = 1, default_qty_type= strategy.percent_of_equity, default_qty_value = 100, calc_on_order_fills=false, slippage=0,commission_type=strategy.commission.percent,commission_value=0.03)

//time condition
fromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
fromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
fromYear = input(defval = 2010, title = "From Year", minval = 1970)
 //monday and session 
// To Date Inputs
toDay = input(defval = 31, title = "To Day", minval = 1, maxval = 31)
toMonth = input(defval = 12, title = "To Month", minval = 1, maxval = 12)
toYear = input(defval = 2031, title = "To Year", minval = 1970)

startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear, toMonth, toDay, 00, 00)
time_cond = time >= startDate and time <= finishDate

UseHAcandles    = input(false, title="Use Heikin Ashi Candles in Algo Calculations")

haClose = UseHAcandles ? security(heikinashi(syminfo.tickerid), timeframe.period, close) : close
haOpen  = UseHAcandles ? security(heikinashi(syminfo.tickerid), timeframe.period, open) : open
haHigh  = UseHAcandles ? security(heikinashi(syminfo.tickerid), timeframe.period, high) : high
haLow   = UseHAcandles ? security(heikinashi(syminfo.tickerid), timeframe.period, low) : low

//alma fast and slow
src = haClose
windowsize = input(title="Length Size Fast", type=input.integer, defval=20)
windowsize2 = input(title="Length Size Slow", type=input.integer, defval=40)
offset = input(title="Offset", type=input.float, defval=0.9, step=0.05)
sigma = input(title="Sigma", type=input.float, defval=5)
outfast=alma(src, windowsize, offset, sigma)
outslow=alma(src, windowsize2, offset, sigma)

//macd
fast_length = input(title="Fast Length", type=input.integer, defval=6)
slow_length = input(title="Slow Length", type=input.integer, defval=25)
signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9)

// Calculating
fast_ma = ema(src, fast_length)
slow_ma =  ema(src, slow_length)
macd = fast_ma - slow_ma
signal = ema(macd, signal_length)
hist = macd - signal

long=crossover(outfast,outslow) and hist > hist[1] and time_cond
short=crossunder(outfast,outslow) and hist < hist[1] and time_cond

takeProfit_long=input(2.0, step=0.005)
stopLoss_long=input(0.2, step=0.005)
takeProfit_short=input(0.05, step=0.005)
stopLoss_short=input(1.0, step=0.005)

strategy.entry("long",1,when=long)
strategy.entry("short",0,when=short)

strategy.exit("short_tp/sl", "long", profit=close * takeProfit_long / syminfo.mintick, loss=close * stopLoss_long / syminfo.mintick, comment='LONG EXIT',  alert_message = 'closeshort')
strategy.exit("short_tp/sl", "short", profit=close * takeProfit_short / syminfo.mintick, loss=close * stopLoss_short / syminfo.mintick, comment='SHORT EXIT',  alert_message = 'closeshort')