Đây là một hệ thống theo dõi xu hướng cổ điển. Nó sử dụng đường chéo trung bình động để xác định hướng xu hướng và đi vào khi giá vượt ra khỏi kênh Donchian. Các thông số kênh Donchian được đặt thành 50 ngày để lọc tiếng ồn thị trường ngắn hạn.
Chiến lược này chủ yếu dựa trên các điểm sau:
Đường trung bình động theo cấp số nhân 40 ngày và 120 ngày được sử dụng để xây dựng một chỉ số xác định xu hướng. Khi đường nhanh vượt qua trên đường chậm từ dưới, đó là một tín hiệu chéo vàng, cho thấy xu hướng tăng. Khi đường nhanh vượt qua dưới đường chậm từ trên, đó là một tín hiệu chéo chết, cho thấy xu hướng giảm.
Các tham số kênh Donchian được thiết lập là 50 ngày để lọc ra tiếng ồn thị trường. Đi dài chỉ khi giá vượt qua dải trên, và đi ngắn chỉ khi giá vượt ra dưới dải dưới để tránh bị mắc kẹt.
Stop loss được thiết lập ở mức 4 lần dưới giá ATR. ATR có thể đo lường hiệu quả sự biến động và rủi ro của thị trường.
Các đường trung bình di chuyển theo hàm số phù hợp hơn với xu hướng giá hiện tại, trong khi các đường trung bình di chuyển đơn giản quá mượt mà.
Thời gian kênh 50 ngày hoạt động tốt với đường trung bình động 40 ngày và 120 ngày để lọc hiệu quả các sự đột phá sai.
Những lợi thế của chiến lược này bao gồm:
Sự kết hợp trung bình động có thể xác định hiệu quả hướng xu hướng thị trường. MA 40 ngày nắm bắt xu hướng ngắn hạn trong khi MA 120 ngày đánh giá xu hướng dài hạn.
Kênh Donchian lọc ra tiếng ồn và tránh theo đuổi đỉnh và đáy. Chỉ tham gia vào các khe hở kênh có hiệu quả tránh giao dịch các khu vực hợp nhất ở giữa.
Việc thiết lập stop loss là hợp lý để kiểm soát lỗ trên các giao dịch riêng lẻ và tránh việc bùng nổ tài khoản. Kiểm soát lỗ giao dịch duy nhất đảm bảo bền vững lợi nhuận.
Các đường trung bình động theo hàm số phù hợp hơn với xu hướng thay đổi giá, cho phép thời gian nắm giữ dài hơn phù hợp với ý tưởng giao dịch xu hướng.
Các thông số trung bình động đạt được sự cân bằng giữa độ nhạy của việc nắm bắt xu hướng và sự ổn định của bộ lọc tiếng ồn.
Những rủi ro của chiến lược này bao gồm:
Rủi ro thời gian nắm giữ dài: Là một chiến lược theo xu hướng, tổn thất lớn có thể xảy ra trong khoảng cách bên kéo dài hoặc đảo ngược xu hướng.
Nguy cơ phá vỡ sai: Có thể có một số tỷ lệ phá vỡ sai khi giá chạm gần các dải kênh, gây ra các giao dịch không cần thiết.
Các tham số thiết lập rủi ro: Các thiết lập cho các đường trung bình và kênh di chuyển là chủ quan. Các thị trường khác nhau cần phải điều chỉnh kết hợp, nếu không sự ổn định của hệ thống bị ảnh hưởng.
Rủi ro dừng lỗ quá chặt: Thiết lập dừng lỗ quá chặt có thể dẫn đến quá nhiều dừng lỗ, ảnh hưởng đến lợi nhuận.
Giải pháp:
Chiến lược có thể được tối ưu hóa trong các khía cạnh sau:
Kiểm tra các kết hợp trung bình động khác nhau để tìm các thông số tối ưu.
Tối ưu hóa thời gian kênh và cài đặt để làm cho tín hiệu đột phá hiệu quả hơn.
Tối ưu hóa chiến lược dừng lỗ. Chấp nhận dừng lại trong thời gian xu hướng và dừng cố định sau khi xu hướng kết thúc.
Thêm các chỉ số xác nhận như MACD, KD để cải thiện độ chính xác tín hiệu.
Giới thiệu các chiến lược kích thước vị trí. Kim tự tháp trong thời gian xu hướng để tối ưu hóa lợi nhuận.
Chọn các kết hợp tham số theo các đặc điểm sản phẩm khác nhau để làm cho hệ thống mạnh mẽ hơn.
Nói chung, đây là một hệ thống theo xu hướng điển hình và đơn giản. Cốt lõi nằm trong việc sử dụng đường trung bình động và các kênh đột phá. Chiến lược dừng lỗ cũng là cổ điển và thực tế. Chiến lược có thể hoạt động như một khuôn khổ cơ bản cho phát triển hệ thống lượng tử, và cũng có thể được triển khai trực tiếp để có lợi nhuận tương đối ổn định. Tăng cường hơn nữa thông qua thử nghiệm có thể cải thiện sự ổn định và lợi nhuận của hệ thống. Tóm lại, chiến lược có tính dễ sử dụng và linh hoạt, làm cho nó phù hợp như một chiến lược giao dịch định lượng cơ bản.
/*backtest start: 2023-10-15 00:00:00 end: 2023-11-14 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © Robrecht99 //@version=5 strategy("Long Term Trend Following System", overlay=true, margin_long=0, margin_short=0, pyramiding=4) // Backtest Range // Start = input(defval = timestamp("01 Jan 2017 00:00 +0000"), title = "Backtest Start Date", group = "backtest window") Finish = input(defval = timestamp("01 Jan 2100 00:00 +0000"), title = "Backtest End Date", group = "backtest window") //Moving Averages // len1 = input.int(40, minval=1, title="Length Fast EMA", group="Moving Average Inputs") len2 = input.int(120, minval=1, title="Length Slow EMA", group="Moving Average Inputs") src1 = input(close, title="Source Fast MA") src2 = input(close, title="Source Slow MA") maFast = input.color(color.new(color.red, 0), title = "Color Fast EMA", group = "Moving Average Inputs", inline = "maFast") maSlow = input.color(color.new(color.blue, 0), title = "Color Slow EMA", group = "Moving Average Inputs", inline = "maSlow") fast = ta.ema(src1, len1) slow = ta.ema(src2, len2) plot(fast, color=maFast, title="Fast EMA") plot(slow, color=maSlow, title="Slow EMA") // Donchian Channels // Length1 = input.int(title="Length Upper Channel", defval=50, minval=1, group="Donchian Channels Inputs") Length2 = input.int(title="Length Lower Channel", defval=50, minval=1, group="Donchian Channels Inputs") h1 = ta.highest(high[1], Length1) l1 = ta.lowest(low[1], Length2) fillColor = input.color(color.new(color.purple, 95), title = "Fill Color", group = "Donchian Channels Inputs") upperColor = input.color(color.new(color.orange, 0), title = " Color Upper Channel", group = "Donchian Channels Inputs", inline = "upper") lowerColor = input.color(color.new(color.orange, 0), title = " Color Lower Channel", group = "Donchian Channels Inputs", inline = "lower") u = plot(h1, "Upper", color=upperColor) l = plot(l1, "Lower", color=upperColor) fill(u, l, color=fillColor) strategy.initial_capital = 50000 //ATR and Position Size // length = input.int(title="ATR Period", defval=14, minval=1, group="ATR Inputs") risk = input(title="Risk Per Trade", defval=0.01, group="ATR Inputs") multiplier = input(title="ATR Multiplier", defval=2, group="ATR Inputs") atr = ta.atr(length) amount = (risk * strategy.initial_capital / (multiplier * atr)) // Buy and Sell Conditions // entrycondition1 = ta.crossover(fast, slow) entrycondition2 = fast > slow sellcondition1 = ta.crossunder(fast, slow) sellcondition2 = slow > fast // Buy and Sell Signals // if (close > h1 and entrycondition2) strategy.entry("long", strategy.long, qty=amount) stoploss = close - atr * 4 strategy.exit("exit sl", stop=stoploss, trail_offset=stoploss) if (sellcondition1 and sellcondition2) strategy.close(id="long") if (close < l1 and sellcondition2) strategy.entry("short", strategy.short, qty=amount) stoploss = close + atr * 4 strategy.exit("exit sl", stop=stoploss, trail_offset=stoploss) if (entrycondition1 and entrycondition2) strategy.close(id="short")