Mười một chiến lược giao cắt kết hợp đường trung bình động


Ngày tạo: 2024-01-15 13:57:53 sửa đổi lần cuối: 2024-01-15 13:57:53
sao chép: 3 Số nhấp chuột: 710
1
tập trung vào
1617
Người theo dõi

Mười một chiến lược giao cắt kết hợp đường trung bình động

Tổng quan

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.

Chiến lược Logic

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:

  1. Mức dừng đạt
  2. Mức dừng lỗ đạt
  3. Tạo tín hiệu ngược (trên đường trung bình di chuyển theo hướng ngược)

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.

Ưu điểm

  • Kết hợp 11 loại MA khác nhau để tạo ra tín hiệu mạnh mẽ
  • Tính linh hoạt trong cấu hình tham số chính
  • Chặn và dừng lỗ bảo vệ lợi nhuận, hạn chế tổn thất
  • Đường bậc thang cho phép tăng vị trí trong xu hướng mạnh

Rủi ro

  • Giống như bất kỳ chỉ số kỹ thuật nào, giao MA có thể tạo ra tín hiệu sai
  • Quá tối ưu hóa điều kiện thị trường hiện tại có thể làm giảm hiệu suất trong tương lai
  • “Hard Stop” rút khỏi giao dịch đúng đắn quá sớm

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.

Tối ưu hóa không gian

Có một số cách để cải thiện chiến lược này:

  1. Thêm các bộ lọc bổ sung trước khi vào cửa, chẳng hạn như kiểm tra khối lượng và giá cả
  2. Kiểm tra một cách có hệ thống các loại MA khác nhau và chọn 1-2 loại tốt nhất
  3. Tối ưu hóa độ dài MA cho các loại giao dịch và khoảng thời gian cụ thể
  4. Sử dụng tracking stop loss thay cho hard stop loss
  5. Trình độ tăng trưởng của xu hướng có thể được thêm vào bởi các giai đoạn dừng.

Tóm tắt

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.

Mã nguồn chiến lược
/*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)