Strategi Perdagangan Jaringan Cerdas Adaptif


Tanggal Pembuatan: 2024-01-16 14:51:48 Akhirnya memodifikasi: 2024-01-16 14:51:48
menyalin: 1 Jumlah klik: 985
1
fokus pada
1617
Pengikut

Strategi Perdagangan Jaringan Cerdas Adaptif

Ringkasan

Strategi ini adalah strategi perdagangan grid cerdas adaptif yang berbasis pada platform TradingView, ditulis menggunakan Pine Script v4. Strategi ini dilapisi pada tabel harga dan menciptakan grid dalam kisaran yang ditentukan untuk menghasilkan sinyal beli dan jual.

Prinsip Strategi

Fungsi utama

  1. Bentuk piramida dan pengelolaan dana:

    • Di sini, Anda dapat melihat gambar-gambar yang diunggah di situs-situs sosial seperti Facebook, Twitter, dan Twitter.
    • Dengan menggunakan strategi berbasis uang tunai untuk mengelola ukuran posisi, perusahaan dapat memperluas jangkauannya.
    • Untuk tujuan simulasi, modal awal ditetapkan sebesar US\(100, dan modal awal ditetapkan sebesar US\)100.
    • Setiap transaksi dikenai komisi sebesar 0.1%.
  2. Jangkauan grid:

    • Pengguna dapat memilih untuk menggunakan kisaran yang dihitung secara otomatis atau mengatur batas atas dan bawah grid secara manual.
    • Rentang otomatis dapat diambil dari harga tertinggi dan terendah terbaru atau dari rata-rata bergerak sederhana (SMA).
    • Pengguna dapat mendefinisikan periode revisi untuk menghitung kisaran, dan menyesuaikan bias untuk memperluas atau memperkecil kisaran.
  3. Garis kisi:

    • Kebijakan ini memungkinkan jumlah baris grid yang dapat disesuaikan dalam kisaran, dengan rekomendasi kisaran antara 3 dan 15.
    • Garis grid adalah jarak yang sama antara batas atas dan bawah.

Logika Strategi

  • Posisi yang dimiliki:

    • Jika harga jatuh di bawah garis grid dan tidak ada pesanan belum ternegosiasi yang terkait dengan garis grid, maka skrip akan melakukan pembelian, dan kemudian akan melakukan pembayaran.
    • Jumlah setiap pembelian dihitung berdasarkan modal awal dibagi dengan jumlah baris grid, dan disesuaikan dengan harga saat ini.
  • Keluar dari Posisi:

    • Sinyal jual akan dipicu ketika harga naik melebihi garis grid yang lebih tinggi dan ada pesanan yang belum terpecahkan yang terkait dengan garis grid yang lebih rendah berikutnya.
  • Adaptasi Jaringan:

    • Jika menggunakan auto-range, grid akan beradaptasi dengan kondisi pasar yang berubah dengan menghitung ulang batas atas dan bawah dan menyesuaikan dengan kondisi pasar yang berubah.

Analisis Keunggulan

Strategi ini mengintegrasikan keuntungan dari sistematisasi dan pelaksanaan yang efisien dari perdagangan grid. Mengizinkan penambahan dan penggunaan manajemen dana, yang dapat mengontrol risiko secara efektif. Jaringan secara otomatis beradaptasi dengan pasar, yang berlaku untuk situasi yang berbeda. Parameter dapat disesuaikan, yang sesuai dengan gaya perdagangan yang berbeda.

Analisis risiko

Jika harga menembus batas bawah di atas grid, kemungkinan besar akan menyebabkan kerugian yang lebih besar. Parameter harus disesuaikan dengan tepat, atau digabungkan dengan stop loss untuk mengendalikan risiko. Selain itu, terlalu sering berdagang akan meningkatkan biaya transaksi.

Arah optimasi

Anda dapat mempertimbangkan untuk memfilter sinyal indikator tren atau mengoptimalkan parameter grid, atau mencegah risiko ekstremitas dengan menghentikan kerugian.

Meringkaskan

Strategi ini secara sistematis menghasilkan titik jual beli dan mengelola posisi, dapat disesuaikan dengan preferensi yang berbeda melalui penyesuaian parameter. Ini menggabungkan secara organik regulasi perdagangan grid dengan fleksibilitas perdagangan tren, mengurangi kesulitan operasi dan memiliki toleransi kesalahan tertentu.

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