Strategi perdagangan kuantitatif pembukaan dan penutupan crossover rata-rata bergerak dikombinasikan dengan indikator dinamis ADX

MA ADX SMMA EMA DEMA TEMA WMA VWMA HullMA LSMA ALMA SSMA TMA ATR
Tanggal Pembuatan: 2025-02-18 13:35:54 Akhirnya memodifikasi: 2025-02-18 13:35:54
menyalin: 1 Jumlah klik: 445
1
fokus pada
1617
Pengikut

Strategi perdagangan kuantitatif pembukaan dan penutupan crossover rata-rata bergerak dikombinasikan dengan indikator dinamis ADX

Ringkasan

Ini adalah strategi perdagangan kuantitatif yang didasarkan pada persimpangan rata-rata bergerak antara harga buka dan harga tutup, dan menggabungkan indikator tren rata-rata ((ADX) sebagai filter. Strategi ini menggunakan beberapa jenis rata-rata bergerak, termasuk SMMA, EMA, DEMA, dan lain-lain, untuk menangkap perubahan tren pasar dengan mengidentifikasi titik persimpangan rata-rata, sambil menggunakan indikator ADX untuk mengkonfirmasi kekuatan tren, meningkatkan keandalan perdagangan.

Prinsip Strategi

Logika inti dari strategi ini adalah dengan menghitung moving averages dari harga buka dan harga tutup, menghasilkan beberapa sinyal ketika harga tutup rata-rata melintasi harga buka rata-rata dan ADX lebih besar dari batas yang ditetapkan; menghasilkan sinyal kosong ketika harga tutup rata-rata melintasi harga buka rata-rata dan ADX lebih besar dari batas yang ditetapkan. Strategi ini mendukung beberapa metode penghitungan rata-rata bergerak, termasuk rata-rata bergerak sederhana (SMA), rata-rata bergerak indeks (EMA), rata-rata bergerak indeks ganda (EMAD), dan lain-lain. Jenis rata-rata yang paling cocok dapat dipilih berdasarkan karakteristik pasar yang berbeda.

Keunggulan Strategis

  1. Fleksibel: mendukung berbagai jenis rata-rata bergerak, dapat memilih metode perhitungan rata-rata yang optimal sesuai dengan situasi pasar yang berbeda
  2. Konfirmasi tren: Filter indikator ADX untuk mengurangi sinyal palsu di pasar yang bergejolak
  3. Pengendalian risiko yang sempurna: termasuk fungsi stop loss dan stop loss, yang dapat mengontrol risiko setiap transaksi secara efektif
  4. Kustomisasi tinggi: menyediakan beberapa interface parameter, termasuk siklus garis rata-rata, ADX threshold, arah perdagangan, dan lain-lain, untuk mengoptimalkan strategi
  5. Dukungan multi siklus waktu: dapat berjalan pada siklus waktu yang berbeda untuk menyesuaikan gaya perdagangan yang berbeda

Risiko Strategis

  1. Rata-rata lag: rata-rata bergerak pada dasarnya adalah indikator lag, yang dapat menghasilkan sinyal lag dalam pasar yang berfluktuasi cepat
  2. Risiko False Breakout: False breakout rata-rata dapat terjadi pada saat pasar bergejolak, meskipun ada filter ADX, namun perlu diperhatikan
  3. Sensitivitas parameter: Efek strategi lebih sensitif terhadap pengaturan parameter, yang memerlukan penyesuaian yang sesuai dalam berbagai kondisi pasar
  4. Adaptasi pasar: Berkinerja baik di pasar yang jelas sedang tren, tetapi mungkin sering diperdagangkan di pasar yang bergoyang
  5. Kompleksitas komputasi: Berbagai jenis perhitungan rata-rata dapat meningkatkan beban sistem, perlu memperhatikan efisiensi operasional

Arah optimasi strategi

  1. Memperkenalkan indikator volume: Efektivitas tren dapat dikonfirmasi dengan menggabungkan perubahan volume
  2. Mengoptimalkan parameter ADX: menyesuaikan ADX threshold berdasarkan dinamika siklus pasar yang berbeda
  3. Menambahkan indikator pengakuan tren: Anda dapat mempertimbangkan untuk menambahkan indikator tren lainnya untuk meningkatkan keandalan sinyal
  4. Perbaikan mekanisme stop loss: pengenalan tracking stop loss atau stop loss yang beradaptasi dengan fluktuasi
  5. Optimalkan waktu perdagangan: Mempertimbangkan faktor volatilitas dan likuiditas pasar, pilih waktu perdagangan yang optimal

Meringkaskan

Ini adalah sistem perdagangan kuantitatif yang menggabungkan strategi crossover rasio klasik dengan indikator ADX. Dengan dukungan berbagai jenis rasio dan konfirmasi tren ADX, strategi ini dapat lebih memahami tren pasar, dengan mekanisme pengendalian risiko yang baik. Strategi ini sangat dapat disesuaikan dan dapat disesuaikan secara optimal sesuai dengan lingkungan pasar yang berbeda.

Kode 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 ===