Dựa trên chiến lược theo dõi đảo ngược đường trung bình động kép


Ngày tạo: 2024-02-20 17:08:43 sửa đổi lần cuối: 2024-02-20 17:08:43
sao chép: 1 Số nhấp chuột: 527
1
tập trung vào
1617
Người theo dõi

Dựa trên chiến lược theo dõi đảo ngược đường trung bình động kép

Tổng quan

Chiến lược theo dõi đảo ngược hai đường trung bình là một chiến lược giao dịch định lượng sử dụng đường trung bình di chuyển như một tín hiệu giao dịch. Chiến lược này kết hợp các mức chênh lệch đường trung bình chậm và nhanh của MACD và đường tín hiệu của nó, cùng với phán đoán tỷ lệ đa không của khối lượng giao dịch, tạo thành tín hiệu giao dịch để nắm bắt cơ hội đảo ngược thị trường.

Nguyên tắc chiến lược

Chiến lược này chủ yếu đánh giá mối quan hệ giữa đường nhanh và đường chậm, tạo ra nhiều tín hiệu khi đường nhanh đi qua đường chậm và tạo ra tín hiệu trống khi đường chậm đi qua đường nhanh. Ngoài ra, nó cũng kết hợp với trạng thái trống của MACD, mối quan hệ giữa giá trị chênh lệch và đường tín hiệu, tình trạng trống của khối lượng giao dịch.

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

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

Lợi thế chiến lược

  • Sử dụng giao điểm hai đường bằng nhau để xác định điểm đảo ngược của thị trường, lý thuyết bò sát được củng cố
  • Kết hợp thông số giao thông để tránh đột phá giả
  • Chỉ số MACD đánh giá tình hình, nhận diện các đặc điểm phản hồi
  • Parameters Có tính linh hoạt trong các chính sách kiểm soát phần

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

  • Bi-equal-cross gây ra vấn đề whipsaw

    • Điều chỉnh tham số đường trung bình, tăng Threshold
  • Số lượng giao dịch không thể lọc hoàn toàn thông tin đột phá

    • Kết hợp các chỉ số phụ như OBV để xác định xu hướng giao dịch thực tế
  • Không thể xác định độ sâu và độ mạnh của điều chỉnh subsection

    • Tăng Stop Loss, đánh giá các điểm hỗ trợ quan trọng

Hướng tối ưu hóa

  • Sử dụng mô hình học máy thay vì phán đoán theo quy tắc

    • Cải thiện tính thô lỗ của chiến lược và giảm quá phù hợp
  • Tăng kỹ năng chống phá hủy

    • Giữ một phần lợi nhuận và giảm rủi ro
  • Kết hợp các chỉ số cảm xúc, phân tích tin tức

    • Cải thiện tính chính xác của mô hình
  • Cấy ghép sang các giống khác, thị trường

    • Kiểm tra khả năng mở rộng chiến lược

Tóm tắt

Chiến lược theo dõi đảo ngược hai đường trung bình tổng hợp các chỉ số đường trung bình, chỉ số MACD và chỉ số khối lượng giao dịch, bằng cách nắm bắt tín hiệu đảo ngược của chúng, chọn điểm đảo ngược thích hợp để thiết lập vị thế. Có rất nhiều không gian để tối ưu hóa chiến lược, có thể tăng cường sự ổn định và lợi nhuận của chiến lược thông qua các phương tiện học máy và kiểm soát gió.

Mã nguồn chiến lược
/*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)