Chiến lược giao dịch chéo trung bình động tam giác

Tác giả:ChaoZhang, Ngày: 2024-01-16 18:18:02
Tags:

img

Tổng quan

Triangular Moving Average (TMA) Crossover là một chiến lược giao dịch phân tích kỹ thuật điển hình. Nó sử dụng ba đường trung bình chuyển động có độ dài thời gian khác nhau để nắm bắt xu hướng và thực hiện giao dịch rủi ro thấp. Khi trung bình chuyển động ngắn hạn vượt qua trung bình chuyển động trung hạn lên, và trung bình chuyển động trung hạn trên trung bình chuyển động dài hạn, một tín hiệu mua được tạo ra. Khi trung bình chuyển động ngắn hạn vượt dưới trung bình chuyển động trung hạn xuống, và trung bình chuyển động trung hạn dưới trung bình chuyển động dài hạn, một tín hiệu bán được tạo ra.

Chiến lược logic

Chiến lược TMA chủ yếu dựa trên ba đường trung bình động để xác định hướng xu hướng. Đường trung bình động ngắn hạn phản ứng nhạy cảm với sự thay đổi giá; Đường trung bình động trung hạn cung cấp một đánh giá rõ ràng hơn về xu hướng; Đường trung bình động dài hạn lọc ra tiếng ồn thị trường và xác định hướng xu hướng dài hạn.

Khi đường trung bình động ngắn hạn vượt qua đường trung bình động trung hạn lên, điều này cho thấy giá đã bắt đầu phá vỡ lên. Tại thời điểm này, nếu đường trung bình động trung hạn trên đường trung bình động dài hạn, điều đó có nghĩa là thị trường hiện tại đang trong xu hướng tăng. Do đó, tín hiệu mua được tạo ra ở đây.

Ngược lại, khi trung bình động ngắn hạn vượt qua dưới mức trung bình động trung hạn xuống, nó cho thấy giá đã bắt đầu phá vỡ xuống. Tại thời điểm này, nếu trung bình động trung hạn thấp hơn trung bình động dài hạn, điều đó có nghĩa là thị trường hiện tại đang trong xu hướng giảm. Kết quả là, một tín hiệu bán được tạo ra.

Chiến lược này cũng thiết lập các đường dừng lỗ và lấy lợi nhuận. Sau khi tham gia giao dịch, giá dừng lỗ và lấy lợi nhuận sẽ được tính dựa trên các cài đặt tỷ lệ phần trăm. Nếu giá chạm vào một trong hai đường, vị trí sẽ được đóng.

Phân tích lợi thế

  • Sử dụng ba đường trung bình động cùng nhau để cải thiện tính chính xác của phán đoán
  • Đặt stop-loss và take-profit để kiểm soát hiệu quả rủi ro theo giao dịch
  • Các tham số trung bình động có thể tùy chỉnh phù hợp với các sản phẩm khác nhau
  • Bảy tùy chọn cho các loại trung bình động, các loại chiến lược đa dạng

Phân tích rủi ro và giải pháp

  • Các tín hiệu sai khi ba MA hợp nhất

    Giải pháp: Điều chỉnh các thông số MA đúng cách để tránh tín hiệu sai

  • Tỷ lệ stop-loss/take-profit quá mạnh

    Giải pháp: tỷ lệ phần trăm tinh chỉnh; không thể quá lớn hoặc quá nhỏ

  • Cài đặt tham số không chính xác dẫn đến quá nhiều hoặc quá ít giao dịch

    Giải pháp: Kiểm tra các kết hợp tham số khác nhau để tìm ra tối ưu

Hướng dẫn tối ưu hóa

Chiến lược TMA có thể được tối ưu hóa từ các khía cạnh sau:

  • Kiểm tra các loại khác nhau và kết hợp chiều dài để tìm ra tối ưu

    Kiểm tra các kết hợp loại hoặc chiều dài MA khác nhau để có kết quả tốt nhất

  • Thêm các chỉ số kỹ thuật khác làm bộ lọc tín hiệu

    Thêm các chỉ số như KDJ, MACD vv để xác minh nhiều yếu tố

  • Chọn các tham số dựa trên các đặc điểm của sản phẩm

    Giảm thời gian MA cho các sản phẩm dễ bay hơi; kéo dài thời gian cho các sản phẩm ổn định

  • Sử dụng máy học để tìm các thông số tối ưu

    Chế độ quét tham số tự động để nhanh chóng xác định vị trí tối ưu

Kết luận

Chiến lược TMA Crossover là một chiến lược dễ sử dụng sau xu hướng nói chung. Nó sử dụng ba MA cùng nhau để nắm bắt xu hướng và thiết lập dừng lỗ / lấy lợi nhuận để kiểm soát rủi ro, cho phép lợi nhuận ổn định.


/*backtest
start: 2024-01-08 00:00:00
end: 2024-01-15 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy("Kozlod - 3 MA strategy with SL/PT", shorttitle="kozlod_3ma", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 5)

// 
// author: Kozlod
// date: 2018-03-25
// 

////////////
// INPUTS //
////////////

ma_type        = input(title = "MA Type",            defval = "SMA", options = ['SMA', 'EMA', 'WMA', 'VWMA', 'HMA', 'SMMA', 'DEMA'])
short_ma_len   = input(title = "Short MA Length",    defval = 5,     minval = 1)
short_ma_src   = input(title = "Short MA Source",    defval = close)
medium_ma_len  = input(title = "Medium MA Length",   defval = 20,    minval = 2)
medium_ma_src  = input(title = "Medium MA Source",   defval = close)
long_ma_len    = input(title = "Long MA Length",     defval = 100,   minval = 3)
long_ma_src    = input(title = "Long MA Source",     defval = close)

sl_lev_perc    = input(title = "SL Level % (0 - Off)", type = float,   defval = 0,  minval = 0, step = 0.01)
pt_lev_perc    = input(title = "PT Level % (0 - Off)", type = float,   defval = 0,  minval = 0, step = 0.01)

// Set initial values to 0
short_ma  = 0.0
long_ma   = 0.0
medium_ma = 0.0

// Simple Moving Average (SMA)
if ma_type == 'SMA' 
    short_ma  := sma(short_ma_src,  short_ma_len)
    medium_ma := sma(medium_ma_src, medium_ma_len)
    long_ma   := sma(long_ma_src,   long_ma_len)

// Exponential Moving Average (EMA)
if ma_type == 'EMA'
    short_ma  := ema(short_ma_src,  short_ma_len)
    medium_ma := ema(medium_ma_src, medium_ma_len)
    long_ma   := ema(long_ma_src,   long_ma_len)

// Weighted Moving Average (WMA)
if ma_type == 'WMA'
    short_ma  := wma(short_ma_src,  short_ma_len)
    medium_ma := wma(medium_ma_src, medium_ma_len)
    long_ma   := wma(long_ma_src,   long_ma_len)

// Hull Moving Average (HMA)
if ma_type == 'HMA'
    short_ma  := wma(2*wma(short_ma_src,  short_ma_len  / 2) - wma(short_ma_src,  short_ma_len),  round(sqrt(short_ma_len)))
    medium_ma := wma(2*wma(medium_ma_src, medium_ma_len / 2) - wma(medium_ma_src, medium_ma_len), round(sqrt(medium_ma_len)))
    long_ma   := wma(2*wma(long_ma_src,   long_ma_len   / 2) - wma(long_ma_src,   long_ma_len),   round(sqrt(long_ma_len)))

// Volume-weighted Moving Average (VWMA)
if ma_type == 'VWMA'
    short_ma  := vwma(short_ma_src,  short_ma_len)
    medium_ma := vwma(medium_ma_src, medium_ma_len)
    long_ma   := vwma(long_ma_src,   long_ma_len)

// Smoothed Moving Average (SMMA)    
if ma_type == 'SMMA'
    short_ma  := na(short_ma[1])  ? sma(short_ma_src, short_ma_len)   : (short_ma[1]  * (short_ma_len  - 1) + short_ma_src)  / short_ma_len
    medium_ma := na(medium_ma[1]) ? sma(medium_ma_src, medium_ma_len) : (medium_ma[1] * (medium_ma_len - 1) + medium_ma_src) / medium_ma_len
    long_ma   := na(long_ma[1])   ? sma(long_ma_src,  long_ma_len)    : (long_ma[1]   * (long_ma_len   - 1) + long_ma_src)   / long_ma_len

// Double Exponential Moving Average (DEMA)
if ma_type == 'DEMA'
    e1_short  = ema(short_ma_src , short_ma_len)
    e1_medium = ema(medium_ma_src, medium_ma_len)
    e1_long   = ema(long_ma_src,   long_ma_len)
    
    short_ma  := 2 * e1_short  - ema(e1_short,  short_ma_len)
    medium_ma := 2 * e1_medium - ema(e1_medium, medium_ma_len)
    long_ma   := 2 * e1_long   - ema(e1_long,   long_ma_len)

/////////////
// SIGNALS //
/////////////

long_signal  = crossover( short_ma, medium_ma) and medium_ma > long_ma
short_signal = crossunder(short_ma, medium_ma) and medium_ma < long_ma

// Calculate PT/SL levels 
// Initial values 
last_signal    = 0
prev_tr_price  = 0.0
pt_level       = 0.0
sl_level       = 0.0

// Calculate previous trade price
prev_tr_price := (long_signal[1] and nz(last_signal[2]) != 1) or (short_signal[1] and nz(last_signal[2]) != -1) ? open : nz(last_signal[1]) != 0 ? prev_tr_price[1] : na

// Calculate SL/PT levels 
pt_level := nz(last_signal[1]) == 1 ? prev_tr_price * (1 + pt_lev_perc / 100) : nz(last_signal[1]) == -1 ? prev_tr_price * (1 - pt_lev_perc / 100)  : na
sl_level := nz(last_signal[1]) == 1 ? prev_tr_price * (1 - sl_lev_perc / 100) : nz(last_signal[1]) == -1 ? prev_tr_price * (1 + sl_lev_perc / 100)  : na

// Calculate if price hit sl/pt 
long_hit_pt = pt_lev_perc > 0 and nz(last_signal[1]) ==  1 and close >= pt_level
long_hit_sl = sl_lev_perc > 0 and nz(last_signal[1]) ==  1 and close <= sl_level

short_hit_pt = pt_lev_perc > 0 and nz(last_signal[1]) ==  -1 and close <= pt_level
short_hit_sl = sl_lev_perc > 0 and nz(last_signal[1]) ==  -1 and close >= sl_level

// What is last active trade? 
last_signal := long_signal ? 1 : short_signal ? -1 : long_hit_pt or long_hit_sl or short_hit_pt or short_hit_sl ? 0 : nz(last_signal[1])

//////////////
// PLOTTING //
//////////////

// Plot MAs
plot(short_ma,  color = red,    linewidth = 2)
plot(medium_ma, color = green,  linewidth = 2)
plot(long_ma,   color = yellow, linewidth = 2)


// Plot Levels 
plotshape(prev_tr_price, style = shape.cross, color = gray, location  = location.absolute, size = size.small)


plotshape(sl_lev_perc > 0 ? sl_level : na, style = shape.cross, color = red,   location  = location.absolute, size = size.small)
plotshape(pt_lev_perc > 0 ? pt_level : na, style = shape.cross, color = green, location  = location.absolute, size = size.small)

//////////////
// STRATEGY //
//////////////

strategy.entry("long",  true,  when = long_signal)
strategy.entry("short", false, when = short_signal)

strategy.close("long",  when = long_hit_pt  or long_hit_sl)
strategy.close("short", when = short_hit_pt or short_hit_sl)

Thêm nữa