Stratégie de négociation quantitative à plusieurs délais basée sur le PSAR, le MACD et le RSI

Auteur:ChaoZhang est là., Date: 2023-12-27 16:12:57 Je vous en prie.
Les étiquettes:

img

Résumé

Cette stratégie combine les indicateurs Parabolic SAR, MACD et RSI pour mettre en œuvre des transactions automatiques longues et courtes sur plusieurs délais.

Principe de stratégie

  1. L'indicateur PSAR est utilisé pour déterminer la direction des prix et les points d'inversion de tendance.

  2. L'indicateur MACD évalue la dynamique des prix. Le passage de la ligne MACD au-dessus de la ligne SIGNAL vers le haut est un signal haussier tandis que le passage vers le bas est baissier.

  3. L'indicateur RSI évalue les conditions de surachat et de survente.

  4. Combinez les signaux des trois indicateurs ci-dessus pour former une décision finale longue/courte.

  5. Utilisez adaptivement l'indicateur Chop Index pour filtrer les marchés en consolidation afin d'éviter les sacs à main.

  6. Utiliser la dimensionnement des positions par pyramide inverse pour gérer dynamiquement les objectifs de risque et de profit.

Les avantages

  1. La combinaison de multiples indicateurs qui évaluent la tendance, l'élan et les oscillateurs améliore la précision.

  2. Adapté aux conditions du marché en filtrant les marchés consolidés pour éviter de tomber dans des pièges.

  3. Gestion dynamique des risques et des bénéfices par le biais d'une position pyramidale inversée avec des arrêts et des limites adaptatifs.

  4. Très personnalisable avec des paramètres réglables pour différents produits et environnements de marché.

  5. Prise en charge de plusieurs délais, flexible pour les transactions à court terme intraday ou à moyen/long terme.

Analyse des risques

  1. Les décisions longues/courtes dépendent des paramètres qui peuvent provoquer des erreurs si elles sont inappropriées.

  2. Possibilité de faux signaux conduisant à des décisions contraires à la tendance.

  3. Les paramètres inappropriés de stop loss et de prise de profit peuvent augmenter les pertes ou réduire les bénéfices.

  4. Il nécessite une surveillance fréquente et des ajustements de paramètres entraînant des coûts d'intervention humaine élevés.

Directions d'optimisation

  1. Ajouter un module de validation du modèle pour évaluer les paramètres et l'efficacité du signal.

  2. Augmenter le module d'apprentissage automatique pour l'optimisation automatique des paramètres et des modèles.

  3. Ingérer plus de sources de données pour enrichir l'espace des fonctionnalités et améliorer les décisions.

  4. Développer des systèmes automatisés de surveillance et de maintenance pour réduire l'intervention humaine.

  5. Ajouter des évaluations de backtesting et de simulation pour valider les performances de la stratégie.

Conclusion

Cette stratégie réalise le trading quantitatif automatisé en combinant plusieurs indicateurs techniques avec un système basé sur des règles.


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

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © vikris

//@version=4
strategy("[VJ]Phoenix Force of PSAR +MACD +RSI", overlay=true, calc_on_every_tick = false,pyramiding=0)

// ********** Strategy inputs - Start **********

// Used for intraday handling
// Session value should be from market start to the time you want to square-off 
// your intraday strategy
// Important: The end time should be at least 2 minutes before the intraday
// square-off time set by your broker
var i_marketSession = input(title="Market session", type=input.session, 
     defval="0915-1455", confirm=true)

// Make inputs that set the take profit % (optional)
longProfitPerc = input(title="Long Take Profit (%)",
     type=input.float, minval=0.0, step=0.1, defval=3) * 0.01

shortProfitPerc = input(title="Short Take Profit (%)",
     type=input.float, minval=0.0, step=0.1, defval=3) * 0.01
     
// Set stop loss level with input options (optional)
longLossPerc = input(title="Long Stop Loss (%)",
     type=input.float, minval=0.0, step=0.1, defval=3) * 0.01

shortLossPerc = input(title="Short Stop Loss (%)",
     type=input.float, minval=0.0, step=0.1, defval=3) * 0.01    


// ********** Strategy inputs - End **********


// ********** Supporting functions - Start **********

// A function to check whether the bar or period is in intraday session
barInSession(sess) => time(timeframe.period, sess) != 0



// Figure out take profit price
longExitPrice  = strategy.position_avg_price * (1 + longProfitPerc)
shortExitPrice = strategy.position_avg_price * (1 - shortProfitPerc)

// Determine stop loss price
longStopPrice  = strategy.position_avg_price * (1 - longLossPerc)
shortStopPrice = strategy.position_avg_price * (1 + shortLossPerc)


// ********** Supporting functions - End **********


// ********** Strategy - Start **********
// See if intraday session is active
bool intradaySession = barInSession(i_marketSession)

// Trade only if intraday session is active

//=================Strategy logic goes in here===========================
 
psar = sar(0.02,0.02,0.2)
c1a = close > psar
c1v = close < psar

malen = input(50, title="MA Length")
mm200 = sma(close, malen)
c2a = close > mm200
c2v = close < mm200

fast = input(12, title="MACD Fast EMA Length")
slow = input(26, title="MACD Slow EMA Length")
[macd,signal,hist] = macd(close, fast,slow, 9)
c3a = macd >= 0
c3v = macd <= 0

rsilen = input(7, title="RSI Length")
th = input(50, title="RSI Threshold")
rsi14 = rsi(close, rsilen)
c4a = rsi14 >= th
c4v = rsi14 <= th

chopi = input(7, title="Chop Index lenght")
ci = 100 * log10(sum(atr(1), chopi) / (highest(chopi) - lowest(chopi))) / log10(chopi)

buy = c1a and c2a and c3a and c4a ? 1 : 0
sell = c1v and c2v and c3v and c4v ? -1 : 0


//Final Long/Short Condition
longCondition = buy==1 and ci <50
shortCondition = sell==-1 and ci <50 
 
//Long Strategy - buy condition and exits with Take profit and SL
if (longCondition and intradaySession)
    stop_level = longStopPrice
    profit_level = longExitPrice
    strategy.entry("My Long Entry Id", strategy.long)
    strategy.exit("TP/SL", "My Long Entry Id", stop=stop_level, limit=profit_level)


//Short Strategy - sell condition and exits with Take profit and SL
if (shortCondition and intradaySession)
    stop_level = shortStopPrice
    profit_level = shortExitPrice
    strategy.entry("My Short Entry Id", strategy.short)
    strategy.exit("TP/SL", "My Short Entry Id", stop=stop_level, limit=profit_level)
 
 
// Square-off position (when session is over and position is open)
squareOff = (not intradaySession) and (strategy.position_size != 0)
strategy.close_all(when = squareOff, comment = "Square-off")

// ********** Strategy - End **********

Plus de