Dựa trên chiến lược giao dịch lưới động


Ngày tạo: 2024-01-23 10:53:05 sửa đổi lần cuối: 2024-01-23 10:53:05
sao chép: 0 Số nhấp chuột: 832
1
tập trung vào
1617
Người theo dõi

Dựa trên chiến lược giao dịch lưới động

Tổng quan

Chiến lược này thực hiện giao dịch lưới bằng cách thiết lập nhiều đơn mua bán song song trong phạm vi giá, điều chỉnh các phạm vi lưới và các đường theo biến động của thị trường, để tạo ra lợi nhuận.

Nguyên tắc chiến lược

  1. Cài đặt đường viền trên và dưới của lưới, có thể được thiết lập bằng tay hoặc có thể tự động tính toán dựa trên giá cao và thấp trong khoảng thời gian gần đây.
  2. Tính diện rộng của khoảng lưới dựa trên số lượng lưới được thiết lập.
  3. Tạo một mảng giá lưới với số lượng tương ứng.
  4. Khi giá thấp hơn một đường lưới, mở nhiều lệnh bên dưới đường lưới; khi giá cao hơn một đường lưới, mở đơn trống trên đường lưới.
  5. Động thái điều chỉnh giới hạn trên và dưới của lưới, chiều rộng và giá đường lưới để phù hợp với sự thay đổi của thị trường.

Phân tích lợi thế

  1. Có thể đạt được lợi nhuận ổn định trong thị trường ngang và biến động, không bị ảnh hưởng bởi hành động đơn phương.
  2. Hỗ trợ thiết lập thủ công cũng hỗ trợ tính toán tự động khoảng cách lưới, khả năng thích ứng cao.
  3. Có thể tối ưu hóa thu nhập bằng cách điều chỉnh số lượng lưới, chiều rộng lưới và số lượng ủy thác.
  4. Kiểm soát vị trí tích hợp để kiểm soát rủi ro.
  5. Hỗ trợ cho việc điều chỉnh kích thước lưới một cách động, giúp cho chiến lược có khả năng thích ứng mạnh mẽ hơn.

Phân tích rủi ro

  1. Khi có một xu hướng lớn, có thể có một khoản lỗ lớn.
  2. Số lượng lưới và vị trí không đúng cách có thể làm tăng rủi ro.
  3. Tự động tính toán dải lưới có thể không hiệu quả trong trường hợp cực đoan.

Giải pháp rủi ro:

  1. Tối ưu hóa tham số lưới, kiểm soát chặt chẽ tổng vị trí.
  2. Các chiến lược này sẽ giúp các nhà đầu tư có thể giảm bớt chi phí.
  3. Kết hợp các chỉ số xu hướng để đánh giá tình hình thị trường, và nếu cần thiết, tắt chiến lược.

Hướng tối ưu hóa

  1. Lựa chọn số lượng lưới tốt nhất kết hợp với đặc điểm thị trường và quy mô vốn.
  2. Kiểm tra các tham số tính toán tự động của lưới tối ưu hóa theo chu kỳ thời gian khác nhau.
  3. Tối ưu hóa cách tính toán số lượng ủy thác để có được thu nhập ổn định hơn.
  4. Kết hợp với các chỉ số khác để đánh giá tình hình, thiết lập các điều kiện đóng chiến lược.

Tóm tắt

Chiến lược giao dịch mạng lưới động này có thể giúp bạn kiếm lợi nhuận trong giao dịch ngang và giao dịch dao động bằng cách điều chỉnh động các tham số giữa các phân đoạn mạng lưới để thích ứng với sự thay đổi của thị trường. Trong khi đó, việc thiết lập các kiểm soát vị trí thích hợp có thể kiểm soát rủi ro.

Mã nguồn chiến lược
/*backtest
start: 2023-12-23 00:00:00
end: 2024-01-22 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("sarasa srinivasa kumar", 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="(Auto) 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="(Auto) 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)