Retour sur la tendance avec stratégie de négociation de volatilité intra-barrique

Auteur:ChaoZhang est là., Date: le 26 février 2024 à 17 h 15 h 54
Les étiquettes:

img

Résumé

Cette stratégie calcule les différences de pression d'achat et de vente dans le volume des transactions à travers différentes fenêtres de temps, combinées avec les signaux MACD, pour concevoir une stratégie de trading d'inversion de tendance.

Principes de stratégie

La logique de base de cette stratégie repose sur les points suivants:

  1. Calculer la pression d'achat et la pression de vente du volume des transactions dans différentes fenêtres de temps (fenêtres courtes et longues).

  2. Utilisez la valeur de différence du MACD (la différence entre la ligne MACD et la ligne de signal) pour déterminer l'état long et court. Combinez avec les signaux de pression d'achat et de vente dans le volume de transaction pour vérifier les inversions de tendance.

  3. Lorsque l'anomalie de la pression d'achat du volume des transactions s'amplifie et que la ligne MACD est franchie, il est déterminé que le marché peut avoir un renversement de tendance de la vente à l'achat.

  4. Lorsque l'anomalie de la pression de vente du volume des transactions s'amplifie et que la ligne MACD est franchie, il est déterminé que le marché peut avoir un renversement de tendance d'achat à vente.

  5. Après avoir saisi le signal d'inversion, utilisez des stratégies de prise de profit et de stop-loss pour contrôler les risques.

Analyse des avantages

Les avantages de cette stratégie sont les suivants:

  1. L'utilisation des différences longues/courtes dans le volume des transactions pour déterminer les points d'inversion de tendance évite de se fier uniquement à des indicateurs de détermination des tendances tels que les moyennes mobiles tout en négligeant le rôle du volume des transactions.

  2. La combinaison des signaux MACD pour vérifier les renversements peut améliorer la précision du jugement.

  3. L'utilisation de fenêtres de temps longues et courtes pour déterminer les anomalies dans le volume des transactions rend les signaux d'inversion plus fiables.

  4. Les stratégies d'inversion ont tendance à avoir des taux de profit moyens plus élevés.

Analyse des risques

Les risques de cette stratégie comprennent:

  1. Le volume des transactions et les signaux MACD peuvent donner de faux signaux, ce qui conduit à des jugements erronés sur les renversements.

  2. Après le déclenchement des signaux d'inversion, le marché peut s'ajuster à nouveau et ne pas inverser directement immédiatement.

  3. L'imposition incorrecte des bénéfices et des arrêts de perte peut entraîner une augmentation des pertes.

  4. Des retraits plus élevés, peu adaptés aux investisseurs qui recherchent des rendements stables.

Directions d'optimisation

L'optimisation de cette stratégie comprend:

  1. Optimiser les fenêtres de temps longues et courtes pour rendre les jugements d'inversion plus précis.

  2. Optimiser les paramètres MACD pour améliorer la précision long/short.

  3. Optimiser les algorithmes de prise de profit et de stop loss pour réduire les risques de perte.

  4. Ajouter plus d'indicateurs de jugement des anomalies pour améliorer le taux de réussite de l'inversion.

  5. Ajouter des modules de dimensionnement des positions et de gestion de l'argent.

Conclusion

En résumé, il s'agit d'une stratégie de trading algorithmique de renversement de tendance typique. Elle repose principalement sur des amplifications des anomalies du volume des transactions et des vérifications du signal MACD pour déterminer et capturer les renversements de prix des positions longues aux positions courtes ou vice versa.


/*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)

Plus de