Giao dịch định lượng dựa trên bao bì trung bình động và ATR Trailing Stop

Tác giả:ChaoZhang, Ngày: 2023-12-08 15:53:22
Tags:

img

Tổng quan

Chiến lược được đặt tên là MADEFlex, viết tắt của Chiến lược giao dịch định lượng linh hoạt dựa trên bao bì trung bình động và ATR Trailing Stop. Nó kết hợp chỉ số bao bì trung bình động và cơ chế dừng theo dõi ATR để thực hiện một giải pháp giao dịch định lượng linh hoạt và có thể kiểm soát được.

Nguyên tắc

MADE là một chỉ báo về giá cả của các loại sản phẩm. Cốt lõi của chiến lược này là chỉ báo Moving Average Displaced Envelope (MADE). MADE tạo thành các dải phía trên và phía dưới bằng cách nhân các nhân tố phần trăm với trung bình di chuyển theo cấp số nhân (EMA). Các tín hiệu bán được tạo ra khi giá phá vỡ trên dải phía trên và các tín hiệu mua được tạo ra khi giá phá vỡ dưới dải phía dưới. Chiến lược này kết hợp chỉ báo MADE với cơ chế dừng theo dõi Average True Range (ATR).

Cụ thể, chỉ số MADE chứa 3 tham số: Thời gian, tỷ lệ phần trăm trên perAb và tỷ lệ phần trăm dưới perBl. Các tham số Thời gian xác định thời gian của EMA. Khoảng cách giữa dải trên và dưới EMA được kiểm soát bởi các yếu tố phần trăm. Phần dừng lại sau ATR chủ yếu được đặt bởi thời gian ATR nATRPeriod và ATR nATRMultip. Khi giá vượt quá đường dừng lỗ của thanh trước, đường dừng lỗ được điều chỉnh theo giá trừ lỗ ATR cố định. Khi giá giảm xuống dưới đường dừng lỗ của thanh trước, đường dừng lỗ được điều chỉnh theo giá cộng với lỗ ATR cố định.

Cuối cùng, tín hiệu mua và bán được tạo ra bằng cách kết hợp các tín hiệu chỉ số MADE và điều kiện dừng kéo theo ATR. Giao dịch ngược có thể đạt được thông qua công tắc đầu vào ngược.

Phân tích lợi thế

Chiến lược MADEFlex có những lợi thế sau:

  1. Các tín hiệu kết hợp đáng tin cậy hơn và dừng mất mát. MADE tự nó có xu hướng tạo ra tín hiệu sai.

  2. Các thông số MADE và các thông số ATR có thể được điều chỉnh để kiểm soát số lượng và chất lượng tín hiệu.

  3. Hỗ trợ giao dịch ngược.

  4. Đánh giá hiệu ứng dừng trực quan thông qua các đường dừng được vẽ.

Phân tích rủi ro

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

  1. Các thông số MADE không chính xác có thể tạo ra tín hiệu sai quá mức. Các thông số thích hợp cần được kiểm tra cẩn thận.

  2. Việc dừng ATR quá lỏng lẻo có thể bỏ lỡ cơ hội dừng.

  3. Rủi ro cao hơn với giao dịch ngược. Đặc biệt trong các tình huống biến động cao, giao dịch ngược có thể làm tăng rủi ro mất mát. Cần sử dụng thận trọng.

  4. Trong điều kiện thị trường cực đoan, việc thiếu bảo vệ dừng lỗ có thể dẫn đến tổn thất cao hơn.

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

Chiến lược MADEFlex có thể được tối ưu hóa theo các hướng sau:

  1. Tối ưu hóa các tham số MADE để cải thiện chất lượng tín hiệu. Các kết hợp thời gian và tỷ lệ phần trăm khác nhau có thể được thử nghiệm để tìm các bộ tham số đáng tin cậy hơn.

  2. Tối ưu hóa các thông số dừng phía sau ATR để có hiệu quả dừng tốt hơn. Thời gian và số lần ATR có thể được thử nghiệm để xác định các kết hợp phù hợp hơn.

  3. Thêm các bộ lọc khác để giảm thêm tín hiệu sai, ví dụ: kết hợp các chỉ số biến động để lọc.

  4. Thêm cơ chế lấy lợi nhuận để thoát ra ở mức lợi nhuận nhất định. Điều này khóa lợi nhuận và kiểm soát rủi ro.

  5. Sử dụng các phương pháp học máy để tối ưu hóa các thông số một cách năng động, ví dụ như học tăng cường.

Kết luận

Chiến lược MADEFlex kết hợp thành công các tín hiệu giao dịch từ chỉ số Moving Average Envelope và phương pháp ATR trailing stop. Thông qua các thông số điều chỉnh, nó thực hiện một giải pháp giao dịch định lượng linh hoạt và có thể kiểm soát được. Chiến lược có độ tin cậy tương đối cao và khả năng kiểm soát mạnh mẽ. Nó phù hợp với người dùng có một số cơ sở định lượng để sử dụng và tối ưu hóa. Với các tối ưu hóa hơn nữa, có thể mong đợi hiệu suất chiến lược đáng kể hơn.


/*backtest
start: 2022-12-01 00:00:00
end: 2023-12-07 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
////////////////////////////////////////////////////////////
//  Copyright by HPotter v1.0 27/09/2022
// Moving Average Displaced Envelope. These envelopes are calculated 
// by multiplying percentage factors with their displaced expotential 
// moving average (EMA) core.
// How To Trade Using:
// Adjust the envelopes percentage factors to control the quantity and 
// quality of the signals. If a previous high goes above the envelope 
// a sell signal is generated. Conversely, if the previous low goes below 
// the envelope a buy signal is given.
//
// Average True Range Trailing Stops Strategy, by Sylvain Vervoort 
// The related article is copyrighted material from Stocks & Commodities Jun 2009 
//
// ATR TS used by filter for MADE signals.
//
// WARNING:
// - For purpose educate only
// - This script to change bars colors.
////////////////////////////////////////////////////////////
strategy(title='Moving Average Displaced Envelope & ATRTS', shorttitle='MADE+ATR', overlay=true)
tradeDirection = input.string('Both', title='Trade Direction', options=['Both', 'Long', 'Short'])
Price = input(title='Source', defval=close)
Period = input.int(defval=9, minval=1)
perAb = input.float(title='Percent above', defval=.5, minval=0.01, step=0.1)
perBl = input.float(title='Percent below', defval=.5, minval=0.01, step=0.1)
disp = input.int(title='Displacement', defval=13, minval=1)

nATRPeriod = input(15)
nATRMultip = input(2)
useATR = input(false, title='ATR Filter')
reverse = input(false, title='Trade reverse')

longAllowed = tradeDirection == 'Long' or tradeDirection == 'Both'
shortAllowed = tradeDirection == 'Short' or tradeDirection == 'Both'
pos = 0
sEMA = ta.ema(Price, Period)
top = sEMA[disp] * ((100 + perAb) / 100)
bott = sEMA[disp] * ((100 - perBl) / 100)

xATR = ta.atr(nATRPeriod)
xHHs =ta.sma(ta.highest(nATRPeriod), nATRPeriod)
xLLs =ta.sma(ta.lowest(nATRPeriod),nATRPeriod)
nSpread = (xHHs - xLLs) / 2
nLoss = nATRMultip * xATR
var xATRTrailingStop = 0.0
xATRTrailingStop := close > nz(xATRTrailingStop[1], 0) and close[1] > nz(xATRTrailingStop[1], 0) ? math.max(nz(xATRTrailingStop[1]), close - nLoss) :
     close < nz(xATRTrailingStop[1], 0) and close[1] < nz(xATRTrailingStop[1], 0) ? math.min(nz(xATRTrailingStop[1]), close + nLoss) : 
     close > nz(xATRTrailingStop[1], 0) ? close - nLoss : close + nLoss

ATRLong = close > xATRTrailingStop ? true : false
ATRShort = close < xATRTrailingStop ? true : false

iff_1 = close > top ? 1 : pos[1]
pos := close < bott ? -1 : iff_1
iff_2 = reverse and pos == -1 ? 1 : pos
possig = reverse and pos == 1 ? -1 : iff_2
clr = strategy.position_size
if possig == 1 
    if longAllowed and ATRLong
        strategy.entry('Long', strategy.long)
    else
        if ATRLong or strategy.position_size > 0
            strategy.close_all()
if possig == -1 
    if shortAllowed and ATRShort
        strategy.entry('Short', strategy.short)
    else    
        if ATRShort or strategy.position_size < 0
            strategy.close_all()
if possig == 0
    strategy.close_all()
    
plot(xATRTrailingStop[1], color=color.blue, title='ATR Trailing Stop')
barcolor(clr < 0 ? #b50404 : clr > 0 ? #079605 : #0536b3)



Thêm nữa