
Ini adalah strategi perdagangan grid dinamik yang beradaptasi dengan banyak ruang yang ditulis berdasarkan Pine Script. Gagasan utama strategi ini adalah untuk mengira secara automatik batas atas dan bawah grid berdasarkan harga tinggi dan rendah terkini atau purata bergerak mudah, dan kemudian membahagikan julat itu ke dalam beberapa garis grid. Apabila harga menyentuh garis grid tertentu, ia akan membuka atau menutup posisi di tempat itu. Dengan cara ini, strategi dapat terus membuka dan menutup posisi dalam keadaan gegaran dan memperoleh keuntungan dari perbezaan harga.
Mengira garisan atas bawah. Berdasarkan pilihan pengguna, garisan atas bawah boleh berdasarkan titik tertinggi dan terendah garisan N-root K yang paling dekat, dan boleh diset untuk memperbesar atau mengecilkan peratusan; juga boleh berdasarkan purata bergerak mudah dari harga penutupan garisan N-root K yang paling dekat, dan diset untuk peratusan penyimpangan atas bawah.
Menjana array garisan gred. Dengan membahagikan julat grid secara purata mengikut bilangan garisan gred yang ditetapkan, menghasilkan array garisan gred yang sesuai dengan harga.
Masuk/menambah kedudukan. Melalui garisan grid dari bawah ke atas, jika harga penutupan semasa lebih rendah daripada harga garisan grid dan garisan grid itu belum memegang kedudukan, maka bukalah lebih banyak pilihan di tempat itu.
Keluar/menurunkan kedudukan. Melalui garisan grid dari atas ke bawah, jika harga penutupan semasa lebih besar daripada harga garisan grid dan garisan grid yang lebih rendah mempunyai kedudukan, maka melonggarkan banyak pesanan garisan grid yang lebih rendah.
Penyesuaian dinamik. Jika anda memilih fungsi grid dinamik, setiap baris K akan mengira semula garis atas dan bawah grid dan baris grid, yang membolehkan grid dapat menyesuaikan diri dengan perubahan keadaan.
Adaptif. Strategi perdagangan grid dapat menyesuaikan diri dengan keadaan gegaran dan tren. Dalam keadaan gegaran, strategi grid dapat terus membuka kedudukan rendah, mendapatkan perbezaan harga; Dalam keadaan trend, kerana grid mengikuti pergerakan harga, juga dapat mengekalkan kedudukan tertentu, mendapatkan keuntungan trend.
Risiko boleh dikawal. Saiz kedudukan setiap kali membuka kedudukan ditentukan oleh jumlah grid yang ditetapkan, lubang risiko tunggal adalah kecil dan boleh dikawal. Pada masa yang sama, kerana harga akan mendapat keuntungan apabila menyentuh garisan grid di atas, juga melindungi kerugian yang berpotensi.
Automasi yang tinggi. Strategi ini boleh beroperasi secara automatik dan tidak memerlukan intervensi manusia, sesuai untuk pelabur yang memerlukan pulangan yang stabil dan jangka panjang.
Parameter Fleksibel. Pengguna boleh menyesuaikan jumlah garisan grid, parameter grid dinamik dan lain-lain mengikut ciri pasaran untuk mengoptimumkan prestasi strategi.
Risiko Swan Hitam. Jika berlaku kejatuhan harga yang melampau, harga akan melonjak ke bawah garis grid terendah, strategi ini akan penuh dan menghadapi penarikan balik yang lebih besar. Untuk mengurangkan risiko ini, anda boleh menetapkan syarat-syarat berhenti kehilangan, apabila kerugian mencapai nilai rendah, semua kedudukan kosong.
Tetapan parameter grid yang tidak betul. Jika grid terlalu besar, perbezaan harga setiap kali membuka kedudukan kosong akan sangat kecil, dan caj boleh memusnahkan sebahagian besar hasil. Jika grid terlalu lebar, nisbah membuka kedudukan sekali adalah tinggi, dan jurang risiko besar.
Risiko perbezaan asas. Strategi ini adalah berdasarkan harga semasa yang ditetapkan untuk membuka kedudukan terbuka. Dalam pasaran seperti niaga hadapan, jika harga kontrak dan harga yang ditetapkan berbeza dengan harga yang besar, harga pembukaan kedudukan terbuka sebenarnya mungkin lebih jauh daripada yang diharapkan.
Menambah penapis trend. Strategi grid tidak berfungsi dengan baik dalam keadaan trend unilateral. Indikator trend boleh dimasukkan sebagai penapis, seperti menyalakan grid hanya apabila ADX berada di bawah paras tertentu, dan menutup grid apabila trend jelas, hanya memegang kedudukan unilateral.
Optimasi isyarat. Isyarat lain boleh diletakkan di atas dasar grid, seperti grid + garis rata-rata, iaitu, grid memutuskan untuk membuka kedudukan kosong, tetapi apabila harga melintasi garis rata-rata, ia akan dibuka.
Pengurusan kedudukan. Setiap kedudukan dalam strategi semasa adalah tetap, dan boleh ditetapkan apabila harga jauh dari harga purata pasaran, untuk menurunkan setiap kedudukan, dan meningkatkan kedudukan apabila mendekati harga purata pasaran, untuk meningkatkan kecekapan penggunaan dana.
Ketumpatan grid yang menyesuaikan diri. Mengubah ketumpatan grid secara dinamik mengikut kadar turun naik harga. Apabila kadar turun naiknya tinggi, jumlah grid dapat ditingkatkan dengan sewajarnya, dan apabila kadar turun naiknya rendah, jumlah grid dapat dikurangkan.
Strategi ini adalah strategi kuantitatif jangka panjang yang kuat dengan menyesuaikan diri dengan grid dinamik, dapat mengambil keuntungan dari harga yang rendah dalam keadaan goyah, dan dapat mengekalkan arah celah tertentu dalam keadaan trend. Strategi ini adalah strategi kuantitatif jangka panjang yang kuat. Dengan logik pemicu dan pengurusan kedudukan grid yang ditetapkan dengan munasabah, keuntungan yang stabil dapat dicapai. Tetapi perlu memberi perhatian kepada pergerakan yang melampau dan risiko kenaikan harga, yang memerlukan pembentukan keadaan berhenti yang sesuai untuk mengawal.
// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © jcloyd
//@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)