Chiến lược này sử dụng chỉ số trung bình di chuyển ((MACD) để xây dựng tín hiệu nhiều lỗ hổng, giao dịch đảo ngược trong điều kiện có xu hướng tốt, thu lợi nhuận bằng cách thiết lập vị trí rời khỏi sân động.
Chiến lược này chủ yếu dựa trên các chỉ số MACD để tạo ra các tín hiệu giao thoa vàng, giao thoa chết và giao thoa trống. Cụ thể, khi đường MACD đi từ dưới lên sẽ tạo ra các tín hiệu giao thoa vàng; khi đường MACD đi từ trên xuống sẽ tạo ra các tín hiệu giao thoa trống.
Khi tín hiệu Gold Fork đến, nếu giá đóng cửa cao hơn đường trung bình EMA, hãy làm nhiều; Khi tín hiệu Dead Fork đến, nếu giá đóng cửa thấp hơn đường trung bình EMA, hãy làm trống. Điều này đảm bảo giao dịch đảo ngược trong xu hướng lớn.
Sau khi vào, chiến lược sử dụng vị trí dừng lỗ và vị trí dừng lỗ để dừng lỗ động. Cụ thể, nhiều vị trí dừng lỗ được đặt thành giá vào(1 - Giảm tối đa); Cài đặt lệnh dừng là giá nhập(1+TARGET_STOP_RATIO*Tỷ lệ giảm tối đa) ⋅ đặt đơn vị trống ngược lại ⋅ trong đó, Tỷ lệ giảm tối đa được tính toán động, thể hiện tỷ lệ phần trăm của giá đóng cửa trong không gian giảm; TARGET_STOP_RATIO mặc định là 2, thể hiện tỷ lệ lỗ là 2 ⋅
Ưu điểm của việc thiết lập vị trí ra khỏi sân như vậy là có thể điều chỉnh tỷ lệ thua lỗ và vị trí dừng lỗ một cách động theo biến động của thị trường. Trong biến động lớn, dừng lại nhanh chóng và theo dõi dừng lại trong biến động nhỏ.
Sử dụng chỉ số MACD để xây dựng tín hiệu đa trống, có thể xác định hiệu quả thời gian biến đổi giá.
Kết hợp với đường trung bình của EMA làm bộ lọc, chọn xu hướng đi lên khi vào sân và tránh giao dịch ngược.
Hệ thống kiểm soát động ngoài sân, có thể điều chỉnh tỷ lệ lợi nhuận, điểm dừng lỗ trong thời gian thực, theo đuổi lợi nhuận cao và kiểm soát rủi ro.
Do sự biến động của thị trường, tốc độ thoát nhanh có thể làm giảm thời gian giao dịch, phù hợp hơn cho các nhà đầu tư bận rộn.
Chỉ số MACD thường tạo ra tín hiệu giả trong thị trường được sắp xếp ngang. Giải pháp là thêm đường trung bình làm bộ lọc để tránh giao dịch ngược.
Trong thị trường có biến động cực lớn, DYNAMIC STOP có thể gây ra lỗ hổng quá nhẹ, nhưng hoạt động tốt trong hầu hết các tình huống. Nếu gặp tình huống cực đoan, bạn có thể xem xét tỷ lệ lỗ hổng cố định.
Không gian lợi nhuận bị hạn chế, cần giao dịch thường xuyên để theo đuổi lợi nhuận. Điều này đòi hỏi nhà đầu tư phải có khả năng chịu đựng tâm lý và thời gian đầu tư. Nếu không có thời gian hoạt động, bạn có thể cân nhắc điều chỉnh cho chu kỳ cao.
Điều chỉnh các tham số MACD theo đặc điểm của giống cụ thể, tối ưu hóa hiệu quả giao dịch của giao dịch.
Kiểm tra các đường trung bình di chuyển khác nhau như là các chỉ số đánh giá xu hướng để tìm các bộ lọc tốt hơn.
Thử nghiệm TARGET_STOP_RATIO, phương pháp tính toán giảm tối đa, tối ưu hóa chiến lược dừng lỗ.
Thêm các điều kiện khác, chẳng hạn như thay đổi khối lượng giao dịch, tỷ lệ biến động, để cải thiện chất lượng tín hiệu.
Thử nghiệm các thuật toán học máy để tinh chế nhiều tính năng hơn, xây dựng mô hình đa yếu tố động, để thực hiện stop-loss thông minh hơn.
Chiến lược này nói chung có tính thực tiễn mạnh mẽ. Với MACD là tín hiệu giao dịch cốt lõi, việc bổ sung phán đoán xu hướng và kiểm soát chuyển động của hai mô-đun phụ trợ có thể cải thiện đáng kể hiệu quả giao dịch của MACD. Chiến lược dừng lỗ là hướng quan trọng trong việc tối ưu hóa chiến lược, chiến lược này đã thực hiện rất nhiều đổi mới trong lĩnh vực này, đáng để nghiên cứu và áp dụng thêm.
/*backtest
start: 2022-12-05 00:00:00
end: 2023-12-11 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © maxencetajet
//@version=5
strategy("MACD Strategy", overlay=true, initial_capital=1000, slippage=25)
src = input(title="Source", defval=close)
target_stop_ratio = input.float(title='Risk/Reward', defval=2, minval=0.5, maxval=100)
risk = input.float(2, title="Risk per Trade %")
riskt = risk / 100 + 1
useDateFilter = input.bool(true, title="Filter Date Range of Backtest",
group="Backtest Time Period")
backtestStartDate = input(timestamp("5 June 2022"),
title="Start Date", group="Backtest Time Period",
tooltip="This start date is in the time zone of the exchange " +
"where the chart's instrument trades. It doesn't use the time " +
"zone of the chart or of your computer.")
backtestEndDate = input(timestamp("5 July 2022"),
title="End Date", group="Backtest Time Period",
tooltip="This end date is in the time zone of the exchange " +
"where the chart's instrument trades. It doesn't use the time " +
"zone of the chart or of your computer.")
inTradeWindow = true
emaV = input.int(200, title="Length", group="EMA")
swingHighV = input.int(7, title="Swing High", group="number of past candles")
swingLowV = input.int(7, title="Swing Low", group="number of past candles")
ema = ta.ema(src, emaV)
fast_length = input(title="Fast Length", defval=12, group="MACD")
slow_length = input(title="Slow Length", defval=26, group="MACD")
signal_length = input.int(title="Signal Smoothing", minval = 1, maxval = 50, defval = 9, group="MACD")
sma_source = input.string(title="Oscillator MA Type", defval="EMA", options=["SMA", "EMA"], group="MACD")
sma_signal = input.string(title="Signal Line MA Type", defval="EMA", options=["SMA", "EMA"], group="MACD")
fast_ma = sma_source == "SMA" ? ta.sma(src, fast_length) : ta.ema(src, fast_length)
slow_ma = sma_source == "SMA" ? ta.sma(src, slow_length) : ta.ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal == "SMA" ? ta.sma(macd, signal_length) : ta.ema(macd, signal_length)
hist = macd - signal
longcondition = close > ema and ta.crossover(macd, signal) and macd < 0
shortcondition = close < ema and ta.crossunder(macd, signal) and macd > 0
float risk_long = na
float risk_short = na
float stopLoss = na
float takeProfit = na
float entry_price = na
risk_long := risk_long[1]
risk_short := risk_short[1]
swingHigh = ta.highest(high, swingHighV)
swingLow = ta.lowest(low, swingLowV)
lotB = (strategy.equity*riskt-strategy.equity)/(close - swingLow)
lotS = (strategy.equity*riskt-strategy.equity)/(swingHigh - close)
if strategy.position_size == 0 and longcondition and inTradeWindow
risk_long := (close - swingLow) / close
strategy.entry("long", strategy.long, qty=lotB)
if strategy.position_size == 0 and shortcondition and inTradeWindow
risk_short := (swingHigh - close) / close
strategy.entry("short", strategy.short, qty=lotS)
if strategy.position_size > 0
stopLoss := strategy.position_avg_price * (1 - risk_long)
takeProfit := strategy.position_avg_price * (1 + target_stop_ratio * risk_long)
entry_price := strategy.position_avg_price
strategy.exit("long exit", "long", stop = stopLoss, limit = takeProfit)
if strategy.position_size < 0
stopLoss := strategy.position_avg_price * (1 + risk_short)
takeProfit := strategy.position_avg_price * (1 - target_stop_ratio * risk_short)
entry_price := strategy.position_avg_price
strategy.exit("short exit", "short", stop = stopLoss, limit = takeProfit)
plot(ema, color=color.white, linewidth=2, title="EMA")
p_ep = plot(entry_price, color=color.new(color.white, 0), linewidth=2, style=plot.style_linebr, title='entry price')
p_sl = plot(stopLoss, color=color.new(color.red, 0), linewidth=2, style=plot.style_linebr, title='stopLoss')
p_tp = plot(takeProfit, color=color.new(color.green, 0), linewidth=2, style=plot.style_linebr, title='takeProfit')
fill(p_sl, p_ep, color.new(color.red, transp=85))
fill(p_tp, p_ep, color.new(color.green, transp=85))