Chiến lược giao dịch lưới động tính toán đường trung bình động và các đường dẫn trên và dưới của nó để thiết lập dynamically phạm vi giao dịch lưới. Khi giá vượt qua phạm vi lưới, tín hiệu giao dịch được phát hành ở các khoảng thời gian cố định được thiết lập bởi các đường lưới để đạt được lợi nhuận.
Chiến lược đầu tiên tính toán đường trung bình động của giai đoạn n được xác định và các đường dẫn trên và dưới của đường trung bình động. Đường dẫn trên là đường trung bình động * (1 + tham số đầu vào std), và đường dẫn dưới là đường trung bình động * (1 - tham số đầu vào std). Điều này xây dựng một vùng phạm vi giao dịch điều chỉnh năng động.
Sau đó, trong vùng phạm vi, chúng ta xác định m đường lưới có khoảng cách đồng đều. Khi giá tăng và vượt qua đường lưới, một tín hiệu dài được phát hành tại đường lưới đó; khi giá giảm và vượt qua đường lưới, một tín hiệu đóng được phát hành tại đường lưới trước đó tương ứng với đường lưới đó. Thông qua hoạt động ngược này, lợi nhuận có thể được thực hiện khi giá dao động.
Cụ thể, chúng ta sử dụng một bảng xếp hạng bool order_array để ghi lại trạng thái giao dịch của mỗi đường lưới. Khi một đường lưới kích hoạt một điều kiện dài, trạng thái tương ứng trong bảng xếp hạng order_array được đặt thành true, cho thấy đường lưới đã có vị trí. Khi giá giảm và phá vỡ đường lưới, trạng thái của đường lưới trước đó trong bảng xếp hạng order_array được đặt thành false và một tín hiệu đóng được phát hành.
Chiến lược có những lợi thế sau:
Sử dụng đường trung bình động để xây dựng một phạm vi giao dịch điều chỉnh động có thể điều chỉnh phạm vi dựa trên biến động thị trường để làm cho chiến lược thích nghi hơn với thị trường.
Thiết kế lưới có thể tự động lấy lợi nhuận và dừng lỗ để ngăn ngừa sự gia tăng lỗ do điều kiện thị trường cực đoan.
Số lượng lưới và phân bổ vốn sử dụng khoảng cách và phân bổ bằng nhau, có thể kiểm soát kích thước các vị trí duy nhất và giảm rủi ro của các vị trí duy nhất.
Cài đặt tín hiệu dài và gần là hợp lý để giao dịch theo xu hướng, và kịp thời lấy lợi nhuận và dừng lỗ.
Chiến lược này cũng có một số rủi ro:
Khi thị trường yếu trong thời gian dài và không vượt qua các đường lưới, chiến lược sẽ rơi vào giao dịch dao động vô mục đích, và việc xen kẽ dài và ngắn có thể gây xói mòn vốn trong tài khoản.
Các tham số được chọn std và số lưới có thể không hoàn toàn hợp lý và cần phải được xác định theo phân tích các loại giao dịch khác nhau. Nếu các tham số được đặt không đúng cách, nó sẽ dẫn đến các khu vực giao dịch và lưới quá lớn hoặc nhỏ, ảnh hưởng đến hiệu quả của chiến lược.
Chiến lược không tính đến một số điều kiện thị trường cực đoan, chẳng hạn như khoảng cách giá, tăng hoặc giảm bùng nổ ngắn hạn, v.v. Những điều kiện này có thể khiến chiến lược phá vỡ nhiều lưới, dẫn đến tổn thất ngoài tầm kiểm soát rủi ro.
Chiến lược cũng có thể được tối ưu hóa trong các khía cạnh sau:
Các thuật toán học máy có thể được giới thiệu để đào tạo các mô hình để dự đoán các đường dẫn trên và dưới của đường trung bình động, làm cho các khu vực giao dịch thông minh và năng động hơn.
Các tham số như số lưới, tỷ lệ phân bổ vốn, kích thước vị trí, v.v. có thể được tối ưu hóa theo đặc điểm của các mục tiêu giao dịch khác nhau bằng các tham số thích nghi.
Các lệnh có điều kiện có thể được đặt để đặt lệnh dừng lỗ trước ở một khoảng cách nhất định từ các đường lưới để đóng vai trò của các lệnh dừng lỗ trước và kiểm soát lỗ trong điều kiện thị trường cực đoan.
Thiết kế một cơ chế xử lý ngoại lệ cho các điều kiện thị trường cực đoan, chẳng hạn như tăng kích thước vị trí ban đầu, bỏ qua lưới trung gian trực tiếp để dừng lỗ, vv, có thể đối phó với các tình huống như khoảng cách giá.
Chiến lược giao dịch lưới động được thiết kế hợp lý như một toàn thể. Nó có thể xây dựng một hệ thống dừng lỗ lợi nhuận tự động với lưới phù hợp với các loại giao dịch có biến động giá thường xuyên. Tuy nhiên, vẫn có một số rủi ro thị trường trong chiến lược này. Các tham số và tình huống đặc biệt cần được tối ưu hóa trước khi chiến lược trở nên mạnh mẽ hơn.
/*backtest start: 2023-10-31 00:00:00 end: 2023-11-30 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy('Grid Trading Strategy', overlay=true) // Input ma_length = input.int(300, 'Moving Average Length',group = 'Moving Average Conditions', step = 10) std = input.float(0.03, title='Upper and Lower Grid Deviation', group='Grid Conditions', step = 0.01) grid = input.int(15, maxval=15, title='Grid Line Quantity', group='Grid Conditions') // Moving Average ma = ta.sma(close, ma_length) upper_bound = ma * (1 + std) lower_bound = ma * (1 - std) grid_width = (upper_bound - lower_bound) / (grid - 1) grid_array = array.new_float(0) for i = 0 to grid - 1 by 1 array.push(grid_array, lower_bound + grid_width * i) var order_array = array.new_bool(grid, false) strategy.initial_capital = 10000 // Entry Conditions for i = 0 to grid - 1 by 1 if close < array.get(grid_array, i) and not array.get(order_array, i) buy_id = i array.set(order_array, buy_id, true) strategy.entry(id=str.tostring(buy_id), direction=strategy.long, comment='#Long ' + str.tostring(buy_id)) if close > array.get(grid_array, i) and i!=0 if array.get(order_array, i-1) sell_id = i - 1 array.set(order_array, sell_id, false) strategy.close(id=str.tostring(sell_id), comment='#Close ' + str.tostring(sell_id)) plot(grid > 0 ? array.get(grid_array,0) : na, color = color.yellow, transp = 10) plot(grid > 1 ? array.get(grid_array,1) : na, color = color.yellow, transp = 10) plot(grid > 2 ? array.get(grid_array,2) : na, color = color.yellow, transp = 10) plot(grid > 3 ? array.get(grid_array,3) : na, color = color.yellow, transp = 10) plot(grid > 4 ? array.get(grid_array,4) : na, color = color.yellow, transp = 10) plot(grid > 5 ? array.get(grid_array,5) : na, color = color.yellow, transp = 10) plot(grid > 6 ? array.get(grid_array,6) : na, color = color.yellow, transp = 10) plot(grid > 7 ? array.get(grid_array,7) : na, color = color.yellow, transp = 10) plot(grid > 8 ? array.get(grid_array,8) : na, color = color.yellow, transp = 10) plot(grid > 9 ? array.get(grid_array,9) : na, color = color.yellow, transp = 10) plot(grid > 10 ? array.get(grid_array,10) : na, color = color.yellow, transp = 10) plot(grid > 11 ? array.get(grid_array,11) : na, color = color.yellow, transp = 10) plot(grid > 12 ? array.get(grid_array,12) : na, color = color.yellow, transp = 10) plot(grid > 13 ? array.get(grid_array,13) : na, color = color.yellow, transp = 10) plot(grid > 14 ? array.get(grid_array,14) : na, color = color.yellow, transp = 10)