Chiến lược xu hướng chéo trung bình di chuyển kép 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 sự chéo của đường EMA nhanh và đường SMA chậm như tín hiệu mua và bán, và kết hợp sự khác biệt của chỉ số MACD để lọc tín hiệu. Chiến lược xem xét nhiều yếu tố như giá, 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 động, EMA với độ dài 200 ngày và SMA với độ dài 100 ngày. Khi giá phá vỡ cả hai đường lên, một tín hiệu mua được tạo ra. Khi giá phá vỡ cả hai đường xuống, một tín hiệu bán được tạo ra. Điều này có thể lọc hiệu quả xu hướng dao động và giảm ngắn hạn.
Để cải thiện thêm độ tin cậy của tín hiệu, chỉ số MACD cũng được giới thiệu. Khi giá vượt qua đường EMA và SMA để tạo ra tín hiệu, đường nhanh của MACD cần phải vượt qua đường chậm từ dưới, và biểu đồ MACD cần phải ở trên trục 0, để kích hoạt tín hiệu mua thực sự. Ngược lại, khi đường nhanh của MACD vượt qua đường chậm từ trên, và biểu đồ MACD dưới trục 0, nó sẽ kích hoạt tín hiệu bán thực sự.
Ngoài ra, stop loss và take profit được thiết lập trong chiến lược. Sau khi chiến lược mở một vị trí, điểm stop loss và take profit sẽ được tính toán và thiết lập theo tỷ lệ phần trăm được thiết lập bởi người dùng. Điều này có thể kiểm soát hiệu quả rủi ro của một giao dịch duy nhất.
Tóm lại, chiến lược này xem xét toàn diện nhiều chỉ số, thiết lập các điều kiện lọc nghiêm ngặt cho tín hiệu mua và bán, và áp dụng dừng lỗ và lấy lợi nhuận để quản lý rủi ro, tạo thành một hệ thống giao dịch tương đối nghiêm ngặt và hoàn chỉnh.
Chiến lược xu hướng chéo trung bình di chuyển kép có những lợi thế sau:
Kết hợp nhiều chỉ số, xem xét toàn diện giá, xu hướng và động lực và thiết lập các điều kiện lọc nghiêm ngặt cho tín hiệu có thể ngăn chặn hiệu quả các tín hiệu sai và cải thiện độ tin cậy tín hiệu.
Việc sử dụng hai đường trung bình động với các thông số khác nhau có thể xác định tốt hơn xu hướng thị trường và lọc các thị trường dao động. Đường EMA nhanh được sử dụng để theo dõi các thay đổi giá kịp thời; Đường SMA chậm được sử dụng để xác định xu hướng dài hạn. Sự kết hợp của hai đường hoạt động tốt hơn.
Chỉ số MACD giới thiệu các thông số tùy chỉnh có thể được điều chỉnh theo đặc điểm của các thị trường khác nhau và có tính linh hoạt cao. Các thiết lập của MACD đảm bảo rằng tín hiệu giao dịch được hỗ trợ bởi giá, xu hướng và đà đồng thời, do đó có giá trị ứng dụng rất mạnh.
Thiết lập điểm dừng lỗ và lấy lợi nhuận có thể tối đa hóa kiểm soát lỗ giao dịch duy nhất và tránh thua lỗ quá mức.
Các tham số của chiến lược này có thể được thiết lập linh hoạt, và chiến lược có thể được điều chỉnh dựa trên kết quả tối ưu hóa, rất thực tế.
Chiến lược xu hướng chéo trung bình động kép cũng có một số rủi ro, chủ yếu là trong các lĩnh vực sau:
Khi giá cổ phiếu cho thấy biến động mạnh mẽ, EMA và SMA có thể vượt qua sai nhiều lần, dẫn đến việc mở và đóng các tín hiệu giao dịch thường xuyên. Điều này sẽ làm tăng tần suất giao dịch và chi phí hoa hồng.
Các chỉ số MACD có thể có sự phá vỡ sai, đặc biệt là trong quá trình khi động lực vẫn chưa rõ ràng.
Vị trí và tỷ lệ thiết lập stop loss có ảnh hưởng lớn đến kết quả lợi nhuận và lỗ. Nếu stop loss được đặt quá nhỏ, có nguy cơ bị bắt; nếu stop loss được đặt quá lớn, lỗ đơn có thể quá nặng. Điều này đòi hỏi phải thử nghiệm đủ để tìm các thông số tối ưu.
Là một chỉ số theo dõi xu hướng, hiệu quả của đường trung bình động sẽ bị giảm giá khi giá đảo ngược nhanh chóng. Chiến lược có thể không có thời gian để dừng lỗ trước khi bị đảo ngược giá, gây ra tổn thất lớn hơn.
Các giải pháp tương ứng là như sau:
Đối với các thị trường biến động, điều chỉnh các tham số của đường trung bình động một cách thích hợp, sử dụng EMA và SMA tham số thấp hơn để giảm tần suất chéo.
Tăng các điều kiện lọc như MACD phá vỡ trên và dưới đường không, có thể làm giảm sự phá vỡ sai ở một mức độ nào đó.
Việc thiết lập vị trí dừng lỗ và tỷ lệ cần kiểm tra và tối ưu hóa đủ để tìm các thông số tối ưu.
Các cơ chế có thể được thiết lập để xác định sự đảo ngược giá nhanh chóng. Khi sự đảo ngược bất thường được phát hiện, các biện pháp khẩn cấp có thể được thực hiện như giảm các vị trí hoặc đình chỉ các chiến lược giao dịch để kiểm soát rủi ro.
Vẫn còn chỗ để tối ưu hóa hơn nữa chiến lược xu hướng chéo trung bình di chuyển kép, chủ yếu trong các khía cạnh sau:
Kiểm tra nhiều chỉ số hơn để kết hợp để tìm các thông số tốt hơn, chẳng hạn như kết hợp kênh BOLL và xem xét tác động của biến động.
Tối ưu hóa các tham số của chiều dài trung bình động để tìm kết hợp tham số tốt nhất trong các điều kiện thị trường khác nhau.
Thiết lập các chiến lược dừng lỗ và lợi nhuận khoa học và hợp lý hơn, chẳng hạn như giới thiệu dừng lỗ sau hoặc thiết lập tỷ lệ rủi ro-lợi nhuận năng động dựa trên kết quả thống kê lịch sử.
Thiết lập các cơ chế để tự động xác định và phản ứng khẩn cấp về sự đảo ngược giá bất thường. Trong điều kiện thị trường cực đoan, chủ động giảm các vị trí hoặc đình chỉ các chiến lược để tránh tổn thất lớn.
Mở rộng các loại giao dịch như ngoại hối, tiền điện tử và các loại khác. Kiểm tra độ mạnh mẽ của các tham số trên các loại khác nhau để mở rộng khả năng áp dụng của chiến lược.
Tối ưu hóa các chiến lược quản lý vốn của chiến lược, chẳng hạn như giao dịch với số tiền cố định, tỷ lệ vị trí cố định, v.v. Kiểm soát rủi ro thua lỗ giao dịch duy nhất, làm cho đường cong vốn tổng thể ổn định hơn.
Chiến lược xu hướng chéo trung bình di chuyển kép xem xét nhiều yếu tố. Khi tạo tín hiệu giao dịch, nó đòi hỏi sự hỗ trợ từ nhiều chỉ số như giá, xu hướng và động lực để đảm bảo độ tin cậy của tín hiệu. Chiến lược cũng áp dụng dừng lỗ di chuyển và lấy lợi nhuận để kiểm soát hiệu quả rủi ro của các giao dịch cá nhân. Cài đặt tham số linh hoạt của chiến lược làm cho nó rất thực tế 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 sẽ gặp một số khó khăn trong ứng dụng, chẳng hạn như giao dịch thường xuyên, phá vỡ sai, định vị dừng lỗ, vv Để tăng thêm độ mạnh mẽ và lợi nhuận của chiến lược, cần phải nỗ lực trong nhiều khía cạnh, bao gồm tối ưu hóa danh mục đầu tư tham số, giới thiệu các chỉ số kỹ thuật mới, cải thiện cơ chế dừng lỗ, vv.
Tóm lại, Chiến lược xu hướng chéo trung bình di chuyển kép tạo thành một hệ thống giao dịch tương đối hoàn chỉnh và nghiêm ngặt. Thông qua tối ưu hóa và cải tiến liên tục trong nghiên cứu và ứng dụng trong tương lai, chiến lược có tiềm năng đạt được giá trị thực tế lớn hơn.
/*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)