Chiến lược theo dõi xu hướng chéo MACD EMA

Tác giả:ChaoZhang, Ngày: 2024-02-18 15:17:36
Tags:

img

Tổng quan

Chiến lược này xác định hướng xu hướng bằng cách tính toán sự chéo chéo giữa chỉ số MACD và đường truyền tín hiệu của nó, và đánh giá sức mạnh của xu hướng hiện tại với chỉ số EMA để theo dõi xu hướng.

Chiến lược logic

Cốt lõi của chiến lược này là xác định hướng xu hướng và thời gian vào dựa trên chỉ số MACD. Sự chéo chéo giữa đường MACD và đường tín hiệu cho thấy sự đảo ngược trong xu hướng giá. Do đó, các vị trí dài và ngắn được xác định theo hướng phá vỡ. Cụ thể, khi giá đóng trên đường EMA và đường MACD xuyên qua đường tín hiệu từ dưới, đi dài; khi giá đóng dưới đường EMA và đường MACD xuyên qua đường tín hiệu từ trên, đi ngắn.

Đường EMA phục vụ để giúp đánh giá xu hướng. Nếu giá nằm trên đường EMA, nó chỉ ra xu hướng tăng. Tại thời điểm này, một bước đột phá từ MACD bên dưới có thể tạo ra tín hiệu chéo vàng. Nếu giá nằm dưới đường EMA, nó chỉ ra xu hướng giảm. Tại thời điểm này, một bước đột phá từ trên đường MACD có thể tạo ra tín hiệu chéo chết. Chiều dài EMA cũng xác định mức độ trung bình đến dài hạn của phán đoán xu hướng.

Bằng cách này, chúng ta có thể vào thị trường kịp thời khi giá bắt đầu đảo ngược để hình thành một xu hướng mới, đạt được hiệu ứng theo dõi xu hướng.

Phân tích lợi thế

Chiến lược này kết hợp hai điều kiện đánh giá, tính đến cả hướng xu hướng của giá và sử dụng các chỉ số để xác định thời gian nhập cảnh cụ thể, tránh rủi ro đột phá sai, và tăng độ tin cậy của chiến lược.

Việc áp dụng đường EMA cũng cho phép chiến lược lọc các tác động của biến động ngắn hạn và khóa trong xu hướng trung bình và dài hạn ở một mức độ nào đó.

Ngoài ra, chiến lược đặt ra các điều kiện cho cả dài và ngắn, có thể được áp dụng cho thị trường bò và gấu, do đó tăng khả năng thích nghi của chiến lược.

Phân tích rủi ro

Rủi ro chính của chiến lược này là chỉ số MACD có khả năng đánh giá sai các tín hiệu Fakeout. Tại thời điểm này, chức năng phụ trợ của đường EMA là cần thiết, nhưng thất bại vẫn có thể xảy ra trong điều kiện thị trường đặc biệt.

Ngoài ra, chiến lược áp dụng một yếu tố lợi nhuận để thiết lập các điều kiện dừng lỗ và lấy lợi nhuận, liên quan đến một số chủ quan.

Cuối cùng, chiến lược chỉ đơn giản là đặt kích thước vị trí lên 100% vốn chủ sở hữu của tài khoản mà không xem xét vấn đề quản lý quỹ, cũng gây ra một số rủi ro trong giao dịch trực tiếp.

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

Các hướng tối ưu hóa chính cho chiến lược này bao gồm:

  1. Tăng các chỉ số khác để đánh giá để tạo ra nhiều kết hợp chỉ số để tránh thêm khả năng MACD tạo ra tín hiệu sai.

  2. Chiều dài đường EMA có thể được tối ưu hóa nhiều thông số để tìm các thông số tối ưu để đánh giá hướng xu hướng.

  3. Các thông số MACD cũng có thể được tối ưu hóa thêm để tìm ra các giá trị chính xác nhất để xác định thời gian đảo ngược.

  4. Thêm một mô-đun quản lý vốn. Ví dụ, yếu tố lợi nhuận có thể được sử dụng như một đầu vào động, và dừng trượt cũng có thể được thiết lập.

  5. Kiểm tra tác động đối với các loại hợp đồng khác nhau, chẳng hạn như tiền điện tử, tương lai chỉ số, vv để tìm loại giao dịch phù hợp nhất.

Kết luận

Nhìn chung, chiến lược theo dõi xu hướng chéo MACD EMA này tương đối đơn giản và thực tế. Nó đảm bảo độ tin cậy tín hiệu thông qua các điều kiện chỉ số kép và khóa lợi nhuận thông qua các phương pháp dừng lỗ và lấy lợi nhuận hợp lý. Không gian tối ưu hóa chính nằm trong việc lựa chọn tham số, kết hợp chỉ số, quản lý vốn, v.v. Với việc tối ưu hóa và thử nghiệm thêm, người ta tin rằng chiến lược này có thể trở thành một trong những chiến lược theo dõi xu hướng hiệu quả nhất.


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

//@version=4

strategy(title="MACD EMA Strategy", shorttitle="MACD EMA STRAT", overlay = true, pyramiding = 0, max_bars_back=3000, calc_on_order_fills = false, commission_type =  strategy.commission.percent, commission_value = 0, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, initial_capital=5000, currency=currency.USD)

// Time Range
FromMonth=input(defval=1,title="FromMonth",minval=1,maxval=12)
FromDay=input(defval=1,title="FromDay",minval=1,maxval=31)
FromYear=input(defval=2020,title="FromYear",minval=2016)
ToMonth=input(defval=1,title="ToMonth",minval=1,maxval=12)
ToDay=input(defval=1,title="ToDay",minval=1,maxval=31)
ToYear=input(defval=9999,title="ToYear",minval=2017)
start=timestamp(FromYear,FromMonth,FromDay,00,00)
finish=timestamp(ToYear,ToMonth,ToDay,23,59)
window()=>true

// STEP 2:
// See if this bar's time happened on/after start date
afterStartDate = true

//EMA
emasrc = close
res = input(title="EMA Timeframe", type=input.resolution, defval="15")
len1 = input(title="EMA Length", type=input.integer, defval=206)
col1 = color.yellow
// Calculate EMA
ema1 = ema(emasrc, len1)
emaSmooth = security(syminfo.tickerid, res, ema1, barmerge.gaps_on, barmerge.lookahead_off)
// Draw EMA
plot(emaSmooth, title="EMA", linewidth=1, color=col1)

//MACD
fast_length = input(title="Fast Length", type=input.integer, defval=15)
slow_length = input(title="Slow Length", type=input.integer, defval=24)
src = input(title="Source", type=input.source, defval=close)
signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9)
sma_source = input(title="Simple MA (Oscillator)", type=input.bool, defval=true)
sma_signal = input(title="Simple MA (Signal Line)", type=input.bool, defval=true)
zeroline = 0

// Plot colors
col_grow_above = #26A69A
col_grow_below = #FFCDD2
col_fall_above = #B2DFDB
col_fall_below = #EF5350
col_macd = #0094ff
col_signal = #ff6a00

// Calculating
fast_ma = sma_source ? sma(src, fast_length) : ema(src, fast_length)
slow_ma = sma_source ? sma(src, slow_length) : ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal ? sma(macd, signal_length) : ema(macd, signal_length)
hist = macd - signal
//plot(hist, title="Histogram", style=plot.style_columns, color=(hist>=0 ? (hist[1] < hist ? col_grow_above : col_fall_above) : (hist[1] < hist ? col_grow_below : col_fall_below) ), transp=0 )
//plot(macd, title="MACD", color=col_macd, transp=0)
//plot(signal, title="Signal", color=col_signal, transp=0)
//plot(zeroline, title="Zero Line", color=color.black, transp=0)

///////////////////////////LONG////////////////////////////////////////////////////////////////////

enablelong = input(true, title="Enable long?")

//Long Signal
upcondition = close > emaSmooth and close[1] > emaSmooth[1]
macdunderhis = macd < zeroline
macdcrossup = crossover(macd, signal)

longcondition = upcondition and macdunderhis and macdcrossup

//strategy buy long
if (longcondition) and (afterStartDate) and strategy.opentrades < 1 and (enablelong == true)
    strategy.entry("long", strategy.long)

//////////////////////////////////////SHORT//////////////////////////////////////////////////////////////////////////////////

enableshort = input(true, title="Enable short?")

//Short Signal
downcondition = close < emaSmooth and close[1] < emaSmooth[1]
macdoverhis = macd > zeroline
macdcrosunder = crossunder(macd, signal)

shortcondition = downcondition and macdoverhis and macdcrosunder

//strategy buy short
if (shortcondition) and (afterStartDate) and strategy.opentrades < 1 and (enableshort == true)
    strategy.entry("short", strategy.short)


//////////////////////////////////////EXIT CONDITION//////////////////////////////////////////////////////////////////////////////////
bought = strategy.position_size[1] < strategy.position_size
sold = strategy.position_size[1] > strategy.position_size
barsbought = barssince(bought)
barssold = barssince(sold)
//////LOWEST LOW//////
//Lowest Low LONG
profitfactorlong = input(title="ProfitfactorLong", type=input.float, step=0.1, defval=1.9)
loLen = input(title="Lowest Low Lookback", type=input.integer,
  defval=46, minval=2)
stop_level_long = lowest(low, loLen)[1]

if strategy.position_size>0 
    profit_level_long = strategy.position_avg_price + ((strategy.position_avg_price - stop_level_long[barsbought])*profitfactorlong)
    strategy.exit(id="TP/ SL", stop=stop_level_long[barsbought], limit=profit_level_long)

//Lowest Low SHORT
profitfactorshort = input(title="ProfitfactorShort", type=input.float, step=0.1, defval=2.1)
highLen = input(title="highest high lookback", type=input.integer,
  defval=25, minval=2)
stop_level_short = highest(high, highLen)[1]

if strategy.position_size<0 
    profit_level_short = strategy.position_avg_price - ((stop_level_short[barssold] - strategy.position_avg_price)*profitfactorshort)
    strategy.exit(id="TP/ SL", stop=stop_level_short[barssold], limit=profit_level_short)
    
//PLOTT TP SL
plot(stop_level_long, title="SL Long", linewidth=1, color=color.red)
plot(stop_level_short, title="SL Short", linewidth=1, color=color.red)

Thêm nữa