
Chiến lược này là một chiến lược mạo hiểm tiền điện tử tự điều chỉnh dựa trên khái niệm giao dịch lưới. Nó có thể tự động điều chỉnh phạm vi giá của giao dịch lưới theo biến động của thị trường và giao dịch mạo hiểm hiệu quả trong phạm vi giá đó.
Ý tưởng chính của chiến lược này là:
Động lực tính toán phạm vi giá của một mạng lưới giao dịch dựa trên các điểm cao và thấp trong lịch sử.
Trong phạm vi giá này, hãy đặt N đường lưới giao dịch.
Khi giá phá vỡ mỗi đường lưới, hãy đặt nhiều hoặc ít theo số lượng cố định.
Các nhà đầu tư sẽ có thể sử dụng các giao dịch này để tạo ra các giao dịch khác nhau.
Khi giá trở lại phạm vi lưới, tiếp tục đặt hàng theo giá chi phí biên của đường lưới.
Vì vậy, vòng tròn đi lại, trong phạm vi giá lưới, giao dịch đánh giá có tần số cao.
Cụ thể, chiến lược này đầu tiên tính toán giá của lưới trong thời gian thực dựa trên cấu hình cửa sổ xem lại ((i_boundLookback) và các tham số dao động ((i_boundDev)).
Sau đó phân chia N đường lưới ((i_gridQty) giữa các giới hạn trên và dưới. Giá của các đường lưới này được lưu trữ trong mảng gridLineArr.
Khi giá phá vỡ một đường lưới, hãy đặt nhiều hoặc ít theo số lượng cố định ((cơ bản chiến lược chia cho số lưới). Các lệnh được ghi lại trong mảng orderArr.
Khi giá phá vỡ đường lưới lân cận một lần nữa, bạn có thể cân bằng lợi nhuận với đơn đặt hàng trước đó để có được vị trí cân bằng lợi nhuận.
Vì vậy, vòng lặp đi và lại, trong phạm vi biến động của giá cả, đánh giá cao thường xuyên.
Ưu điểm lớn nhất của chiến lược này so với chiến lược lưới truyền thống là phạm vi lưới được điều chỉnh tự động, có thể thích nghi với biến động thị trường. Nó có các tính năng sau:
Điều chỉnh tự động, không cần sự can thiệp của con người.
Có khả năng nắm bắt xu hướng giá và giao dịch theo xu hướng.
Những người dân ở đây có thể kiểm soát được rủi ro, tránh nguy cơ bị tấn công đơn phương.
Tỷ lệ giao dịch cao, lợi nhuận cao.
Dễ hiểu, cấu hình đơn giản.
Tỷ lệ sử dụng vốn cao, không dễ bị mắc kẹt.
Nó phản ánh sự thay đổi của thị trường trong thời gian thực, phù hợp với giao dịch robot.
Mặc dù chiến lược này có nhiều ưu điểm, nhưng cũng có một số rủi ro, chủ yếu tập trung vào:
Các nhà đầu tư có thể sẽ mất nhiều tiền nếu giá cả thay đổi mạnh.
Cần có thời gian nắm giữ và cặp giao dịch phù hợp để đạt được lợi nhuận.
Cần đánh giá cẩn thận sự phù hợp giữa quy mô và phạm vi biến động của quỹ.
Có thể cần phải giám sát thường xuyên và tối ưu hóa các tham số để đảm bảo hoạt động bình thường.
Các biện pháp đối phó bao gồm:
Tăng khoảng cách lưới, mở rộng phạm vi lưới.
Chọn cặp giao dịch có biến động khá ổn định.
Điều chỉnh quy mô vốn để đảm bảo đủ thanh khoản.
Thiết lập hệ thống giám sát và báo động tự động.
Chiến lược này có thể được tối ưu hóa theo các khía cạnh sau:
Động lực lưới: Các tham số lưới có thể được điều chỉnh tự động theo biến động của cặp giao dịch.
Cơ chế ngăn chặn thiệt hạiLưu ý: Thiết lập vị trí dừng lỗ hợp lý để tránh rủi ro trong các tình huống cực đoan.
Mạng tổng hợp: Kết hợp lưới với các tham số khác nhau trong các khoảng thời gian khác nhau, để thực hiện lặp lại thời gian.
Học máy: Sử dụng các quy tắc thay thế như mạng thần kinh để tối ưu hóa các tham số tự động.
Trọng tài chéo thị trườngCác nhà đầu tư khác cũng có thể tham gia vào các hoạt động như: giao dịch trên sàn giao dịch, hoặc giao dịch trên các cặp tiền tệ khác.
Chiến lược này nói chung là một chiến lược tháo gỡ lưới cryptocurrency tự điều chỉnh rất thực tế. Đặc điểm lớn nhất của nó là phạm vi lưới được điều chỉnh tự động so với chiến lược lưới truyền thống, bạn có thể cấu hình phạm vi giao dịch của mình theo sự thay đổi của thị trường. Ý tưởng chiến lược rõ ràng, dễ hiểu và cấu hình, phù hợp để sử dụng bởi các nhà đầu tư cá nhân có một nền tảng nhất định, cũng phù hợp để sử dụng như một mẫu chiến lược cho robot giao dịch.
/*backtest
start: 2024-01-11 00:00:00
end: 2024-01-18 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy("(IK) Grid Script", overlay=true, pyramiding=14, close_entries_rule="ANY", default_qty_type=strategy.cash, initial_capital=100.0, currency="USD", commission_type=strategy.commission.percent, commission_value=0.1)
i_autoBounds = input(group="Grid Bounds", title="Use Auto Bounds?", defval=true, type=input.bool) // calculate upper and lower bound of the grid automatically? This will theorhetically be less profitable, but will certainly require less attention
i_boundSrc = input(group="Grid Bounds", title="(Auto) Bound Source", defval="Hi & Low", options=["Hi & Low", "Average"]) // should bounds of the auto grid be calculated from recent High & Low, or from a Simple Moving Average
i_boundLookback = input(group="Grid Bounds", title="(Auto) Bound Lookback", defval=250, type=input.integer, maxval=500, minval=0) // when calculating auto grid bounds, how far back should we look for a High & Low, or what should the length be of our sma
i_boundDev = input(group="Grid Bounds", title="(Auto) Bound Deviation", defval=0.10, type=input.float, maxval=1, minval=-1) // if sourcing auto bounds from High & Low, this percentage will (positive) widen or (negative) narrow the bound limits. If sourcing from Average, this is the deviation (up and down) from the sma, and CANNOT be negative.
i_upperBound = input(group="Grid Bounds", title="(Manual) Upper Boundry", defval=0.285, type=input.float) // for manual grid bounds only. The upperbound price of your grid
i_lowerBound = input(group="Grid Bounds", title="(Manual) Lower Boundry", defval=0.225, type=input.float) // for manual grid bounds only. The lowerbound price of your grid.
i_gridQty = input(group="Grid Lines", title="Grid Line Quantity", defval=8, maxval=15, minval=3, type=input.integer) // how many grid lines are in your grid
f_getGridBounds(_bs, _bl, _bd, _up) =>
if _bs == "Hi & Low"
_up ? highest(close, _bl) * (1 + _bd) : lowest(close, _bl) * (1 - _bd)
else
avg = sma(close, _bl)
_up ? avg * (1 + _bd) : avg * (1 - _bd)
f_buildGrid(_lb, _gw, _gq) =>
gridArr = array.new_float(0)
for i=0 to _gq-1
array.push(gridArr, _lb+(_gw*i))
gridArr
f_getNearGridLines(_gridArr, _price) =>
arr = array.new_int(3)
for i = 0 to array.size(_gridArr)-1
if array.get(_gridArr, i) > _price
array.set(arr, 0, i == array.size(_gridArr)-1 ? i : i+1)
array.set(arr, 1, i == 0 ? i : i-1)
break
arr
var upperBound = i_autoBounds ? f_getGridBounds(i_boundSrc, i_boundLookback, i_boundDev, true) : i_upperBound // upperbound of our grid
var lowerBound = i_autoBounds ? f_getGridBounds(i_boundSrc, i_boundLookback, i_boundDev, false) : i_lowerBound // lowerbound of our grid
var gridWidth = (upperBound - lowerBound)/(i_gridQty-1) // space between lines in our grid
var gridLineArr = f_buildGrid(lowerBound, gridWidth, i_gridQty) // an array of prices that correspond to our grid lines
var orderArr = array.new_bool(i_gridQty, false) // a boolean array that indicates if there is an open order corresponding to each grid line
var closeLineArr = f_getNearGridLines(gridLineArr, close) // for plotting purposes - an array of 2 indices that correspond to grid lines near price
var nearTopGridLine = array.get(closeLineArr, 0) // for plotting purposes - the index (in our grid line array) of the closest grid line above current price
var nearBotGridLine = array.get(closeLineArr, 1) // for plotting purposes - the index (in our grid line array) of the closest grid line below current price
strategy.initial_capital = 50000
for i = 0 to (array.size(gridLineArr) - 1)
if close < array.get(gridLineArr, i) and not array.get(orderArr, i) and i < (array.size(gridLineArr) - 1)
buyId = i
array.set(orderArr, buyId, true)
strategy.entry(id=tostring(buyId), long=true, qty=(strategy.initial_capital/(i_gridQty-1))/close, comment="#"+tostring(buyId))
if close > array.get(gridLineArr, i) and i != 0
if array.get(orderArr, i-1)
sellId = i-1
array.set(orderArr, sellId, false)
strategy.close(id=tostring(sellId), comment="#"+tostring(sellId))
if i_autoBounds
upperBound := f_getGridBounds(i_boundSrc, i_boundLookback, i_boundDev, true)
lowerBound := f_getGridBounds(i_boundSrc, i_boundLookback, i_boundDev, false)
gridWidth := (upperBound - lowerBound)/(i_gridQty-1)
gridLineArr := f_buildGrid(lowerBound, gridWidth, i_gridQty)
closeLineArr := f_getNearGridLines(gridLineArr, close)
nearTopGridLine := array.get(closeLineArr, 0)
nearBotGridLine := array.get(closeLineArr, 1)