Trend Grid Dinamik Mengikuti Strategi Perdagangan Kuantitatif


Tarikh penciptaan: 2024-03-22 16:03:09 Akhirnya diubah suai: 2024-03-22 16:03:09
Salin: 0 Bilangan klik: 1231
1
fokus pada
1617
Pengikut

Trend Grid Dinamik Mengikuti Strategi Perdagangan Kuantitatif

Gambaran keseluruhan

Ini adalah strategi perdagangan kuantitatif yang mengesan trend grid dinamik yang canggih. Gagasan utama strategi ini adalah untuk memisahkan beberapa garisan grid dalam julat harga yang ditetapkan sebelumnya dan secara automatik membuat pembelian atau penjualan garisan ketika harga menyentuh garisan grid, sehingga mendapat keuntungan dalam keadaan goyah. Strategi ini juga mempunyai fungsi untuk menyesuaikan kedudukan garisan grid secara dinamik, yang dapat mengoptimumkan susunan grid secara beradaptasi dengan pergerakan harga terkini.

Prinsip Strategi

Prinsip-prinsip utama strategi ini ialah:

  1. Pertama, sempadan atas dan bawah grid dan bilangan garisan grid ditentukan berdasarkan tetapan pengguna. Sempadan boleh menjadi nilai tetap, atau boleh dikira secara automatik berdasarkan titik tinggi atau rendah terkini atau purata bergerak.

  2. Di dalam sempadan yang ditetapkan, bahagian harga dibahagikan kepada beberapa grid. Setiap garisan grid sesuai dengan harga yang dibeli atau dijual.

  3. Apabila setiap harga menyentuh garisan grid, strategi akan memeriksa sama ada telah memegang kedudukan yang sepadan dengan garisan grid tersebut. Jika tidak ada, ia akan membeli, dan jika ada, ia akan menjual.

  4. Dengan menjual pada harga yang agak tinggi dan membeli pada harga yang rendah, strategi ini dapat terus mendapat keuntungan ketika harga turun naik.

  5. Pada masa yang sama, jika pengguna mengaktifkan fungsi penyesuaian sempadan automatik, kedudukan garisan akan disesuaikan secara automatik mengikut titik tinggi dan rendah harga baru-baru ini atau purata bergerak yang ditetapkan untuk mengoptimumkan susun atur grid.

Melalui prinsip di atas, strategi ini dapat mewujudkan pembelian dan penjualan rendah secara automatik dalam keadaan harga yang bergolak, dan menyesuaikan kedudukan keuntungan mengikut trend, sehingga meningkatkan pendapatan keseluruhan.

Analisis kelebihan

Strategi grid dinamik ini mempunyai kelebihan berikut:

  1. Adaptif. Ia boleh menyesuaikan diri dengan pasaran dan varieti yang berbeza melalui tetapan parameter. Ia mempunyai adaptasi yang baik terhadap keadaan gegaran.

  2. Tingkat automasi yang tinggi. Oleh kerana strategi ini berdasarkan logik matematik yang ketat, titik kedudukan yang jelas untuk meletakkan dan melonggarkan kedudukan, perdagangan yang sepenuhnya automatik dapat dicapai dan gangguan emosi subjektif dapat dikurangkan.

  3. Risiko boleh dikawal. Dengan menetapkan parameter seperti bilangan grid, sempadan grid, dan lain-lain, anda boleh mengawal risiko setiap transaksi dengan berkesan, sehingga mengekalkan risiko keseluruhan dalam julat yang boleh diterima.

  4. Kebolehan beradaptasi trend. Strategi ini mempunyai fungsi untuk menyesuaikan secara dinamik sempadan grid, yang membolehkan grid mengikuti trend harga dan mengoptimumkannya, meningkatkan keuntungan dalam keadaan trend.

  5. Pemenangannya stabil. Oleh kerana perdagangan grid secara semula jadi sering naik dan turun dalam turun naik harga, strategi ini dapat terus mendapat keuntungan selagi harga bergolak, dan oleh itu mempunyai kadar kemenangan yang tinggi dalam jangka panjang.

Analisis risiko

Walaupun terdapat kelebihan yang jelas dalam strategi ini, ia juga mempunyai risiko:

  1. Risiko Trend. Jika harga mengalami trend unilateral yang kuat yang melanggar sempadan grid, ruang keuntungan untuk strategi ini akan terhad dan mungkin menghadapi penarikan balik yang lebih besar.

  2. Kesukaran pengoptimuman parameter tinggi. Strategi ini mempunyai banyak parameter, termasuk bilangan grid, sempadan awal, parameter sempadan dinamik, dan lain-lain. Kombinasi parameter yang berbeza memberi kesan besar terhadap prestasi strategi, dan kesukaran pengoptimuman yang sebenarnya tidak kecil.

  3. Strategi grid pada asasnya adalah strategi frekuensi tinggi, dengan kedudukan terhad yang sangat kerap, yang bermaksud kos dagangan yang lebih tinggi dan potensi risiko slippage.

  4. Strategi ini sangat bergantung kepada pergerakan pergerakan yang bergolak, dan kemungkinan besar akan mengalami pengunduran yang lebih besar sekiranya harga memasuki trend unilateral yang cepat.

Untuk menghadapi risiko ini, penambahbaikan boleh dilakukan dengan cara berikut: menambahkan indikator penghakiman trend sebagai syarat penapisan untuk memulakan strategi, mengoptimumkan ruang dan kaedah carian parameter, memperkenalkan pengurusan wang dan logik kawalan kedudukan, menambah logik pemecahan kedudukan yang seimbang. Dengan pengoptimuman ini, anda dapat meningkatkan lagi kehandalan dan keuntungan strategi tersebut.

Arah pengoptimuman

Berdasarkan analisis di atas, strategi ini boleh dioptimumkan untuk:

  1. Memperkenalkan syarat penapisan trend. Menambah indikator penghakiman trend, seperti purata bergerak, ADX dan lain-lain sebelum memulakan strategi, hanya memulakan strategi dalam keadaan gegaran, dan dalam keadaan trend, terus berjaga-jaga, sehingga dapat mengelakkan risiko penarikan balik dalam keadaan trend.

  2. Pencarian parameter optimum. Menggunakan algoritma pintar untuk mengoptimumkan parameter grid, seperti algoritma genetik, algoritma kumpulan zarah, dan lain-lain, untuk mencari kombinasi parameter yang optimum secara automatik, meningkatkan kecekapan dan kualiti pengoptimuman.

  3. Peningkatan logik kawalan risiko. Menambah lebih banyak logik kawalan risiko dalam strategi, seperti menyesuaikan lebar grid mengikut pergerakan kadar turun naik harga secara dinamik, menetapkan nilai had maksimum untuk menarik balik yang mencetuskan kedudukan rata, dan sebagainya, untuk mengawal risiko dengan lebih baik.

  4. Memperkenalkan terhenti trend. Menetapkan trend untuk menembusi garis berhenti, seperti sempadan grid dalam peratusan tertentu, dan apabila harga menembusi garis berhenti, ia akan berada di kedudukan yang rata, untuk mengelakkan pengunduran besar dalam keadaan trend.

  5. Optimumkan pelaksanaan transaksi. Mengoptimumkan bahagian pelaksanaan transaksi, seperti menggunakan senarai syarat dan algoritma pesanan yang lebih maju, mengurangkan frekuensi dan kos transaksi, meningkatkan kecekapan pelaksanaan.

Dengan pengoptimuman ini, anda dapat meningkatkan fleksibiliti, ketahanan dan keuntungan strategi secara menyeluruh, menjadikannya lebih dekat dengan keperluan lapangan.

ringkaskan

Secara keseluruhan, strategi penjejakan trend grid dinamik adalah strategi perdagangan frekuensi menengah dan tinggi yang berdasarkan prinsip perdagangan grid, serta menggabungkan mekanisme penyesuaian dinamik dan penyesuaian trend. Kelebihannya adalah adaptasi yang kuat, tahap automasi yang tinggi, risiko yang boleh dikawal, penyesuaian trend yang baik, kestabilan kemenangan, dan lain-lain, tetapi juga terdapat risiko yang kuat seperti risiko trend, kesukaran pengoptimuman parameter, perdagangan yang kerap, dan ketergantungan pada keadaan perdagangan. Untuk menangani masalah ini, anda boleh memperbaiki dan meningkatkan prestasi keseluruhan strategi dari segi penapisan trend, pengoptimuman parameter, penguatan kawalan risiko, penghentian trend, pengoptimuman perdagangan.

Idea perdagangan grid itu sendiri adalah kaedah kuantiti yang agak matang dan praktikal, dan kelebihan perdagangan grid klasik telah diperluaskan dan dikembangkan melalui penambahan mekanisme pengoptimuman dinamik dan penyesuaian trend dalam strategi tersebut. Ia menawarkan idea dan kemungkinan perdagangan kuantitatif baru kepada pelabur dalam keadaan yang bergolak.

Kod sumber strategi
/*backtest
start: 2024-03-01 00:00:00
end: 2024-03-21 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)