Ini adalah strategi perdagangan grid dinamik adaptif pendek dan panjang berdasarkan Pine Script. Idea utama strategi ini adalah untuk mengira secara automatik had atas dan bawah grid berdasarkan harga tertinggi dan terendah baru-baru ini atau purata bergerak mudah, dan kemudian membahagikan julat ini secara merata ke dalam beberapa garis grid. Apabila harga mencapai garis grid tertentu, ia akan membuka kedudukan panjang atau menutup kedudukan di tahap itu. Dengan cara ini, strategi dapat terus membuka dan menutup kedudukan di pasaran julat untuk menangkap penyebaran harga. Pada masa yang sama, dengan menyesuaikan sempadan grid secara dinamik, ia juga dapat menyesuaikan diri dengan trend pasaran yang berbeza.
Mengira sempadan grid. Berdasarkan pilihan pengguna, sempadan boleh dikira dari titik tertinggi dan terendah N lilin baru-baru ini, dengan pilihan untuk memperluaskan atau menyempitkan julat dengan peratusan; atau mereka boleh berdasarkan purata bergerak mudah harga penutupan N lilin baru-baru ini, dengan pilihan untuk menetapkan nisbah penyimpangan ke atas dan ke bawah.
Menghasilkan barisan garis grid. Menurut bilangan barisan grid yang ditetapkan, membahagikan julat grid secara merata untuk menghasilkan barisan harga garis grid.
Pendaftaran / Tambah kedudukan. Melalui garis grid dari bawah ke atas. Jika harga penutupan semasa adalah kurang daripada harga garis grid dan tidak ada kedudukan pada garis grid itu, maka buka kedudukan panjang di tahap itu. Dengan cara ini, apabila harga mencapai garis grid yang lebih tinggi, ia akan terus menambah kedudukan.
Keluar / Kurangkan kedudukan. Melalui garis grid dari atas ke bawah. Jika harga penutupan semasa lebih besar daripada harga garis grid dan terdapat kedudukan pada garis grid di bawah, kemudian tutup kedudukan panjang pada garis grid bawah. Dengan cara ini, apabila harga jatuh kembali, ia akan terus mengurangkan kedudukan.
Penyesuaian dinamik: Jika fungsi grid dinamik dipilih, sempadan atas dan bawah grid dan susunan garis grid akan dikira semula pada setiap lilin, supaya grid dapat sentiasa menyesuaikan diri dengan perubahan pasaran.
Keupayaan beradaptasi yang kuat. Strategi perdagangan grid boleh menyesuaikan diri dengan kedua-dua pasaran jangkauan dan tren. Di pasaran jangkauan, strategi grid dapat terus membuka dan menutup kedudukan untuk mendapatkan spread harga; di pasaran tren, kerana grid mengikuti pergerakan harga, ia juga dapat mengekalkan kedudukan tertentu untuk mendapatkan keuntungan trend.
Risiko yang boleh dikawal. Saiz kedudukan setiap pembukaan ditentukan oleh bilangan grid yang ditetapkan, jadi pendedahan risiko tunggal adalah kecil dan boleh dikawal. Pada masa yang sama, kerana mencapai garis grid atas akan menutup kedudukan untuk keuntungan, ia juga melindungi potensi kerugian hingga tahap tertentu.
Tahap automasi yang tinggi. Strategi ini pada dasarnya boleh berjalan sepenuhnya secara automatik tanpa campur tangan manual, yang sesuai untuk pelabur yang memerlukan pulangan stabil jangka panjang.
Parameter fleksibel. Pengguna boleh menetapkan bilangan garis grid, parameter grid dinamik, dan lain-lain dengan fleksibel mengikut ciri pasaran untuk mengoptimumkan prestasi strategi.
Risiko angsa hitam. Dalam kes kejatuhan pasaran yang melampau, jika harga secara langsung jurang ke bawah garisan grid terendah, strategi akan penuh kedudukan dan menghadapi penarikan yang lebih besar. Untuk mengurangkan risiko ini, syarat stop-loss boleh ditetapkan untuk menutup semua kedudukan sebaik sahaja kerugian mencapai ambang.
Tetapan parameter grid yang tidak betul. Jika ketumpatan grid terlalu tinggi, penyebaran setiap bukaan dan penutupan akan sangat kecil, dan kos transaksi mungkin mengikis sebahagian besar keuntungan. Jika lebar grid terlalu besar, nisbah pembukaan sekali adalah tinggi dan pendedahan risiko adalah besar. Ciri-ciri aset asas perlu dinilai dengan teliti untuk memilih parameter grid yang sesuai.
Risiko asas. Strategi ini menetapkan syarat pembukaan dan penutupan berdasarkan harga semasa. Dalam pasaran seperti niaga hadapan, jika harga kontrak berbeza dengan harga asas, harga pembukaan dan penutupan sebenar mungkin menyimpang dengan ketara dari jangkaan.
Tambah penapis trend. Strategi grid tidak berfungsi dengan baik di pasaran trend satu hala. Penunjuk trend boleh ditambah sebagai penapis, seperti hanya membolehkan grid apabila ADX berada di bawah ambang, dan menutup grid apabila trend jelas, hanya memegang kedudukan satu hala.
Optimumkan isyarat. Isyarat lain boleh ditempatkan di atas asas grid, seperti grid + purata bergerak, iaitu, pembukaan dan penutupan terutamanya ditentukan oleh grid, tetapi hanya membuka kedudukan apabila harga melintasi purata bergerak tertentu, jika tidak, jangan membuka kedudukan. Ini dapat mengurangkan kos pembukaan dan penutupan yang kerap.
Pengurusan kedudukan. Pada masa ini, kedudukan setiap grid dalam strategi tetap. Ia boleh ditetapkan untuk mengurangkan kedudukan setiap grid dengan sewajarnya apabila harga jauh dari harga purata pasaran, dan meningkatkan kedudukan apabila ia dekat dengan harga purata pasaran untuk meningkatkan kecekapan penggunaan modal.
Ketumpatan grid adaptif. Sesuaikan ketumpatan grid secara dinamik mengikut turun naik harga. Apabila turun naiknya tinggi, bilangan grid boleh ditingkatkan dengan sewajarnya; apabila turun naiknya rendah, bilangan grid boleh dikurangkan. Ini dapat mengoptimumkan lebar grid dan meningkatkan penggunaan modal.
Melalui grid dinamik adaptif, strategi ini sering membuka dan menutup kedudukan untuk memperoleh spread harga di pasaran jangkauan, dan juga dapat mengekalkan tahap tertentu arah pendedahan di pasaran trend untuk mendapatkan keuntungan trend. Ini adalah strategi kuantitatif jangka pertengahan hingga panjang dengan daya adaptasi yang kuat. Dengan menetapkan grid yang memicu logik dan pengurusan kedudukan dengan munasabah, pulangan yang stabil dapat dicapai. Walau bagaimanapun, perlu memberi perhatian kepada risiko keadaan pasaran yang melampau dan jurang harga, yang memerlukan menetapkan keadaan stop-loss yang sesuai untuk dikawal. Di samping itu, terdapat ruang untuk pengoptimuman dalam penetapan parameter dan pengurusan risiko. Kekuatan dan keuntungan strategi dapat ditingkatkan dengan memperkenalkan penapisan trend, superposisi isyarat, pengurusan kedudukan, ketumpatan grid adaptif dan cara lain. Ringkasnya, berdasarkan logik asas grid, strategi ini menggabungkan mekanisme adaptif, yang dapat memberikan rujukan kuantitatif dan idea jangka pertengahan untuk pelabur jangka panjang.
// 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)