
Chiến lược này sử dụng 3 ngày di chuyển nhanh trung bình, 10 ngày di chuyển chậm trung bình và 16 ngày tín hiệu di chuyển trơn trung bình để xây dựng chỉ số MACD, hỗ trợ chỉ số RSI và đặc điểm giao dịch, thiết lập các đặc điểm đường K đa chiều, đánh giá tình hình đã quá chặt chẽ, hình thành xu hướng dao động trong khu vực, để đảo ngược các mục thu lợi nhuận.
Mã chủ yếu sử dụng 3 ngày trung bình di chuyển nhanh trừ 10 ngày trung bình di chuyển chậm để tạo ra chỉ số MACD, 16 ngày xử lý đường tín hiệu mịn, tạo ra chiến lược MACD tiêu chuẩn. Đồng thời kết hợp phân tích giao dịch tổng hợp mua và bán, đánh giá đặc điểm sức mạnh.
Cụ thể, bằng cách quan sát mối quan hệ của đường MACD với đường tín hiệu, sự thay đổi của độ lệch, đánh giá sự suy giảm của lực lượng đa luân, tìm kiếm cơ hội đảo ngược. Đồng thời, sự thay đổi khối lượng mua bán cũng phản ánh sự suy giảm của lực lượng đa luân.
Chính sách này có 3 tín hiệu nhập cảnh:
Khi khối lượng giao dịch không có lợi thế về khối lượng mua, RSI thấp hơn 41 và tăng lên, và tín hiệu MACD không có sai lệch rõ ràng, hãy làm nhiều hơn;
Khi khối lượng giao dịch có lợi thế về khối lượng mua, RSI ở khoảng 45-55 và tăng lên, MACD và đường tín hiệu cùng tăng lên, làm nhiều hơn;
Khi MACD cao hơn ngưỡng thiết lập và tăng lên, hãy làm trống.
Ba tình huống này phản ánh sự biến động của khu vực trong thời gian ngắn và sự mở rộng quá mức theo một hướng, do đó, được coi là thời điểm tốt để đảo ngược và thực hiện hành động ngược.
Exit được thiết lập như là phương thức dừng lỗ và dừng, rút lại kiểm soát và thu lợi nhuận.
Chiến lược này kết hợp nhiều chỉ số để đánh giá khoảng cách chấn động và quá mua quá bán, để đảo ngược ý tưởng lợi nhuận rõ ràng. Sử dụng phân tích khối lượng giao dịch sâu hơn, tăng cơ sở hoạt động. Cài đặt dừng lỗ cũng thận trọng hơn, tránh theo đuổi quá mức để ngăn chặn giảm.
Cụ thể, những lợi thế là:
MACD là một chỉ số kiểm tra giá trị, đánh giá mối quan hệ giữa giá và khối lượng giao dịch, tránh chủ quan phân tích mặt kỹ thuật đơn lẻ;
RSI đánh giá giá quá mua quá bán, hỗ trợ tìm kiếm sự đảo ngược;
Cài đặt Stop Loss Stop để ngăn chặn tổn thất quá mức và khóa một phần lợi nhuận.
Mặc dù sử dụng nhiều chỉ số tổng hợp trong chiến lược này có thể làm tăng tỷ lệ chiến thắng, nhưng bất kỳ chiến lược nào cũng có một số rủi ro nhất định, vấn đề chính là:
Tỷ lệ các chỉ số phát ra tín hiệu sai, chẳng hạn như tiếp tục xu hướng ban đầu sau khi đảo ngược;
Lưu ý rằng các lệnh dừng lỗ có thể được thiết lập không đúng cách, có thể có quá nhiều rút tiền và lợi nhuận không được khóa tốt.
Các thiết lập tham số có thể cần được tối ưu hóa để kiểm tra thêm, chẳng hạn như kết hợp tham số đường trung bình, chu kỳ RSI, nhân số dừng lỗ.
Những rủi ro này có thể được giảm bằng cách tối ưu hóa hơn nữa. Các phương pháp cụ thể sẽ được mô tả trong phần tiếp theo.
Chiến lược này có thể được tối ưu hóa hơn nữa, chủ yếu tập trung vào các khía cạnh sau:
Kiểm tra các thiết lập tham số trung bình khác nhau để tìm kiếm sự kết hợp tốt nhất;
Kiểm tra các thiết lập tham số RSI để xác định một chu kỳ thích hợp hơn để đánh giá quá mua quá bán;
Tối ưu hóa stop loss và stop loss, tìm sự cân bằng giữa rút tối đa và khóa lợi nhuận;
Giới thiệu mô hình học máy, sử dụng dữ liệu lớn hơn để đào tạo, giảm tỷ lệ sai lầm và tăng tỷ lệ thắng.
Các phương pháp tối ưu hóa này có thể được thực hiện thông qua phản hồi có hệ thống hơn. Với sự mở rộng của thử nghiệm không gian tham số và số lượng mẫu tăng lên, tỷ lệ chiến lược và chỉ số lợi nhuận cũng sẽ tăng lên.
Chiến lược này sử dụng tổng hợp MACD, RSI và khối lượng giao dịch ba loại chỉ số, để đánh giá các đặc điểm xung đột giữa các khu vực thị trường, thiết lập các mục tiêu tại các điểm đảo ngược để chiết khấu sự gia tăng phản hồi. Ý tưởng chiến lược rõ ràng, cân bằng xu hướng và đảo ngược, có không gian lợi nhuận tốt sau khi tối ưu hóa.
/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 23:59:59
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("3 1 Oscillator Profile Flagging", shorttitle="3 1 Oscillator Profile Flagging", overlay=false)
signalBiasValue = input(title="Signal Bias", defval=0.26)
macdBiasValue = input(title="MACD Bias", defval=0.7)
shortLookBack = input( title="Short LookBack", defval=3)
longLookBack = input( title="Long LookBack", defval=6)
takeProfit = input( title="Take Profit", defval=2)
stopLoss = input( title="Stop Loss", defval=0.7)
fast_ma = ta.sma(close, 3)
slow_ma = ta.sma(close, 10)
macd = fast_ma - slow_ma
signal = ta.sma(macd, 16)
hline(0, "Zero Line", color = color.black)
buyVolume = volume*((close-low)/(high-low))
sellVolume = volume*((high-close)/(high-low))
buyVolSlope = buyVolume - buyVolume[1]
sellVolSlope = sellVolume - sellVolume[1]
signalSlope = ( signal - signal[1] )
macdSlope = ( macd - macd[1] )
plot(macd, color=color.blue, title="Total Volume")
plot(signal, color=color.orange, title="Total Volume")
plot(macdSlope, color=color.green, title="MACD Slope")
plot(signalSlope, color=color.red, title="Signal Slope")
intrabarRange = high - low
rsi = ta.rsi(close, 14)
rsiSlope = rsi - rsi[1]
plot(rsiSlope, color=color.black, title="RSI Slope")
getRSISlopeChange(lookBack) =>
j = 0
for i = 0 to lookBack
if ( rsi[i] - rsi[ i + 1 ] ) > -5
j += 1
j
getBuyerVolBias(lookBack) =>
j = 0
for i = 1 to lookBack
if buyVolume[i] > sellVolume[i]
j += 1
j
getSellerVolBias(lookBack) =>
j = 0
for i = 1 to lookBack
if sellVolume[i] > buyVolume[i]
j += 1
j
getVolBias(lookBack) =>
float b = 0.0
float s = 0.0
for i = 1 to lookBack
b += buyVolume[i]
s += sellVolume[i]
b > s
getSignalBuyerBias(lookBack) =>
j = 0
for i = 1 to lookBack
if signal[i] > signalBiasValue
j += 1
j
getSignalSellerBias(lookBack) =>
j = 0
for i = 1 to lookBack
if signal[i] < ( 0.0 - signalBiasValue )
j += 1
j
getSignalNoBias(lookBack) =>
j = 0
for i = 1 to lookBack
if signal[i] < signalBiasValue and signal[i] > ( 0.0 - signalBiasValue )
j += 1
j
getPriceRising(lookBack) =>
j = 0
for i = 1 to lookBack
if close[i] > close[i + 1]
j += 1
j
getPriceFalling(lookBack) =>
j = 0
for i = 1 to lookBack
if close[i] < close[i + 1]
j += 1
j
getRangeNarrowing(lookBack) =>
j = 0
for i = 1 to lookBack
if intrabarRange[i] < intrabarRange[i + 1]
j+= 1
j
getRangeBroadening(lookBack) =>
j = 0
for i = 1 to lookBack
if intrabarRange[i] > intrabarRange[i + 1]
j+= 1
j
bool isNegativeSignalReversal = signalSlope < 0.0 and signalSlope[1] > 0.0
bool isNegativeMacdReversal = macdSlope < 0.0 and macdSlope[1] > 0.0
bool isPositiveSignalReversal = signalSlope > 0.0 and signalSlope[1] < 0.0
bool isPositiveMacdReversal = macdSlope > 0.0 and macdSlope[1] < 0.0
bool hasBearInversion = signalSlope > 0.0 and macdSlope < 0.0
bool hasBullInversion = signalSlope < 0.0 and macdSlope > 0.0
bool hasSignalBias = math.abs(signal) >= signalBiasValue
bool hasNoSignalBias = signal < signalBiasValue and signal > ( 0.0 - signalBiasValue )
bool hasSignalBuyerBias = hasSignalBias and signal > 0.0
bool hasSignalSellerBias = hasSignalBias and signal < 0.0
bool hasPositiveMACDBias = macd > macdBiasValue
bool hasNegativeMACDBias = macd < ( 0.0 - macdBiasValue )
bool hasBullAntiPattern = ta.crossunder(macd, signal)
bool hasBearAntiPattern = ta.crossover(macd, signal)
bool hasSignificantBuyerVolBias = buyVolume > ( sellVolume * 1.5 )
bool hasSignificantSellerVolBias = sellVolume > ( buyVolume * 1.5 )
// 202.30 Profit 55.29% 5m
if ( ( getVolBias(longLookBack) == false ) and rsi <= 41 and math.abs(rsi - rsi[shortLookBack]) > 1 and hasNoSignalBias and rsiSlope > 1.5 and close > open)
strategy.entry("5C1", strategy.long, qty=1)
strategy.exit("TPS", "5C1", limit=strategy.position_avg_price + takeProfit, stop=strategy.position_avg_price - stopLoss)
// 171.70 Profit 50.22% 5m
if ( getVolBias(longLookBack) == true and rsi > 45 and rsi < 55 and macdSlope > 0 and signalSlope > 0)
strategy.entry("5C2", strategy.long, qty=1)
strategy.exit("TPS", "5C2", limit=strategy.position_avg_price + takeProfit, stop=strategy.position_avg_price - stopLoss)
// 309.50 Profit 30.8% 5m 2 tp .7 sl 289 trades
if ( macd > macdBiasValue and macdSlope > 0)
strategy.entry("5P1", strategy.short, qty=1)
strategy.exit("TPS", "5P1", limit=strategy.position_avg_price - takeProfit, stop=strategy.position_avg_price + stopLoss)