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