Documentation

Applications

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

Analyse des échanges - Ratio Edge moyen par heure

Trade Analysis Charts est une partie des résultats de StrategQuant X qui nous permet d'analyser visuellement certaines propriétés d'une stratégie. Dans le tutoriel suivant, nous allons vous montrer comment créer un extrait analytique qui nous montre visuellement le ratio moyen d'une stratégie en fonction de l'heure d'ouverture de la transaction.

Vous pouvez télécharger l'extrait terminé ici.

 

 

Étape 1 - Ouvrir l'éditeur de code

Cliquez sur l'icône de l'éditeur de code pour passer à l'éditeur.

 

 

Étape 2 - Créer une nouvelle colonne Commerce

Ouvrez CodeEditor, cliquez sur Create new et choisissez l'option Trade analysis chart - Name it. Rapport de bord moyen par heure. Cela créera un nouveau snippet AvgEdgeRatioByHour.java dans le dossier Utilisateur/Snippets/SQ/TradeAnalysis Dans le constructeur, nous définissons le nom à afficher.

 

public class AvgEdgeRatioByHour extends TradeAnalysisChart {

    public AvgEdgeRatioByHour() {
        this.name = L.tsq("Avg.Edge Ratio By Hour") ;
    }

 

 

Étape 3 - Modifier la méthode de tirage

Dans cette méthode, nous spécifions le type de graphique que nous voulons créer. Nous pouvons choisir parmi les options suivantes

  • Diagramme à barres
  • Diagramme de dispersion
  • Graphique des prix

Vous créez ensuite un tableau dans lequel vous insérez les données du tableau computeData. Utilisez la boucle for pour ajouter au graphique les valeurs calculées dans le tableau computeData.

@Override
    public AbstractChart draw(OrdersList orders, byte plType, byte tradePeriod) {
        // création d'une nouvelle instance de graphique
        BarChart chart = new BarChart() ;
        
        chart.invertIfNegative(true) ;
        
        if(orders==null) {
            return chart ;
        }
        // création d'un tableau ici nous stockons les données calculées dans la méthode computeData
        double[] hours = computeData(orders, plType, tradePeriod) ;
        
        // remplir le graphique avec les valeurs du tableau
        for(int hour=0 ; hour<hours.length ; hour++) {
            
            chart.addValue(L.tsq("Avg.Edge Ratio By Hour"), hour, hours[hour]/hoursCount[hour]) ;
        }

        return chart ;
    }

 

Étape 4 - Mise en œuvre du tableau computeData

computeData est un tableau dans lequel nous travaillons avec Liste des commandes. 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).
private double[] computeData(OrdersList orders, byte plType, byte tradePeriod) {
        double[] hours = new double[24] ;
        
        for(int hour=0 ; hour<hours.length ; hour++) {
            heures[heure]=0 ;
        }
        
        int hour ;
        // ici nous travaillons avec la liste des commandes
        for(int i = 0 ; i < orders.size() ; i++) {
            Order order = orders.get(i) ;
            
            hour = SQTime.getHour(order.getTimeByPeriodType(tradePeriod)) ; //0-23

            double mae = order.PipsMAE ; //obtient le MAE de l'ordre en pips
            double mfe = order.PipsMFE ; //obtient le MAE de l'ordre en pips
            double atrOnOpen = order.ATROnOpen ; // obtient l'ATR de l'ordre en pips

            double normMAE = mae/atrOnOpen ; // obtient le MAE normalisé
            double normMFE = mfe/atrOnOpen ; // obtient l'EMF normalisé

            double eRTrade = SQUtils.safeDivide(normMFE,normMAE) ; // SQUtils.safeDivide précède l'exception de division par zéro nulle.


            hours[hour]+= eRTrade ;
            hoursCount[hour]+=1 ;
        }

 

Étape 5 - Utilisation Avg. Edge Ratio par heure dans la stratégie Quant X

Après avoir compilé le snippet et redémarré l'éditeur de code et StrategyQUant X, nous pouvons travailler avec le snippet nouvellement créé.

Code commenté

package SQ.TradeAnalysis ;
import com.strategyquant.lib.* ;
import com.strategyquant.datalib.* ;
import com.strategyquant.tradinglib.* ;

public class AvgEdgeRatioByHour extends TradeAnalysisChart {
    // Constructeur de classe dans lequel nous définissons le nom du snippet
    public AvgEdgeRatioByHour() {
        this.name = L.tsq("Avg.Edge Ratio By Hour") ;
    }
    
    @Override
    public AbstractChart draw(OrdersList orders, byte plType, byte tradePeriod) {
        // création d'une nouvelle instance de graphique
        BarChart chart = new BarChart() ;
        
        chart.invertIfNegative(true) ;
        
        if(orders==null) {
            return chart ;
        }
        // création d'un tableau dans lequel nous stockons les données calculées dans la méthode computeData
        double[] hours = computeData(orders, plType, tradePeriod) ;
        
        // remplir le graphique avec les valeurs du tableau
        for(int hour=0 ; hour<hours.length ; hour++) {
            // heures[heure]/compte heures[heure] nous calculons le Edge Ratio moyen par heure
            chart.addValue(L.tsq("Avg.Edge Ratio By Hour"), hour, hours[hour]/hoursCount[hour]) ;
        }

        return chart ;
    }
    // création d'un tableau pour le comptage des transactions
    int [] hoursCount = new int[24] ;
     
    private double[] computeData(OrdersList orders, byte plType, byte tradePeriod) {
        //création d'un tableau dans lequel nous stockons les résultats calculés
        double[] hours = new double[24] ;
        // définir des valeurs pour l'état par défaut 0
        for(int hour=0 ; hour<hours.length ; hour++) {
            heures[heure]=0 ;
        }
        
        int hour ;
        // nous travaillons ici avec une liste d'ordres (OrdersList)
        for(int i = 0 ; i < orders.size() ; i++) {
            Order order = orders.get(i) ;
            
            hour = SQTime.getHour(order.getTimeByPeriodType(tradePeriod)) ; //0-23

            double mae = order.PipsMAE ; //obtient le MAE de l'ordre en pips
            double mfe = order.PipsMFE ; //obtient le MAE de l'ordre en pips
            double atrOnOpen = order.ATROnOpen ; // obtient l'ATR de l'ordre en pips

            double normMAE = mae/atrOnOpen ; // obtient le MAE normalisé
            double normMFE = mfe/atrOnOpen ; // obtient l'EMF normalisé

            double eRTrade = SQUtils.safeDivide(normMFE,normMAE) ; // SQUtils.safeDivide précède l'exception de division par zéro nulle.

            // stocker le ratio de bord pour chaque heure
            hours[hour]+= eRTrade ;
            // compte le nombre de transactions pour chaque heure
            hoursCount[hour]+=1 ;
        }

        return hours ;
    }
}

 

Cet article a-t-il été utile ? L'article était utile L'article n'était pas utile

S'abonner
Notification pour
0 Commentaires
Commentaires en ligne
Afficher tous les commentaires