Chiến lược theo dõi dao động chéo EMA kép

Tác giả:ChaoZhang, Ngày: 2024-01-03 11:38:51
Tags:

img

Tổng quan

Chiến lược theo dõi dao động chéo EMA kép là một chiến lược xác định xu hướng bằng cách sử dụng chỉ số EMA và theo dõi dao động trong điều kiện thị trường biến động. Chiến lược này kết hợp cả hai khái niệm theo dõi xu hướng và thu thập dao động. Nó nhằm mục đích đạt được lợi nhuận tốt hơn bằng cách thực hiện theo dõi dài hạn trong thời gian xu hướng mạnh và giao dịch ngắn hạn trong thời gian dao động.

Chiến lược logic

Chiến lược này sử dụng EMA 20 giai đoạn như một chỉ số để đánh giá xu hướng. Khi giá vượt qua EMA, nó báo hiệu xu hướng tăng, và khi giá vượt qua dưới, nó báo hiệu xu hướng giảm.

Khi giá vượt trên đường EMA, một vị trí dài được nhập bằng cách sử dụng giá cao nhất trong 20 giai đoạn trước đây như là lợi nhuận và mức thấp nhất kể từ khi vượt qua là dừng lỗ. Khi giá vượt dưới đường EMA, một vị trí ngắn được nhập bằng cách sử dụng giá thấp nhất trong 20 giai đoạn trước đây như là lợi nhuận và mức cao nhất kể từ khi vượt qua là dừng lỗ.

Đồng thời, chiến lược cũng kiểm tra xem ADX có trên 30 không. Các giao dịch chỉ được thực hiện khi xu hướng đủ mạnh, tức là khi ADX cao hơn 30.

Trong các giao dịch mở, việc dừng lại tiếp tục điều chỉnh dựa trên điều kiện thị trường để khóa thêm lợi nhuận.

Phân tích lợi thế

Chiến lược này kết hợp các lợi thế của cả việc theo dõi xu hướng và giao dịch dao động. Nó có thể tạo ra lợi nhuận cao hơn trong các thị trường xu hướng và lợi nhuận nhất quán hơn trong các dao động. Khả năng thích nghi mạnh mẽ.

Việc sử dụng EMA cũng giữ cho các tham số đơn giản, giảm rủi ro tối ưu hóa quá mức và đảm bảo sự ổn định.

Phân tích rủi ro

Rủi ro chính của chiến lược này là khả năng dừng lại thường xuyên hơn trong các dao động tăng cường. Đây là nơi ADX có vai trò. Bằng cách vô hiệu hóa giao dịch khi ADX thấp, bạn có thể tránh thua lỗ khi không có xu hướng rõ ràng.

Ngoài ra, việc đặt dừng lỗ đúng cũng là chìa khóa. Các điểm dừng quá rộng có thể làm tăng số lượng lỗ giao dịch duy nhất. Các điểm dừng quá chặt có thể quá nhạy cảm và làm tăng xác suất dừng. Cần phải tìm thấy sự cân bằng giữa mục tiêu lợi nhuận và rủi ro dừng lỗ.

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

Các tối ưu hóa có thể cho chiến lược này bao gồm:

  1. Kiểm tra nhiều thời gian EMA hơn để tìm ra sự kết hợp tối ưu.

  2. Tối ưu hóa các thông số ADX bao gồm thời gian ADX và các giá trị ngưỡng.

  3. Cải thiện các thuật toán lấy lợi nhuận và dừng lỗ, ví dụ như bằng cách giới thiệu dừng động.

  4. Kết hợp các chỉ số bổ sung như KDJ và MACD để tạo ra một hệ thống xác nhận đa chỉ số.

Tóm lại

Tóm lại, chiến lược theo dõi dao động chéo EMA kép là một chiến lược rất thực tế. Nó kết hợp các điểm mạnh của cả hai chiến lược giao dịch xu hướng và chiến lược dao động. Nó có thể được sử dụng cho cả theo dõi dài hạn và giao dịch ngắn hạn.


/*backtest
start: 2023-12-26 00:00:00
end: 2024-01-02 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
strategy("Linda Raschke's Holy Grail", shorttitle="RHG", default_qty_type = strategy.percent_of_equity, default_qty_value = 100, overlay = true)
adxlen = input(14, title="ADX period")
adxMin = input(30)
dilen = adxlen
f_highest(_src, _length)=>
    _adjusted_length = _length < 1 ? 1 : _length
    _value = _src
    for _i = 0 to (_adjusted_length-1)
        _value := _src[_i] >= _value ? _src[_i] : _value
    _return = _value

f_lowest(_src, _length)=>
    _adjusted_length = _length < 1 ? 1 : _length
    _value = _src
    for _i = 0 to (_adjusted_length-1)
        _value := _src[_i] <= _value ? _src[_i] : _value
    _return = _value

dirmov(len) =>
	up = change(high)
	down = -change(low)
	plusDM = na(up) ? na : (up > down and up > 0 ? up : 0)
    minusDM = na(down) ? na : (down > up and down > 0 ? down : 0)
	truerange = rma(tr, len)
	plus = fixnan(100 * rma(plusDM, len) / truerange)
	minus = fixnan(100 * rma(minusDM, len) / truerange)
	[plus, minus]

adx(dilen, adxlen) =>
	[plus, minus] = dirmov(dilen)
	sum = plus + minus
	adx = 100 * rma(abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen)

emaLength = input(20)
curEma = ema(close, emaLength)
highPeriod = input(20)
d = na

takeProfitLong = highest(high, highPeriod) 
stopLossLong = f_lowest(low, barssince(low >= curEma))

if strategy.position_size == 0
    if adx(dilen, adxlen) <= adxMin or high < curEma 
        strategy.cancel("Long")
    if adx(dilen, adxlen) > adxMin and low < curEma and high > curEma and curEma > curEma[highPeriod / 2] and curEma > curEma[highPeriod] and takeProfitLong > high
        strategy.order("Long", strategy.long, stop = high)
        strategy.exit("Exit", "Long", limit = takeProfitLong, stop = stopLossLong)
        d := high

takeProfitShort = lowest(low, highPeriod) 
stopLossShort = f_highest(high, barssince(high <= curEma))

if strategy.position_size == 0
    if adx(dilen, adxlen) <= adxMin or low > curEma 
        strategy.cancel("Short")
    if adx(dilen, adxlen) > adxMin and high > curEma and low < curEma and curEma < curEma[highPeriod / 2] and curEma < curEma[highPeriod] and takeProfitShort < low
        strategy.order("Short", strategy.short, stop = low)
        strategy.exit("Exit", "Short", limit = takeProfitShort, stop = stopLossShort)
        d := low


strategy.close("Exit")

plot(d == high ? stopLossLong : d == low ? stopLossShort : na, style = circles, linewidth = 4, color = red)
plot(d == high ? takeProfitLong : d == low ? takeProfitShort : na, style = circles, linewidth = 4, color = green)
plot(d, style = circles, linewidth = 4, color = yellow)
plot(curEma, color = black, linewidth = 2)  

// === Backtesting Dates ===
testPeriodSwitch = input(false, "Custom Backtesting Dates")
testStartYear = input(2018, "Backtest Start Year")
testStartMonth = input(3, "Backtest Start Month")
testStartDay = input(6, "Backtest Start Day")
testStartHour = input(08, "Backtest Start Hour")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,testStartHour,0)
testStopYear = input(2018, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(14, "Backtest Stop Day")
testStopHour = input(14, "Backtest Stop Hour")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,testStopHour,0)
testPeriod() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false
isPeriod = testPeriodSwitch == true ? testPeriod() : true
// === /END
if not isPeriod
    strategy.cancel_all()
    strategy.close_all()


Thêm nữa