Tài nguyên đang được tải lên... tải...

Chiến lược trung bình động mạnh gấp năm lần

Tác giả:ChaoZhang, Ngày: 2024-05-23 18:14:35
Tags:EMAWMASMATMAVARWWMAZLEMATSF

img

Tổng quan

Chiến lược Trung bình Di chuyển Quintuple Strong là một chiến lược giao dịch dựa trên nhiều trung bình di chuyển. Chiến lược này sử dụng 5 trung bình di chuyển của các khung thời gian và loại khác nhau để xác định xu hướng mạnh mẽ trên thị trường. 3 trung bình di chuyển đầu tiên là các thành phần cốt lõi của chiến lược, chủ yếu được sử dụng để xác định xu hướng và tạo tín hiệu, trong khi trung bình di chuyển thứ 4 và thứ 5 chủ yếu được sử dụng để phán đoán phụ trợ và phân tích trực quan.

Bằng cách xem xét toàn diện xu hướng và mối quan hệ vị trí tương đối của các đường trung bình động của các khung thời gian và loại khác nhau, chiến lược này có thể xác định chính xác hướng và sức mạnh xu hướng hiện tại của thị trường và điều chỉnh đúng thời điểm các vị trí theo những thay đổi trong xu hướng, để đạt được lợi nhuận tốt.

Nguyên tắc chiến lược

Chiến lược này sử dụng 5 đường trung bình động của các khung thời gian và loại khác nhau, cụ thể là:

  1. Trung bình động cấp 1: hiển thị tùy chỉnh, nhãn, nguồn dữ liệu, khung thời gian, chiều dài, chiều rộng dòng, màu sắc và kiểu.
  2. Trung bình động cấp 2: hiển thị tùy chỉnh, nhãn, nguồn dữ liệu, khung thời gian, chiều dài, chiều rộng dòng, màu sắc và kiểu.
  3. Trung bình động cấp 3: hiển thị tùy chỉnh, nhãn, nguồn dữ liệu, khung thời gian, chiều dài, chiều rộng dòng, màu sắc và kiểu.
  4. Trung bình động cấp 4: chủ yếu được sử dụng để đánh giá phụ trợ, hiển thị tùy chỉnh, nhãn, nguồn dữ liệu, khung thời gian, chiều dài, chiều rộng đường và màu sắc.
  5. Trung bình động cấp 5: chủ yếu được sử dụng để đánh giá phụ trợ, hiển thị tùy chỉnh, nhãn, nguồn dữ liệu, khung thời gian, chiều dài, chiều rộng đường và màu sắc.

Các loại của 5 đường trung bình động này có thể được thiết lập linh hoạt, bao gồm SMA, EMA, WMA, TMA, VAR, WWMA, ZLEMA, TSF và 8 loại khác.

Ý tưởng cốt lõi của chiến lược này là xác định hướng và sức mạnh của xu hướng bằng cách sử dụng nhiều xác nhận xu hướng của đường trung bình động của các khung thời gian và loại khác nhau:

  • Khi giá đóng cửa cao hơn mức trung bình động cấp 1, 2, và 3, mua dài;
  • Khi giá đóng cửa thấp hơn mức trung bình động cấp 1, 2, và 3, đi ngắn;
  • Khi nắm giữ một vị trí dài, nếu giá đóng cửa giảm xuống dưới mức trung bình động cấp 1 và 2, đóng dài;
  • Khi nắm giữ một vị trí ngắn, nếu giá đóng tăng trên mức trung bình động cấp 1 và 2, đóng ngắn.

Ngoài ra, chiến lược này sẽ hiển thị màu sắc của nến theo vị trí hiện tại:

  • Khi giữ một vị trí dài, cây nến màu xanh lá cây;
  • Khi giữ một vị trí ngắn, ngọn nến màu đỏ;
  • Trong các trường hợp khác, ngọn nến màu xám.

Ưu điểm chiến lược

  1. Khả năng theo dõi xu hướng mạnh mẽ. Chiến lược này sử dụng sự kết hợp của nhiều trung bình động trung bình và dài hạn để xác định xu hướng, với khả năng nhận dạng xu hướng mạnh mẽ, có thể nắm bắt hiệu quả các xu hướng thị trường chính.
  2. Các thông số của chiến lược này có thể được thiết lập linh hoạt, bao gồm loại, khung thời gian, thời gian của các đường trung bình động, vv, có thể được tối ưu hóa theo các đặc điểm thị trường và sở thích của nhà đầu tư khác nhau.
  3. Khả năng thích nghi với nhiều thị trường. Phán quyết về xu hướng của chiến lược này chủ yếu dựa trên sự chuyển động của giá, với khả năng thích nghi mạnh mẽ với thị trường, và có thể được sử dụng trên nhiều thị trường như cổ phiếu, hợp đồng tương lai, ngoại hối, tiền điện tử, v.v.
  4. Logic rõ ràng và đơn giản. Logic cốt lõi của chiến lược này là đơn giản và rõ ràng, dễ hiểu và thực hiện, mà không yêu cầu các mô hình toán học quá phức tạp.

Rủi ro chiến lược

  1. Rửa rủi ro giao dịch trên thị trường giới hạn phạm vi. Chiến lược này thường hoạt động trên thị trường giới hạn phạm vi, và có thể trải qua nhiều giao dịch thua lỗ nhỏ hơn, dẫn đến giảm lợi nhuận ròng.
  2. Rủi ro tối ưu hóa tham số. Chiến lược này sử dụng nhiều tham số. Nếu không thực hiện kiểm tra lại dữ liệu lịch sử và tối ưu hóa tham số đầy đủ, nó có thể dẫn đến giảm lớn hơn trong giao dịch trực tiếp trong tương lai.
  3. Rủi ro đảo ngược xu hướng. Chiến lược này chủ yếu phù hợp với các thị trường xu hướng. Một khi xu hướng thị trường đảo ngược, chiến lược này có thể tiếp tục giao dịch theo hướng xu hướng ban đầu, gây ra tổn thất.

Để giảm các rủi ro trên, các cải tiến sau đây có thể được xem xét:

  1. Thêm phát hiện thị trường giới hạn phạm vi và logic phán đoán để giảm số lượng giao dịch trên các thị trường không có xu hướng.
  2. Thực hiện đủ các thử nghiệm tối ưu hóa tham số trên chiến lược này để tìm ra sự kết hợp tham số tối ưu mạnh mẽ.
  3. Đặt mức dừng lỗ hợp lý để kiểm soát rủi ro tối đa của một giao dịch duy nhất. Đồng thời, các chỉ số hoặc tín hiệu khác có thể được sử dụng để xác nhận sự đảo ngược xu hướng và điều chỉnh các vị trí kịp thời.

Hướng dẫn tối ưu hóa chiến lược

  1. Đưa ra nhiều chỉ số xác nhận xu hướng hơn, chẳng hạn như MACD, DMI, v.v., để cải thiện độ chính xác của phán đoán xu hướng.
  2. Đối với các thị trường giới hạn phạm vi, hãy xem xét giới thiệu logic hoạt động có thể thích nghi với các thị trường giới hạn phạm vi, chẳng hạn như giao dịch lưới.
  3. Đối với các đặc điểm thị trường khác nhau, tối ưu hóa các thông số của chiến lược riêng biệt để cải thiện khả năng thích nghi.
  4. Xem xét việc kết hợp chiến lược này với các chiến lược khác, chẳng hạn như sự kết hợp giữa chiến lược xu hướng + chiến lược giới hạn phạm vi, chiến lược xu hướng + chiến lược phản xu hướng, v.v., để cải thiện độ vững chắc của chiến lược.

Tóm lại

Chiến lược trung bình động mạnh gấp 5 lần là một chiến lược giao dịch dựa trên nhiều xác nhận xu hướng. Bằng cách xem xét toàn diện xu hướng và mối quan hệ vị trí tương đối của trung bình động của các khung thời gian và loại khác nhau, nó có thể xác định tương đối chính xác hướng và sức mạnh xu hướng hiện tại của thị trường, và điều chỉnh đúng thời điểm các vị trí theo những thay đổi trong xu hướng. Lý thuyết chiến lược đơn giản và rõ ràng, các tham số linh hoạt và điều chỉnh, và nó có thể thích nghi với nhiều thị trường. Tuy nhiên, nó thực hiện các thị trường phạm vi nhập cảnh nói chung, và có một số rủi ro tối ưu hóa tham số và rủi ro đảo ngược xu hướng. Trong tương lai, chúng ta có thể xem xét giới thiệu nhiều chỉ số hơn, tối ưu hóa các tham số, thêm logic hoạt động cho các thị trường phạm vi, và kết hợp với các loại chiến lược khác để tiếp tục cải thiện độ bền và lợi nhuận của chiến lược này.


/*backtest
start: 2023-05-17 00:00:00
end: 2024-05-22 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Quintuple Strong Moving Average Strategy","QuisMa", overlay=true, margin_long=100, margin_short=100)

// 1
mav1_show = input.bool(true, 'Show Plot', group='Level 1 ', inline='mav1_0')
mav1_label = input.bool(true, 'Show Label', group='Level 1 ', inline='mav1_0')
mav1_source = input.source(close, '', group='Level 1 ', inline='mav1_1')
mav1_timeframe = input.timeframe('5', '', group='Level 1 ', inline='mav1_1')
mav1_length = input.int(50, 'Length', group='Level 1 ', inline='mav1_3')
mav1_size = input.int(2000, 'Size', minval=1, group='Level 1 ', inline='mav1_3')
mav1_width = input.int(2, '', minval=0, group='Level 1 ', inline='mav1_2')
mav1_color = input.color(color.new(#ffd000, 0), '', group='Level 1 ', inline='mav1_2')
mav1_type = input.string(title='Moving Average Type 1', defval='VAR', options=['SMA', 'EMA', 'WMA', 'TMA', 'VAR', 'WWMA', 'ZLEMA', 'TSF'])

// 2
mav2_show = input.bool(true, 'Show Plot', group='Level 2', inline='mav2_0')
mav2_label = input.bool(true, 'Show Label', group='Level 2', inline='mav2_0')
mav2_source = input.source(close, '', group='Level 2', inline='mav2_1')
mav2_timeframe = input.timeframe('30', '', group='Level 2', inline='mav2_1')
mav2_length = input.int(50, 'Length', group='Level 2', inline='mav2_3')
mav2_size = input.int(2000, 'Size', minval=1, group='Level 2', inline='mav2_3')
mav2_width = input.int(2, '', minval=0, group='Level 2', inline='mav2_2')
mav2_color = input.color(color.new(#ffd000, 0), '', group='Level 2', inline='mav2_2')
mav2_type = input.string(title='Moving Average Type 2', defval='VAR', options=['SMA', 'EMA', 'WMA', 'TMA', 'VAR', 'WWMA', 'ZLEMA', 'TSF'])

// 3
mav3_show = input.bool(true, 'Show Plot', group='Level 3', inline='mav3_0')
mav3_label = input.bool(true, 'Show Label', group='Level 3', inline='mav3_0')
mav3_source = input.source(close, '', group='Level 3', inline='mav3_1')
mav3_timeframe = input.timeframe('60', '', group='Level 3', inline='mav3_1')
mav3_length = input.int(50, 'Length', group='Level 3', inline='mav3_3')
mav3_size = input.int(2000, 'Size', minval=1, group='Level 3', inline='mav3_3')
mav3_width = input.int(2, '', minval=0, group='Level 3', inline='mav3_2')
mav3_color = input.color(color.new(#ffd000, 0), '', group='Level 3', inline='mav3_2')
mav3_type = input.string(title='Moving Average Type 3', defval='VAR', options=['SMA', 'EMA', 'WMA', 'TMA', 'VAR', 'WWMA', 'ZLEMA', 'TSF'])

// 4
mav4_show = input.bool(true, 'Show Plot', group='Level 4', inline='mav4_0')
mav4_label = input.bool(true, 'Show Label', group='Level 4', inline='mav4_0')
mav4_source = input.source(close, '', group='Level 4', inline='mav4_1')
mav4_timeframe = input.timeframe('480', '', group='Level 4', inline='mav4_1')
mav4_length = input.int(50, 'Length', group='Level 4', inline='mav4_3')
mav4_size = input.int(2000, 'Size', minval=1, group='Level 4', inline='mav4_3')
mav4_width = input.int(2, '', minval=0, group='Level 4', inline='mav4_2')
mav4_color = input.color(color.new(#ffd000, 0), '', group='Level 4', inline='mav4_2')
mav4_type = input.string(title='Moving Average Type 4', defval='VAR', options=['SMA', 'EMA', 'WMA', 'TMA', 'VAR', 'WWMA', 'ZLEMA', 'TSF'])

// 5
mav5_show = input.bool(true, 'Show Plot', group='Level 5', inline='mav5_0')
mav5_label = input.bool(true, 'Show Label', group='Level 5', inline='mav5_0')
mav5_source = input.source(close, '', group='Level 5', inline='mav5_1')
mav5_timeframe = input.timeframe('720', '', group='Level 5', inline='mav5_1')
mav5_length = input.int(50, 'Length', group='Level 5', inline='mav5_3')
mav5_size = input.int(2000, 'Size', minval=1, group='Level 5', inline='mav5_3')
mav5_width = input.int(2, '', minval=0, group='Level 5', inline='mav5_2')
mav5_color = input.color(color.new(#ffd000, 0), '', group='Level 5', inline='mav5_2')
mav5_type = input.string(title='Moving Average Type 5', defval='VAR', options=['SMA', 'EMA', 'WMA', 'TMA', 'VAR', 'WWMA', 'ZLEMA', 'TSF'])


// FUNCTIONS {{{
candle_size_ms = time - time[1]  // milliseconds of a candle

timetostring(tms) =>
    d_ = math.floor(tms / 86400)
    h_ = math.floor((tms - d_ * 86400) / 3600)
    m_ = math.floor((tms - d_ * 86400 - h_ * 3600) / 60)
    s_ = math.floor(tms - d_ * 86400 - h_ * 3600 - m_ * 60)
    ret = d_ > 0 ? str.tostring(d_) + ' D ' : ''
    ret += (h_ > 0 ? str.tostring(h_) + ' H ' : '')
    ret += (m_ > 0 ? str.tostring(m_) + ' m ' : '')
    if d_ == 0
        ret += (s_ > 0 ? str.tostring(s_) + ' s ' : '')
        ret
    ret

tftostring(tf) =>
    tfa = str.split(tf, '')
    tfalast = array.get(tfa, array.size(tfa) - 1)
    tfalastIsNum = na(str.tonumber(tfalast)) ? false : true
    txt = tfalastIsNum ? timetostring(str.tonumber(tf) * 60) : tf
    txt

htfLabel(htfy, tf, col) =>
    txt = tftostring(tf)
    htftxt = 'ᐊ ' + txt
    htftip = 'HTF  [ ' + txt + ' ] ' + str.tostring(htfy, '#.##')
    label.new(x=time + candle_size_ms * 2, y=htfy, xloc=xloc.bar_time, yloc=yloc.price, color=color.new(color.black, 100), textcolor=col, style=label.style_label_left, size=size.normal, text=htftxt, tooltip=htftip)

// Moving Averages Functions {{{
Var_Func(src, length) =>
    valpha = 2 / (length + 1)
    vud1 = src > src[1] ? src - src[1] : 0
    vdd1 = src < src[1] ? src[1] - src : 0
    vUD = math.sum(vud1, 9)
    vDD = math.sum(vdd1, 9)
    vCMO = nz((vUD - vDD) / (vUD + vDD))
    VAR = 0.0
    VAR := nz(valpha * math.abs(vCMO) * src) + (1 - valpha * math.abs(vCMO)) * nz(VAR[1])
    VAR

Wwma_Func(src, length) =>
    wwalpha = 1 / length
    WWMA = 0.0
    WWMA := wwalpha * src + (1 - wwalpha) * nz(WWMA[1])
    WWMA

Zlema_Func(src, length) =>
    zxLag = length / 2 == math.round(length / 2) ? length / 2 : (length - 1) / 2
    zxEMAData = src + src - src[zxLag]
    ZLEMA = ta.ema(zxEMAData, length)
    ZLEMA

Tsf_Func(src, length) =>
    lrc = ta.linreg(src, length, 0)
    lrc1 = ta.linreg(src, length, 1)
    lrs = lrc - lrc1
    TSF = ta.linreg(src, length, 0) + lrs
    TSF

getMA(src, length, mav_type) =>
    ma = 0.0
    if mav_type == 'SMA'
        ma := ta.sma(src, length)
    if mav_type == 'EMA'
        ma := ta.ema(src, length)
    if mav_type == 'WMA'
        ma := ta.wma(src, length)
    if mav_type == 'TMA'
        ma := ta.sma(ta.sma(src, math.ceil(length / 2)), math.floor(length / 2) + 1)
    if mav_type == 'VAR'
        ma := Var_Func(src, length)
    if mav_type == 'WWMA'
        ma := Wwma_Func(src, length)
    if mav_type == 'ZLEMA'
        ma := Zlema_Func(src, length)
    if mav_type == 'TSF'
        ma := Tsf_Func(src, length)
    ma

mav1 = request.security(syminfo.tickerid, mav1_timeframe, getMA(mav1_source, mav1_length, mav1_type), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_on)
plot(mav1_show ? mav1 : na, 'mav 1', color=mav1_color, linewidth=mav1_width, show_last=mav1_size)
var label mav1lbl = na
label.delete(mav1lbl)
mav1lbl := mav1_label ? htfLabel(mav1, mav1_timeframe, mav1_color) : na

mav2 = request.security(syminfo.tickerid, mav2_timeframe, getMA(mav2_source, mav2_length, mav2_type), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_on)
plot(mav2_show ? mav2 : na, 'mav 2', color=mav2_color, linewidth=mav2_width, show_last=mav2_size)
var label mav2lbl = na
label.delete(mav2lbl)
mav2lbl := mav2_label ? htfLabel(mav2, mav2_timeframe, mav2_color) : na

mav3 = request.security(syminfo.tickerid, mav3_timeframe, getMA(mav3_source, mav3_length, mav3_type), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_on)
plot(mav3_show ? mav3 : na, 'mav 3', color=mav3_color, linewidth=mav3_width, show_last=mav3_size)
var label mav3lbl = na
label.delete(mav3lbl)
mav3lbl := mav3_label ? htfLabel(mav3, mav3_timeframe, mav3_color) : na

mav4 = request.security(syminfo.tickerid, mav4_timeframe, getMA(mav4_source, mav4_length, mav4_type), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_on)
plot(mav4_show ? mav4 : na, 'mav 4', color=mav4_color, linewidth=mav4_width, show_last=mav4_size)
var label mav4lbl = na
label.delete(mav4lbl)
mav4lbl := mav4_label ? htfLabel(mav4, mav4_timeframe, mav4_color) : na

mav5 = request.security(syminfo.tickerid, mav5_timeframe, getMA(mav5_source, mav5_length, mav5_type), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_on)
plot(mav5_show ? mav5 : na, 'mav 5', color=mav5_color, linewidth=mav5_width, show_last=mav5_size)
var label mav5lbl = na
label.delete(mav5lbl)
mav5lbl := mav5_label ? htfLabel(mav5, mav5_timeframe, mav5_color) : na

// Alış ve Satış Koşulları
alisKosulu = close > mav1 and close > mav2 and close > mav3
satisKosulu = close < mav1 and close < mav2 and close < mav3

// Alış ve Satış Sinyalleri
if (alisKosulu and not satisKosulu)
    strategy.entry("Alış", strategy.long)
if (satisKosulu and not alisKosulu)
    strategy.entry("Satış", strategy.short)

// Pozisyonları Kapatma Koşulları
if (strategy.opentrades > 0)
    if (close < mav1 and close < mav2 and strategy.position_size > 0)
        strategy.close("Alış")
    if (close > mav1 and close > mav2 and strategy.position_size < 0)
        strategy.close("Satış")

// Mum Rengi Ayarlama
longKosul = strategy.opentrades > 0 and strategy.position_size > 0
shortKosul = strategy.opentrades > 0 and strategy.position_size < 0

barcolor(longKosul ? color.green : shortKosul ? color.red : color.gray)


Có liên quan

Thêm nữa