Strategi ini menggunakan persilangan dua purata bergerak eksponensial (EMA) sebagai isyarat beli dan jual. Apabila EMA tempoh pendek melintasi di atas EMA tempoh panjang dari bawah, ia menghasilkan isyarat beli; sebaliknya, apabila EMA tempoh pendek melintasi di bawah EMA tempoh panjang dari atas, ia menghasilkan isyarat jual. Di samping itu, strategi menentukan sama ada titik persilangan adalah harga tertinggi atau terendah dalam 10 tempoh perdagangan terakhir untuk mengesahkan kekuatan trend. Jika titik persilangan adalah harga tertinggi, latar belakang akan berwarna hijau; jika ia adalah harga terendah, ia akan berwarna merah.
Strategi ini menggunakan persimpangan purata bergerak eksponensial sebagai logik utamanya, sambil juga mempertimbangkan kedudukan relatif harga titik persimpangan dalam tempoh baru-baru ini untuk menentukan kekuatan trend. Secara keseluruhan, logik strategi jelas, dan kelebihan jelas, tetapi ia juga mempunyai batasan dan risiko tertentu. Dengan memperkenalkan lebih banyak penunjuk penilaian tambahan, menetapkan langkah kawalan risiko yang munasabah, dan mengoptimumkan parameter utama, kestabilan dan keuntungan strategi ini dapat ditingkatkan lagi.
/*backtest start: 2024-02-01 00:00:00 end: 2024-02-29 23:59:59 period: 1h basePeriod: 15m 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 // @version=5 strategy("ema giao nhau", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100) // Get user input emaLength1 = input.int(title="EMA #1 Length", defval=5) emaLength2 = input.int(title="EMA #2 Length", defval=10) // Get MAs ema1 = ta.ema(close, emaLength1) ema2 = ta.ema(close, emaLength2) // Draw MAs plot(ema1, color=color.blue, title="EMA 1") plot(ema2, color=color.red, title="EMA 2") // Detect crossovers bool crossOver = ta.crossover(ema1, ema2) bool crossUnder = ta.crossunder(ema1, ema2) bool cross = crossOver or crossUnder //float crossPrice = ta.valuewhen(cross, close, 0) float crossPrice = cross ? close : na // Check if the crossover price is the highest price over the past 10 bars bool highestPrice = crossOver for i = 1 to 10 if crossPrice <= close[i] highestPrice := false break // Check if the crossover price is the lowest price over the past 10 bars bool lowestPrice = crossUnder for i = 1 to 10 if crossPrice >= close[i] lowestPrice := false break // Flag the bar if it is a high/low close bgcolor(highestPrice ? color.new(color.green, 50) : na) bgcolor(lowestPrice ? color.new(color.red, 50) : na) // Display crossover price if cross highestEmaPrice = ema1 > ema2 ? ema1 : ema2 label myLabel = label.new(bar_index, highestEmaPrice, "CrossPrice=" + str.tostring(crossPrice), color=color.white) if highestPrice and strategy.position_size == 0 strategy.entry(id="Buy", direction=strategy.long) if lowestPrice and strategy.position_size == 0 strategy.entry(id="Sell", direction=strategy.short) // Exit trades when short-term EMA is breached if strategy.position_size > 0 and crossUnder strategy.close("Buy") if strategy.position_size < 0 and crossOver strategy.close("Sell")