
Gói chiến lược này sử dụng 11 loại moving average khác nhau để làm cho nhiều và làm cho ít. 11 loại moving average được sử dụng bao gồm: trung bình di chuyển đơn giản (SMA), trung bình di chuyển chỉ số (EMA), trung bình di chuyển trọng lượng (WMA), trung bình di chuyển trọng lượng (VWMA), trung bình di chuyển phẳng (SMMA), trung bình di chuyển nhị phân (DEMA), trung bình di chuyển ba chiều (TEMA), trung bình di chuyển của Hull (HMA), trung bình di chuyển chậm trễ (ZEMA), trung bình di chuyển tam giác (TMA) và trượt siêu phẳng (SSMA).
Chiến lược này cho phép cấu hình hai đường trung bình di chuyển với một đường nhanh hơn và một đường chậm hơn, chọn từ 11 lựa chọn. Một tín hiệu làm nhiều sẽ được tạo ra khi MA nhanh hơn vượt qua MA chậm hơn. Một tín hiệu làm khoảng trống sẽ được tạo ra khi MA nhanh hơn vượt qua MA chậm hơn.
Các tính năng bổ sung bao gồm cài đặt thang, dừng và mức độ dừng.
Logic chiến lược cốt lõi phụ thuộc vào sự giao thoa giữa hai đường trung bình di chuyển để xác định lối vào và lối ra.
Điều kiện để tham gia là:
Tham gia nhiều lần: MA nhanh > MA chậm
Bước vào không khí: MA nhanh < MA chậm
Việc rút lui được xác định bởi một trong ba tiêu chí sau:
Chiến lược này cho phép cấu hình các tham số quan trọng như loại và độ dài MA, thiết lập thang, tỷ lệ dừng và dừng. Điều này cung cấp tính linh hoạt để tối ưu hóa chiến lược theo các điều kiện thị trường và sở thích rủi ro khác nhau.
Quản lý rủi ro có thể được tăng cường bằng cách xác nhận giá sử dụng tín hiệu vào, sử dụng tracking stop loss thay vì stop loss cứng và tránh tối ưu hóa quá mức.
Có một số cách để cải thiện chiến lược này:
Chiến lược giao dịch chéo đường trung bình di chuyển 11 cung cấp một phương pháp giao dịch chéo có hệ thống. Bằng cách kết hợp các tín hiệu trên nhiều chỉ số MA và cho phép cấu hình các tham số quan trọng, nó cung cấp một khung giao dịch mạnh mẽ và linh hoạt.
/*backtest
start: 2023-12-15 00:00:00
end: 2024-01-14 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=3
strategy(title = "[STRATEGY] MA Cross Eleven", overlay = true)
// MA - type, source, length
// MA - type, source, length
// SMA --> Simple
// EMA --> Exponential
// WMA --> Weighted
// VWMA --> Volume Weighted
// SMMA --> Smoothed
// DEMA --> Double Exponential
// TEMA --> Triple Exponential
// HMA --> Hull
// TMA --> Triangular
// SSMA --> SuperSmoother filter
// ZEMA --> Zero Lag Exponential
type = input(defval="ZEMA", title="MA Type: ", options=["SMA", "EMA", "WMA", "VWMA", "SMMA", "DEMA", "TEMA", "HullMA", "ZEMA", "TMA", "SSMA"])
len1 = input(defval=8, title="Fast MA Length", minval=1)
srcclose1 = input(close, "Fast MA Source")
len2 = input(defval=21, title="Slow MA Length", minval=1)
srcclose2 = input(close, "Slow MA Source")
// Returns MA input selection variant, default to SMA if blank or typo.
variant(type, src, len) =>
v1 = sma(src, len) // Simple
v2 = ema(src, len) // Exponential
v3 = wma(src, len) // Weighted
v4 = vwma(src, len) // Volume Weighted
v5 = 0.0
v5 := na(v5[1]) ? sma(src, len) : (v5[1] * (len - 1) + src) / len // Smoothed
v6 = 2 * v2 - ema(v2, len) // Double Exponential
v7 = 3 * (v2 - ema(v2, len)) + ema(ema(v2, len), len) // Triple Exponential
v8 = wma(2 * wma(src, len / 2) - wma(src, len), round(sqrt(len))) // Hull
v11 = sma(sma(src,len),len) // Triangular
// SuperSmoother filter
// © 2013 John F. Ehlers
a1 = exp(-1.414*3.14159 / len)
b1 = 2*a1*cos(1.414*3.14159 / len)
c2 = b1
c3 = (-a1)*a1
c1 = 1 - c2 - c3
v9 = 0.0
v9 := c1*(src + nz(src[1])) / 2 + c2*nz(v9[1]) + c3*nz(v9[2])
// Zero Lag Exponential
e = ema(v2, len)
v10 = v2+(v2-e)
// return variant, defaults to SMA if input invalid.
type=="EMA"?v2 : type=="WMA"?v3 : type=="VWMA"?v4 : type=="SMMA"?v5 : type=="DEMA"?v6 : type=="TEMA"?v7 : type=="HullMA"?v8 : type=="SSMA"?v9 : type=="ZEMA"?v10 : type=="TMA"? v11: v1
ma_1 = variant(type, srcclose1, len1)
ma_2 = variant(type, srcclose2, len2)
plot(ma_1, title="Fast MA", color = green, linewidth=2, transp=0)
plot(ma_2, title="Slow MA", color = red, linewidth=2, transp=0)
longCond = na
shortCond = na
longCond := crossover(ma_1, ma_2)
shortCond := crossunder(ma_1, ma_2)
// Count your long short conditions for more control with Pyramiding
sectionLongs = 0
sectionLongs := nz(sectionLongs[1])
sectionShorts = 0
sectionShorts := nz(sectionShorts[1])
if longCond
sectionLongs := sectionLongs + 1
sectionShorts := 0
if shortCond
sectionLongs := 0
sectionShorts := sectionShorts + 1
// Pyramiding Inputs
pyrl = input(1, "Pyramiding")
// These check to see your signal and cross references it against the pyramiding settings above
longCondition = longCond and sectionLongs <= pyrl
shortCondition = shortCond and sectionShorts <= pyrl
// Get the price of the last opened long or short
last_open_longCondition = na
last_open_shortCondition = na
last_open_longCondition := longCondition ? high[1] : nz(last_open_longCondition[1])
last_open_shortCondition := shortCondition ? low[1] : nz(last_open_shortCondition[1])
// Check if your last postion was a long or a short
last_longCondition = na
last_shortCondition = na
last_longCondition := longCondition ? time : nz(last_longCondition[1])
last_shortCondition := shortCondition ? time : nz(last_shortCondition[1])
in_longCondition = last_longCondition > last_shortCondition
in_shortCondition = last_shortCondition > last_longCondition
// Take profit
isTPl = input(false, "Take Profit Long")
isTPs = input(false, "Take Profit Short")
tpl = input(3, "Take Profit Long %", type=float)
tps = input(30, "Take Profit Short %", type=float)
long_tp = isTPl and crossover(high, (1+(tpl/100))*last_open_longCondition) and in_longCondition == 1
short_tp = isTPs and crossunder(low, (1-(tps/100))*last_open_shortCondition) and in_shortCondition == 1
// Stop Loss
isSLl = input(false, "Stop Loss Long")
isSLs = input(false, "Stop Loss Short")
sl= 0.0
sl := input(3, "Stop Loss %", type=float)
long_sl = isSLl and crossunder(low, (1-(sl/100))*last_open_longCondition) and longCondition == 0 and in_longCondition == 1
short_sl = isSLs and crossover(high, (1+(sl/100))*last_open_shortCondition) and shortCondition == 0 and in_shortCondition == 1
// Create a single close for all the different closing conditions.
long_close = long_tp or long_sl ? 1 : 0
short_close = short_tp or short_sl ? 1 : 0
// Get the time of the last close
last_long_close = na
last_short_close = na
last_long_close := long_close ? time : nz(last_long_close[1])
last_short_close := short_close ? time : nz(last_short_close[1])
// Strategy entries
strategy.entry("long", strategy.long, when=longCondition == true, stop = open[1])
strategy.entry("short", strategy.short, when=shortCondition == true)
strategy.close("long", when = long_sl or long_tp)
strategy.close("short", when = short_sl or short_tp)