Chiến lược định lượng Golden Cross và Dead Cross của Đường trung bình động kép


Ngày tạo: 2023-12-05 10:24:34 sửa đổi lần cuối: 2023-12-05 10:24:34
sao chép: 0 Số nhấp chuột: 704
1
tập trung vào
1619
Người theo dõi

Chiến lược định lượng Golden Cross và Dead Cross của Đường trung bình động kép

Tổng quan

Chiến lược này dựa trên tín hiệu Gold Fork Dead Fork của đường trung bình di chuyển ALMA kép, kết hợp với tín hiệu đa trống của chỉ số MACD, để thực hiện tự động nhiều trống. Chiến lược này áp dụng cho chu kỳ thời gian 4 giờ trở lên, dữ liệu thử nghiệm là BNB / USDT, khoảng thời gian từ năm 2017 đến nay, phí xử lý được đặt là 0,03%

Nguyên tắc chiến lược

Chiến lược sử dụng đường nhanh và đường chậm ALMA để xây dựng đường trung bình di chuyển kép. Dài đường nhanh là 20 và dài đường chậm là 40, với độ lệch 0,9 và chênh lệch chuẩn là 5.

Trong khi đó, các chiến lược kết hợp với MACD chỉ số của đường thẳng biểu đồ tín hiệu. Chỉ khi MACD đường thẳng là tích cực () tăng, nhiều tín hiệu là có hiệu quả; chỉ khi MACD đường thẳng là âm () giảm, tín hiệu là không có hiệu quả.

Chiến lược này đồng thời đặt các điều kiện dừng lỗ. Đặt nhiều lần dừng là 2 lần, dừng là 0,2 lần; Đặt trần là 0,05 lần, dừng là 1 lần.

Phân tích lợi thế

Chiến lược này kết hợp sự phán đoán xu hướng của đường trung bình di chuyển đôi và sự phán đoán năng lượng của chỉ số MACD, có thể lọc hiệu quả các tín hiệu giả, cải thiện độ chính xác của nhập cảnh. Thiết lập dừng lỗ là hợp lý, tối đa hóa lợi nhuận và tránh thua lỗ lớn.

Dữ liệu phản hồi được áp dụng từ năm 2017, bao gồm nhiều lần chuyển đổi bò và gấu, chiến lược vẫn hoạt động tốt trong điều kiện xuyên chu kỳ. Điều này chứng minh rằng chiến lược thích nghi với đặc điểm tuyến tính và phi tuyến tính của thị trường.

Phân tích rủi ro

Chiến lược này có những rủi ro như sau:

  1. Đường trung bình di chuyển đôi bị chậm trễ và có thể bỏ lỡ cơ hội rút ngắn
  2. Nếu MACD là 0 thì chiến lược sẽ không tạo ra tín hiệu
  3. Tỷ lệ Stop Loss được thiết lập trước và có thể lệch so với thực tế

Giải pháp:

  1. Giảm chu kỳ trung bình di chuyển một cách thích hợp và tăng độ nhạy đối với đường ngắn
  2. Tối ưu hóa các tham số MACD để biến động đồ thị đường thẳng thường xuyên hơn
  3. Động thái điều chỉnh thiết lập dừng lỗ

Hướng tối ưu hóa

Chiến lược này cũng có thể được tối ưu hóa theo các khía cạnh sau:

  1. Thử các loại trung bình di chuyển khác nhau để tìm ra hiệu quả mượt hơn
  2. Tối ưu hóa các tham số của đường trung bình di chuyển và MACD cho các giống và chu kỳ khác nhau
  3. Thêm các điều kiện bổ sung, chẳng hạn như thay đổi khối lượng giao dịch, để lọc tín hiệu
  4. Điều chỉnh tỷ lệ Stop Loss trong thời gian thực để chiến lược có thể thích ứng hơn

Tóm tắt

Chiến lược này kết hợp thành công với phán đoán xu hướng của đường trung bình di chuyển và phán đoán hỗ trợ của MACD, và thiết lập các điểm dừng lỗ hợp lý, có thể đạt được lợi nhuận ổn định trong nhiều trường hợp. Bằng cách tiếp tục tối ưu hóa các thiết lập tham số và thêm các điều kiện lọc bổ sung, sự ổn định và khả năng lợi nhuận của chiến lược có thể được nâng cao hơn nữa.

Mã nguồn chiến lược
/*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')