Full Crypto Swing ALMA Cross MACD Chiến lược định lượng

Tác giả:ChaoZhang, Ngày: 2023-12-05 10:24:34
Tags:

img

Tổng quan

Chiến lược này dựa trên các tín hiệu chéo vàng và chéo chết của đường trung bình động ALMA kép, kết hợp với các tín hiệu dài và ngắn của chỉ số MACD, để đạt được các vị trí dài và ngắn tự động. Chiến lược này phù hợp với khung thời gian từ 4 giờ trở lên và dữ liệu thử nghiệm là BNB / USDT từ năm 2017 đến nay, với tỷ lệ hoa hồng được đặt ở mức 0,03%.

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

Chiến lược này sử dụng các đường nhanh và chậm được xây dựng từ ALMA để xây dựng đường trung bình di chuyển kép. Chiều dài đường nhanh là 20 và đường chậm là 40, cả hai đều áp dụng độ dịch chuyển 0,9 và độ lệch chuẩn 5. Khi đường nhanh vượt qua đường chậm, một tín hiệu dài được tạo ra. Khi đường nhanh vượt dưới đường chậm, một tín hiệu ngắn được tạo ra.

Đồng thời, chiến lược kết hợp tín hiệu histogram của chỉ số MACD. Chỉ khi histogram MACD dương tính (tăng), tín hiệu dài là hợp lệ; chỉ khi histogram MACD âm tính (giảm), tín hiệu ngắn là hợp lệ.

Chiến lược cũng thiết lập các điều kiện lấy lợi nhuận và dừng lỗ. Lợi nhuận dài là 2 lần và lỗ dừng là 0,2 lần; Lợi nhuận ngắn là 0,05 lần và lỗ dừng là 1 lần.

Phân tích lợi thế

Chiến lược này kết hợp phán đoán xu hướng của đường trung bình động đôi và 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 sai và cải thiện độ chính xác của việc nhập.

Dữ liệu backtest được áp dụng từ năm 2017, bao gồm nhiều chu kỳ chuyển đổi tăng và giảm. Chiến lược vẫn hoạt động tốt qua các giai đoạn. Điều này chứng minh rằng chiến lược thích nghi với cả đặ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 có những rủi ro sau:

  1. Đường trung bình di chuyển đôi tự nó có tác dụng chậm trễ, có thể bỏ lỡ các cơ hội ngắn hạn
  2. Khi biểu đồ MACD bằng không, chiến lược sẽ không tạo ra tín hiệu
  3. Các tỷ lệ lấy lợi nhuận và dừng lỗ được đặt trước, có thể lệch khỏi thị trường thực tế

Giải pháp:

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

Hướng dẫn tối ưu hóa

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

  1. Cố gắng các loại khác nhau của trung bình động để tìm hiệu ứng làm mịn tốt hơn
  2. Tối ưu hóa các tham số của đường trung bình động và MACD để phù hợp với các sản phẩm và chu kỳ khác nhau
  3. Thêm các điều kiện bổ sung như thay đổi khối lượng giao dịch vào tín hiệu lọc
  4. Điều chỉnh tỷ lệ lấy lợi nhuận và dừng lỗ trong thời gian thực để thích nghi tốt hơn

Kết luận

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


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

Thêm nữa