Chiến lược này sử dụng sự chéo chéo của hai đường trung bình động theo cấp số nhân (EMA) làm tín hiệu mua và bán. Khi EMA ngắn hạn vượt qua EMA dài hạn từ dưới, nó tạo ra tín hiệu mua; ngược lại, khi EMA ngắn hạn vượt qua dưới EMA dài hạn từ trên, nó tạo ra tín hiệu bán. Ngoài ra, chiến lược xác định xem điểm chéo là giá cao nhất hoặc thấp nhất trong 10 kỳ giao dịch gần đây để xác nhận sức mạnh của xu hướng. Nếu điểm chéo là giá cao nhất, nền sẽ màu xanh lá cây; nếu đó là giá thấp nhất, nó sẽ màu đỏ. Hơn nữa, chiến lược hiển thị giá của điểm chéo trên biểu đồ.
Chiến lược này sử dụng tỷ lệ chéo trung bình động theo cấp số nhân như là logic cốt lõi của nó, đồng thời cũng xem xét vị trí tương đối của giá điểm chéo trong giai đoạn gần đây để xác định sức mạnh xu hướng. Nhìn chung, logic chiến lược rõ ràng và lợi thế là hiển nhiên, nhưng nó cũng có một số hạn chế và rủi ro nhất định. Bằng cách giới thiệu nhiều chỉ số phán đoán phụ, thiết lập các biện pháp kiểm soát rủi ro hợp lý và tối ưu hóa các thông số chính, sự ổn định và lợi nhuận của chiến lược này có thể được cải thiện hơn nữa.
/*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")