Strategi Perdagangan Grid Teori Lautan


Tarikh penciptaan: 2023-10-13 17:07:39 Akhirnya diubah suai: 2023-10-13 17:07:39
Salin: 0 Bilangan klik: 787
1
fokus pada
1617
Pengikut

Gambaran keseluruhan

Strategi ini menggunakan kaedah perdagangan grid dalam teori lautan, dalam julat harga yang ditetapkan, garisan grid yang diedarkan secara seragam, membeli dan menjual operasi berdasarkan hubungan harga dengan garisan grid. Strategi ini mempunyai ciri-ciri seperti julat harga grid yang dikira secara automatik, garisan grid yang diedarkan secara seragam, dan lain-lain, yang dapat mengawal risiko dengan berkesan.

Prinsip Strategi

Strategi ini pertama-tama mengira had atas dan bawah grid harga berdasarkan pilihan atau tetapan lalai pengguna, iaitu harga tertinggi dan terendah dalam grid. Terdapat dua cara pengiraan, satu adalah mencari harga tertinggi dan terendah dalam kitaran pengukuran semula, dan kedua adalah mengira garis rata-rata untuk kitaran tertentu.

Penciptaan isyarat perdagangan bergantung pada hubungan antara harga dan garisan grid. Apabila harga berada di bawah garisan grid di bawahnya, anda boleh membuat banyak kedudukan di garisan grid itu dengan jumlah tetap; apabila harga lebih tinggi daripada garisan grid di atasnya, anda boleh meletakkan jumlah tetap di garisan grid itu.

Secara khusus, strategi mengekalkan satu baris grid harga array dan satu baris bol array yang menyatakan sama ada setiap baris grid mempunyai dagangan terikat. Apabila harga lebih rendah daripada satu baris grid dan garisan itu tidak mempunyai dagangan terikat, harga di garisan itu lebih banyak; apabila harga lebih tinggi daripada satu baris grid dan garisan grid di bawahnya mempunyai dagangan terikat, garisan grid di bawahnya diratakan. Dengan cara ini, perdagangan grid dapat dilakukan.

Kelebihan Strategik

  1. Mengira jarak grid secara automatik, mengelakkan kesukaran untuk menetapkannya secara manual.

  2. Garis grid yang diedarkan secara merata, mengelakkan kepekatan grid yang menyebabkan perdagangan berlebihan.

  3. Menggunakan kaedah perdagangan grid, risiko dapat dikawal dengan berkesan, dan turun naik harga di dalam grid dapat menghasilkan keuntungan.

  4. Tidak ada arah harga yang dijangkakan, berlaku untuk keadaan gegaran.

  5. Kadar bayaran dan nombor kedudukan boleh disesuaikan untuk pelbagai jenis transaksi.

  6. Garis grid yang dipaparkan secara visual, memudahkan untuk mengetahui keadaan transaksi.

Risiko Strategik

  1. RISIKO BREAKING GRID RISIKO BREAKING GRID RISIKO BREAKING GRID RISIKO BREAKING GRID RISIKO BREAKING GRID RISIKO BREAKING GRID RISIKO BREAKING GRID RISIKO BREAKING GRID RISIKO BREAKING GRID RISIKO BREAKING GRID RISIKO BREAKING GRID RISIKO BREAKING GRID RISIKO BREAKING GRID RISIKO BREAKING GRID RISIKO BREAKING GRID RISIKO BREAKING GRID RISIKO BREAKING GRID RISIKO BREAKING GRID RISIKO BREAKING GRID RISIKO BREAKING GRID RISIKO BREAKING GRID RISIKO RISIKO BREAKING GRID RISIKO RISIKO RISIKO RISIKO RISIKO RISIKO RISIKO RISK

  2. Risiko jarak grid yang terlalu longgar. Garis grid yang terlalu lebar tidak menguntungkan, tetapi terlalu sempit akan meningkatkan bayaran. Perlu diimbangi.

  3. Risiko terlalu lama memegang jawatan. Ia sukar untuk mendapatkan keuntungan tetapi meningkatkan kerugian bayaran.

  4. Pengaturan parameter yang tidak betul berisiko. Pengaturan parameter yang tidak betul, seperti kitaran pengukuran semula atau kitaran garis rata-rata, akan menjejaskan pengiraan jarak grid.

  5. Risiko Sistemik Pasaran: Strategi ini lebih sesuai untuk keadaan yang bergolak dan tidak sesuai untuk keadaan yang bersendirian dalam jangka masa yang panjang.

Pengoptimuman Strategi

  1. Tetapan parameter grid yang dioptimumkan. Faktor-faktor seperti ciri-ciri pasaran, kos urus niaga, jumlah grid yang dioptimumkan, kitaran pengukuran semula dan lain-lain.

  2. Pengesuaian dinamik antara grid. Apabila terdapat perubahan besar dalam pasaran, mekanisme untuk menyesuaikan secara dinamik antara grid boleh diperkenalkan.

  3. Masukkan mekanisme hentian kerugian. Tetapkan garis hentian yang munasabah untuk mengelakkan kerugian yang terlalu besar. Garis hentian kerugian juga boleh disesuaikan secara dinamik.

  4. Berpasangan dengan penapis indikator lain. Seperti garis Brin, trend indicator, dan lain-lain, untuk mengelakkan perdagangan yang tidak sesuai.

  5. Mengoptimumkan kecekapan penggunaan dana. Menambah analisis panas dan sejuk, mengurangkan dagangan apabila turun naik lebih rendah.

ringkaskan

Strategi ini menggunakan prinsip perdagangan grid, untuk mewujudkan perdagangan keadaan bergolak yang boleh dikawal risiko. Strategi ini mempunyai kelebihan seperti grid pengiraan automatik, grid pengedaran seragam, dan dapat menyesuaikan parameter dengan keadaan pasaran yang berbeza. Risiko boleh dikawal dan mudah dikendalikan. Tetapi strategi ini juga mempunyai beberapa batasan, yang memerlukan pengoptimuman berterusan untuk menyesuaikan diri dengan perubahan pasaran.

Kod sumber strategi
/*backtest
start: 2023-09-12 00:00:00
end: 2023-10-12 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
strategy.initial_capital = 50000
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

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)