Xu hướng chéo EMA kép theo chiến lược với bộ lọc ATR và ADX

Tác giả:ChaoZhang, Ngày: 2023-11-15 15:53:57
Tags:

img

Tổng quan

Chiến lược này sử dụng hệ thống chéo EMA kép cổ điển để theo dõi xu hướng, với các bộ lọc bổ sung từ các chỉ số ATR và ADX, để theo dõi xu hướng mạnh và kiểm soát rủi ro trong quá trình hợp nhất.

Chiến lược logic

Chiến lược này chủ yếu dựa trên những điều sau:

  1. Sử dụng EMA 8 giai đoạn nhanh hơn và EMA 20 giai đoạn chậm hơn để tạo ra tín hiệu chéo.

  2. Chỉ số ATR phản ánh sự biến động gần đây. Việc bình thường hóa ATR cho phép điều chỉnh năng động các điều kiện lọc chéo EMA, giảm yêu cầu trong các xu hướng mạnh và tăng trong các lần hợp nhất để kiểm soát rủi ro.

  3. Chỉ số ADX xác định sức mạnh của xu hướng. Đánh giá ADX trên 30 cho thấy xu hướng mạnh mẽ, thúc đẩy dừng lỗ kịp thời.

  4. Kết hợp với xu hướng bò / gấu để xác định thời gian vào dài / ngắn. Đi dài trên thập giá vàng trong thị trường bò, và ngắn trên thập giá chết trong thị trường gấu.

  5. Bộ lọc khối lượng để nhập khi khối lượng mở rộng.

  6. Sử dụng chỉ số USD đơn giản để xác định sức mạnh của USD, mở rộng phạm vi dừng và lấy lợi nhuận trong USD mạnh.

  7. Sử dụng chỉ số SuperTrend để xác định hướng thị trường tổng thể cho các khoản hỗ trợ dài hạn / ngắn hạn bổ sung.

Chiến lược kết hợp các chỉ số xu hướng và dao động để điều chỉnh các tham số một cách năng động, theo dõi xu hướng trong khi kiểm soát rủi ro.

Ưu điểm của Chiến lược

  1. Hệ thống EMA kép cung cấp xác định xu hướng, với sự trơn tru của EMA lọc các sự phá vỡ sai.

  2. Các bộ lọc chuẩn ATR cho phép linh hoạt cho các môi trường thị trường khác nhau.

  3. ADX và khối lượng cung cấp các kiểm tra bổ sung để tránh các whipsaws trong quá trình hợp nhất.

  4. Xem xét USD và SuperTrend cải thiện độ chính xác quyết định về xu hướng vĩ mô.

  5. Quản lý rủi ro tự động điều chỉnh dựa trên sức mạnh USD.

  6. Các tín hiệu chéo vàng / chết đơn giản và logic dừng / lấy lợi nhuận làm cho nó dễ dàng thực hiện và kiểm tra lại.

Rủi ro của chiến lược

  1. EMA đôi chậm trong việc phát hiện các điểm chuyển hướng xu hướng.

  2. Chọn tham số ATR kém có thể quá hung hăng hoặc bảo thủ.

  3. Các thông số ADX cần tối ưu hóa, đặt điểm cao không đúng có thể bỏ lỡ xu hướng.

  4. Việc xác định xu hướng USD và SuperTrend có thể không chính xác.

  5. Dừng lỗ quá chặt sẽ làm tăng tổn thất, rủi ro quá rộng sẽ gây ra rủi ro.

Ý tưởng cải thiện

  1. Xem xét thêm các chỉ số như MACD để phát hiện điểm chuyển đổi tốt hơn.

  2. Tối ưu hóa các thông số ATR trên dữ liệu lịch sử hơn.

  3. Kiểm tra các thông số ADX khác nhau và tối ưu hóa ngưỡng điểm cao.

  4. Thêm nhiều biến cho USD và phân tích xu hướng thị trường.

  5. Tính toán tỷ lệ dừng lỗ tối ưu từ số liệu thống kê backtest.

  6. Thử nghiệm với các điểm dừng sau hoặc đèn chùm.

  7. Tiếp tục tối ưu hóa kích thước nhập khẩu và thời gian giữ.

Kết luận

Chiến lược này tích hợp hệ thống EMA kép cổ điển với nhiều chỉ số phụ trợ, sử dụng tối ưu hóa tham số cho một cách tiếp cận theo xu hướng khá mạnh mẽ. Nó thích nghi linh hoạt với môi trường thị trường thay đổi, theo dõi xu hướng trong khi kiểm soát rủi ro. Kiểm tra và tối ưu hóa thêm các điểm dừng và các tham số chỉ số sẽ cải thiện kết quả. Các khái niệm đáng để học hỏi và cải thiện.


/*backtest
start: 2023-10-15 00:00:00
end: 2023-11-14 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Refactored Advanced EMA Cross with Normalized ATR Filter, Controlling ADX", shorttitle="ALP V5", overlay=true)

// Initialize variables to track if a buy order has been placed and number of periods since the last buy
var bool hasBought = false
var int barCountSinceBuy = 0

// Define EMA periods
emaShort = ta.ema(close, 8)
emaLong = ta.ema(close, 20)

// Define ATR period and normalization
atrLength = 14
atrValue = ta.atr(atrLength)
maxHistoricalATR = ta.highest(atrValue, 20)
minHistoricalATR = ta.lowest(atrValue, 20)
normalizedATR = (atrValue - minHistoricalATR) / (maxHistoricalATR - minHistoricalATR)

// Define ADX parameters
adxValue = ta.rma(close, 14)
adxHighLevel = 30
isADXHigh = adxValue > adxHighLevel

// Initialize risk management variables
var float stopLossPercent = na
var float takeProfitPercent = na
var float trailingStop = na

// Calculate USD strength (simplified)
usd_strength = close / ta.ema(close, 50) - 1

// Adjust risk parameters based on USD strength
if (usd_strength > 0)
    stopLossPercent := 3
    takeProfitPercent := 6
else
    stopLossPercent := 4
    takeProfitPercent := 8

// Initialize position variable
var float positionPrice = na

// Volume filter
minVolume = ta.sma(volume, 14) * 1.5
isVolumeHigh = volume > minVolume



// Piyasa yönü için süper trend göstergesi
[supertrendValue, supertrendDirection] = ta.supertrend(4, 14)  // Use a factor of 3 and ATR period of 10
bool isBullMarket = supertrendDirection < 0
bool isBearMarket = supertrendDirection > 0

// Yükselen piyasa için alım koşulu
buyConditionBull = isBullMarket and ta.crossover(emaShort, emaLong) and normalizedATR > 0.2
// Düşen piyasa için alım koşulu
buyConditionBear = isBearMarket and ta.crossover(emaShort, emaLong) and normalizedATR > 0.5
// Genel alım koşulu
buyCondition = buyConditionBull or buyConditionBear

// Yükselen ve düşen piyasalar için farklı satış koşulları
sellConditionBull = isBullMarket and (ta.crossunder(emaShort, emaLong) or isADXHigh)
sellConditionBear = isBearMarket and (ta.crossunder(emaShort, emaLong) or isADXHigh)
// Genel satış koşulu
sellCondition = sellConditionBull or sellConditionBear


// Buy condition
if (buyCondition)
    strategy.entry("Buy", strategy.long)
    positionPrice := close
    hasBought := true // Set the flag to true when a buy order is placed
    barCountSinceBuy := 0 // Reset the bar counter when a buy order is placed

// Increase the bar counter if a buy has been executed
if (hasBought)
    barCountSinceBuy := barCountSinceBuy + 1

// Calculate stop-loss and take-profit levels
longStopLoss = positionPrice * (1 - stopLossPercent / 100)
longTakeProfit = positionPrice * (1 + takeProfitPercent / 100)


// Final Sell condition, now also checks if a buy has occurred before and if at least 5 periods have passed
finalSellCondition = sellCondition and hasBought and barCountSinceBuy >= 3 and isVolumeHigh

if (finalSellCondition)
    strategy.close("Buy")
    positionPrice := na
    hasBought := false // Reset the flag when a sell order is placed
    barCountSinceBuy := 0 // Reset the bar counter when a buy order is closed

// Implement stop-loss, take-profit, and trailing stop
strategy.exit("Stop Loss", "Buy", stop=longStopLoss)
strategy.exit("Take Profit", "Buy", limit=longTakeProfit)
//strategy.exit("Trailing Stop", "Buy", trail_price=close, trail_offset=trailingStop * close / 100)


var label l = na

if (buyCondition)
    l := label.new(bar_index, high, text="buy triggered " + str.tostring(usd_strength))
    label.delete(l[1])

if (finalSellCondition)
    l := label.new(bar_index, high, text="sell triggered " + str.tostring(usd_strength))
    label.delete(l[1])

// Plot signals
plotshape(series=buyCondition, title="Buy Signal", location=location.belowbar, color=color.green, style=shape.labelup, text="Buy")
plotshape(series=finalSellCondition, title="Sell Signal", location=location.abovebar, color=color.red, style=shape.labeldown, text="Sell")


Thêm nữa