Strategi perdagangan kuantitatif membuka dan menutup persilangan purata bergerak digabungkan dengan penunjuk dinamik ADX

MA ADX SMMA EMA DEMA TEMA WMA VWMA HullMA LSMA ALMA SSMA TMA ATR
Tarikh penciptaan: 2025-02-18 13:35:54 Akhirnya diubah suai: 2025-02-18 13:35:54
Salin: 1 Bilangan klik: 445
1
fokus pada
1617
Pengikut

Strategi perdagangan kuantitatif membuka dan menutup persilangan purata bergerak digabungkan dengan penunjuk dinamik ADX

Gambaran keseluruhan

Ini adalah strategi perdagangan kuantitatif yang berasaskan persimpangan rata-rata bergerak harga bukaan dan harga tutup, dan menggabungkan indikator trend rata-rata ((ADX) sebagai penapis. Strategi ini menggunakan pelbagai jenis rata-rata bergerak, termasuk SMMA, EMA, DEMA, dan lain-lain, untuk menangkap perubahan trend pasaran dengan mengenal pasti titik persimpangan rata-rata, sambil menggunakan indikator ADX untuk mengesahkan kekuatan trend, meningkatkan kebolehpercayaan perdagangan.

Prinsip Strategi

Logik teras strategi ini adalah dengan mengira purata bergerak harga pembukaan dan harga penutupan, menghasilkan banyak isyarat apabila purata harga penutupan melintasi rata-rata harga pembukaan ke atas dan ADX lebih besar daripada ambang yang ditetapkan; menghasilkan isyarat kosong apabila purata harga penutupan melintasi rata-rata harga pembukaan ke bawah dan ADX lebih besar daripada ambang yang ditetapkan. Strategi ini menyokong pelbagai kaedah pengiraan rata-rata bergerak, termasuk purata bergerak sederhana (SMA), purata bergerak indeks (EMA), purata bergerak indeks ganda (EMAD), dan lain-lain.

Kelebihan Strategik

  1. Fleksibiliti: menyokong pelbagai jenis purata bergerak, yang membolehkan anda memilih kaedah pengiraan purata yang paling sesuai dengan keadaan pasaran yang berbeza
  2. Pengesahan Trend: Penapisan Indeks ADX Berkesan Untuk Mengurangkan Isyarat Palsu Dalam Pasaran Bergolak
  3. Pengendalian risiko yang sempurna: termasuk fungsi stop loss dan stop loss, yang dapat mengawal risiko setiap perdagangan dengan berkesan
  4. Kemudahan penyesuaian yang tinggi: menyediakan pelbagai antara muka parameter, termasuk kitaran garis rata-rata, ADX, arah perdagangan, dan lain-lain, untuk memudahkan pengoptimuman strategi
  5. Sokongan pelbagai kitaran masa: boleh berjalan pada kitaran masa yang berbeza, menyesuaikan diri dengan gaya dagangan yang berbeza

Risiko Strategik

  1. Rata-rata rata-rata: rata-rata bergerak pada dasarnya adalah penunjuk yang ketinggalan, yang mungkin menghasilkan isyarat ketinggalan dalam pasaran yang bergolak dengan cepat
  2. Risiko False Breakthroughs: Kesan False Breakthroughs pada Garis Rata-Rata boleh berlaku apabila pasaran bergolak, walaupun terdapat penapisan ADX, tetapi perlu berhati-hati
  3. Sensitiviti parameter: Kesan strategi lebih sensitif kepada tetapan parameter, yang memerlukan penyesuaian yang sesuai dalam keadaan pasaran yang berbeza
  4. Kebolehan beradaptasi pasaran: Berkesan lebih baik di pasaran yang jelas dalam trend, tetapi mungkin sering berdagang di pasaran yang bergolak
  5. Kompleksiti pengiraan: Pengiraan pelbagai jenis garis rata boleh meningkatkan beban sistem, dan perhatian perlu diberikan kepada kecekapan operasi

Arah pengoptimuman strategi

  1. Memperkenalkan penunjuk volum: Keberkesanan arah aliran boleh disahkan dengan menggabungkan perubahan dalam volum
  2. Mengoptimumkan parameter ADX: menyesuaikan nilai terhad ADX mengikut dinamik kitaran pasaran yang berbeza
  3. Menambah indikator pengesahan trend: penambahan indikator trend lain boleh dipertimbangkan untuk meningkatkan kebolehpercayaan isyarat
  4. Memperbaiki mekanisme hentikan kerugian: memperkenalkan hentikan yang mengesan atau hentikan yang menyesuaikan diri dengan kadar turun naik
  5. Optimumkan masa dagangan: mempertimbangkan faktor turun naik dan kecairan pasaran untuk memilih masa dagangan yang terbaik

ringkaskan

Ini adalah sistem perdagangan kuantitatif yang menggabungkan strategi silang garis rata klasik dengan indikator ADX. Dengan sokongan pelbagai jenis garis rata dan pengesahan trend ADX, ia dapat memahami tren pasaran dengan lebih baik, sambil mempunyai mekanisme kawalan risiko yang baik. Strategi ini sangat disesuaikan dan dapat disesuaikan secara optimum mengikut keadaan pasaran yang berbeza. Walaupun terdapat beberapa risiko yang melekat, strategi ini mempunyai nilai praktikal yang baik dengan penetapan parameter yang munasabah dan pengoptimuman berterusan.

Kod sumber strategi
/*backtest
start: 2024-02-18 00:00:00
end: 2025-02-16 08:00:00
period: 3d
basePeriod: 3d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © algostudio

//@version=6
strategy("Open Close Cross Strategy R5.1", shorttitle="OCC Strategy R5.1", overlay=true,
     pyramiding=0, default_qty_type=strategy.percent_of_equity, default_qty_value=10, calc_on_every_tick=false)

// === INPUTS ===
useRes      = input.bool(true, title="Use Alternate Resolution?")
intRes      = input.int(3, title="Multiplier for Alternate Resolution", minval=1)
stratRes    = timeframe.ismonthly ? str.tostring(timeframe.multiplier * intRes) + "M" :
              timeframe.isweekly ? str.tostring(timeframe.multiplier * intRes) + "W" :
              timeframe.isdaily ? str.tostring(timeframe.multiplier * intRes) + "D" :
              timeframe.isintraday ? str.tostring(timeframe.multiplier * intRes) : "60"

basisType   = input.string("SMMA", title="MA Type:", options=["SMA", "EMA", "DEMA", "TEMA", "WMA", "VWMA", "SMMA", "HullMA", "LSMA", "ALMA", "SSMA", "TMA"])
basisLen    = input.int(8, title="MA Period", minval=1)
offsetSigma = input.int(6, title="Offset for LSMA / Sigma for ALMA", minval=0)
offsetALMA  = input.float(0.85, title="Offset for ALMA", minval=0, step=0.01)
scolor      = input.bool(false, title="Show Colored Bars to Indicate Trend?")
delayOffset = input.int(0, title="Delay Open/Close MA (Forces Non-Repainting)", minval=0, step=1)
tradeType   = input.string("BOTH", title="What trades should be taken:", options=["LONG", "SHORT", "BOTH", "NONE"])

// === BASE FUNCTIONS ===
variant(type, src, len, offSig, offALMA) =>
    if type == "EMA"
        ta.ema(src, len)
    else if type == "DEMA"
        ta.ema(ta.ema(src, len), len) * 2 - ta.ema(ta.ema(ta.ema(src, len), len), len)
    else if type == "TEMA"
        3 * (ta.ema(src, len) - ta.ema(ta.ema(src, len), len)) + ta.ema(ta.ema(ta.ema(src, len), len), len)
    else if type == "WMA"
        ta.wma(src, len)
    else if type == "VWMA"
        ta.vwma(src, len)
    else if type == "SMMA"
        ta.sma(src, len)
    else if type == "HullMA"
        ta.wma(2 * ta.wma(src, len / 2) - ta.wma(src, len), math.round(math.sqrt(len)))
    else if type == "LSMA"
        ta.linreg(src, len, offSig)
    else if type == "ALMA"
        ta.alma(src, len, offALMA, offSig)
    else if type == "TMA"
        ta.sma(ta.sma(src, len), len)
    else
        ta.sma(src, len)

// Security wrapper
reso(exp, use, res) => use ? request.security(syminfo.tickerid, res, exp, lookahead=barmerge.lookahead_on) : exp

// === SERIES SETUP ===
closeSeries = variant(basisType, close[delayOffset], basisLen, offsetSigma, offsetALMA)
openSeries  = variant(basisType, open[delayOffset], basisLen, offsetSigma, offsetALMA)

// Alternate resolution series
closeSeriesAlt = reso(closeSeries, useRes, stratRes)
openSeriesAlt  = reso(openSeries, useRes, stratRes)

// Trend Colors
trendColour = closeSeriesAlt > openSeriesAlt ? color.green : color.red
bcolour     = closeSeries > openSeriesAlt ? color.lime : color.red
barcolor(scolor ? bcolour : na, title="Bar Colours")

closeP = plot(closeSeriesAlt, title="Close Series", color=trendColour, linewidth=2, style=plot.style_line)
openP  = plot(openSeriesAlt, title="Open Series", color=trendColour, linewidth=2, style=plot.style_line)
fill(closeP, openP, color=trendColour)
// === ADX FILTER ===
// ADX Calculation
// Input parameters
adxLength = input.int(14, title="ADX Length", minval=1)
adxfilter = input.int(13, title="ADX filter", minval=1)
// Calculate +DM and -DM (Directional Movement)
plusDM = math.max(high - high[1], 0)
minusDM = math.max(low[1] - low, 0)

// Remove cases where both are positive
plusDM := plusDM > minusDM ? plusDM : 0
minusDM := minusDM > plusDM ? minusDM : 0

// Smooth the directional movement using RMA
smoothedPlusDM = ta.rma(plusDM, adxLength)
smoothedMinusDM = ta.rma(minusDM, adxLength)

// Calculate True Range and smooth it
tr = ta.atr(adxLength)
smoothedTR = ta.rma(tr, adxLength)

// Compute +DI and -DI
plusDI = (smoothedPlusDM / smoothedTR) * 100
minusDI = (smoothedMinusDM / smoothedTR) * 100

// Compute DX (Directional Index)
dx = math.abs(plusDI - minusDI) / (plusDI + minusDI) * 100

// Compute ADX by smoothing DX
adx = ta.rma(dx, adxLength)




// === UPDATED TRADE CONDITIONS ===
xlong     = ta.crossover(closeSeriesAlt, openSeriesAlt) and adx > adxfilter
xshort    = ta.crossunder(closeSeriesAlt, openSeriesAlt) and adx > adxfilter
longCond  = xlong
shortCond = xshort


// === STRATEGY ===
slPoints  = input.float(0, title="Initial Stop Loss Points", minval=0)
tpPoints  = input.float(0, title="Initial Target Profit Points", minval=0)
ebar      = input.int(10000, title="Number of Bars for Back Testing", minval=0)

tdays     = (timenow - time) / 60000.0

tdays     := timeframe.ismonthly ? tdays / 1440.0 / 5.0 / 4.3 / timeframe.multiplier :
             timeframe.isweekly ? tdays / 1440.0 / 5.0 / timeframe.multiplier :
             timeframe.isdaily ? tdays / 1440.0 / timeframe.multiplier :
             tdays / timeframe.multiplier

TP = tpPoints > 0 ? tpPoints : na
SL = slPoints > 0 ? slPoints : na

if (ebar == 0 or tdays <= ebar)
    if longCond and tradeType != "SHORT"
        strategy.entry("long", strategy.long)
    if shortCond and tradeType != "LONG"
        strategy.entry("short", strategy.short)
    if shortCond and tradeType == "LONG"
        strategy.close("long")
    if longCond and tradeType == "SHORT"
        strategy.close("short")
    strategy.exit("XL", from_entry="long", profit=TP, loss=SL)
    strategy.exit("XS", from_entry="short", profit=TP, loss=SL)

// === END ===