Documentation
Applications
Dernière mise à jour le 20. 11. 2021 par clonex / Ivan Hudec
Simulation de la moyenne mobile des actions
Contenu des pages
Dans ce tutoriel, nous allons vous montrer comment créer et simuler un contrôle de courbe d'équité dans What If Crosscheck .
Les scénarios d'hypothèses dans StrategyQuantx sont l'outil qui vous permet de tester différentes hypothèses de négociation de votre stratégie.
La fonction de simulation du contrôle de l'équité permet de simuler l'activation et la désactivation d'une stratégie en fonction de la courbe de l'équité. L'hypothèse est basée sur le fait qu'il est préférable de négocier une stratégie si sa performance est supérieure à sa moyenne. Un bon article consacré à ce sujet peut être consulté à l'adresse suivante ici.
Vous pouvez télécharger l'extrait terminé ici.
Étape 1 - Créer un nouvel extrait d'hypothèse
Ouvrez CodeEditor, cliquez sur Create new et choisissez l'option List of trades column - Name it. EquityMATrading.
Cela créera un nouveau snippet EquityMATrading.java dans le dossier Utilisateur/Snippets/SQ/Whatif
Étape 2 - Définir les paramètres du snippet
Puisque nous voulons calculer la moyenne des fonds propres, nous devons inclure un paramètre - Période de MAP qui permet de spécifier une période de la moyenne mobile.
@ClassConfig(name="() Equity MA Trading", display="Equity MA(#MAPeriod#) Trading ") @Help("Texte d'aide") public class EquityMATrading extends WhatIf { public static final Logger Log = LoggerFactory.getLogger(EquityMATrading.class) ; @Parameter(name="MAPeriod", defaultValue="10", minValue=2, maxValue=100000, step=1) public int MAPeriod ;
Étape 3 - Mise en œuvre de la méthode filter(OrdersList orders)
Le filtre(Liste des commandes ) est utilisée pour filtrer la liste originale des ordres dans la stratégie. Liste des commandes est une classe qui stocke la liste des opérations d'une stratégie et fournit des méthodes pour manipuler la liste des opérations. Vous pouvez faire une boucle sur l'ensemble de la Liste des commandes et obtenir des données pour des Commande utiliser la méthode obtenir(int index).
Ici, vous devez faire attention à la façon dont vous bouclez la liste des commandes. Dans notre exemple, nous utilisons la boucle for classique, nous ne pouvons donc pas manipuler la liste des ordres pendant la boucle.
Au lieu de cela, nous créons un Liste des commandes ol où nous stockons les transactions qui ont rempli nos conditions. Nous copions cette liste d'ordres à la fin de l'extrait dans la liste d'ordres principale
Étape 4 - Utilisation du snippet Whatif EquityMATrading
Pour ajouter un snippet dans les Crosschecks, vous pouvez utiliser ce snippet pour simuler ce qui se passerait si vous tradiez votre stratégie lorsque sa courbe d'équité est au-dessus de sa moyenne mobile.
Code complet commenté de l'extrait
paquet SQ.WhatIf ; import org.slf4j.Logger ; import org.slf4j.LoggerFactory ; import com.strategyquant.lib.SQTime ; import com.strategyquant.tradinglib.ClassConfig ; import com.strategyquant.tradinglib.Help ; import com.strategyquant.tradinglib.Order ; import com.strategyquant.tradinglib.OrdersList ; import com.strategyquant.tradinglib.Parameter ; import com.strategyquant.tradinglib.WhatIf ; import com.strategyquant.tradinglib.results.stats.comparator.OrderComparatorByOpenTime ; import it.unimi.dsi.fastutil.objects.ObjectListIterator ; @ClassConfig(name="() Equity MA Trading", display="Equity MA Trading (#MAPeriod#)") @Help("Texte d'aide") public class EquityMATrading extends WhatIf { public static final Logger Log = LoggerFactory.getLogger(EquityMATrading.class) ; @Parameter(name="MAPeriod", defaultValue="10", minValue=2, maxValue=100000, step=1) public int MAPeriod ; @Override public void filter(OrdersList orders) throws Exception { // Nouvelle instance de OrdersList dans laquelle nous stockons les transactions qui se situent au-dessus de la moyenne mobile OrdersList newOL = new OrdersList("AboveMovingAverage") ; // Nous parcourons en boucle l'ensemble des ordres de la OrdersList afin de calculer la moyenne mobile. for(int i = MAPeriod;i < orders.size();i++){ // Le dernier ordre en cours nous permet de décider s'il faut ou non passer à la nouvelle moyenne mobile. Ordre ordre = ordres.get(i) ; // Obtenir le solde de l'ordre double balance = order.AccountBalance ; // filtre les commandes équilibrées if(order.isBalanceOrder()) continue ; double sum = 0 ; // calcule la moyenne mobile des capitaux propres for(int k =1;kavg) { // nous ajoutons order.get(i) à newOL newOL.add(order) ; } avg =0 ; // réinitialisation de la variable moyenne sum =0 ; // réinitialisation de la variable somme } // trier newOL en fonction de l'heure d'ouverture des positions newOL.sort(new OrderComparatorByOpenTime()) ; //// trier les ordres par heure d'ouverture // nous remplaçons la liste d'ordres OrdersList par la liste d'ordres newOL et nous ne recevons que les transactions au-dessus de la moyenne mobile orders.replaceWithList(newOL) ; } }
Cet article a-t-il été utile ? L'article était utile L'article n'était pas utile
très bien 🙂 très bien 🙂 très bien 🙂 très bien 🙂 très bien 🙂 très bien 🙂 très bien