Strategi arbitraj mata wang kripto adaptif berdasarkan perdagangan grid


Tarikh penciptaan: 2024-01-19 14:17:50 Akhirnya diubah suai: 2024-01-19 14:17:50
Salin: 1 Bilangan klik: 1123
1
fokus pada
1617
Pengikut

Strategi arbitraj mata wang kripto adaptif berdasarkan perdagangan grid

Gambaran keseluruhan

Strategi ini adalah strategi arbitraj cryptocurrency yang menyesuaikan diri berdasarkan konsep perdagangan grid. Ia dapat menyesuaikan secara automatik julat harga perdagangan grid mengikut turun naik pasaran, dan melakukan perdagangan yang sangat efisien dalam julat harga tersebut.

Prinsip Strategi

Strategi ini berpusat pada:

  1. Dinamika mengira julat harga grid dagangan berdasarkan harga tinggi dan rendah sejarah.

  2. Dalam julat harga ini, N garisan grid perdagangan ditetapkan pada jarak yang sama.

  3. Apabila harga menembusi setiap garisan grid, anda boleh melakukan over atau under dengan jumlah tetap.

  4. Arbitrage dilakukan di antara garisan yang berdekatan, dan selepas keuntungan, ia dipadamkan.

  5. Apabila harga kembali ke dalam julat grid, teruskan untuk membuka kedudukan pada harga kos marginal garisan grid.

  6. Dengan cara ini, anda boleh melakukan perdagangan lelang dengan frekuensi tinggi dalam harga grid.

Secara khusus, strategi pertama mengira harga grid secara real-time berdasarkan parameter tetingkap lihat kembali ((i_boundLookback) dan rentang turun naik ((i_boundDev)) yang dikonfigurasi.

Kemudian N garisan grid dipisahkan antara had atas dan bawah ((i_gridQty). Harga garisan grid ini disimpan ke dalam matriks gridLineArr.

Apabila harga menembusi satu garisan grid, ia akan mengambil kedudukan lebih atau lebih rendah dengan jumlah tetap ((strategy capital divided by the number of grids)). Pesanan ini dicatatkan dalam array orderArr.

Apabila harga menembusi garisan grid yang berdekatan sekali lagi, anda boleh menyamai keuntungan dengan pesanan sebelumnya, dan mendapat kedudukan imbang.

Oleh itu, ia berputar-putar dan melakukan arbitraj frekuensi tinggi di bawah pergerakan harga.

Analisis kelebihan

Kelebihan terbesar strategi ini berbanding strategi grid tradisional adalah bahawa julat grid disesuaikan secara automatik dan dapat menyesuaikan diri dengan turun naik pasaran. Ia mempunyai ciri-ciri berikut:

  1. Pengaturan automatik, tanpa campur tangan manusia.

  2. Ia boleh menangkap trend harga dan berdagang mengikut arah trend.

  3. Ia boleh dikawal dan mengelakkan serangan.

  4. Ia mempunyai frekuensi dagangan yang tinggi dan kadar keuntungan yang tinggi.

  5. Mudah difahami, mudah diatur.

  6. Ia mempunyai kadar penggunaan yang tinggi dan tidak mudah terjebak.

  7. Menerangkan perubahan pasaran dalam masa nyata, sesuai untuk perdagangan robot.

Analisis risiko

Walaupun terdapat banyak kelebihan, strategi ini juga mempunyai risiko, yang tertumpu kepada:

  1. Ia boleh menyebabkan kerugian yang lebih besar apabila harga berubah-ubah.

  2. Masa pegangan dan pasangan dagangan yang sesuai diperlukan untuk mencapai keuntungan.

  3. Kaedah ini perlu dipertimbangkan dengan teliti untuk mengukur saiz dana dan jangkauan turun naiknya.

  4. Parameter mungkin perlu dipantau dan dioptimumkan secara kerap untuk memastikan ia berfungsi dengan baik.

Langkah-langkah yang diambil termasuk:

  1. Meningkatkan jarak antara grid dan meluaskan ruang lingkup grid.

  2. Pilih pasangan dagangan yang lebih stabil.

  3. Menyesuaikan saiz dana untuk memastikan kebolehliruan yang mencukupi.

  4. Menubuhkan mekanisme pengawasan dan isyarat automatik.

Arah pengoptimuman

Strategi ini boleh dioptimumkan dalam beberapa aspek:

  1. Grid dinamik: Parameter grid boleh disesuaikan secara automatik mengikut turun naik pasangan dagangan.

  2. Pencegahan kerosakanIa juga boleh menyebabkan kemerosotan yang lebih besar dalam kes-kes yang berkaitan dengan pembiayaan.

  3. Rangkaian komposit: Kombinasi grid menggunakan parameter yang berbeza dalam tempoh masa yang berbeza, untuk mencapai pengulangan masa.

  4. Pembelajaran Mesin: Menggunakan peraturan alternatif seperti rangkaian saraf untuk mencapai optimasi parameter secara automatik.

  5. Arbitraj merentas pasaranPerdagangan Arbitrage: Perdagangan Arbitrage antara pertukaran atau antara pasangan mata wang.

ringkaskan

Strategi ini secara keseluruhan merupakan strategi penarikan grid cryptocurrency yang sangat praktikal. Berbanding dengan strategi grid tradisional, ciri utamanya adalah bahawa julat grid disesuaikan secara automatik, dan anda boleh menyesuaikan ruang perdagangan anda sendiri mengikut perubahan pasaran.

Kod sumber strategi
/*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)