ADX Chiến lược theo dõi xu hướng thông minh

Tác giả:ChaoZhang, Ngày: 2023-11-28 14:04:00
Tags:

img

Tổng quan

Chiến lược theo dõi xu hướng thông minh ADX sử dụng chỉ số hướng trung bình (ADX) để đánh giá sức mạnh của xu hướng và nắm bắt xu hướng khi chúng yếu và theo xu hướng mạnh để kiếm lợi nhuận.

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

Cốt lõi của chiến lược này chủ yếu dựa trên chỉ số hướng trung bình (ADX) để đánh giá sức mạnh xu hướng hiện tại. ADX tính toán giá trị trung bình của chỉ số hướng biến động giá trong một khoảng thời gian nhất định để đại diện cho sức mạnh của xu hướng. Khi giá trị ADX dưới ngưỡng đã thiết lập, chúng tôi tin rằng thị trường đang củng cố. Tại thời điểm này, phạm vi hộp được xác định. Nếu giá vượt qua các đường ray trên và dưới của hộp, một tín hiệu giao dịch được tạo ra.

Cụ thể, chiến lược đầu tiên tính toán giá trị ADX 14 chu kỳ. Khi nó thấp hơn 18, nó được coi là xu hướng yếu hơn. Sau đó nó tính toán phạm vi của hộp được hình thành bởi giá cao nhất và thấp nhất của 20 đường K gần đây nhất. Khi giá vượt qua hộp này, các tín hiệu mua và bán được tạo ra. Khoảng cách dừng lỗ là 50% kích thước hộp, và khoảng cách lấy lợi nhuận là 100% kích thước hộp.

Chiến lược này kết hợp đánh giá sức mạnh xu hướng và tín hiệu đột phá để nắm bắt xu hướng khi chúng yếu hơn và tham gia hợp nhất, tránh giao dịch thường xuyên trên thị trường hỗn loạn.

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

  1. Kết hợp đánh giá sức mạnh xu hướng có thể tránh giao dịch thường xuyên trong thị trường rối loạn.
  2. Bước đột phá của hộp tăng độ lọc để tránh bị mắc kẹt trong thị trường biến động.
  3. Trong các thị trường xu hướng, mục tiêu lợi nhuận cao hơn có thể được đạt được.
  4. Các thông số ADX có thể tùy chỉnh, các thông số hộp, hệ số dừng lỗ, vv để thích nghi với các loại khác nhau.

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

  1. Cài đặt tham số ADX không chính xác có thể bỏ lỡ xu hướng hoặc đưa ra phán đoán sai.
  2. Phạm vi hộp quá lớn hoặc nhỏ có thể ảnh hưởng đến kết quả.
  3. Các hệ số stop loss và take profit không phù hợp có thể gây ra stop loss không đủ hoặc profit taking quá sớm.

Các thông số như ADX, phạm vi hộp, hệ số stop loss có thể được tối ưu hóa để làm cho nó phù hợp hơn với các sản phẩm và môi trường thị trường khác nhau.

Hướng dẫn tối ưu hóa chiến lược

  1. Các thông số ADX có thể kiểm tra kết quả của các chu kỳ khác nhau.
  2. Các thông số hộp có thể thử nghiệm chiều dài khác nhau để xác định kích thước phạm vi tối ưu.
  3. Điều chỉnh stop loss và lấy tỷ lệ lợi nhuận để tối ưu hóa tỷ lệ rủi ro - lợi nhuận.
  4. Kiểm tra tác động của giao dịch dài/ngắn đơn phương.
  5. Thêm các chỉ số khác cho các combo, như chỉ số khối lượng.

Tóm lại

Chiến lược theo dõi xu hướng thông minh ADX nói chung là một chiến lược theo dõi xu hướng tương đối ổn định. Nó kết hợp đánh giá sức mạnh xu hướng và tín hiệu đột phá giá để tránh các vấn đề như theo đuổi mức cao và giết chết mức thấp phổ biến trong các chiến lược theo xu hướng điển hình. Thông qua tối ưu hóa tham số và quản lý tiền chặt chẽ, chiến lược có thể kiếm lợi nhuận ổn định.


/*backtest
start: 2023-11-20 00:00:00
end: 2023-11-27 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Developer: Andrew Palladino. 
//Creator: Rob Booker.
//Date: 9/29/2017
//@version=5
//Date: 08/10/2022
//Updated to V5 from V1, default cash settings added and indicators made more easily visible by:
// @ Powerscooter

strategy("Rob Booker - ADX Breakout", shorttitle="ADX Breakout V5", overlay=true, default_qty_type = strategy.cash, default_qty_value = 100000, initial_capital = 100000)

adxSmoothPeriod = input(14, title="ADX Smoothing Period", group = "ADX Settings")
adxPeriod = input(14, title="ADX Period", group = "ADX Settings")
adxLowerLevel = input(18, title="ADX Lower Level", group = "ADX Settings")
boxLookBack = input(20, title="BreakoutBox Lookback Period", group = "BreakoutBox")
profitTargetMultiple = input(1.0, title="Profit Target Box Width Multiple", group = "Take Profit and Stop Loss")
stopLossMultiple = input(0.5, title="Stop Loss Box Width Multiple", group = "Take Profit and Stop Loss")
enableDirection = input(0, title="Both(0), Long(1), Short(-1)", group = "Trade Direction")


// When the ADX drops below threshold limit, then we consider the pair in consolidation. 
// Set Box around highs and lows of the last 20 candles. with upper and lower boundaries. 
// When price breaks outside of box, a trade is taken. (on close or on touch?)
// Stop is placed, default 50%, of the size of the box. So if box is 200 pips, stop is at 100 pips. 
// Profit target is 100% of the size of the box. Default. User can set a profit target of 0.5, 1 full size, 2 or 3. 


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

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

adxHigh(dilen, adxlen) => 
	[plus, minus] = dirmov(dilen)
	plus
	
adxLow(dilen, adxlen) => 
	[plus, minus] = dirmov(dilen)
	minus
	
sig = adx(adxSmoothPeriod, adxPeriod)
//sigHigh = adxHigh(dilen, adxlen)
//sigLow = adxLow(dilen, adxlen)

isADXLow = sig < adxLowerLevel

//boxUpperLevel = ta.highest(high, boxLookBack)[1]
//boxLowerLevel = ta.lowest(low, boxLookBack)[1]

var float boxUpperLevelCarry = 0
var float boxLowerLevelCarry = 0

boxUpperLevel = strategy.position_size == 0 ? ta.highest(high, boxLookBack)[1] : boxUpperLevelCarry
boxUpperLevelCarry := boxUpperLevel
boxLowerLevel = strategy.position_size == 0 ? ta.lowest(low, boxLookBack)[1] : boxLowerLevelCarry
boxLowerLevelCarry := boxLowerLevel

boxWidth = boxUpperLevel - boxLowerLevel

profitTarget = strategy.position_size > 0  ? strategy.position_avg_price + profitTargetMultiple*boxWidth : strategy.position_size < 0 ?  strategy.position_avg_price - profitTargetMultiple*boxWidth : na
stopLoss = strategy.position_size > 0 ? strategy.position_avg_price - stopLossMultiple*boxWidth : strategy.position_size < 0 ? strategy.position_avg_price + stopLossMultiple*boxWidth : na

plot(strategy.position_size == 0 ? boxUpperLevel : na, color=color.white, style = plot.style_linebr)
plot(strategy.position_size == 0 ? boxLowerLevel : na, color=color.white, style = plot.style_linebr)


bgcolor(isADXLow ? color.purple : na, transp=72, title = "ADX limit")
plot(stopLoss, color=color.red, linewidth=2, style = plot.style_linebr, title="StopLossLine")
plot(profitTarget, color=color.blue, linewidth=2, style = plot.style_linebr, title="ProfitTargetLine")

isBuyValid = strategy.position_size == 0 and ta.cross(close, boxUpperLevel) and isADXLow

//Long Entry Condition
strategy.exit("close_long", from_entry="open_long", limit = profitTarget, stop = stopLoss)
if isBuyValid and strategy.opentrades == 0 and (enableDirection == -1 or enableDirection == 0)
    strategy.entry("open_long", strategy.long)

isSellValid = strategy.position_size == 0 and ta.cross(close, boxLowerLevel) and isADXLow

//Short Entry condition
strategy.exit(id="close_short", from_entry="open_short", limit = profitTarget, stop = stopLoss)
if isSellValid and strategy.opentrades == 0 and (enableDirection == 1 or enableDirection == 0)
    strategy.entry("open_short", strategy.short)

Thêm nữa