
Chiến lược này xác định định hướng xu hướng bằng cách tính toán sự giao nhau của MACD và đường tín hiệu đường trung bình di chuyển của nó, và kết hợp với chỉ số EMA để đánh giá xu hướng hiện tại là mạnh hoặc yếu, để thực hiện theo dõi xu hướng. Khi đường MACD từ dưới lên phá vỡ đường tín hiệu, làm nhiều hơn, phá vỡ từ trên xuống và làm trống, đồng thời đường EMA cũng có thể đánh giá xu hướng mạnh để lọc các phá vỡ giả.
Chiến lược này chủ yếu dựa trên các chỉ số MACD để xác định hướng xu hướng và thời gian nhập. Các đường MACD phá vỡ đường tín hiệu cho thấy xu hướng giá bị đảo ngược, do đó, đánh giá nhiều lỗ hổng dựa trên hướng phá vỡ.
EMA trung bình đóng vai trò là hỗ trợ phán đoán xu hướng, nếu giá cao hơn EMA trung bình cho biết là xu hướng tăng, tại thời điểm đó MACD bên dưới phá vỡ dễ dàng hình thành tín hiệu giao chéo vàng hoạt động; Nếu giá thấp hơn EMA trung bình cho biết là xu hướng giảm, tại thời điểm đó MACD bên trên phá vỡ dễ dàng hình thành tín hiệu giao chéo chết. Độ dài của EMA cũng quyết định mức độ trung bình và dài hạn của xu hướng phán đoán.
Bằng cách này, bạn có thể tham gia vào thị trường khi giá bắt đầu đảo ngược và hình thành xu hướng mới, để có hiệu quả theo dõi xu hướng.
Chiến lược này kết hợp các điều kiện phán đoán kép, xem xét hướng xu hướng của giá cả và sử dụng các chỉ số để đánh giá thời điểm nhập cảnh cụ thể, tránh nguy cơ phá vỡ giả, tăng cường độ tin cậy của chiến lược. So với chỉ số MACD đơn lẻ, chiến lược này có thể đánh giá chính xác hơn về sự khởi đầu của một xu hướng mới.
Việc sử dụng đường trung bình EMA cũng cho phép chiến lược lọc một phần ảnh hưởng của biến động ngắn hạn, khóa xu hướng đường dài trung bình. Điều này rất hữu ích trong việc sử dụng hiệu quả đảo ngược của MACD.
Ngoài ra, các chiến lược có thể được áp dụng cho các điều kiện thị trường có xu hướng tăng hoặc giảm, điều này cũng tăng khả năng thích ứng của chiến lược.
Rủi ro chính của chiến lược này là chỉ số MACD có khả năng đánh giá Fakeout cao hơn, tín hiệu có thể bị nhận dạng sai. Tại thời điểm này, chức năng trợ giúp của đường trung bình của EMA sẽ được yêu cầu, nhưng trong trường hợp đặc biệt, có thể không hiệu quả.
Ngoài ra, trong chiến lược sử dụng tỷ lệ lợi nhuận để thiết lập điều kiện dừng lỗ, có một mức độ chủ quan, nếu thiết lập không đúng cũng sẽ ảnh hưởng đến hiệu quả của chiến lược.
Cuối cùng, chiến lược chỉ đơn giản đặt số lượng vị trí mở là 100% quyền lợi tài khoản, không xem xét vấn đề quản lý tiền, điều này cũng có một số rủi ro trong thị trường chứng khoán.
Chiến lược này bao gồm một số hướng tối ưu hóa:
Thêm các chỉ số khác để tạo ra nhiều kết hợp chỉ số, có thể tránh xa khả năng MACD phát ra tín hiệu sai. Ví dụ, bạn có thể xem xét KDJ, BOLL, v.v.
Độ dài đường trung bình của EMA có thể được tối ưu hóa đa kết hợp để tìm các tham số tốt nhất để xác định hướng xu hướng.
Các tham số MACD cũng có thể được tối ưu hóa hơn nữa để tìm các tham số chính xác nhất xác định thời gian đảo ngược.
Thêm mô-đun quản lý tiền, chẳng hạn như tỷ lệ lợi nhuận có thể được sử dụng như một đầu vào động, cũng có thể thiết lập điểm dừng lỗ trượt, vv
Kiểm tra hiệu quả của các loại hợp đồng khác nhau để tìm kiếm các loại giao dịch phù hợp nhất. Ví dụ: tiền điện tử, tương lai chỉ số chứng khoán, v.v.
Chiến lược theo dõi xu hướng chéo vàng MACD EMA nói chung là đơn giản và thực tế, bằng cách đánh giá hai chỉ số để đảm bảo độ tin cậy của tín hiệu, thiết lập một cách dừng lỗ hợp lý để khóa lợi nhuận. Không gian tối ưu hóa chính là về lựa chọn tham số, danh mục chỉ số, quản lý tiền. Nếu kiểm tra tối ưu hóa hơn nữa, 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ả.
/*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)