Strategi ini menggunakan metode perdagangan grid dalam teori laut, dengan garis grid yang didistribusikan secara merata dalam kisaran harga yang ditetapkan, untuk membeli dan menjual operasi berdasarkan hubungan harga dengan garis grid. Strategi ini memiliki fitur seperti kisaran harga grid yang dihitung secara otomatis, garis grid yang didistribusikan secara merata, dan dapat mengontrol risiko secara efektif.
Strategi ini pertama-tama menghitung batas atas dan bawah dari grid harga berdasarkan pilihan atau pengaturan default pengguna, yaitu harga tertinggi dan terendah dari grid. Ada dua cara perhitungan, yaitu dengan mencari harga tertinggi dan terendah dalam periode pengukuran ulang, dan kedua adalah dengan menghitung rata-rata periode tertentu.
Produksi sinyal perdagangan tergantung pada hubungan antara harga dan garis grid. Ketika harga berada di bawah garis grid di bawahnya, posisi terbuka di garis grid dibuat dengan jumlah tetap; Ketika harga lebih tinggi dari garis grid di atasnya, posisi kosong di garis grid dibuat dengan jumlah tetap. Dengan demikian, posisi berfluktuasi di dalam grid seiring dengan fluktuasi harga.
Secara khusus, strategi mempertahankan array harga grid line dan array bool yang menunjukkan apakah setiap grid line memiliki daftar yang terlampir. Jika harga lebih rendah dari satu grid line dan tidak ada daftar yang terlampir, maka harga di garis tersebut akan di-outbid. Jika harga lebih tinggi dari satu grid line dan ada daftar yang terlampir di bawahnya, maka harga di bawahnya akan di-outbid. Dengan cara ini, transaksi grid dapat dilakukan.
Menghitung jarak grid secara otomatis, menghindari kesulitan pengaturan manual. Anda dapat memilih metode penghitungan yang berbeda.
Garis grid didistribusikan secara merata, menghindari kepadatan grid yang menyebabkan over-trading.
Menggunakan metode perdagangan grid, risiko dapat dikendalikan secara efektif, dan harga yang berfluktuasi dalam grid dapat selalu menguntungkan.
Tidak ada ekspektasi arah harga, berlaku untuk situasi goyah.
Biaya transaksi dan jumlah posisi dapat disesuaikan dengan jenis transaksi yang berbeda.
Garis grid yang ditampilkan secara visual, memudahkan untuk memahami situasi transaksi.
Risiko terobosan di antara grid. Harga terobosan di bawah grid akan menyebabkan kerugian yang lebih besar.
Risiko jarak grid yang terlalu lebar. Jaringan yang terlalu lebar sulit untuk mendapatkan keuntungan, tetapi terlalu sempit akan meningkatkan biaya. Perlu dipertandingkan.
Berisiko terlalu lama memegang posisi. Bertahan terlalu lama memegang posisi sulit untuk mendapatkan keuntungan yet meningkatkan kerugian biaya.
Pengaturan parameter yang tidak tepat berisiko. Pengaturan parameter yang tidak tepat, seperti siklus pengukuran ulang atau siklus rata-rata, dapat mempengaruhi perhitungan jarak grid.
Risiko sistematis pasar. Strategi ini lebih cocok untuk situasi yang bergolak, bukan untuk situasi yang bersifat unilateral dalam jangka panjang.
Optimalkan parameter grid. Pertimbangkan faktor-faktor seperti karakteristik pasar, biaya transaksi, jumlah grid yang dioptimalkan, dan siklus pengukuran ulang.
Adaptasi dinamis antara area grid. Jika ada perubahan besar di pasar, mekanisme untuk menyesuaikan secara dinamis antara area grid dapat diperkenalkan.
Masukkan mekanisme stop loss. Tetapkan batas stop loss yang masuk akal untuk menghindari kerugian yang terlalu besar.
Bergabung dengan indikator lain untuk memfilter perdagangan. Seperti garis Brin, indikator tren, dan lain-lain, untuk menghindari perdagangan yang tidak sesuai.
Mengoptimalkan efisiensi penggunaan dana. Menambahkan analisis panas dan dingin, mengurangi transaksi saat volatilitas lebih rendah.
Strategi ini menggunakan prinsip perdagangan grid, untuk mencapai risiko yang dapat dikendalikan untuk perdagangan kondisi bergolak. Strategi ini memiliki keuntungan seperti grid perhitungan otomatis, grid distribusi yang merata, dan dapat menyesuaikan parameter dengan lingkungan pasar yang berbeda. Risiko dapat dikendalikan dan mudah dioperasikan. Namun, strategi ini juga memiliki beberapa keterbatasan, yang perlu terus dioptimalkan untuk menyesuaikan diri dengan perubahan pasar. Secara keseluruhan, strategi ini memberikan strategi implementasi yang lebih standar dan parameter untuk perdagangan grid.
/*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)