L'écart de prix et l'évolution de la stratégie de négociation

Auteur:ChaoZhang est là., Date: 2023-10-25 à 18h02
Les étiquettes:

img

Résumé

Cette stratégie utilise l'indicateur CCI et l'indicateur de dynamique combiné avec l'indicateur RSI pour identifier les tendances du marché et entrer lorsque l'écart apparaît dans la zone de surachat/survente.

La logique de la stratégie

Premièrement, la stratégie détermine les signaux longs et courts par l'indicateur CCI ou l'indicateur de dynamique qui franchit la ligne 0 ou la ligne 0.

En outre, la stratégie peut choisir de déterminer les divergences haussières/baissières du RSI afin d'assurer des signaux plus fiables.

Lorsque le CCI ou l'impulsion déclenche un signal long et que le RSI se trouve dans la zone de survente, la stratégie vérifie si le haut et le bas précédents sont tous deux au-dessus de la ligne moyenne de la bande de Bollinger.

Ainsi, la stratégie utilise à la fois des indicateurs de tendance et d'oscillation, pour entrer dans une tendance tôt et éviter une fausse rupture avec une plage de réversion moyenne.

Analyse des avantages

  1. La combinaison d'indicateurs de tendance et d'oscillation permet d'entrer en tendance plus tôt et d'éviter des positions inutiles sur le marché de l'intervalle.

  2. L'utilisation de la moyenne des bandes de Bollinger avec les écarts de prix filtre efficacement les fausses ruptures.

  3. La vérification de l'indice de volatilité historique évite de générer de mauvais signaux de trading.

  4. Commerce entièrement automatisé sans interférence manuelle, adapté au trading algorithmique.

  5. L'ajustement flexible des paramètres s'adapte aux différents produits commerciaux.

  6. Arrêtez les pertes et contrôlez efficacement les risques.

Analyse des risques

  1. Les paramètres de bande de Bollinger inappropriés peuvent entraîner une invalidité de l'identification de la moyenne de réversion.

  2. Des paramètres d'indicateur incorrects peuvent générer trop de faux signaux.

  3. Une rupture échouée nécessite un arrêt de perte rapide lorsque le prix revient à la moyenne.

  4. Une liquidité médiocre peut entraîner un trading de rupture inefficace.

  5. Veiller à ce que les données historiques soient suffisantes pour éviter un mauvais ajustement de la courbe.

  6. Faites attention aux séances de trading pour éviter une fausse rupture.

Directions d'amélioration

  1. Optimiser les paramètres des bandes de Bollinger pour une plage de réversion moyenne plus stable.

  2. Test de paramètres sur différents produits pour une meilleure optimisation.

  3. Ajouter la dimension de la position pour éviter une position unique surdimensionnée.

  4. Ajouter un filtre de session de négociation pour négocier principalement pendant les heures actives.

  5. Incorporer des modèles d'apprentissage automatique pour générer des signaux plus intelligents.

  6. Intégrer davantage de sources de données pour déterminer l'évolution globale du marché.

  7. Ajouter plus d'indicateurs pour former un ensemble solide d'indicateurs.

Conclusion

Cette stratégie intègre des indicateurs de tendance et d'oscillation pour capturer les tendances tôt. Avec la moyenne de la bande de Bollinger et les écarts de prix, il évite efficacement les fausses ruptures. Des paramètres flexibles s'adaptent à différents produits avec de bons résultats de backtest. Les prochaines étapes consistent à optimiser les paramètres et l'ensemble du modèle pour plus de robustesse et à obtenir des rendements excessifs constants à long terme.


/*backtest
start: 2022-10-18 00:00:00
end: 2023-10-24 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy(title='BroTheJo Strategy', shorttitle='BTJ', overlay=true)

// Input settings
ccimomCross = input.string('CCI', 'Entry Signal Source', options=['CCI', 'Momentum'])
ccimomLength = input.int(10, minval=1, title='CCI/Momentum Length')
useDivergence = input.bool(false, title='Find Regular Bullish/Bearish Divergence')
rsiOverbought = input.int(65, minval=1, title='RSI Overbought Level')
rsiOversold = input.int(35, minval=1, title='RSI Oversold Level')
rsiLength = input.int(14, minval=1, title='RSI Length')
plotMeanReversion = input.bool(true, 'Plot Mean Reversion Bands on the chart')
emaPeriod = input(200, title='Lookback Period (EMA)')
bandMultiplier = input.float(1.6, title='Outer Bands Multiplier')

// CCI and Momentum calculation
momLength = ccimomCross == 'Momentum' ? ccimomLength : 10
mom = close - close[momLength]
cci = ta.cci(close, ccimomLength)
ccimomCrossUp = ccimomCross == 'Momentum' ? ta.cross(mom, 0) : ta.cross(cci, 0)
ccimomCrossDown = ccimomCross == 'Momentum' ? ta.cross(0, mom) : ta.cross(0, cci)

// RSI calculation
src = close
up = ta.rma(math.max(ta.change(src), 0), rsiLength)
down = ta.rma(-math.min(ta.change(src), 0), rsiLength)
rsi = down == 0 ? 100 : up == 0 ? 0 : 100 - 100 / (1 + up / down)
oversoldAgo = rsi[0] <= rsiOversold or rsi[1] <= rsiOversold or rsi[2] <= rsiOversold or rsi[3] <= rsiOversold
overboughtAgo = rsi[0] >= rsiOverbought or rsi[1] >= rsiOverbought or rsi[2] >= rsiOverbought or rsi[3] >= rsiOverbought

// Regular Divergence Conditions
bullishDivergenceCondition = rsi[0] > rsi[1] and rsi[1] < rsi[2]
bearishDivergenceCondition = rsi[0] < rsi[1] and rsi[1] > rsi[2]

// Mean Reversion Indicator
meanReversion = plotMeanReversion ? ta.ema(close, emaPeriod) : na
stdDev = plotMeanReversion ? ta.stdev(close, emaPeriod) : na
upperBand = plotMeanReversion ? meanReversion + stdDev * bandMultiplier : na
lowerBand = plotMeanReversion ? meanReversion - stdDev * bandMultiplier : na

// Entry Conditions
prevHigh = ta.highest(high, 1)
prevLow = ta.lowest(low, 1)
longEntryCondition = ccimomCrossUp and oversoldAgo and (not useDivergence or bullishDivergenceCondition) and (prevHigh >= meanReversion) and (prevLow >= meanReversion)
shortEntryCondition = ccimomCrossDown and overboughtAgo and (not useDivergence or bearishDivergenceCondition) and (prevHigh <= meanReversion) and (prevLow <= meanReversion)

// Plotting
oldLongEntryCondition = ccimomCrossUp and oversoldAgo and (not useDivergence or bullishDivergenceCondition)
oldShortEntryCondition = ccimomCrossDown and overboughtAgo and (not useDivergence or bearishDivergenceCondition)
plotshape(oldLongEntryCondition, title='BUY', style=shape.triangleup, location=location.belowbar, color=color.new(color.lime, 0), textcolor=color.new(color.white, 0), size=size.tiny)
plotshape(oldShortEntryCondition, title='SELL', style=shape.triangledown, location=location.abovebar, color=color.new(color.red, 0), textcolor=color.new(color.white, 0), size=size.tiny)

// Strategy logic
if (longEntryCondition)
    strategy.entry("Buy", strategy.long)
if (shortEntryCondition)
    strategy.entry("Sell", strategy.short)

// Close all open positions when outside of bands
closeAll = (high >= upperBand) or (low <= lowerBand)

if (closeAll)
    strategy.close_all("Take Profit/Cut Loss")


// Plotting
plot(upperBand, title='Upper Band', color=color.fuchsia, linewidth=1)
plot(meanReversion, title='Mean', color=color.gray, linewidth=1)
plot(lowerBand, title='Lower Band', color=color.blue, linewidth=1)

Plus de