Stratégie de suivi de l'inversion des moyennes mobiles doubles

Auteur:ChaoZhang est là., Date: 2024-02-20 17h08:43 Je vous en prie.
Les étiquettes:

img

Résumé

La stratégie de suivi de l'inversion des moyennes mobiles doubles est une stratégie de trading quantitative qui utilise les croisements des moyennes mobiles comme signaux de trading.

La logique de la stratégie

La stratégie juge principalement la relation entre la ligne rapide et la ligne lente. Elle génère un signal d'achat lorsque la ligne rapide traverse au-dessus de la ligne lente, et un signal de vente lorsque la ligne rapide traverse au-dessous de la ligne lente. En outre, elle juge également de manière exhaustive l'état long / court du marché en fonction de l'état long / court de la valeur de la différence MACD, la relation entre la différence et la ligne de signal, la situation long / court des volumes de trading, etc.

Plus précisément, la stratégie juge la taille et la direction de la valeur de la différence MACD, le croisement entre la différence et la ligne de signal, la direction constante ou opposée entre la différence et la ligne de signal, etc. Ces situations reflètent les caractéristiques de rebond du sous-marché après une chute.

Lorsque la différence et la ligne de signal montrent des signaux d'inversion du marché et que les volumes de négociation confirment l'inversion du marché, des signaux de négociation sont générés.

Les avantages

  • Utiliser des croisements doubles des moyennes mobiles pour déterminer les points d'inversion du marché, base théorique solide
  • Incorporer un jugement sur le volume de négociation pour éviter de fausses ruptures
  • L'indicateur MACD évalue le sentiment de la sous-section, identifie les caractéristiques de rebond
  • Une grande souplesse des paramètres

Risques et solutions

  • Problème de l'aiguille causé par le croisement de la moyenne mobile
    • Ajuster les paramètres de la moyenne mobile, augmenter le seuil
  • Volumes de négociation incapables de filtrer complètement les fausses ruptures
    • Incorporer des indicateurs secondaires tels que l' OBV pour juger des tendances du volume réel des transactions
  • Impossible de juger de la profondeur et de la force de l'ajustement de la sous-section
    • Augmenter le stop loss, évaluer les domaines de soutien importants

Directions d'optimisation

  • Utiliser des modèles d'apprentissage automatique au lieu de jugements basés sur des règles
    • Améliorer la robustesse de la stratégie, réduire les suradaptations
  • Augmenter les techniques de stop loss et de prise de profit
    • Bloquer des bénéfices partiels, réduire les risques
  • Incorporer des indicateurs de sentiment, des analyses de nouvelles
    • Améliorer l'exactitude du jugement du modèle
  • Port vers les autres produits, marchés
    • Extensibilité de la stratégie de test

Résumé

La stratégie de suivi de l'inversion des moyennes mobiles doubles prend en compte de manière exhaustive des indicateurs tels que les moyennes mobiles, le MACD et les volumes de trading. En capturant leurs signaux d'inversion, des points d'inversion appropriés sont sélectionnés pour établir des positions.


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

Plus de