
Chiến lược theo dõi xung đột hai EMA Gold Cross là một chiến lược sử dụng chỉ số EMA để xác định xu hướng và theo dõi trong thời gian xung đột. Chiến lược này kết hợp các phương pháp theo dõi xu hướng và bắt xung đột, theo dõi đường dài trong thời gian mạnh mẽ và giao dịch đường ngắn trong thời gian xung đột để có được lợi nhuận tốt hơn.
Chiến lược này sử dụng 20 chu kỳ EMA như một chỉ số để đánh giá xu hướng. Khi giá vượt qua EMA, thị trường được coi là bắt đầu tăng; khi giá vượt qua EMA, thị trường được coi là bắt đầu giảm.
Khi giá trên EMA, với giá cao nhất của 20 chu kỳ cao nhất là điểm dừng, với giá thấp nhất của EMA sau khi giá trên EMA là điểm dừng lỗ, làm nhiều vào; khi giá dưới EMA, với giá thấp nhất của 20 chu kỳ thấp nhất là điểm dừng, với giá cao nhất của EMA sau khi giá dưới EMA là điểm dừng lỗ, làm trống vào.
Trong khi đó, các chiến lược cũng sẽ đánh giá xem ADX có lớn hơn 30 không. Chỉ khi xu hướng đủ rõ ràng, tức là ADX cao hơn 30, thì giao dịch sẽ được thực hiện. Điều này có thể tránh bị dừng lỗ trong tình huống chấn động.
Trong quá trình giữ vị trí, trail stop sẽ được điều chỉnh theo tình hình thị trường thực tế để khóa nhiều lợi nhuận hơn.
Chiến lược này kết hợp lợi thế của việc theo dõi xu hướng và giao dịch xung đột, có thể kiếm được lợi nhuận cao hơn trong các tình huống xu hướng và có thể thu được lợi nhuận ổn định hơn trong các tình huống xung đột, có khả năng thích ứng mạnh mẽ.
Việc sử dụng EMA cũng làm cho các tham số của chiến lược ít hơn, giảm nguy cơ tối ưu hóa quá mức, do đó đảm bảo sự ổn định của chiến lược.
Rủi ro chính của chiến lược này là có thể có nhiều lỗ dừng khi xung đột tăng lên. Tại thời điểm này, tác dụng của ADX được thể hiện. Khi giá trị ADX thấp, giao dịch sẽ bị đóng cửa để tránh thua lỗ khi không có xu hướng rõ ràng.
Ngoài ra, thiết lập điểm dừng hợp lý cũng là chìa khóa. Thiết lập điểm dừng quá lớn có thể làm tăng tổn thất đơn lẻ; thiết lập điểm dừng quá nhỏ có thể quá nhạy cảm, làm tăng xác suất dừng.
Chiến lược này có thể được tối ưu hóa theo các khía cạnh sau:
Lựa chọn chu kỳ EMA. Bạn có thể thử nghiệm nhiều tham số chu kỳ EMA hơn để tìm ra sự kết hợp tham số tốt nhất.
Các tham số của ADX có thể được tối ưu hóa. Chu kỳ ADX và ADX có thể thử các thiết lập khác nhau.
Thuật toán Stop Loss có thể được cải thiện, chẳng hạn như giới thiệu Stop Loss động.
Có thể xem xét kết hợp với các chỉ số khác, chẳng hạn như KDJ, MACD, v.v., để tạo ra chiến lược xác thực đa chỉ số.
Chiến lược theo dõi xung đột chéo vàng EMA đôi nói chung là một chiến lược rất thực tế. Nó kết hợp các đặc điểm của chiến lược xu hướng và chiến lược xung đột, có thể được sử dụng cho theo dõi đường dài hoặc giao dịch đường ngắ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()