
Strategi pergerakan rata-rata bergerak adalah sistem perdagangan kuantitatif yang berdasarkan pada hubungan harga dengan purata bergerak. Strategi ini menentukan isyarat perdagangan dengan menentukan arah purata bergerak dan penembusan harga, dan mempunyai mekanisme hentian hentian dinamik.
Strategi ini direka berdasarkan prinsip-prinsip utama berikut:
Mekanisme penilaian trend dinamikStrategi menggunakan perubahan arah purata bergerak ((SMA, EMA atau VWMA boleh dipilih) untuk menentukan trend pasaran. Apabila purata bergerak naik melebihi had yang ditetapkan ((default 0.25%), ia dianggap sebagai tren naik; apabila turun melebihi had yang sama, ia dianggap sebagai tren menurun.
Syarat kemasukan:
Mekanisme pelbagai peringkat:
Penapisan masaStrategi ini mempunyai penapis masa perdagangan yang disertakan, yang secara default hanya berlaku antara 9:30 dan 15:15 untuk mengelakkan kesan turun naik pada masa yang tidak berdagang.
Julat masa pengesanan: Pengguna boleh menyesuaikan tarikh akhir pengesanan semula untuk menilai prestasi strategi dalam keadaan pasaran yang berbeza.
Selepas analisis mendalam, strategi ini mempunyai kelebihan yang ketara:
Sesuaikan diri dengan keadaan pasaran: Dengan menilai arah purata bergerak dinamik, strategi dapat menyesuaikan arah perdagangan secara automatik mengikut trend pasaran dan menyesuaikan diri dengan keadaan pasaran yang berbeza.
Pengendalian RisikoStrategi ini direka bentuk dengan pelbagai tahap kawalan risiko, termasuk penapisan trend, penarikan balik, pergerakan rata-rata melintasi keluar, dan hentian keras, yang berkesan untuk mencegah kerugian besar.
Sensitiviti tindak balas boleh disesuaikanDengan menyesuaikan jenis purata bergerak (SMA / EMA / VWMA), asas pengiraan (harga penutupan / OHLC / 4 dan sebagainya) dan parameter panjang, pengguna dapat mengoptimumkan kepekaan tindak balas strategi terhadap turun naik pasaran.
Pelbagai peluang masukStrategi ini bukan sahaja menyediakan isyarat penembusan utama, tetapi juga merangkumi mekanisme penarikan balik, meningkatkan peluang perdagangan dan mengoptimumkan harga masuk purata.
Memperlihatkan status transaksi: Kod ini mengintegrasikan label status dagangan dan penanda masuk dan keluar untuk menunjukkan pelaksanaan strategi secara langsung, memudahkan analisis dan pengoptimuman.
Sistem amaran lengkap: Fungsi amaran isyarat dagangan terbina dalam, menyokong pemantauan dan peringatan masa nyata, meningkatkan kecekapan pelaksanaan strategi.
Walaupun strategi ini dirancang secara menyeluruh, terdapat risiko yang berpotensi:
Isyarat palsu pasaran yang bergolakDalam pasaran yang bergolak, arah purata bergerak mungkin berubah-ubah dengan kerap, menyebabkan terlalu banyak perdagangan dan kerugian. Penyelesaian adalah dengan menambah ambang pengesahan arah atau menggabungkan isyarat penapis indikator lain.
Kepekaan ParameterPrestasi strategi sangat bergantung kepada tetapan parameter, seperti panjang purata bergerak dan peratusan penurunan pelbagai jenis. Varieti perdagangan yang berbeza mungkin memerlukan tetapan parameter yang berbeza, yang memerlukan pengoptimuman parameter yang mencukupi.
Kekurangan pengesahan jumlah pesananStrategi semasa adalah berdasarkan pada harga dan purata bergerak, tanpa mempertimbangkan faktor kuantiti yang boleh menghasilkan isyarat yang salah dalam persekitaran yang rendah.
Risiko celah yang disebabkan oleh sekatan masa daganganStrategi yang terhad kepada perdagangan pada waktu tertentu mungkin tidak dapat menangani perubahan besar dalam pasaran pada waktu malam atau di luar waktu perdagangan, terutamanya apabila harga melonjak.
Reaksi JangkitanWalaupun terdapat mekanisme penilaian trend yang dinamik, reaksi terhadap pembalikan trend yang mendadak mungkin terlewat dan boleh menyebabkan penarikan balik yang lebih besar dalam pasaran yang berbalik dengan cepat.
Berdasarkan analisis kod, strategi ini boleh dioptimumkan dalam arah berikut:
Indeks dinamik bersepadu: Mengintegrasikan indikator momentum seperti RSI, MACD ke dalam sistem pengesahan isyarat, meningkatkan ketepatan penilaian trend, mengurangkan isyarat palsu. Ini dilakukan kerana penembusan harga murni kadang-kadang boleh menyebabkan kesalahan penilaian, dan indikator momentum dapat memberikan pengesahan tambahan.
Menambah komponen kadar turun naik yang beradaptasi: Sesuaikan markah masuk dan markah hentian mengikut dinamik kadar turun naik pasaran, tambah keperluan markah dalam persekitaran turun naik yang tinggi, mengurangkan kekerapan pemicu; mengurangkan markah dalam persekitaran turun naik yang rendah, meningkatkan kepekaan.
Menambah penapis jumlah transaksi: Memperkenalkan mekanisme pengesahan jumlah transaksi, yang memerlukan kenaikan jumlah transaksi ketika harga terobosan, menyaring isyarat penembusan yang lemah dalam persekitaran jumlah transaksi yang rendah.
Pengurusan wang yang lebih baik: Sesuaikan saiz kedudukan mengikut prestasi dagangan, keluasan penarikan balik dan kadar kemenangan yang dinamik. Tambah kedudukan apabila terdapat isyarat kepastian yang tinggi dan kurangkan kedudukan apabila terdapat ketidakpastian yang tinggi.
Penggabungan kerangka masa: Isyarat yang digabungkan dalam pelbagai bingkai masa, seperti meminta perdagangan hanya apabila trend garis hari dan garis jam selaras, meningkatkan kestabilan sistem.
Strategi pembinaan dan pelepasan gudang: Mempunyai mekanisme kemasukan dan keluar secara beratur, mengelakkan risiko kemasukan tunggal, dan pada masa yang sama mendapat keuntungan melalui perlindungan keuntungan.
Strategi pengesanan dan pembalikan trend silang rata-rata bergerak dinamik adalah sistem perdagangan yang direka dengan baik, yang menyediakan pedagang dengan alat untuk bertindak balas secara sistematik terhadap turun naik pasaran melalui penilaian trend yang dinamik, syarat masuk yang fleksibel dan pengurusan risiko berlapis. Ciri utamanya adalah menggabungkan kelebihan pengesanan dan pembalikan trend, mengawal risiko dengan titik masuk yang tepat sambil menghormati trend besar.
Strategi ini sangat sesuai untuk pasaran yang mempunyai turun naik yang tinggi dalam jangka masa sederhana dan panjang, pedagang dapat mengoptimumkan strategi untuk menyesuaikan diri dengan pelbagai jenis perdagangan dengan menyesuaikan jenis dan panjang purata bergerak dan pelbagai parameter penurunan. Walaupun terdapat risiko seperti sensitiviti parameter dan isyarat palsu pasaran yang bergolak, strategi ini dapat ditingkatkan lagi dengan arah pengoptimuman yang disyorkan, seperti pengintegrasian indikator momentum, penyesuaian kadar turun naik dan pengesahan jangka masa yang panjang.
Secara keseluruhannya, strategi ini menyediakan pedagang dengan kerangka perdagangan kuantitatif yang tersusun dengan potensi untuk mencapai pulangan yang lebih baik daripada pembelian dan pegangan tradisional, dengan konfigurasi parameter yang betul dan pengurusan risiko yang sesuai.
/*backtest
start: 2024-04-29 00:00:00
end: 2024-07-27 00:00:00
period: 2h
basePeriod: 2h
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/
//@version=6
// @ipuneetg
strategy("PG MA Crossover Buy and Sell Options Special", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100)
// === INPUTS ===
maType = input.string("SMA", title="Select MA Type", options=["SMA", "EMA", "VWMA"])
calcBasis = input.string("close", title="Calculation Basis", options=["close", "OHLC/4", "HLC/3", "HLCC/4"])
maLength = input.int(21, title="Moving Average Length")
reversalThresholdPercent = input.float(0.25, title="Reversal Threshold (%)", step=0.01)
percentBelowTop = input.float(1.0, title="Exit % Below Top (%)", step=0.1, minval=0.1)
shortProfitPercent = input.float(0.5, title="Short Profit Protection (%)", minval=0.1, step=0.1)
stopLossPercent = input.float(1.5, title="Stop Loss % Above Entry (for Shorts)", step=0.1, minval=0.1)
allowShorts = input.bool(true, title="Allow Short Trades?")
// === SESSION SETTINGS ===
startHour = input.int(9, title="Trade Start Hour")
startMinute = input.int(30, title="Start Minute")
endHour = input.int(15, title="Trade End Hour")
endMinute = input.int(15, title="End Minute")
tradeSession = str.tostring(startHour, "00") + str.tostring(startMinute, "00") + "-" + str.tostring(endHour, "00") + str.tostring(endMinute, "00")
sessionActive = not na(time(timeframe.period, tradeSession))
// === PRICE BASIS ===
basis = switch calcBasis
"OHLC/4" => (open + high + low + close) / 4
"HLC/3" => (high + low + close) / 3
"HLCC/4" => (high + low + close + close) / 4
=> close
// === MOVING AVERAGE ===
ma = switch maType
"SMA" => ta.sma(basis, maLength)
"EMA" => ta.ema(basis, maLength)
"VWMA" => ta.vwma(basis, maLength)
// === DYNAMIC REVERSAL DETECTION ===
var float lastReversal = na
var bool isRising = true
thresholdValue = ma * reversalThresholdPercent / 100
if na(lastReversal)
lastReversal := ma
if ma > lastReversal + thresholdValue
isRising := true
lastReversal := ma
else if ma < lastReversal - thresholdValue
isRising := false
lastReversal := ma
maColor = isRising ? color.green : color.red
// === TRADE VARIABLES ===
var float tradeHigh = na
var float tradeLow = na
var float shortEntryPrice = na
var bool inLong = false
var bool inShort = false
// === LONG & SHORT CONDITIONS ===
longEntry = sessionActive and isRising and close >= ma * (1 + reversalThresholdPercent / 100)
longReEntry = sessionActive and isRising and not inLong and close <= ma * 1.01
shortEntry = sessionActive and not isRising and close <= ma * (1 - reversalThresholdPercent / 100)
shortReEntry = sessionActive and not inShort and close >= ma * 0.998
// === EXIT CONDITIONS ===
exitLongBelowTop = close < tradeHigh * (1 - percentBelowTop / 100)
exitLongBelowMA = close < ma
exitShortAboveTop = close > tradeHigh * (1 + percentBelowTop / 100)
exitShortAboveMA = close > ma
// === EXECUTE TRADES ===
// === LONG SIDE ===
if not inLong and (longEntry or longReEntry)
strategy.entry("Long", strategy.long)
tradeHigh := close
inLong := true
if inLong
tradeHigh := math.max(tradeHigh, high)
if exitLongBelowTop or exitLongBelowMA
strategy.close("Long")
reason = exitLongBelowTop ? "Exit Long (Below Top)" : "Exit Long (Below MA)"
inLong := false
// === SHORT SIDE ===
if allowShorts
if not inShort and (shortEntry or shortReEntry)
if close >= ma * 0.996 and close <= ma * 1.002
strategy.entry("Short", strategy.short)
tradeHigh := close
tradeLow := close
shortEntryPrice := close
inShort := true
if inShort
// Update tradeLow dynamically
tradeLow := na(tradeLow) ? close : math.min(tradeLow, close)
// Calculate Stop Levels
hardStopLossPrice = shortEntryPrice * (1 + stopLossPercent / 100)
hardStopLossTriggered = high >= hardStopLossPrice
normalExitPrice1 = tradeLow * (1 + shortProfitPercent / 100)
normalExitTriggered = close > normalExitPrice1 or close > ma
// Exit Conditions
if hardStopLossTriggered
strategy.close("Short", comment="Hard Stop Loss")
inShort := false
tradeLow := na
else
if normalExitTriggered
reason = close > normalExitPrice1 ? "Exit Short (Above Profit %)" : "Exit Short (Above MA)"
strategy.close("Short", comment=reason)
inShort := false
tradeLow := na
// === PLOT MA ===
plot(ma, color=maColor, title="Dynamic Moving Average", linewidth=2)
// === TRADE STATUS BOX ===
var label tradeStatusLabel = na
var color statusColor = color.blue
var string statusText = "No Open Trade"
if inLong
statusColor := color.green
statusText := "Long Trade Open"
else if inShort
statusColor := color.red
statusText := "Short Trade Open"
if not na(tradeStatusLabel)
label.delete(tradeStatusLabel)