Strategi Perdagangan Grid Kuantitatif Adaptif Aktif


Tanggal Pembuatan: 2024-02-02 18:08:22 Akhirnya memodifikasi: 2024-02-02 18:08:22
menyalin: 0 Jumlah klik: 919
1
fokus pada
1617
Pengikut

Strategi Perdagangan Grid Kuantitatif Adaptif Aktif

Ringkasan

Strategi ini menghasilkan keuntungan yang stabil dalam situasi yang bergejolak dengan membangun grid perdagangan yang disesuaikan secara dinamis. Strategi ini secara otomatis menghitung jarak grid dan harga batas atas dan bawah berdasarkan jumlah grid yang ditetapkan.

Prinsip Strategi

  1. Perhitungan batas grid dan array harga grid line berdasarkan parameter input.

  2. Ketika harga lebih rendah dari suatu garis grid dan garis grid tersebut tidak memiliki pesanan yang sesuai, maka di titik harga garis grid tersebut dibuatlah banyak pesanan; ketika harga lebih tinggi dari garis grid sebelumnya (kecuali yang pertama) dan garis grid sebelumnya ada pesanan yang sesuai, maka dipadatkanlah banyak pesanan yang sesuai dari garis grid sebelumnya.

  3. Jika Anda mengaktifkan parameter grid yang disesuaikan secara otomatis, Anda akan secara berkala menghitung ulang harga, jarak, dan array grid atas dan bawah dari grid berdasarkan jumlah data K-line terbaru.

Analisis Keunggulan

  1. Mencapai tujuan untuk mendapatkan keuntungan dalam situasi yang bergejolak. Dalam situasi yang bergejolak, dapat membangun kepemilikan dan posisi stop-loss di berbagai titik harga, sehingga menghasilkan keuntungan secara keseluruhan.

  2. Anda dapat memilih untuk menyesuaikan parameter grid secara manual atau otomatis. Penyesuaian manual membutuhkan intervensi manusia, tetapi lebih terkontrol. Penyesuaian otomatis mengurangi beban operasi, sehingga strategi dapat beradaptasi dengan perubahan lingkungan pasar.

  3. Dengan membatasi jumlah grid maksimum, risiko unilateral dapat dikendalikan. Risiko di arah ini dikendalikan ketika harga menembus semua garis grid.

  4. Anda dapat mengontrol kerugian per unit dengan menyesuaikan jarak kisi. Mengurangi jarak kisi dapat mengurangi kerugian per unit.

Analisis risiko

  1. Dalam situasi yang sangat berfluktuasi, ada risiko untuk melakukan arbitrage. Jika harga berfluktuasi dengan cepat di antara beberapa grid, maka mungkin ada risiko untuk melakukan arbitrage.

  2. Anda perlu mengatur jumlah modal awal yang masuk akal. Jika modal awal tidak cukup, Anda tidak dapat mendukung jumlah kabel yang cukup.

  3. Terlalu banyak atau terlalu sedikit grid tidak menguntungkan strategi. Terlalu sedikit grid tidak dapat memanfaatkan fluktuasi sepenuhnya; Terlalu banyak adalah kerugian tunggal yang terlalu kecil. Perlu diuji untuk menentukan parameter optimal.

  4. Ada risiko bahwa parameter grid yang disesuaikan secara otomatis dapat dimanipulasi. Perhitungan parameter grid bergantung pada jumlah garis K tertentu, yang mungkin dipengaruhi oleh operasi jangka pendek.

Arah optimasi

  1. Menambahkan logika stop loss, seperti pengaturan floating stop loss atau tracking stop loss, untuk lebih mengontrol risiko kerugian unilateral.

  2. Algoritma yang ditambahkan untuk mengoptimalkan parameter grid. Anda dapat menguji pengaturan parameter pada tahap pasar yang berbeda, dan kemudian melatih model dengan metode pembelajaran mesin untuk mengoptimalkan parameter secara otomatis.

  3. Perhitungan dengan indikator lain seperti MACD, KD, dan lain-lain, apakah saat ini sedang naik atau turun, untuk menyesuaikan jumlah atau parameter grid.

  4. Mengoptimalkan pengendalian penarikan seperti menetapkan rasio penarikan maksimum, dan menutup strategi ketika mencapai titik terendah, untuk menghindari kerugian yang lebih luas.

Meringkaskan

Strategi ini memanfaatkan sepenuhnya karakteristik situasi yang bergejolak, dan mencapai tujuan keuntungan yang stabil melalui perdagangan grid dinamis. Strategi ini mempertimbangkan fleksibilitas pengaturan parameter dan mengurangi intensitas kerja operasi. Dapat dikatakan bahwa dalam situasi yang bergejolak, strategi ini adalah pilihan keuntungan yang ideal.

Kode Sumber Strategi
/*backtest
start: 2024-01-02 00:00:00
end: 2024-02-01 00:00:00
period: 1h
basePeriod: 15m
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)