Documentation

Applications

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

Appel d'un autre indicateur à partir d'un extrait d'indicateur

Lorsque vous programmez des indicateurs dans Strategy Quant X, il peut arriver que vous souhaitiez appeler un autre indicateur et accéder à ses valeurs. Dans le prochain article, nous montrerons comment importer et appeler des indicateurs correctement.

 

Étape 1 - Créer un nouvel indicateur personnalisé dans l'éditeur de code

Ouvrez l'éditeur de code, créez un nouvel extrait et nommez-le IndicatorCalling. Cet article suppose que vous sachiez comment créer des indicateurs. Dans la documentation, vous trouverez deux exemples

 

Étape 2 - Importation des indicateurs et définition du type d'indicateur

Dans cette étape, nous importons 3 indicateurs. ATR, RSI et DPO. La classe Indicators est une classe de cache qui met en cache tous les indicateurs utilisés dans une configuration de trading.
ATR et RSI sont des indicateurs créés directement dans StrategyQuantX, et DPO est un indicateur que vous pouvez télécharger depuis le serveur de partage.  ici.

package SQ.Blocks.Indicators.IndicatorCalling ;

import com.strategyquant.lib.* ;
import com.strategyquant.datalib.* ;
import com.strategyquant.tradinglib.* ;
import SQ.Internal.IndicatorBlock ;
import SQ.Internal.IndicatorBlock ;
// importation d'indicateurs
import SQ.Blocks.Indicators.ATR.ATR ;
import SQ.Blocks.Indicators.RSI.RSI ;
import SQ.Blocks.Indicators.DPO.DPO ;

Étape 3 - Réglages des paramètres

Le premier paramètre est important. Il existe deux options :

  • Paramètre avec type Série de données .Ceci est valable pour une grande partie des indicateurs qui sont calculés à partir d'un seul prix. Par exemple, les indicateurs CCI, RSI, etc. sont généralement calculés à partir du cours de clôture. Vous pouvez les configurer pour qu'ils soient calculés à partir d'un prix différent, par exemple à partir du prix de l'ouverture, mais il s'agit toujours d'un seul tableau de prix.
  • Paramètre avec type Données graphiques est un objet qui représente l'ensemble du graphique - vous aurez accès aux prix Open, High, Low, Close, Volume dans le graphique donné.

 

Dans ce cas, lorsque nous voulons appeler un autre indicateur à partir d'un indicateur, nous devons choisir le type de paramètre ChartData Input.

Un indicateur peut avoir plusieurs paramètres. Dans notre cas, nous définirons les paramètres des indicateurs que nous appellerons. Les paramètres Période DPOP, Période ATR, Période RSIP sont utilisés pour définir les périodes des indicateurs. Le moteur génétique ou l'optimiseur les utiliseront également.

La troisième variable est ValeurIl est à noter qu'il a une annotation différente @Sortie. Cela signifie que cette variable n'est pas un paramètre de l'indicateur mais son tampon de sortie. Les indicateurs n'ont généralement qu'un seul tampon de sortie, mais ils peuvent en avoir plusieurs - par exemple, la bande de Bollinger a un tampon supérieur et un tampon inférieur.

Paramètre
public ChartData Input ;

@Parameter(defaultValue="10", isPeriod=true, minValue=2, maxValue=1000, step=1)
public int DPOPeriod ;

@Parameter(defaultValue="10", isPeriod=true, minValue=2, maxValue=1000, step=1)
public int ATRPeriod ;

@Parameter(defaultValue="10", isPeriod=true, minValue=2, maxValue=1000, step=1)
public int RSIPeriod ;

@Sortie
public DataSeries Value ;


 

 

Étape 4 - Mise en œuvre de la méthode OnBarUpdate()

Dans cette méthode, nous appelons des instances d'indicateurs et calculons la valeur résultante que nous stockons dans l'objet Dataseries Valeur.

protected void OnBarUpdate() throws TradingException {
      
      	ATR aTRIndicator = Indicators.ATR(Input, ATRPeriod) ;
  	  	double atrValue = aTRIndicator.Value.getRounded(0) ;

      	RSI rsiIndicator = Indicators.RSI(Input.Close, RSIPeriod) ;
  	  	double rsiValue = rsiIndicator.Value.getRounded(0) ;

        DPO dpoIndicator = Indicators.DPO(Input, DPOPeriod) ;
  	  	double dpoValue = dpoIndicator.Value.getRounded(0) ;
        
        if (CurrentBar < Math.max(ATRPeriod,RSIPeriod)) {
            // ce qu'il faut définir lorsqu'il y a moins de barres que le paramètre de période de l'indicateur
            Value.set(0, 0) ;

        } else {
            double value = rsiValue/atrValue*dpoValue/atrValue ;
            Value.set(0, value) ;
        }

double value = rsiValue/atrValue*dpoValue/atrValue pour obtenir la valeur finale de l'indicateur. Il s'agit d'un exemple, le calcul n'a donc pas de signification plus profonde.

 

Code complet

package SQ.Blocks.Indicators.IndicatorCalling ;

import com.strategyquant.lib.* ;
import com.strategyquant.datalib.* ;
import com.strategyquant.tradinglib.* ;
import SQ.Internal.IndicatorBlock ;
import SQ.Blocks.Indicators.ATR.ATR ;
import SQ.Blocks.Indicators.RSI.RSI ;
import SQ.Blocks.Indicators.DPO.DPO ;
import SQ.Internal.IndicatorBlock ;


@BuildingBlock(name="(IC) IndicatorCalling", display="IndicatorCalling(#ATRPeriod#,#RSIPeriod#)[#Shift#]", returnType = ReturnTypes.Number)
@Help("Texte d'aide de l'IndicatorCalling")
public class IndicatorCalling extends IndicatorBlock {

    @Parameter
    public ChartData Input ;

    @Parameter(defaultValue="10", isPeriod=true, minValue=2, maxValue=1000, step=1)
    public int DPOPeriod ;

    @Parameter(defaultValue="10", isPeriod=true, minValue=2, maxValue=1000, step=1)
    public int ATRPeriod ;

    @Parameter(defaultValue="10", isPeriod=true, minValue=2, maxValue=1000, step=1)
    public int RSIPeriod ;

    @Sortie
    public DataSeries Value ;

    //------------------------------------------------------------------------
    //------------------------------------------------------------------------
    //------------------------------------------------------------------------


    @Override
    protected void OnBarUpdate() throws TradingException {
        
      	ATR aTRIndicator = Indicators.ATR(Input, ATRPeriod) ;
  	  	double atrValue = aTRIndicator.Value.getRounded(0) ;

      	RSI rsiIndicator = Indicators.RSI(Input.Close, RSIPeriod) ;
  	  	double rsiValue = rsiIndicator.Value.getRounded(0) ;

        DPO dpoIndicator = Indicators.DPO(Input, DPOPeriod) ;
  	  	double dpoValue = dpoIndicator.Value.getRounded(0) ;
        
        if (CurrentBar < Math.max(ATRPeriod,RSIPeriod)) {
            // ce qu'il faut définir lorsqu'il y a moins de barres que le paramètre de période de l'indicateur
            Value.set(0, 0) ;

        } else {
            double value = rsiValue/atrValue+dpoValue/atrValue ;
            Value.set(0, value) ;
        }

    }
}

 

 

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

6 Commentaires
Le plus ancien
Le plus récent Le plus populaire
Emmanuel
23. 12. 2021 12:18 am

C'est très utile ! !!! Merci ! !!!

Emmanuel
23. 12. 2021 12:27 am

Cette solution ouvre la voie à de nombreuses possibilités.

Neil Farmer
15. 1. 2022 9:31 am

Comment utiliser un indicateur tel que SessionHigh dans un autre indicateur ? Pour les indicateurs de prix qui sont dans SQ.Blocks.Price, il ne semble pas que vous puissiez suivre le même modèle que celui utilisé dans l'exemple ci-dessus.

tomas262
Administrateur
Répondre à  Neil Farmer
20. 1. 2022 10:56 pm

Voulez-vous dire que vous souhaitez obtenir le cours le plus élevé de la séance pour une moyenne mobile par exemple ? Ou un autre indicateur ?

Dernière modification le 4 années il y a par tomas262
Arwin Fakey
Arwin Fakey
4. 2. 2026 12:19 am

J'aimerais ajouter l'indicateur supertrend à ma plateforme sqx.
, Comment puis-je faire cela ?

tomas262
Administrateur
Répondre à  Arwin Fakey
6. 2. 2026 10:22 pm

L'indicateur SuperTrend est déjà présent dans SQX. Vous pouvez le trouver dans la liste des blocs de construction sous la catégorie Indicateurs