
Strategi ini berdagang berdasarkan isyarat silang dua indeks moving averages (EMA). Apabila EMA jangka pendek berada di atas EMA jangka panjang, anda membuka lebih banyak kedudukan; apabila EMA jangka pendek berada di bawah EMA jangka panjang, anda menutup posisi. Strategi ini juga memperkenalkan mekanisme hentian kerugian dan penapis masa perdagangan untuk mengawal risiko dan mengoptimumkan prestasi strategi.
Strategi ini menggunakan dua EMA yang berbeza sebagai asas penilaian trend. EMA lebih cepat bertindak balas terhadap perubahan harga berbanding dengan purata bergerak sederhana (SMA), dan pembahagian berat lebih munasabah. Apabila EMA jangka pendek melintasi EMA jangka panjang, ini bermakna harga mungkin membentuk trend menaik dan membuka lebih banyak kedudukan; sebaliknya, apabila EMA jangka pendek melintasi EMA jangka panjang, ini bermakna trend menaik mungkin berakhir dan meletakkan kedudukan.
Di samping isyarat persilangan garis rata, strategi ini juga memperkenalkan mekanisme hentian kerugian. Di satu pihak, ia menetapkan hentian peratusan tetap, iaitu, apabila harga turun lebih dari peratusan tertentu dari harga pembukaan kedudukan, ia memaksa kedudukan kosong untuk mengawal kerugian; di sisi lain, ia juga boleh memilih untuk menetap apabila harga penutupan harga lebih rendah daripada harga penutupan K baris sebelumnya.
Selain itu, strategi ini juga memperkenalkan penapis masa perdagangan. Pengguna boleh menetapkan sendiri masa permulaan dan akhir perdagangan yang dibenarkan, untuk mengelakkan perdagangan pada masa tertentu (seperti cuti, masa tidak berdagang, dan lain-lain).
Mudah digunakan: Strategi ini logiknya jelas, hanya menggunakan dua EMA sebagai isyarat perdagangan, mudah difahami dan dilaksanakan.
Pengesanan trend: EMA dapat bertindak balas dengan cepat terhadap perubahan harga, yang membolehkan strategi ini menangkap pembentukan dan penutupan trend tepat pada masanya, dan dengan itu memperoleh keuntungan dari trend.
Kawalan risiko: memperkenalkan peratusan berhenti tetap dan berhenti berdasarkan harga penutupan K baris sebelumnya, yang dapat mengawal kerugian dan penarikan balik perdagangan tunggal dengan berkesan.
Fleksibiliti parameter: Pengguna boleh menyesuaikan kitaran EMA, peratusan hentian, parameter sama ada menggunakan hentian harga penutupan K sebelumnya, tempoh masa perdagangan, dan sebagainya mengikut keperluan mereka sendiri, untuk mengoptimumkan prestasi strategi.
Risiko pengoptimuman parameter: Prestasi strategi bergantung pada pilihan parameter seperti kitaran EMA, peratusan kerugian, dan parameter yang tidak sesuai boleh menyebabkan prestasi strategi yang tidak baik. Oleh itu, pengoptimuman parameter dan pengujian kembali diperlukan pada data sejarah untuk memilih parameter yang paling optimum.
Risiko pasaran: Strategi ini digunakan terutamanya dalam pasaran yang sedang tren, apabila pasaran bergolak atau trend berbalik, perdagangan yang kerap boleh menyebabkan penarikan balik yang lebih besar. Oleh itu, perlu menyesuaikan parameter strategi atau berhenti menggunakan strategi ini mengikut keadaan pasaran.
Risiko kos: Strategi ini mungkin menghasilkan lebih banyak transaksi, sehingga meningkatkan kos transaksi. Oleh itu, anda perlu memilih piawaian dan jumlah transaksi yang sesuai, dan mengawal kos setiap transaksi.
Pengenalan lebih banyak petunjuk teknikal: Berdasarkan isyarat EMA silang, pengenalan petunjuk teknikal lain seperti RSI, MACD dan lain-lain, membentuk isyarat perdagangan pelbagai faktor, meningkatkan ketepatan penilaian trend.
Hentian dinamik: Berdasarkan turun naik pasaran, ATR dan lain-lain, kedudukan hentian diubah secara dinamik, sambil mengawal risiko, dan mengurangkan kerugian yang mungkin disebabkan oleh hentian.
Pengurusan kedudukan: Sesuai dengan kekuatan trend pasaran, harga dan tahap penyimpangan dari garis purata, dan lain-lain, menyesuaikan saiz kedudukan secara dinamik, meningkatkan kedudukan apabila trend kuat, dan mengurangkan kedudukan apabila trend lemah atau tidak jelas.
Pengoptimuman Pembelajaran Mesin: Menggunakan algoritma pembelajaran mesin untuk mengoptimumkan parameter strategi, secara automatik memilih kombinasi parameter terbaik, meningkatkan keuntungan strategi dan mengurangkan risiko overfitting.
Strategi kuantitatif silang dua garis ini menilai trend melalui sinyal silang dua EMA, sambil memperkenalkan mekanisme berhenti-rugi dan penapis masa perdagangan, dan mencapai keseimbangan yang baik antara keupayaan untuk mengikuti trend dan kawalan risiko. Walaupun logik strategi ini sederhana, tetapi dengan pengoptimuman parameter dan kawalan risiko yang munasabah, keuntungan yang stabil dapat diperoleh di pasaran yang sedang berkembang. Strategi ini dapat diperbaiki pada masa depan dengan memperkenalkan lebih banyak petunjuk teknikal, dinamika stop loss, pengurusan dan pengoptimuman pembelajaran mesin untuk meningkatkan lagi prestasi strategi dan ketangkasan.
/*backtest
start: 2023-03-02 00:00:00
end: 2024-03-07 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © ZenAndTheArtOfTrading / www.PineScriptMastery.com
// @version=5
strategy("EMA strategy",
overlay=true,
initial_capital=50000,
default_qty_type=strategy.percent_of_equity,
default_qty_value=100, // 100% of balance invested on each trade
commission_type=strategy.commission.cash_per_contract,
commission_value=0.005) // Interactive Brokers rate
// Get user input
i_ma1 = input.int(title="MA 1 Length", defval=200, step=10, group="Strategy Parameters", tooltip="Long-term MA")
i_ma2 = input.int(title="MA 2 Length", defval=10, step=10, group="Strategy Parameters", tooltip="Short-term MA")
i_stopPercent = input.float(title="Stop Loss Percent", defval=0.10, step=0.1, group="Strategy Parameters", tooltip="Failsafe Stop Loss Percent Decline")
i_lowerClose = input.bool(title="Exit On Lower Close", defval=false, group="Strategy Parameters", tooltip="Wait for a lower-close before exiting above MA2")
i_startTime = input(title="Start Filter", defval=timestamp("01 Jan 1995 13:30 +0000"), group="Time Filter", tooltip="Start date & time to begin searching for setups")
i_endTime = input(title="End Filter", defval=timestamp("1 Jan 2099 19:30 +0000"), group="Time Filter", tooltip="End date & time to stop searching for setups")
// Get indicator values
ma1 = ta.ema(close, i_ma1)
ma2 = ta.ema(close, i_ma2)
// Check filter(s)
f_dateFilter = true
// Check buy/sell conditions
var float buyPrice = 0
buyCondition = close > ma1 and strategy.position_size == 0 and f_dateFilter
sellCondition = close < ma2 and strategy.position_size > 0 //and (not i_lowerClose or close < low[1])
stopDistance = strategy.position_size > 0 ? ((buyPrice - close) / close) : na
stopPrice = strategy.position_size > 0 ? buyPrice - (buyPrice * i_stopPercent) : na
stopCondition = strategy.position_size > 0 and stopDistance > i_stopPercent
// Enter positions
if buyCondition
strategy.entry(id="Long", direction=strategy.long)
if buyCondition[1]
buyPrice := open
// Exit positions
if sellCondition or stopCondition
strategy.close(id="Long", comment="Exit" + (stopCondition ? "SL=true" : ""))
buyPrice := na
// Draw pretty colors
plot(buyPrice, color=color.lime, style=plot.style_linebr)
plot(stopPrice, color=color.red, style=plot.style_linebr, offset=-1)
plot(ma1, color=color.blue)
plot(ma2, color=color.orange)