
Chiến lược này chủ yếu bằng cách tính toán động lực EMA kép và động lực DEMA chéo của giá để xác định xu hướng và kết hợp với chỉ số biến động ATR để lọc các đột phá giả, thực hiện một chiến lược giao dịch định lượng với chỉ số động lực kép và lọc biến động.
Chiến lược này bao gồm:
Tính toán giá EMA và DEMA như một chỉ số động lực kép. Trong đó EMA có chu kỳ dài hơn phản ánh xu hướng dài hạn, DEMA là một chỉ số động lực ngắn hạn nhạy cảm hơn.
Tính toán chỉ số biến động ATR. Xác định biến động và tính thanh khoản của thị trường thông qua kích thước của ATR. Khi biến động quá lớn, hãy lọc tín hiệu của chỉ số biến động, tránh phá vỡ giả.
ATR dao động được đánh giá bằng phương tiện di chuyển tham số hóa. Khi ATR dao động thấp hơn phương tiện di chuyển, tín hiệu chỉ số động được phép kích hoạt.
Các tham số điều khiển chu kỳ thời gian ATR, độ dài ATR, loại và độ dài trung bình di chuyển ATR.
Thiết lập các quy tắc dừng lỗ, dừng lỗ và theo dõi dừng lỗ cho các vị trí đa đầu.
Chiến lược lọc EMA kép này có thể làm giảm đáng kể các tín hiệu giả và giao dịch thường xuyên trong chiến lược chết đuối EMA thông thường. Sau khi thêm chỉ số dao động ATR, có thể lọc hiệu quả các tín hiệu gây ra bởi các biến động nhỏ, tránh bị mắc kẹt.
So với chỉ số động lực đơn, chiến lược này sử dụng thiết kế hai chỉ số để cải thiện hiệu quả phán đoán. DEMA là chỉ số động lực ngắn hạn nhạy cảm hơn, kết hợp với EMA dài ổn định, tạo ra tín hiệu kết hợp đáng tin cậy hơn.
Bằng cách điều chỉnh tham số ATR, bạn có thể đặt các điều kiện dao động phù hợp cho các vật thể khác nhau, tăng khả năng áp dụng của chiến lược.
Rủi ro lớn nhất của chiến lược này là thiết lập tham số không đúng có thể dẫn đến tín hiệu giao dịch quá hiếm. Thiết lập độ dài DEMA và EMA quá dài hoặc thiết lập giới hạn biến động ATR quá cao có thể làm suy yếu hiệu quả hoạt động thực tế của chiến lược. Điều này cần được thử nghiệm nhiều lần để điều chỉnh thành sự kết hợp tham số tốt nhất.
Một rủi ro tiềm ẩn khác là trong một tình huống cực đoan, biến động giá có thể vượt quá giới hạn của tham số ATR, dẫn đến thua lỗ. Điều này đòi hỏi người ta phải theo dõi các trường hợp bất thường trên thị trường và tạm dừng chiến lược.
Kiểm tra các kết hợp các tham số khác nhau của chỉ số động lực để tìm tham số tốt nhất.
Cố gắng điều chỉnh chỉ số động lượng của hai EMA thành MACD hoặc các chỉ số khác.
Kiểm tra các thiết lập 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.
Tăng khả năng lọc khối lượng giao dịch, tránh nguy cơ giá không thực sự tăng.
Tối ưu hóa hệ thống dừng lỗ, làm cho lợi nhuận tốt hơn lợi nhuận.
Chiến lược này tích hợp các chỉ số động lực và phân tích tỷ lệ biến động, được thiết kế trên cơ sở lý thuyết vững chắc. Bằng cách điều chỉnh tham số và tối ưu hóa quy tắc, nó có thể trở thành một chiến lược giao dịch định lượng ổn định và đáng tin cậy.
/*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")