Chiến lược giao dịch thuật toán đột phá động lực kép và lọc biến động

Tác giả:ChaoZhang, Ngày: 2023-12-22 12:01:21
Tags:

img

Tổng quan

Chiến lược này chủ yếu sử dụng sự chéo chéo giữa động lực EMA và động lực DEMA để xác định xu hướng, và kết hợp chỉ số biến động ATR để lọc các sự đột phá sai, thực hiện một chiến lược giao dịch định lượng với các chỉ số động lực kép và lọc biến động.

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

Các thành phần chính của chiến lược này bao gồm:

  1. Tính toán EMA và DEMA của giá như các chỉ số động lực kép. EMA dài hơn phản ánh xu hướng dài hạn, trong khi DEMA phục vụ như một chỉ số động lực ngắn hạn nhạy cảm hơn. Một tín hiệu mua được tạo ra khi DEMA vượt qua trên EMA.

  2. Tính toán chỉ số biến động ATR. Sử dụng giá trị ATR để xác định biến động thị trường và điều kiện thanh khoản. lọc các tín hiệu chỉ số động lực khi biến động quá cao để tránh đột phá sai.

  3. Sự biến động của ATR được đánh giá là cao hoặc thấp bằng đường trung bình động được tham số hóa.

  4. Các thông số kiểm soát khung thời gian ATR, chiều dài ATR, loại và chiều dài trung bình động ATR v.v.

  5. Thiết lập các quy tắc dừng lỗ, lấy lợi nhuận và dừng lại cho các vị trí dài.

Phân tích lợi thế

Bộ lọc EMA kép có thể làm giảm đáng kể các tín hiệu sai và giao dịch quá mức so với các chiến lược chéo EMA cơ bản.

So với chỉ số động lượng duy nhất, thiết kế kép có thể cải thiện hiệu quả phán đoán. Là một chỉ số động lượng ngắn hạn đáp ứng nhanh hơn, DEMA kết hợp với EMA dài hạn ổn định tạo thành một tín hiệu combo đáng tin cậy.

Bằng cách điều chỉnh các thông số ATR, các ngưỡng biến động thích hợp có thể được thiết lập cho các dấu hiệu khác nhau, cải thiện khả năng thích nghi chiến lược.

Phân tích rủi ro

Rủi ro lớn nhất là cài đặt tham số không đúng có thể dẫn đến quá ít tín hiệu giao dịch. DEMA quá dài và chiều dài EMA, hoặc ngưỡng biến động ATR đặt quá cao, tất cả đều có thể làm suy yếu hiệu suất chiến lược thực tế.

Một rủi ro tiềm năng khác là trong điều kiện thị trường cực đoan, biến động giá có thể vi phạm các hạn chế tham số ATR dẫn đến tổn thất.

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

  1. Kiểm tra các kết hợp tham số chỉ số động lực khác nhau để tìm các cài đặt tối ưu.

  2. Hãy thử thay thế các chỉ số động lực từ EMA kép bằng MACD hoặc các chỉ số khác.

  3. Kiểm tra các cấu hình chỉ số biến động khác nhau, chẳng hạn như ATR lịch sử tổng thể, chỉ số biến động thị trường v.v.

  4. Thêm lọc khối lượng để tránh rủi ro từ sự đột phá giá sai.

  5. Tối ưu hóa các cơ chế dừng lỗ và lấy lợi nhuận để cải thiện tỷ lệ rủi ro-lợi nhuận.

Kết luận

Chiến lược này tích hợp phân tích động lực và nghiên cứu biến động với cơ sở lý thuyết vững chắc. Thông qua điều chỉnh tham số và tối ưu hóa logic, nó có thể trở thành một hệ thống giao dịch thuật toán ổn định và đáng tin cậy. Với các tín hiệu giao dịch rõ ràng và rủi ro có thể kiểm soát được, nó đáng để xác minh và thực hiện trong giao dịch trực tiếp.


/*backtest
start: 2023-11-21 00:00:00
end: 2023-12-21 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/
// © Qorbanjf

//@version=4
strategy("ORIGIN DEMA/EMA & VOL LONG ONLY", shorttitle="ORIGIN DEMA/EMA & VOL LONG", overlay=true)

// DEMA
length = input(10, minval=1, title="DEMA LENGTH")
src = input(close, title="Source")
e1 = ema(src, length)
e2 = ema(e1, length)
dema1 = 2 * e1 - e2
plot(dema1, "DEMA", color=color.yellow)

//EMA
len = input(25, minval=1, title="EMA Length")
srb = input(close, title="Source")
offset = input(title="Offset", type=input.integer, defval=0, minval=-500, maxval=500)
ema1 = ema(srb, len)
plot(ema1, title="EMA", color=color.blue, offset=offset)


// Inputs
atrTimeFrame = input("D", title="ATR Timeframe", type=input.resolution)
atrLookback = input(defval=14,title="ATR Lookback Period",type=input.integer)
useMA = input(title = "Show Moving Average?", type = input.bool, defval = true)
maType = input(defval="EMA", options=["EMA", "SMA"], title = "Moving Average Type")
maLength = input(defval = 20, title = "Moving Average Period", minval = 1)
//longLossPerc = input(title="Long Stop Loss (%)",
    // type=input.float, minval=0.0, step=0.1, defval=1) * 0.01
longTrailPerc = input(title="Trail stop loss (%)",
     type=input.float, minval=0.0, step=0.1, defval=50) * 0.01
longProfitPerc = input(title="Long Take Profit (%)",
     type=input.float, minval=0.0, step=0.1, defval=3000) / 100

// === INPUT BACKTEST RANGE ===
FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2017, title = "From Year", minval = 2000)
ToMonth   = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 9999, title = "To Year", minval = 2017)


// ATR Logic // atrValue = atr(atrLookback) // atrp = (atrValue/close)*100 // plot(atrp, color=color.white, linewidth=2, transp = 30)

atrValue = security(syminfo.tickerid, atrTimeFrame, atr(atrLookback))
atrp = (atrValue/close)*100

// Moving Average Logic
ma(maType, src, length) =>
    maType == "EMA" ? ema(src, length) : sma(src, length) //Ternary Operator (if maType equals EMA, then do ema calc, else do sma calc)
maFilter = security(syminfo.tickerid, atrTimeFrame, ma(maType, atrp, maLength))

// variables for enter position
enterLong = crossover(dema1, ema1) and atrp < maFilter

// variables for exit position
sale = crossunder(dema1, ema1)

// stop loss
//longStopPrice  = strategy.position_avg_price * (1 - longLossPerc)

// trail stop
// Determine trail stop loss prices
longStopTrail = 0.0

longStopTrail := if (strategy.position_size > 0)
    stopValue = close * (1 - longTrailPerc)
    max(stopValue, longStopTrail[1])
else
    0
//Take profit Percentage
longExitPrice  = strategy.position_avg_price * (1 + longProfitPerc)

//Enter trades when conditions are met
strategy.entry(id="long",
 long=strategy.long,
 when=enterLong,
 comment="long")

//
strategy.close("long", when = sale, comment = "Sell")
//place exit orders (only executed after trades are active)

strategy.exit(id="sell",
 limit = longExitPrice,
 stop = longStopTrail,
 comment = "SL/TP")



Thêm nữa