
Strategi perdagangan grid yang menyesuaikan diri adalah strategi kuantitatif berdasarkan sistem perdagangan grid yang menyesuaikan diri dengan perubahan pasaran dengan menyesuaikan kedudukan garisan grid secara automatik. Strategi ini menggunakan pelbagai petunjuk teknikal untuk mengira titik perdagangan yang terbaik dan mengemas kini grid secara dinamik mengikut perubahan harga. Idea utamanya adalah untuk melakukan pembelian atau penjualan di dalam julat harga yang ditetapkan apabila harga menyentuh garisan grid yang ditetapkan, untuk menangkap peluang keuntungan yang dibawa oleh turun naik pasaran.
Strategi ini berdasarkan kepada komponen teras dan prinsip kerja berikut:
Mekanisme pemprosesan halusStrategi: Pertama, harga diselesaikan dengan cara yang halus, pelbagai jenis purata bergerak disokong ((Linear Regression, SMA, EMA, VWMA dan TEMA), pengguna boleh memilih kaedah yang sesuai untuk diselesaikan mengikut keutamaan mereka.
Parameter kelewatanIni adalah inovasi utama dalam strategi ini, dengan memperkenalkan fungsi kelewatan lz ((), sistem akan mengemas kini isyarat hanya apabila perubahan harga melebihi peratusan tertentu, untuk menapis bunyi pasaran dengan berkesan.
Mekanisme pembinaan grid:
Logik penjanaan isyarat:
Mekanisme kawalan perdagangan:
Kemas kini grid dinamikApabila Lazy Moving Average (LMA) berubah, keseluruhan struktur grid akan disesuaikan semula untuk membolehkan strategi menyesuaikan diri dengan julat harga baru.
Strategi ini menggunakan harga garisan grid yang disimpan secara berturut-turut untuk menentukan titik jual beli tertentu dengan mengira perpotongan harga dengan garisan grid, dengan mempertimbangkan pelbagai syarat untuk mengelakkan transaksi yang tidak perlu.
Kebolehan menyesuaikan diriKelebihan utama strategi ini ialah ia dapat menyesuaikan kedudukan grid secara automatik mengikut perubahan pasaran, tanpa campur tangan manusia. Melalui parameter kelenturan dan mekanisme penyesuaian titik fokus, grid dapat bergerak mengikut perubahan trend harga dan sentiasa relevan.
Penapis bunyiPengenalan parameter kelewatan (Laziness) adalah inovasi yang memastikan bahawa penyesuaian grid hanya akan dicetuskan apabila perubahan harga cukup ketara, dengan berkesan mengurangkan tindak balas terhadap bunyi pasaran dan meningkatkan kestabilan strategi.
Fleksibiliti dan penyesuaianStrategi ini menyediakan banyak parameter yang boleh disesuaikan oleh pengguna mengikut ciri-ciri pasaran dan gaya perdagangan individu.
Kawasan perdagangan visualStrategi menunjukkan kawasan dagangan yang aktif pada masa ini dengan warna yang diisi, membolehkan peniaga mengetahui secara intuitif di mana harga semasa berada di dalam grid, untuk memudahkan keputusan.
Kawalan RisikoDengan mengehadkan perdagangan hanya dalam rangkaian tertentu, strategi ini mewujudkan mekanisme kawalan risiko semula jadi untuk mencegah perdagangan yang tidak menguntungkan dalam keadaan pasaran yang melampau.
Logik masuk dan keluar yang selaras: Menggunakan garisan grid yang sama sebagai isyarat membeli dan menjual, mengekalkan logik perdagangan yang konsisten dan boleh diramalkan.
Risiko penembusanStrategi ini pada asasnya adalah strategi perdagangan jarak, yang mungkin menghadapi kerugian berterusan dalam pasaran yang kuat. Strategi ini mungkin terus mengambil kedudukan dalam arah yang salah apabila harga menembusi bawah grid dan terus bergerak satu arah. Penyelesaian adalah dengan menambah komponen pengenalan trend, atau menangguhkan perdagangan grid apabila trend ditubuhkan.
Kepekaan ParameterPrestasi strategi sangat bergantung kepada parameter yang ditetapkan, terutamanya parameter kelewatan (Laziness) dan parameter kelenturan (Elasticity). Parameter yang tidak sesuai boleh menyebabkan grid tidak disesuaikan pada masanya atau terlalu sensitif.
Risiko memegang kedudukan piramidStrategi membenarkan beberapa kali masuk dalam arah yang sama (pyramiding = 4) yang boleh menyebabkan kelebihan leverage dan pengumpulan risiko dalam keadaan pasaran yang melampau. Perlu dipertimbangkan untuk menetapkan had maksimum dan pengurusan kedudukan dinamik.
Titik tergelincir dan kesan bayaranStrategi perdagangan grid biasanya melibatkan perdagangan yang kerap, dan dalam pelaksanaan sebenar, titik tergelincir dan yuran boleh menjejaskan keuntungan strategi secara ketara. Faktor-faktor ini perlu dimasukkan dalam pengukuran semula dan mungkin perlu menyesuaikan jarak grid untuk mengimbangi frekuensi perdagangan dan kos.
Pemprosesan konflik isyarat: Apabila isyarat beli dan jual muncul pada masa yang sama, pilihan strategi semasa mengabaikan dua isyarat, yang boleh menyebabkan kehilangan peluang perdagangan penting.
Penyesuaian parameterStrategi boleh dioptimumkan lagi untuk menyesuaikan selang grid dan parameter kelewatan secara automatik mengikut turun naik pasaran. Sebagai contoh, meningkatkan selang grid di pasaran yang bergelombang tinggi dan mengurangkan selang grid di pasaran yang bergelombang rendah, menjadikan strategi lebih sesuai dengan keadaan pasaran yang berbeza.
Mengintegrasikan komponen pengiktirafan trendStrategi semasa mungkin tidak berfungsi dengan baik di pasaran yang sedang tren, dengan pengenalan indikator pengiktirafan trend (seperti ADX, persilangan purata bergerak, dan sebagainya), menyesuaikan arah perdagangan secara automatik atau menangguhkan perdagangan grid apabila trend yang kuat diiktiraf.
Pengurusan kedudukan dinamikStrategi semasa menggunakan saiz kedudukan tetap, boleh ditingkatkan kepada pengurusan kedudukan dinamik berdasarkan pengiraan risiko, seperti menyesuaikan saiz kedudukan berdasarkan ATR, atau mengagihkan dana berdasarkan peratusan nilai bersih akaun.
Analisis pelbagai kerangka masa: Pengenalan analisis pelbagai kerangka masa, menggunakan arah trend untuk tempoh masa yang lebih lama untuk menapis isyarat perdagangan, hanya melakukan perdagangan grid di arah yang mematuhi trend kerangka masa yang lebih besar.
Mekanisme henti kerugian yang sempurnaStrategi semasa tidak mempunyai mekanisme hentian kerugian yang jelas. Hentian global boleh ditambah berdasarkan keadaan pasaran keseluruhan, atau titik hentian yang berasingan ditetapkan untuk setiap tahap grid untuk mengehadkan kerugian maksimum dalam satu perdagangan.
Pengoptimuman masa masuk dan keluarStrategi boleh menggabungkan jumlah atau harga pergerakan indikator, dan pada isyarat grid, dengan syarat penapisan tambahan untuk mengoptimumkan masa masuk dan keluar tertentu, meningkatkan kadar kejayaan.
Integrasi Pembelajaran MesinPertimbangan untuk menggunakan algoritma pembelajaran mesin untuk mengoptimumkan kedudukan grid dan pilihan parameter, meramalkan tetapan grid terbaik melalui model latihan data sejarah, dan meningkatkan lagi kebolehpasaran strategi.
Strategi dagangan grid adaptif mengatasi kekurangan fleksibiliti strategi perdagangan grid tradisional melalui fungsi kelewatan yang inovatif dan mekanisme penyesuaian grid dinamik. Ia dapat menyesuaikan diri secara automatik dengan perubahan pasaran, menangkap peluang perdagangan dalam julat harga yang berbeza, sambil mengawal tingkah laku perdagangan melalui pelbagai parameter.
Walaupun terdapat masalah yang berpotensi seperti risiko penembusan dan kepekaan parameter, strategi ini berpotensi untuk mencapai prestasi yang stabil dalam pelbagai keadaan pasaran dengan mengintegrasikan arah pengoptimuman seperti pengenalan trend dan penyesuaian parameter dinamik. Dalam aplikasi praktikal, disarankan untuk mengesahkan prestasi strategi terlebih dahulu melalui pengesanan balik yang komprehensif, terutamanya prestasi di bawah keadaan pasaran yang berbeza, dan menyesuaikan parameter mengikut ciri-ciri jenis perdagangan tertentu, untuk mencapai kesan terbaik.
//@version=5
// This source code is subject to the terms of the Mozilla Public License 2.0 https://mozilla.org/MPL/2.0/
// ©mvs1231 || xxattaxx
strategy(title='Grid Bot Auto Strategy', shorttitle='GridBot', initial_capital = 100000, overlay=true, pyramiding=4, default_qty_type = strategy.fixed, default_qty_value = 0, commission_value = 0.04, commission_type = strategy.commission.percent, margin_long = 0, margin_short = 0, process_orders_on_close = true)
//----<User Inputs>------------------------------------------------------------------------------//
iLen = input.int(7, 'Smoothing Length(7)', minval=1)
iMA = input.string('lreg', 'Smoothing Type', options=['lreg', 'sma', 'ema', 'vwma', 'tema'])
iLZ = input.float(4.0, 'Laziness(4%)', step=.25) / 100
iELSTX = input(50.0, 'Elasticity(50)')
iGI = input.float(2.0, 'Grid Interval(2%)', step=.25) / 100
iGrids = input.int(6, 'Number of Grids', options=[2, 4, 6, 8])
iCool = input.int(2, 'Cooldown(2)', minval=0)
iDir = input.string('neutral', 'Direction', options=['neutral', 'up', 'down'])
iGT = input.int(70, 'Grid Line Transparency(100 to hide)', minval=0, maxval=100)
iFT = input.int(90, 'Fill Transparency(100 to hide)', minval=0, maxval=100)
iSS = input.string('small', 'Signal Size', options=['small', 'large'])
iReset = input(true, 'Reset Buy/Sell Index When Grids Change')
iEXTR = input(true, 'Use Highs/Lows for Signals')
iMT = input(true, 'Show Min Tick')
iRFC = input(false, 'Reverse Fill Colors')
qty_ent = iGrids/2
qty_pos = strategy.initial_capital / qty_ent / 2 / open
//----<Colors>-----------------------------------------------------------------------------------//
RedGrid = color.new(color.red, iGT)
GreenGrid = color.new(color.green, iGT)
Crimson = #DC143C
LimeGreen = #32CD32
//----<Variables>--------------------------------------------------------------------------------//
NextUP = 0.0
NextDN = 0.0
LastSignal = 0
LastSignal_Index = 0
AP = 0.0
G = iGrids
Buy = false
Sell = false
UpperLimit = 0.0
LowerLimit = 0.0
SignalLine = 0.0
CurrentGrid = 0.0
BuyLine = 0.0
SellLine = 0.0
DIR = 0
MeaningOfLife = 42
//----<Calculations>-----------------------------------------------------------------------------//
//Lazy Formula
lz(x, lzf) =>
LZ = 0.0
s = math.sign(x)
LZ := x == nz(x[1], x) ? x : x > nz(LZ[1] + lzf * LZ[1] * s, x) ? x : x < nz(LZ[1] - lzf * LZ[1] * s, x) ? x : LZ[1]
LZ
//Smoothing
LR = ta.linreg(close, iLen, 0)
SMA = ta.sma(close, iLen)
EMA = ta.ema(close, iLen)
VWMA = ta.vwma(close, iLen)
TEMA = ta.ema(ta.ema(ta.ema(close, iLen), iLen), iLen)
MA = iMA == 'lreg' ? LR : iMA == 'sma' ? SMA : iMA == 'ema' ? EMA : iMA == 'vwma' ? VWMA : TEMA
//Make Lazy
LMA = lz(MA, iLZ)
//Calculate Elasticity
ELSTX = syminfo.mintick * iELSTX
//Show Mintick
if iMT and barstate.islast
table.cell(table.new(position.top_right, 1, 1), 0, 0, str.tostring(syminfo.mintick))
//Anchor Point
AP := MA > LMA ? AP[1] + ELSTX : MA < LMA ? AP[1] - ELSTX : AP[1]
AP := AP >= NextUP[1] ? NextUP[1] : AP
AP := AP <= NextDN[1] ? NextDN[1] : AP
//Reset if Next Level Reached or AP is crossed
AP := LMA != LMA[1] ? LMA : AP
//Next Gridlines
NextUP := LMA != LMA[1] ? LMA + LMA * iGI : NextUP[1]
NextDN := LMA != LMA[1] ? LMA - LMA * iGI : NextDN[1]
//Grid Interval
GI = AP * iGI
//----<Grid Array>-------------------------------------------------------------------------------//
a_grid = array.new_float(9)
for x = -4 to 4 by 1
array.set(a_grid, x + 4, AP + GI * x)
Get_Array_Values(ArrayName, index) =>
value = array.get(ArrayName, index)
value
//----<Set Static Grids>-------------------------------------------------------------------------//
G0 = Get_Array_Values(a_grid, 0) //Upper4
G1 = Get_Array_Values(a_grid, 1) //Upper3
G2 = Get_Array_Values(a_grid, 2) //Upper2
G3 = Get_Array_Values(a_grid, 3) //Upper1
G4 = Get_Array_Values(a_grid, 4) //Center
G5 = Get_Array_Values(a_grid, 5) //Lower1
G6 = Get_Array_Values(a_grid, 6) //Lower2
G7 = Get_Array_Values(a_grid, 7) //Lower3
G8 = Get_Array_Values(a_grid, 8) //Lower4
//----<Set Upper and Lower Limits>---------------------------------------------------------------//
UpperLimit := G >= 8 ? G8 : G >= 6 ? G7 : G >= 4 ? G6 : G5
LowerLimit := G >= 8 ? G0 : G >= 6 ? G1 : G >= 4 ? G2 : G3
//----<Calculate Signals>------------------------------------------------------------------------//
Get_Signal_Index() =>
Value = 0.0
Buy_Index = 0
Sell_Index = 0
start = 4 - G / 2
end = 4 + G / 2
for x = start to end by 1
Value := Get_Array_Values(a_grid, x)
if iEXTR
Sell_Index := low[1] < Value and high >= Value ? x : Sell_Index
Buy_Index := high[1] > Value and low <= Value ? x : Buy_Index
Buy_Index
else
Sell_Index := close[1] < Value and close >= Value ? x : Sell_Index
Buy_Index := close[1] > Value and close <= Value ? x : Buy_Index
Buy_Index
[Buy_Index, Sell_Index]
[BuyLine_Index, SellLine_Index] = Get_Signal_Index()
//----<Signals>----------------------------------------------------------------------------------//
Buy := BuyLine_Index > 0 ? true : Buy
Sell := SellLine_Index > 0 ? true : Sell
//No repeat trades at current level
Buy := low >= SignalLine[1] - GI ? false : Buy
Sell := high <= SignalLine[1] + GI ? false : Sell
//No trades outside of grid limits
Buy := close > UpperLimit ? false : Buy
Buy := close < LowerLimit ? false : Buy
Sell := close < LowerLimit ? false : Sell
Sell := close > UpperLimit ? false : Sell
//Direction Filter (skip one signal if against market direction)
DIR := iDir == 'up' ? 1 : iDir == 'down' ? -1 : 0
Buy := DIR == -1 and low >= SignalLine[1] - GI * 2 ? false : Buy
Sell := DIR == 1 and high <= SignalLine[1] + GI * 2 ? false : Sell
//Conflicting Signals
if Buy and Sell
Buy := false
Sell := false
LastSignal_Index := LastSignal_Index[1]
LastSignal_Index
//----<Cooldown>---------------------------------------------------------------------------------//
y = 0
for i = 1 to iCool by 1
if Buy[i] or Sell[i]
y := 0
break
y += 1
y
CoolDown = y
Buy := CoolDown < iCool ? false : Buy
Sell := CoolDown < iCool ? false : Sell
//----<Trackers>---------------------------------------------------------------------------------//
LastSignal := Buy ? 1 : Sell ? -1 : LastSignal[1]
LastSignal_Index := Buy ? BuyLine_Index : Sell ? SellLine_Index : LastSignal_Index[1]
SignalLine := Get_Array_Values(a_grid, LastSignal_Index)
//Reset to Center Grid when LMA changes
if iReset
SignalLine := LMA < LMA[1] ? UpperLimit : SignalLine
SignalLine := LMA > LMA[1] ? LowerLimit : SignalLine
SignalLine
BuyLine := Get_Array_Values(a_grid, BuyLine_Index)
SellLine := Get_Array_Values(a_grid, SellLine_Index)
//----<Plot Grids>--------------------------//
color apColor = na
apColor := MA < AP ? color.new(color.red, iGT) : MA > AP ? color.new(color.green, iGT) : apColor[1]
apColor := LMA != LMA[1] ? na : apColor
plot(G >= 8 ? G0 : na, color=GreenGrid)
plot(G >= 6 ? G1 : na, color=GreenGrid)
plot(G >= 4 ? G2 : na, color=GreenGrid)
plot(G >= 2 ? G3 : na, color=GreenGrid)
plot(G4, color=apColor, linewidth=4) // Center
plot(G >= 2 ? G5 : na, color=RedGrid)
plot(G >= 4 ? G6 : na, color=RedGrid)
plot(G >= 6 ? G7 : na, color=RedGrid)
plot(G >= 8 ? G8 : na, color=RedGrid)
//fill
LineAbove = SignalLine == UpperLimit ? SignalLine : SignalLine + GI
LineBelow = SignalLine == LowerLimit ? SignalLine : SignalLine - GI
a = plot(LineAbove, color=color.new(color.red, 100), style=plot.style_circles)
b = plot(LineBelow, color=color.new(color.green, 100), style=plot.style_circles)
boxColor = LastSignal == 1 ? color.new(color.green, iFT) : color.new(color.red, iFT)
if iRFC
boxColor := LastSignal == -1 ? color.new(color.green, iFT) : color.new(color.red, iFT)
boxColor
fill(a, b, color=boxColor)
//----<Plot Signals>-----------------------------------------------------------------------------//
plotchar(Buy and iSS == 'small', 'Buy', color=color.new(LimeGreen, 0), size=size.tiny, location=location.belowbar, char='▲')
plotchar(Sell and iSS == 'small', 'Sell', color=color.new(Crimson, 0), size=size.tiny, location=location.abovebar, char='▼')
plotchar(Buy and iSS == 'large', 'Buy', color=color.new(LimeGreen, 0), size=size.small, location=location.belowbar, char='▲')
plotchar(Sell and iSS == 'large', 'Sell', color=color.new(Crimson, 0), size=size.small, location=location.abovebar, char='▼')
//----<Alerts>-----------------------------------------------------------------------------------//
alertcondition(condition=Buy, title='buy', message='buy')
alertcondition(condition=Sell, title='sell', message='sell')
//-----------------------------------------------------------------------------------------------//
if strategy.position_size >= 0 and Buy
strategy.entry("Long", strategy.long, qty = qty_pos)
if strategy.position_size <= 0 and Sell
strategy.entry("Short", strategy.short, qty = qty_pos)
if strategy.position_size > 0 and Sell
strategy.close("Long", qty = qty_pos)
if strategy.position_size < 0 and Buy
strategy.close("Short", qty = qty_pos)