
Chiến lược xu hướng chéo hai đường là một chiến lược giao dịch dựa trên đường trung bình di chuyển. Nó sử dụng chéo đường nhanh EMA và đường chậm SMA làm tín hiệu mua và bán, và kết hợp với sự lệch của chỉ số MACD để lọc tín hiệu. Chiến lược này cùng lúc xem xét nhiều yếu tố như giá cả, xu hướng và động lực, tạo thành một hệ thống giao dịch tương đối hoàn chỉnh.
Chiến lược này sử dụng hai đường trung bình di chuyển EMA và SMA. Trong đó EMA dài 200 ngày và SMA dài 100 ngày. Khi giá tăng vượt qua hai đường trung bình, nó tạo ra tín hiệu mua; Khi giá giảm vượt qua hai đường trung bình, nó tạo ra tín hiệu bán.
Để tăng thêm độ tin cậy của tín hiệu, chiến lược cũng giới thiệu chỉ số MACD. Khi giá phá vỡ EMA và SMA tạo ra tín hiệu, cần đường nhanh của MACD từ bên dưới phá vỡ đường chậm và MACD hình trụ nằm trên trục 0 để kích hoạt tín hiệu mua thực sự. Ngược lại, đường nhanh của MACD từ trên phá vỡ đường chậm và MACD hình trụ nằm dưới trục 0 để kích hoạt tín hiệu bán thực sự.
Ngoài ra, chiến lược cũng thiết lập dừng lỗ và chặn. Sau khi chiến lược mở vị trí, nó sẽ tính toán và thiết lập điểm dừng lỗ và chặn dựa trên tỷ lệ mà người dùng đã thiết lập. Điều này có thể kiểm soát hiệu quả rủi ro của một giao dịch.
Nhìn chung, chiến lược tổng hợp xem xét nhiều chỉ số, đặt ra các điều kiện lọc nghiêm ngặt cho tín hiệu mua và bán và quản lý rủi ro bằng cách dừng lỗ, tạo thành một hệ thống giao dịch tương đối nghiêm ngặt và toàn diện.
Chiến lược giao chéo hai đường đều có một số lợi thế:
Kết hợp với nhiều chỉ số, giá cả, xu hướng và động lực được xem xét tổng thể, các điều kiện lọc nghiêm ngặt được thiết lập cho tín hiệu, có thể tránh hiệu quả tín hiệu giả và tăng độ tin cậy của tín hiệu.
Sử dụng đường trung bình di chuyển với hai tham số khác nhau, có thể nhận ra xu hướng thị trường tốt hơn, lọc các biến động. Đường EMA nhanh được sử dụng để theo dõi thay đổi giá theo thời gian; đường SMA chậm được sử dụng để xác định xu hướng dài hạn.
Các tham số có thể được thiết lập trong chỉ số MACD có thể được điều chỉnh theo các đặc điểm của thị trường khác nhau, có tính linh hoạt cao. Cài đặt của MACD đảm bảo tín hiệu giao dịch được hỗ trợ bởi giá cả, xu hướng và động lực đồng thời, do đó có giá trị ứng dụng mạnh mẽ.
Thiết lập điểm dừng lỗ để kiểm soát tối đa tổn thất của một giao dịch, tránh SIZE_MATHFUNC Rủi ro mất mát đơn lẻ quá lớn. Việc thiết lập tỷ lệ dừng hợp lý có thể khóa một phần lợi nhuận, giảm tiếp xúc với rủi ro thị trường sau khi kiếm được lợi nhuận.
Các tham số chiến lược này có thể được thiết lập linh hoạt và có thể điều chỉnh chiến lược theo kết quả tối ưu hóa, rất hữu ích. Có rất nhiều không gian tối ưu hóa để thử nghiệm các thị trường và tham số khác nhau.
Các chiến lược giao thoa hai đường cong cũng có một số rủi ro, chủ yếu tập trung vào các khía cạnh sau:
EMA và SMA có thể xảy ra nhiều lần giao dịch sai khi giá chứng khoán biến động mạnh, dẫn đến các tín hiệu giao dịch mở và đóng thường xuyên. Điều này sẽ làm tăng tần suất giao dịch và chi phí xử lý.
Chỉ số MACD có thể bị phá vỡ giả, đặc biệt là trong quá trình chuyển động chưa rõ ràng. Trong trường hợp này, tín hiệu cũng không đáng tin cậy và có thể gây ra tổn thất không cần thiết.
Vị trí và tỷ lệ của thiết lập dừng lỗ có ảnh hưởng lớn đến kết quả thu lợi nhuận. Nếu thiết lập dừng lỗ quá nhỏ, có nguy cơ bị che đậy; và nếu thiết lập dừng lỗ quá lớn, tổn thất đơn lẻ có thể quá lớn. Điều này cần được thử nghiệm đầy đủ để tìm các tham số tối ưu.
Đường trung bình di chuyển được sử dụng như một chỉ số theo dõi xu hướng, hiệu quả chỉ thị của nó sẽ bị giảm giá khi giá thay đổi nhanh chóng. Chiến lược có thể không dừng lại khi giá bị đảo ngược, gây ra tổn thất lớn hơn.
Các giải pháp tương ứng như sau:
Đối với tình huống biến động mạnh, các tham số của đường trung bình di chuyển có thể được điều chỉnh thích hợp, sử dụng các tham số EMA và SMA thấp, giảm số lần giao nhau.
Thêm các điều kiện lọc của MACD trên trục 0 và xuống, có thể làm giảm một phần các đợt phá vỡ giả. Bạn cũng có thể xem xét thêm các chỉ số khác để kết hợp, chẳng hạn như KDJ, BOLL, v.v.
Các thiết lập về vị trí và tỷ lệ dừng lỗ cần được đánh giá và tối ưu hóa đầy đủ để tìm các tham số tối ưu. Trên cơ sở này, cũng cần xem xét giám sát liên tục và điều chỉnh động.
Có thể thiết lập cơ chế nhận diện giá quay ngược nhanh. Nếu phát hiện bất thường, hãy thực hiện các biện pháp khẩn cấp để thu hẹp vị trí hoặc tạm dừng chiến lược giao dịch, kiểm soát lỗ hổng rủi ro.
Chiến lược này có thể được tối ưu hóa hơn nữa, chủ yếu tập trung vào các khía cạnh sau:
Thử nghiệm nhiều chỉ số để kết hợp, tìm các tham số tốt hơn. Ví dụ như giới thiệu kênh BOLL, xem xét tác động của tỷ lệ dao động, v.v.
Tối ưu hóa tham số chiều dài của đường trung bình di chuyển để tìm ra sự kết hợp tham số tốt nhất trong các điều kiện thị trường khác nhau. Tối ưu hóa tham số cuộn cũng là một lựa chọn.
Thiết lập các chiến lược dừng lỗ theo lý thuyết khoa học hơn. Ví dụ, giới thiệu các chiến lược dừng lỗ theo dõi, hoặc thiết lập tỷ lệ lợi nhuận rủi ro động dựa trên kết quả thống kê lịch sử. Điều này có thể làm tăng thêm sự ổn định của chiến lược.
Thiết lập cơ chế nhận diện và ứng phó tự động khi giá đảo ngược bất thường. Trong trường hợp cực đoan, chủ động cắt giảm vị trí hoặc tạm dừng chiến lược để tránh tổn thất lớn.
Mở rộng các loại giao dịch, chẳng hạn như ngoại hối, tiền kỹ thuật số và các loại khác. Kiểm tra sức mạnh tham số của các loại khác nhau, mở rộng phạm vi áp dụng chiến lược.
Các chiến lược quản lý tài chính để tối ưu hóa chiến lược, chẳng hạn như giao dịch định lượng, tỷ lệ vị trí cố định, v.v.
Chiến lược xu hướng chéo hai chiều cân nhắc nhiều yếu tố tổng hợp, cần hỗ trợ của nhiều chỉ số về giá cả, xu hướng và động lực khi phát tín hiệu giao dịch, do đó đảm bảo độ tin cậy của tín hiệu. Chiến lược cũng sử dụng dừng lỗ di động, có thể kiểm soát hiệu quả rủi ro của giao dịch đơn. Các tham số của chiến lược được thiết lập linh hoạt, thực tế và phù hợp cho giao dịch tự động.
Tuy nhiên, không có chiến lược nào là hoàn hảo. Chiến lược này cũng gặp một số khó khăn trong việc áp dụng, chẳng hạn như giao dịch thường xuyên, phá vỡ giả và thiết lập vị trí dừng lỗ. Điều này đòi hỏi chúng ta phải làm việc từ nhiều khía cạnh khác nhau như tối ưu hóa các tham số, giới thiệu các chỉ số kỹ thuật mới, cải thiện cơ chế dừng lỗ, để tăng cường sự ổn định và khả năng sinh lời của chiến lược.
Nhìn chung, chiến lược xu hướng chéo hai đường đều tạo ra một hệ thống giao dịch tương đối toàn diện và nghiêm ngặt. Trong nghiên cứu và ứng dụng sau này, chiến lược này có thể mang lại giá trị chiến đấu lớn hơn thông qua việc tối ưu hóa và cải tiến liên tục.
/*backtest
start: 2023-11-01 00:00:00
end: 2023-11-30 23:59:59
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
// Hi,
// This is my first strategy made by myself(except for the MACD indicator). I'm publishing this to get myself out there and for some newer people to see how a basic strategy works. All credits go to Zen&TheArtofTrading, for teaching me almost everything I know about Pinescript
// The strategy is basically an MACD crossover trend strategy. If the MACD line crosses the signal line upward, above the zero point of the histogram, while the price is above 200 EMA and 100 SMA it's a buy signal
// If the MACD line crosses the signal line downward, while below zero point of the histogram, as well as the price being below 200 EMA and 100 SMA it's a sell signal
// I used the 200 EMA and 100 SMA because I wanted to filter weak signals as much as possible when the market is ranging, if you have any suggestions to go around this better, please let me know, still learning everyday
// If you have any suggestions, tips or tricks please let me know. I'm still new to Pinescript, but having a lot of fun trying stuff out. If you see something in my code that you don't understand, feel free to ask, I'll try to answer as best as I can
// I opened the strategy with predetermined backtesting pyramiding, currency etc. This made the progress of backtesting multiple TP and SL easier. Also the commission value is from Binance Futures, I just left it in there for anyone who wants to just copy this strategy
strategy("MACD Crossover Trend Strategy Template", overlay = true )
// Determining inputs and values, I just copied the built-in MACD strategy and removed everything I didn't need, just needed the barebone indicator and added EMA + SMA inputs
fast_length = input(title = "Fast Length", type = input.integer, defval = 12, group = "MACD Values")
slow_length = input(title = "Slow Length", type = input.integer, defval = 26, group = "MACD Values")
src = input(title = "Source", type = input.source, defval = close, group = "MACD Values")
signal_length = input(title = "Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9, group = "MACD Values")
sma_source = input(title = "Simple MA (Oscillator)", type = input.bool, defval = false, group = "MACD Values")
sma_signal = input(title = "Simple MA (Signal Line)", type = input.bool, defval = false, group = "MACD Values")
fast_ma = sma_source ? sma(src, fast_length) : ema(src, fast_length)
slow_ma = sma_source ? sma(src, slow_length) : ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal ? sma(macd, signal_length) : ema(macd, signal_length)
hist = macd - signal
emaLength = input(title = "EMA", type = input.integer, defval = 200, step = 10, group = "Moving Averages")
smaLength = input(title = "SMA", type = input.integer, defval = 100, step = 10, group = "Moving Averages")
// Input backtest range, you can adjust this here or in the input options
fromMonth = input(defval = 1, title = "From Month", type = input.integer, minval = 1, maxval = 12, group = "Backtest Date Range")
fromDay = input(defval = 1, title = "From Day", type = input.integer, minval = 1, maxval = 31, group = "Backtest Date Range")
fromYear = input(defval = 2000, title = "From Year", type = input.integer, minval = 1970, group = "Backtest Date Range")
thruMonth = input(defval = 1, title = "Thru Month", type = input.integer, minval = 1, maxval = 12, group = "Backtest Date Range")
thruDay = input(defval = 1, title = "Thru Day", type = input.integer, minval = 1, maxval = 31, group = "Backtest Date Range")
thruYear = input(defval = 2099, title = "Thru Year", type = input.integer, minval = 1970, group = "Backtest Date Range")
// Inputs for EMA, SMA and to adjust your take profit and stop losses in the input options while backtesting, it's result of your input is calculated back to percentages
ema = ema(close, emaLength)
sma = sma(close, smaLength)
profitlong = input(title = "Profit Long %", type = input.float, defval = 2, minval = 0.1, maxval = 100, step = 0.1, group = "TP / SL %") * 0.01
losslong = input(title = "Loss Long %", type = input.float, defval = 1, minval = 0.1, maxval = 100, step = 0.1, group = "TP / SL %") * 0.01
profitshort = input(title = "Profit Short %", type = input.float, defval = 2, minval = 0.1, maxval = 100, step = 0.1, group = "TP / SL %") * 0.01
lossshort = input(title = "Loss Short %", type = input.float, defval = 1, minval = 0.1, maxval = 100, step = 0.1, group = "TP / SL %") * 0.01
// Check EMA and SMA also check the backtest range. inDataRange is a true or false statement, true if the date right now is between the parameters that's filled at the corresponding inputs
// (for example 1-1-2020 till 12-12-2020, if that specific bar is between these dates, statement is true and trade will be executed)
// If the date is not in between the given parameters, statement turns to false and it won't allow new trades and closes all current trades as seen with the strategy.close_all function
inDataRange = (time >= timestamp(syminfo.timezone, fromYear, fromMonth, fromDay, 0, 0)) and (time < timestamp(syminfo.timezone, thruYear, thruMonth, thruDay, 0, 0))
long = close > ema and close > sma and inDataRange
short = close < ema and close < sma and inDataRange
// Entry and exit signals + checking backtest date range, what the signals are supposed to do is noted at the beginning of the code
// I want a way to filter out weak signals that are ranging around the zero point of the histogram.
// So far couldn't think of a decent way to do this over multiple symbols since the range of the histogram changes with every symbol, sometimes ranging between 0 and 1 or sometimes ranging between 0 and 1000
// I could probably use a cofficiency or something, but that's beyond my grasp at the moment
// Also I wanted a way to let my strategy determine a stop loss based on the pullback and having a 1.5 risk/reward TP on top of that. Couldn't really figure out a way to determine the pullback
if (crossover(macd, signal) and macd > 0)
strategy.entry("Long", long = strategy.long,
comment = "Long Buy",
when = long)
strategy.exit("Exit Long", "Long", profit = close * profitlong / syminfo.mintick, loss = close * losslong / syminfo.mintick)
if (crossunder(macd, signal) and macd < 0)
strategy.entry("Short", long = strategy.short,
comment = "Short Buy",
when = short)
strategy.exit("Exit Short", "Short", profit = close * profitshort / syminfo.mintick, loss = close * lossshort / syminfo.mintick)
// To make sure the backtesting doesn't leave a position open beyond, or before, our applied dates
if (not inDataRange)
strategy.close_all()
// plot(strategy.equity, title="equity", color=color.red, linewidth=2, style=plot.style_areabr)