Full Crypto Swing ALMA Cross MACD Strategi Kuantitatif

Penulis:ChaoZhang, Tarikh: 2023-12-05 10:24:34
Tag:

img

Ringkasan

Strategi ini berdasarkan isyarat salib emas dan salib mati garis purata bergerak ALMA berganda, digabungkan dengan isyarat panjang dan pendek penunjuk MACD, untuk mencapai kedudukan panjang dan pendek automatik. Strategi ini sesuai untuk bingkai masa 4 jam atau lebih, dan data ujian adalah BNB / USDT dari 2017 hingga sekarang, dengan kadar komisen ditetapkan pada 0.03%.

Prinsip Strategi

Strategi ini menggunakan garis pantas dan perlahan yang dibina dari ALMA untuk membina purata bergerak berganda. Panjang garis pantas adalah 20 dan garis perlahan adalah 40, kedua-duanya mengamalkan ofset 0.9 dan penyimpangan standard 5. Apabila garis pantas melintasi garis perlahan, isyarat panjang dihasilkan. Apabila garis pantas melintasi di bawah garis perlahan, isyarat pendek dihasilkan.

Pada masa yang sama, strategi ini menggabungkan isyarat histogram penunjuk MACD. Hanya apabila histogram MACD positif (naik), isyarat panjang adalah sah; hanya apabila histogram MACD negatif (turun), isyarat pendek adalah sah.

Strategi ini juga menetapkan mengambil keuntungan dan syarat berhenti rugi. mengambil keuntungan panjang adalah 2 kali dan kehilangan berhenti adalah 0.2 kali; mengambil keuntungan pendek adalah 0.05 kali dan kehilangan berhenti adalah 1 kali.

Analisis Kelebihan

Strategi ini menggabungkan penilaian trend purata bergerak berganda dan penilaian tenaga penunjuk MACD, yang dapat menapis isyarat palsu dengan berkesan dan meningkatkan ketepatan kemasukan.

Data backtest telah digunakan sejak tahun 2017, meliputi pelbagai kitaran penukaran bull dan bear. Strategi ini masih berfungsi dengan baik di sepanjang tempoh. Ini membuktikan bahawa strategi ini menyesuaikan diri dengan ciri-ciri linier dan bukan linier pasaran.

Analisis Risiko

Strategi ini mempunyai risiko berikut:

  1. Purata bergerak berganda itu sendiri mempunyai kesan kelewatan, mungkin kehilangan peluang jangka pendek
  2. Apabila histogram MACD adalah sifar, strategi tidak akan menghasilkan isyarat
  3. Rasio mengambil keuntungan dan stop loss ditetapkan terlebih dahulu, boleh menyimpang dari pasaran sebenar

Penyelesaian:

  1. Memendekkan kitaran purata bergerak dengan sewajarnya untuk meningkatkan kepekaan jangka pendek
  2. Mengoptimumkan parameter MACD untuk menjadikan turun naik histogram lebih kerap
  3. Sesuaikan secara dinamik tetapan mengambil keuntungan dan hentikan kerugian

Arahan pengoptimuman

Strategi ini juga boleh dioptimumkan dalam aspek berikut:

  1. Cuba pelbagai jenis purata bergerak untuk mencari kesan smoothing yang lebih baik
  2. Mengoptimumkan parameter purata bergerak dan MACD untuk menyesuaikan produk dan kitaran yang berbeza
  3. Tambah syarat tambahan seperti perubahan jumlah dagangan kepada isyarat penapis
  4. Sesuaikan mengambil keuntungan dan stop loss nisbah dalam masa nyata untuk fleksibiliti yang lebih baik

Kesimpulan

Strategi ini berjaya menggabungkan pertimbangan trend purata bergerak dan pertimbangan tambahan MACD, dan menetapkan keuntungan yang munasabah dan menghentikan kerugian, yang dapat memperoleh pulangan yang stabil dalam pelbagai keadaan pasaran. Kestabilan dan keuntungan strategi dapat ditingkatkan dengan terus mengoptimumkan tetapan parameter, menambah syarat penapisan tambahan, dll.


/*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')

Lebih lanjut