Sự đảo ngược xu hướng với chiến lược giao dịch biến động nội thất

Tác giả:ChaoZhang, Ngày: 2024-02-26 17:15:54
Tags:

img

Tổng quan

Chiến lược này tính toán sự khác biệt áp lực mua và bán trong khối lượng giao dịch qua các cửa sổ thời gian khác nhau, kết hợp với tín hiệu MACD, để thiết kế một chiến lược giao dịch đảo ngược xu hướng.

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

Logic cốt lõi của chiến lược này dựa trên các điểm sau:

  1. Tính toán áp lực mua và áp lực bán của khối lượng giao dịch trong các cửa sổ thời gian khác nhau (cửa sổ ngắn và dài).

  2. Sử dụng giá trị khác biệt của MACD (sự khác biệt giữa đường MACD và đường tín hiệu) để xác định trạng thái dài và ngắn. Kết hợp với các tín hiệu áp lực mua và bán trong khối lượng giao dịch để xác minh sự đảo ngược xu hướng.

  3. Khi bất thường áp lực mua của khối lượng giao dịch tăng cường và đường MACD vượt qua, nó được xác định rằng thị trường có thể có một sự đảo ngược xu hướng từ bán để mua.

  4. Khi bất thường áp lực bán hàng của khối lượng giao dịch tăng cường và đường MACD vượt qua, nó được xác định rằng thị trường có thể có một sự đảo ngược xu hướng từ mua sang bán.

  5. Sau khi nhập tín hiệu đảo ngược, sử dụng chiến lược lấy lợi nhuận và dừng lỗ để kiểm soát rủi ro.

Phân tích lợi thế

Những lợi thế của chiến lược này bao gồm:

  1. Sử dụng sự khác biệt dài / ngắn trong khối lượng giao dịch để xác định các điểm đảo ngược xu hướng tránh chỉ dựa vào các chỉ số xác định xu hướng như đường trung bình động trong khi bỏ qua vai trò của khối lượng giao dịch.

  2. Kết hợp các tín hiệu MACD để xác minh sự đảo ngược có thể cải thiện độ chính xác phán đoán.

  3. Sử dụng các cửa sổ thời gian dài và ngắn để xác định sự bất thường trong khối lượng giao dịch làm cho tín hiệu đảo ngược đáng tin cậy hơn.

  4. Chiến lược đảo ngược có xu hướng có tỷ lệ lợi nhuận trung bình cao hơn.

Phân tích rủi ro

Những rủi ro của chiến lược này bao gồm:

  1. Khối lượng giao dịch và tín hiệu MACD có thể cung cấp tín hiệu sai, dẫn đến đánh giá sai về sự đảo ngược.

  2. Sau khi các tín hiệu đảo ngược được kích hoạt, thị trường có thể điều chỉnh lại và không đảo ngược trực tiếp ngay lập tức.

  3. Thiết lập lợi nhuận và dừng lỗ không chính xác có thể dẫn đến tổn thất lớn hơn.

  4. Các khoản rút cao hơn, không phù hợp với các nhà đầu tư theo đuổi lợi nhuận ổn định.

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

Tối ưu hóa cho chiến lược này bao gồm:

  1. Tối ưu hóa các cửa sổ thời gian dài và ngắn để làm cho các phán đoán đảo ngược chính xác hơn.

  2. Tối ưu hóa các thông số MACD để cải thiện độ chính xác dài / ngắn.

  3. Tối ưu hóa các thuật toán lấy lợi nhuận và dừng lỗ để giảm rủi ro mất mát.

  4. Thêm nhiều chỉ số đánh giá dị thường để cải thiện tỷ lệ thành công đảo ngược.

  5. Thêm kích thước vị trí và quản lý tiền mô-đun.

Kết luận

Tóm lại, đây là một chiến lược giao dịch thuật toán đảo ngược xu hướng điển hình. Nó chủ yếu dựa trên sự khuếch đại trong sự bất thường về khối lượng giao dịch và xác minh tín hiệu MACD để xác định và nắm bắt sự đảo ngược giá từ các vị trí dài sang ngắn hoặc ngược lại. Chiến lược này có những lợi thế về độ chính xác cao và lợi nhuận tốt nhưng cũng có một số rủi ro. Việc tối ưu hóa thêm các thông số và chức năng có thể làm cho chiến lược hoạt động tốt hơn.


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

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

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)
takeProfit = input( title="Take Profit", defval=0.75)
stopLoss = input( title="Stop Loss", defval=0.5)

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")
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, qty=10)
strategy.exit("TPS", "Short1", limit=strategy.position_avg_price - takeProfit, stop=strategy.position_avg_price + stopLoss)

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

Thêm nữa