Strategi ini melaksanakan sistem perdagangan purata bergerak eksponensial tiga (EMA) biasa. Ia menghasilkan isyarat perdagangan dengan membandingkan EMA 5 hari yang cepat, EMA 20 hari yang sederhana dan EMA 50 hari yang perlahan. Ia juga menggunakan harga penutupan bar semasa berbanding dengan bar sebelumnya untuk menapis isyarat palsu.
Apabila EMA 5 hari melintasi di atas EMA 20 hari, dan ketiga-tiga EMA sejajar dengan kenaikan (EMA 5 hari > EMA 20 hari > EMA 50 hari), dan penutupan bar semasa di atas bar sebelum ditutup oleh tik tertentu, pergi panjang.
Selepas masuk, apabila harga berjalan oleh tanda-tanda tertentu, kerugian hentian akan dimulakan untuk terus menyesuaikan kerugian hentian berdasarkan turun naik harga, untuk mengunci keuntungan yang lebih besar.
Menggunakan tiga EMA untuk menjana isyarat dapat menapis bunyi bising pasaran dengan berkesan dan mengenal pasti trend. EMA pantas mencerminkan perubahan terkini, EMA sederhana menentukan arah trend, dan EMA perlahan menapis goyangan.
Membandingkan penutupan bar semasa dengan penutupan bar terdahulu menapis isyarat palsu dan mengurangkan perdagangan yang tidak perlu.
Penghentian kerugian yang mengikuti secara dinamik menyesuaikan penghentian kerugian berdasarkan tindakan harga untuk memaksimumkan kunci keuntungan.
Tetapan parameter fleksibel strategi ini membolehkan pengoptimuman di seluruh produk dan jangka masa yang berbeza dari bar harian hingga minit.
Perpindahan EMA yang kerap boleh menghasilkan perdagangan berlebihan di pasaran yang berbeza, meningkatkan kos komisen dan kelalaian.
Hentikan kerugian boleh keluar dari trend sebelum masa semasa whipsaws besar.
Kelewatan EMA boleh menyebabkan kehilangan titik perubahan utama dan kerugian.
Parameter seperti tempoh EMA, tanda berhenti yang tertinggal memerlukan pengoptimuman untuk produk dan jangka masa yang berbeza.
Masukkan penunjuk lain seperti MACD, KD untuk menapis isyarat perdagangan.
Uji dan mengoptimumkan parameter untuk produk dan jangka masa tertentu untuk mencari kombinasi terbaik.
Sesuaikan parameter secara dinamik melalui pengawasan manusia atau pembelajaran mesin.
Pertimbangkan untuk melumpuhkan penangguhan dan memegang kedudukan penuh untuk keadaan pasaran tertentu.
Ganti stop loss yang mudah dengan mekanisme mengambil keuntungan automatik yang lebih maju.
Strategi ini mengintegrasikan tiga teknik analisis teknikal yang biasa - EMA crossover, price breakout dan trailing stop loss ke dalam sistem perdagangan trend yang agak komprehensif dan kukuh. Melalui pengoptimuman parameter, ia boleh disesuaikan dengan produk dan jangka masa yang berbeza dan berfungsi dengan baik di pasaran yang kuat.
/*backtest start: 2023-10-01 00:00:00 end: 2023-10-02 12:00:00 period: 1m basePeriod: 1m 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/ // © Matt Dearden - IndoPilot // @version=4 /////////////////////////////////////////////////////// Initial Parameters /////////////////////////////////////////////////////// SystemName = "Triple EMA Strategy" ShortSystemName = "TEMA" InitPosition = 0 InitCapital = 50000 InitCommission = 0.004 //approx value to compensate for Oanda spreads InitPyramidMax = 0 CalcOnorderFills = true strategy(title=SystemName, shorttitle=ShortSystemName, overlay=true, pyramiding=InitPyramidMax, default_qty_type=strategy.cash, default_qty_value=InitPosition, commission_type=strategy.commission.percent, commission_value=InitCommission, initial_capital=InitCapital, max_lines_count=500, max_labels_count=500, process_orders_on_close=false, calc_on_every_tick=false) ///////////////////////////////////////////////////////////// Inputs ///////////////////////////////////////////////////////////// DateFilter = input(false, "═════ Data Filtering ═════") InitYear = input(title="Year", type=input.integer, defval=2021, minval=2000, maxval=2021) InitMonth = input(title="Month (0=ALL)", type=input.integer, defval=0, minval=0, maxval=12) InitStopLoss = input(title="Stop Loss (ticks)", type=input.integer, defval=100, minval=0, maxval=1000) TrailingStopLoss = input(title="Trailing S/L (ticks)", type=input.integer, defval=130, minval=0, maxval=1000) InitBuffer = input(title="Buffer (ticks)", type=input.integer, defval=15, minval=0, maxval=1000) InitEMA1 = input(title="EMA 1", type=input.integer, defval=5, minval=0, maxval=1000) InitEMA2 = input(title="EMA 2", type=input.integer, defval=20, minval=0, maxval=1000) InitEMA3 = input(title="EMA 3", type=input.integer, defval=50, minval=0, maxval=1000) //////////////////////////////////////////////////////////// Variables /////////////////////////////////////////////////////////// var StopLoss = float(0.0) var StartPrice = float(0.0) //setup multipliers and catch JPY difference Multiplier = syminfo.currency == "JPY" ? 10 : 1000 //get the daily exchange rate from yesterday //X_rate = security(AccountCurrency+syminfo.currency, "D", close[1]) OrderQty = 1 Buffer = InitBuffer / (Multiplier * 100) /////////////////////////////////////////////////////// Triple EMA Strategy ////////////////////////////////////////////////////// EMA1 = ema(close, InitEMA1) EMA2= ema(close, InitEMA2) EMA3 = ema(close, InitEMA3) //entry conditions longCondition = crossover(EMA1, EMA2) and close > EMA3 and EMA1 > EMA3 and EMA2 > EMA3 and close > (close[1] + Buffer) shortCondition = crossunder(EMA1, EMA2) and close < EMA3 and EMA1 < EMA3 and EMA2 < EMA3 and close < (close[1] - Buffer) /////////////////////////////////////////////////////// Trailing Stoploss //////////////////////////////////////////////////////// if (strategy.position_size > 0 and (close > (StartPrice + (TrailingStopLoss / (100 * Multiplier))))) StopLoss := max(StopLoss, close - (TrailingStopLoss / (100 * Multiplier))) strategy.exit("Long Stoploss", "Long") if (strategy.position_size < 0 and (close < (StartPrice - (InitStopLoss / (100 * Multiplier))))) StopLoss := min(StopLoss, close + (TrailingStopLoss / (100 * Multiplier))) strategy.exit("Short Stoploss", "Short") ///////////////////////////////////////////////////////// Setup entries ///////////////////////////////////////////////////////// if (longCondition) StartPrice := close StopLoss := StartPrice - (InitStopLoss / (100 * Multiplier)) strategy.entry("Long", strategy.long, qty=OrderQty) strategy.exit("Long Stoploss", "Long") if (shortCondition) StartPrice := close StopLoss := StartPrice + (InitStopLoss / (100 * Multiplier)) strategy.entry("Short", strategy.short, qty=OrderQty) strategy.exit("Short Stoploss", "Short") ///////////////////////////////////////////////////////// Draw the EMAs ///////////////////////////////////////////////////////// plot(EMA1, "EMA1", color=#00FF00) plot(EMA2, "EMA2", color=#FF0000) plot(EMA3, "EMA3", color=#4040FF)