Chiến lược theo dõi đảo ngược trung bình động kép

Tác giả:ChaoZhang, Ngày: 2024-02-20 17:08:43
Tags:

img

Tổng quan

Chiến lược theo dõi đảo ngược trung bình di chuyển kép là một chiến lược giao dịch định lượng sử dụng đường chéo trung bình di chuyển làm tín hiệu giao dịch. Chiến lược kết hợp sự khác biệt trung bình di chuyển nhanh và chậm của chỉ số MACD và đường tín hiệu của nó, cũng như tỷ lệ dài / ngắn của khối lượng giao dịch, để hình thành tín hiệu giao dịch và nắm bắt các cơ hội đảo ngược thị trường.

Chiến lược logic

Chiến lược này chủ yếu đánh giá mối quan hệ giữa đường nhanh và đường chậm. Nó tạo ra tín hiệu mua khi đường nhanh vượt qua đường chậm, và tín hiệu bán khi đường nhanh vượt qua đường chậm. Ngoài ra, nó cũng đánh giá toàn diện tình trạng dài / ngắn của thị trường dựa trên tình trạng dài / ngắn của giá trị chênh lệch MACD, mối quan hệ giữa đường khác biệt và tín hiệu, tình hình dài / ngắn của khối lượng giao dịch, v.v.

Cụ thể, chiến lược đánh giá kích thước và hướng của giá trị chênh lệch MACD, giao thoa giữa chênh lệch và đường tín hiệu, hướng nhất quán hoặc ngược lại giữa chênh lệch và đường tín hiệu, v.v. Những tình huống này phản ánh các đặc điểm phục hồi của thị trường con sau khi giảm. Ngoài ra, phân phối dài / ngắn của khối lượng giao dịch cũng được sử dụng như một chỉ số đánh giá phụ trợ.

Khi sự khác biệt và đường tín hiệu cho thấy tín hiệu đảo ngược thị trường, và khối lượng giao dịch tương ứng để xác nhận đảo ngược thị trường, các tín hiệu giao dịch sẽ được tạo ra.

Ưu điểm

  • Sử dụng hai đường chéo trung bình động để xác định các điểm đảo ngược thị trường, cơ sở lý thuyết vững chắc
  • Bao gồm đánh giá khối lượng giao dịch để tránh sự phá vỡ sai
  • Chỉ số MACD đánh giá tâm lý phân khúc, xác định các đặc điểm phục hồi
  • Độ linh hoạt cao của các thông số

Rủi ro và giải pháp

  • Vấn đề Whipsaw gây ra bởi đường chéo trung bình động
    • Điều chỉnh các thông số trung bình động, tăng ngưỡng
  • Khối lượng giao dịch không thể lọc hoàn toàn các vụ phá vỡ sai
    • Kết hợp các chỉ số thứ cấp như OBV để đánh giá xu hướng khối lượng giao dịch thực tế
  • Không thể đánh giá chiều sâu và sức mạnh của điều chỉnh phụ phần
    • Tăng mức dừng lỗ, đánh giá các lĩnh vực hỗ trợ quan trọng

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

  • Sử dụng các mô hình học máy thay vì các phán đoán dựa trên quy tắc
    • Cải thiện tính mạnh mẽ của chiến lược, giảm quá mức
  • Tăng kỹ thuật dừng lỗ và lấy lợi nhuận
    • Chốt một phần lợi nhuận, giảm rủi ro
  • Bao gồm các chỉ số tâm lý, phân tích tin tức
    • Cải thiện độ chính xác của mô hình đánh giá
  • Cảng đến các sản phẩm khác, thị trường
    • Khả năng mở rộng chiến lược thử nghiệm

Tóm lại

Chiến lược theo dõi đảo ngược trung bình di chuyển kép xem xét toàn diện các chỉ số như trung bình di chuyển, MACD và khối lượng giao dịch. Bằng cách nắm bắt các tín hiệu đảo ngược của chúng, các điểm đảo ngược thích hợp được chọn để thiết lập các vị trí.


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

//@version=5
strategy("3 10 Oscillator Profile Flagging", shorttitle="3 10 Oscillator Profile Flagging", overlay=true)

signalBiasValue = input(title="Signal Bias", defval=0.26)
macdBiasValue = input(title="MACD Bias", defval=0.8)
shortLookBack = input( title="Short LookBack", defval=3)
longLookBack = input( title="Long LookBack", defval=10)

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(macdSlope, color=color.red, title="Total Volume")
//plot(signalSlope, color=color.green, title="Total Volume")
intrabarRange = high - low

getLookBackSlope(lookBack) => signal - signal[lookBack]
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
    float s = 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 - signalBiasValue )
            j += 1
    j

getSignalNoBias(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if signal[i] < signalBiasValue and signal[i] > ( 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 and signalSlope[1] > 0
bool isNegativeMacdReversal = macdSlope < 0 and macdSlope[1] > 0

bool isPositiveSignalReversal = signalSlope > 0 and signalSlope[1] < 0
bool isPositiveMacdReversal = macdSlope > 0 and macdSlope[1] < 0

bool hasBearInversion = signalSlope > 0 and macdSlope < 0
bool hasBullInversion = signalSlope < 0 and macdSlope > 0

bool hasSignalBias = math.abs(signal) >= signalBiasValue
bool hasNoSignalBias = signal < signalBiasValue and signal > ( 0 - signalBiasValue )

bool hasSignalBuyerBias = hasSignalBias and signal > 0
bool hasSignalSellerBias = hasSignalBias and signal < 0

bool hasPositiveMACDBias = macd > macdBiasValue
bool hasNegativeMACDBias = macd < ( 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 )

// 7.48 Profit 52.5% 
if ( hasSignificantBuyerVolBias and getPriceRising(shortLookBack) == shortLookBack  and getBuyerVolBias(shortLookBack) == shortLookBack and hasPositiveMACDBias and hasBullInversion)
    strategy.entry("Short1", strategy.short)
strategy.exit("TPS", "Short1", limit=strategy.position_avg_price - 0.75, stop=strategy.position_avg_price + 0.5)

// 32.53 Profit 47.91%
if ( getPriceFalling(shortLookBack) and (getVolBias(shortLookBack) == false) and signalSlope < 0 and hasSignalSellerBias)
    strategy.entry("Long1", strategy.long)
strategy.exit("TPS", "Long1", limit=strategy.position_avg_price + 0.75, stop=strategy.position_avg_price - 0.5)

Thêm nữa