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


Ngày tạo: 2023-11-28 14:04:00 sửa đổi lần cuối: 2023-11-28 14:04:00
sao chép: 0 Số nhấp chuột: 884
1
tập trung vào
1617
Người theo dõi

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

Tổng quan

Chiến lược theo dõi xu hướng thông minh của ADX sử dụng chỉ số xu hướng trung bình (ADX) để đánh giá sức mạnh của xu hướng, bắt xu hướng khi xu hướng yếu, theo dõi lợi nhuận trong xu hướng mạnh. Chiến lược này đánh giá sức mạnh của xu hướng đồng thời kết hợp với đột phá giá để tạo ra tín hiệu giao dịch, thuộc loại chiến lược theo dõi xu hướng.

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

Chiến lược này chủ yếu dựa trên chỉ số xu hướng trung bình (ADX) để đánh giá sức mạnh của xu hướng hiện tại. ADX thể hiện sức mạnh của xu hướng bằng cách tính toán giá trị trung bình của DIRECTIONAL INDICATOR về biến động giá trong một chu kỳ nhất định.

Cụ thể, chiến lược đầu tiên tính ADX của 14 chu kỳ, khi nó thấp hơn 18, nó cho rằng xu hướng yếu. Sau đó tính phạm vi khung hình của giá cao nhất và giá thấp nhất trong 20 đường K. Khi giá phá vỡ khung, nó tạo ra tín hiệu mua và bán. Khoảng cách dừng là 50% kích thước khung, và khoảng cách dừng là 100% kích thước khung.

Chiến lược này kết hợp cả phán đoán về sức mạnh của xu hướng và tín hiệu phá vỡ, có thể bắt được khi xu hướng yếu và vào biên soạn, tránh giao dịch thường xuyên trong tình huống không có trật tự. Trong khi có xu hướng mạnh, phạm vi dừng lại lớn hơn, có thể thu được nhiều lợi nhuận hơn.

Lợi thế chiến lược

  1. Trong khi đó, các nhà đầu tư có thể sử dụng các phương pháp khác nhau để tạo ra các giao dịch, bao gồm các giao dịch theo xu hướng.
  2. Bước qua khung hình đã thêm một bộ lọc để tránh bị mắc kẹt trong một cơn động đất.
  3. Trong một xu hướng, bạn có thể có được một khoảng trống lớn hơn để dừng lại.
  4. Có thể tùy chỉnh tham số ADX, tham số khung, hệ số dừng lỗ, v.v., phù hợp với các giống khác nhau.

Rủi ro chiến lược

  1. Thiết lập tham số ADX không chính xác có thể bỏ lỡ xu hướng hoặc phán đoán sai.
  2. Các khung hình quá lớn hoặc quá nhỏ có thể ảnh hưởng đến hiệu quả.
  3. Tỷ lệ dừng hỏng không đúng có thể gây ra quá ít hỏng hoặc dừng quá sớm.

Có thể tối ưu hóa bằng cách điều chỉnh tham số ADX, tham số khung, hệ số dừng lỗ, v.v. để phù hợp hơn với các giống và môi trường thương mại khác nhau. Ngoài ra, quản lý tài chính nghiêm ngặt cũng rất quan trọng, kiểm soát tỷ lệ dừng lỗ đơn để tránh tổn thất lớn.

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

  1. Các tham số ADX có thể kiểm tra hiệu ứng chu kỳ khác nhau.
  2. Các tham số khung vuông có thể được thử nghiệm với các độ dài khác nhau để xác định kích thước phạm vi tối ưu.
  3. Hệ số dừng lỗ có thể được điều chỉnh để tối ưu hóa tỷ lệ lợi nhuận rủi ro.
  4. Bạn có thể thử nghiệm hiệu quả của giao dịch đơn phương chỉ với nhiều hoặc chỉ với không.
  5. Có thể kết hợp với các chỉ số khác, chẳng hạn như chỉ số năng lượng gia tăng.

Tóm tắt

Chiến lược theo dõi xu hướng thông minh của ADX nói chung là một chiến lược xu hướng ổn định hơn. Nó kết hợp cả phán đoán về sức mạnh của xu hướng và tín hiệu phá vỡ giá, tránh một phần vấn đề theo dõi xu hướng thông thường. Bằng cách tối ưu hóa tham số và quản lý quỹ nghiêm ngặt, chiến lược này có thể mang lại lợi nhuận ổn định.

Mã nguồn chiến lược
/*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)