Documentation

Applications

Dernière mise à jour le 20. 11. 2021 par clonex / Ivan Hudec

Simulation de la moyenne mobile des actions

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.

La création d'un paramètre signifie qu'il sera ajustable dans l'onglet Whatif d'EquityMATrading dans les contrôles croisés.

 

@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

S'abonner
Notification pour
1 Commentaire
Le plus ancien
Le plus récent Le plus populaire
Commentaires en ligne
Afficher tous les commentaires
Emmanuel
20. 12. 2021 8:11 pm

très bien 🙂 très bien 🙂 très bien 🙂 très bien 🙂 très bien 🙂 très bien 🙂 très bien