Strategi perdagangan grid penyesuaian dan mekanisme pelarasan dinamik

MA EMA SMA VWMA TEMA LREG Grid Trading Elasticity Laziness Cooldown
Tarikh penciptaan: 2025-02-28 10:01:54 Akhirnya diubah suai: 2025-02-28 10:01:54
Salin: 4 Bilangan klik: 1044
2
fokus pada
319
Pengikut

Strategi perdagangan grid penyesuaian dan mekanisme pelarasan dinamik Strategi perdagangan grid penyesuaian dan mekanisme pelarasan dinamik

Gambaran keseluruhan

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.

Prinsip Strategi

Strategi ini berdasarkan kepada komponen teras dan prinsip kerja berikut:

  1. 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.

  2. 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.

  3. Mekanisme pembinaan grid:

    • Titik Anchor sebagai pusat grid, menyesuaikan secara dinamik mengikut hubungan harga dengan purata bergerak
    • Jarak grid (Grid Interval) menentukan jarak antara garisan grid berdekatan
    • Parameter kelenturan ((Elasticity) mengawal sensitiviti penyesuaian titik fokus
  4. Logik penjanaan isyarat:

    • Sinyal beli dihasilkan apabila harga melintasi garisan grid dari bawah
    • Sinyal jual dihasilkan apabila harga melintasi garisan grid dari atas
    • Anda boleh memilih untuk menggunakan harga tinggi / rendah atau harga tutup sebagai pemicu isyarat
  5. Mekanisme kawalan perdagangan:

    • Cooldown: Mengelakkan perdagangan yang kerap
    • Penapis Arahan (Direction Filter) boleh memaksa bias strategi ke arah multihead, kosong atau neutral
    • Hadkan perdagangan di dalam garisan grid
  6. 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.

Kelebihan Strategik

  1. 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.

  2. 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.

  3. Fleksibiliti dan penyesuaianStrategi ini menyediakan banyak parameter yang boleh disesuaikan oleh pengguna mengikut ciri-ciri pasaran dan gaya perdagangan individu.

  4. 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.

  5. 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.

  6. 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 Strategik

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

Arah pengoptimuman strategi

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  6. 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.

  7. 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.

ringkaskan

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.

Kod sumber strategi
//@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)