Bài viết này giới thiệu một chiến lược giao dịch định lượng dựa trên nguyên tắc chéo trung bình động. Chiến lược xác định hướng dài / ngắn bằng cách so sánh giá với trung bình động, và đặt mức lợi nhuận và dừng lỗ để kiểm soát rủi ro. Mã chiến lược được viết bằng Pine Script và tích hợp với API nền tảng giao dịch Dhan, cho phép giao dịch tự động các tín hiệu chiến lược.
Cốt lõi của chiến lược này là đường trung bình động. Nó tính toán đường trung bình động đơn giản của giá đóng trong một khoảng thời gian nhất định như cơ sở để đánh giá xu hướng. Khi giá vượt trên đường trung bình động, nó tạo ra tín hiệu dài, và khi vượt dưới, nó tạo ra tín hiệu ngắn. Chức năng exrem được sử dụng để lọc các tín hiệu trùng lặp liên tục và cải thiện chất lượng tín hiệu. Chiến lược đặt mức lợi nhuận và dừng lỗ tương ứng dựa trên hướng vị trí hiện tại và mối quan hệ giữa giá và đường trung bình động, kiểm soát rủi ro và lợi nhuận của mỗi giao dịch.
Moving average crossover là một phương pháp theo dõi xu hướng đơn giản và dễ sử dụng có thể nắm bắt hiệu quả các xu hướng thị trường trung hạn đến dài hạn. Với các thiết lập tham số hợp lý, chiến lược có thể đạt được lợi nhuận ổn định trong các thị trường xu hướng. Việc thiết lập lấy lợi nhuận và dừng lỗ giúp kiểm soát rút tiền và cải thiện tỷ lệ rủi ro-lợi nhuận. Logic mã chiến lược rõ ràng, sử dụng mô-đun hóa chức năng, có khả năng đọc và mở rộng mạnh mẽ. Ngoài ra, chiến lược tích hợp API nền tảng Dhan để nhận ra việc thực thi lệnh tự động, cải thiện hiệu quả thực thi.
Đường trung bình động vốn là các chỉ số chậm trễ. Trong các thời điểm chuyển đổi của thị trường, các tín hiệu có thể bị trì hoãn, dẫn đến cơ hội giao dịch tối ưu bị bỏ hoặc tín hiệu sai. Cài đặt tham số không chính xác sẽ ảnh hưởng đến hiệu suất chiến lược và cần được tối ưu hóa theo các đặc điểm và khung thời gian thị trường khác nhau.
Chiến lược chuyển động trung bình là một chiến lược giao dịch định lượng đơn giản và thực tế có thể kiếm lợi nhuận trong các thị trường xu hướng thông qua theo dõi xu hướng và kiểm soát dừng lỗ. Tuy nhiên, chính chiến lược có một số hạn chế nhất định và cần được tối ưu hóa và cải thiện theo đặc điểm thị trường và sở thích rủi ro. Trong ứng dụng thực tế, cũng cần phải chú ý đến việc thực hiện kỷ luật nghiêm ngặt và kiểm soát rủi ro đúng cách.
/*backtest start: 2024-05-01 00:00:00 end: 2024-05-31 23:59:59 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © syam-mohan-vs @ T7 - wwww.t7wealth.com www.t7trade.com //This is an educational code done to describe the fundemantals of pine scritpting language and integration with Indian discount broker Dhan. This strategy is not tested or recommended for live trading. //@version=5 strategy("Pine & Dhan - Moving Average Crossover Strategy", overlay=true) //Remove excess signals exrem(condition1, condition2) => temp = false temp := na(temp[1]) ? false : not temp[1] and condition1 ? true : temp[1] and condition2 ? false : temp[1] ta.change(temp) == true ? true : false // Define MA period ma_period = input(20, title = "MA Length") // Define target and stop loss levels target_percentage = input.float(title="Target Profit (%)", defval=2.0) stop_loss_percentage = input.float(title="Stop Loss (%)", defval=1.0) // Calculate the MA ma = ta.sma(close, ma_period) // Entry conditions long_entry = close >= ma short_entry = close < ma // Calculate target and stop loss prices target_price = long_entry ? strategy.position_avg_price + (close * (target_percentage / 100)) : strategy.position_avg_price - (close * (target_percentage / 100)) stop_loss_price = short_entry ? strategy.position_avg_price + (close * (stop_loss_percentage/ 100)) : strategy.position_avg_price - (close * (stop_loss_percentage / 100)) long_entry := exrem(long_entry,short_entry) short_entry := exrem(short_entry,long_entry) // Plot the MA plot(ma, color=color.blue, linewidth=2, title="MA") // Plot the entry and exit signals plotshape(long_entry, style=shape.arrowup, color=color.green, size=size.small,location = location.belowbar) plotshape(short_entry, style=shape.arrowdown, color=color.red, size=size.small,location = location.abovebar) //Find absolute value of positon size to exit position properly size = math.abs(strategy.position_size) //Replace these four JSON strings with those generated from user Dhan account long_msg = '{"secret":"C0B2u","alertType":"multi_leg_order","order_legs":[{"transactionType":"B","orderType":"MKT","quantity":"1","exchange":"NSE","symbol":"NIFTY1!","instrument":"FUT","productType":"I","sort_order":"1","price":"0"}]}' long_exit_msg = '{"secret":"C0B2u","alertType":"multi_leg_order","order_legs":[{"transactionType":"S","orderType":"MKT","quantity":"1","exchange":"NSE","symbol":"NIFTY1!","instrument":"FUT","productType":"M","sort_order":"1","price":"0"}]}' short_msg = '{"secret":"C0B2u","alertType":"multi_leg_order","order_legs":[{"transactionType":"S","orderType":"MKT","quantity":"1","exchange":"NSE","symbol":"NIFTY1!","instrument":"FUT","productType":"M","sort_order":"1","price":"0"}]}' short_exit_msg = '{"secret":"C0B2u","alertType":"multi_leg_order","order_legs":[{"transactionType":"B","orderType":"MKT","quantity":"1","exchange":"NSE","symbol":"NIFTY1!","instrument":"FUT","productType":"M","sort_order":"1","price":"0"}]}' // Submit orders based on signals if(strategy.position_size == 0) if long_entry strategy.order("Long", strategy.long,alert_message=long_msg) if short_entry strategy.order("Short", strategy.short,alert_message=short_msg) if(strategy.position_size > 0) if(short_entry) strategy.order("Short", strategy.short, qty = size, alert_message=short_msg) else strategy.exit("Long Exit", from_entry="Long", qty = size, stop=stop_loss_price, limit= target_price, alert_message=long_exit_msg) if(strategy.position_size < 0) if(long_entry) strategy.order("Long", strategy.long, qty = size, alert_message=long_msg) else strategy.exit("Short Exit", from_entry="Short", qty = size, stop=stop_loss_price, limit= target_price, alert_message=short_exit_msg)