
Chiến lược này dựa trên sự giao thoa của hai đường trung bình di chuyển với các tham số khác nhau để phát ra tín hiệu mua và bán. Một tín hiệu mua được phát ra khi đường trung bình di chuyển ngắn hơn phá vỡ đường trung bình di chuyển dài hơn từ phía dưới; một tín hiệu bán được phát ra khi đường trung bình di chuyển ngắn hơn phá vỡ đường trung bình di chuyển dài hơn từ phía trên.
Chiến lược này được viết bằng ngôn ngữ kịch bản pine. Đầu tiên, thông qua đầu vào, xác định loại, độ dài và nguồn giá của hai đường trung bình di chuyển, được đặt tên là p1 và p2, trong đó p1 đại diện cho đường trung bình có chu kỳ ngắn hơn và p2 đại diện cho đường trung bình có chu kỳ dài hơn.
Các hàm crossover và crossunder được sử dụng để đánh giá sự giao nhau của hai đường thẳng. Khi p1 phá vỡ p2 từ phía dưới, nó sẽ phát ra tín hiệu mua; khi p1 phá vỡ p2 từ phía trên, nó sẽ phát ra tín hiệu bán.
Để thực hiện giao dịch, chiến lược sẽ tạo vị trí nhiều đầu hoặc trống khi phát tín hiệu thông qua hàm strategy.entry. Nếu tham số shortOnly được bật, chỉ giao dịch sẽ bán tín hiệu.
Chiến lược này có những ưu điểm sau:
Chiến lược này cũng có một số rủi ro:
Có thể giảm tín hiệu vô hiệu bằng cách điều chỉnh chiều dài đường trung bình, giới thiệu các điều kiện lọc, v.v.
Chiến lược này có thể được tối ưu hóa theo các khía cạnh sau:
Giới thiệu giá trung bình trọng lượng khối lượng hoặc giá điển hình như một nguồn giá để tăng độ tin cậy của tín hiệu chéo
Tăng Validation Period để tránh lỗi chéo ngắn hạn
Kết hợp với ATR dừng, thiết lập mức lỗ tối đa chịu được dựa trên sự biến động của thị trường
Sử dụng các tham số tối ưu hóa phù hợp với đường cong để tìm các tham số kết hợp tối ưu
Chỉ xem xét tín hiệu giao dịch khi xu hướng chu kỳ lớn nhất quán
Chiến lược giao chéo song song này dễ hiểu và thực hiện, tạo ra tín hiệu giao dịch thông qua giao chéo của hai đường song song, có thể được tùy chỉnh cao. Tuy nhiên, nó cũng có thể tạo ra nhiều tín hiệu không hiệu quả trong tình huống chấn động. Có thể giảm rủi ro bằng cách tối ưu hóa tham số và tối ưu hóa quy tắc, có không gian tối ưu hóa lớn, đáng để nghiên cứu thêm.
/*backtest
start: 2022-11-20 00:00:00
end: 2023-11-26 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/
// © RafaelPiccolo
//@version=4
strategy("Double MA Cross", overlay=true)
type1 = input("SMA", "MA Type 1", options=["SMA", "EMA", "WMA", "HMA", "VWMA", "RMA", "TEMA"])
len1 = input(10, minval=1, title="Length 1")
src1 = input(close, "Source 1", type=input.source)
type2 = input("SMA", "MA Type 2", options=["SMA", "EMA", "WMA", "HMA", "VWMA", "RMA", "TEMA"])
len2 = input(50, minval=2, title="Length 2")
src2 = input(close, "Source 2", type=input.source)
shortOnly = input(false, "Short only")
tema(src, len)=>
ema1 = ema(src, len)
ema2 = ema(ema1, len)
ema3 = ema(ema2, len)
return = 3 * (ema1 - ema2) + ema3
getPoint(type, len, src)=>
return = type == "SMA" ? sma(src, len) : type == "EMA" ? ema(src, len) : type == "WMA" ? wma(src, len) : type == "HMA" ? hma(src, len) : type == "VWMA" ? vwma(src, len) : type == "RMA" ? rma(src, len) : tema(src, len)
p1 = getPoint(type1, len1, src1)
p2 = getPoint(type2, len2, src2)
shortCondition = crossunder(p1, p2)
longCondition = crossover(p1, p2)
if (shortCondition)
strategy.entry("Short", strategy.short)
if (longCondition)
if (shortOnly)
strategy.close("Short")
else
strategy.entry("Long", strategy.long)
plot(p1, "MA 1", p1 < p2 ? color.red : color.green)
plot(p2, "MA 2", color.blue)