Documentation

Applications

Dernière mise à jour le 27. 5. 2020 par Mark Fric

Ajout d'indicateurs et de signaux

De nouveaux blocs d'indicateurs et de signaux peuvent être ajoutés à StrategyQuant à l'aide d'un outil intégré. Éditeur de code.

Éditeur de code SQ

 

Chaque indicateur et signal de StrategyQuant est implémenté sous forme d'extrait Java, avec le code source complet visible.

D'une manière générale :

  • chaque indicateur doit mettre en œuvre un OnBarUpdate() c'est là que se trouve l'algorithme de l'indicateur proprement dit.
  • chaque signal doit implémenter une méthode OnBlockEvaluate() qui renvoie true ou false

Ces méthodes sont appelées à chaque barre, et l'indicateur ou le signal ne doit calculer que ses dernières valeurs et les stocker dans ses tampons de sortie.

Les blocs d'indicateurs et de signaux ont des paramètres - tels que la période ou le graphique. SQ Snippets utilise l'annotation @ pour ces paramètres, qui sont définis comme des variables de classe Java standard.

 

Exemples d'annotation de blocs

Les annotations définissent le nom et le type du bloc, ainsi que les variables qui sont des paramètres d'indicateur et celles qui sont des tampons pour les valeurs calculées.

L'élan

@BuildingBlock(name="(MO) Momentum", display="Momentum(#Period#)[#Shift#]", returnType = ReturnTypes.Number)
@Indicator(oscillator=true, middleValue=100, min=96, max=104, step=0.1)
public class Momentum extends IndicatorBlock {

    @Parameter(defaultChartIndex=0)
    public DataSeries Input ;
    
    @Parameter(defaultValue="14")
    public int Period ;

    @Output(name = "Momentum", color = Colors.Red)
    public DataSeries Value ;

 

Le momentum est inférieur au niveau (blocage du signal)

@BuildingBlock(name="Le momentum est inférieur au niveau", display="Momentum(#Period#) < #Level#", returnType = ReturnTypes.Boolean)
public class MomLower extends ConditionBlock {
    
    @Parameter
    public DataSeries Input ;
    
    @Parameter(defaultValue="14", minValue=2, maxValue=10000, step=1)
    public int Period ;

    @Parameter(defaultValue="0", minValue=0, maxValue=200, step=0.01, builderMinValue=96, builderMaxValue=104, builderStep=0.1)
    public double Level ;

    @Paramètre
    public int Shift ;

 

 

Exemples de méthodes d'indicateurs OnBarUpdate()

Vous pouvez voir un exemple de quelques indicateurs ci-dessous, dans la plupart des cas les codes sont très simples grâce à l'architecture SQ - vous n'avez pas besoin de calculer toutes les valeurs sur toutes les barres, mais seulement la valeur sur la toute dernière barre.

L'élan

protected void OnBarUpdate() throws TradingException {
    if(CurrentBar == 0) {
        Value.set(0, 0) ;
    } else {
        Value.set(0, Input.get(0) * 100.0 / Input.get(Math.min(Period, CurrentBar))) ;
    }
}

 

ATR

protected void OnBarUpdate() throws TradingException {
    double curHigh = Chart.High.get(0) ;
    double curLow = Chart.Low.get(0) ;
    double trueRange = curHigh - curLow ;
    
    if (CurrentBar == 0){
        Value.set(0, trueRange) ;
    }
    else {
        double prevClose = Chart.Close.get(1) ;
        trueRange = Math.max(Math.abs(curLow - prevClose), Math.max(trueRange, Math.abs(curHigh - prevClose))) ;
        
        Value.set(0, ((Math.min(CurrentBar + 1, Period) - 1 ) * Value.get(1) + trueRange) / Math.min(CurrentBar + 1, Period)) ;
    }
}

 

L'ICC

protected void OnBarUpdate() throws TradingException {
    averageCalculator.onBarUpdate(Input.get(0), CurrentBar) ;
    
    if (CurrentBar == 0) {
        Value.set(0, 0) ;
    }
    else {
        double mean = 0 ;
        double sma = averageCalculator.getValue() ;
        
        for (int idx = Math.min(CurrentBar, Period - 1) ; idx >= 0 ; idx--) {
            mean += Math.abs(Input.get(idx) - sma) ;
        }
        
        if(mean < 0.0000000001) {
            Value.set(0, 0) ;
        } else {
            double cci = (Input.get(0) - sma) / (mean == 0 ? 1 : (0,015 * (mean / Math.min(Period, CurrentBar + 1)))) ;
            Value.set(0, cci) ;
        }
    }
}

Vous pouvez constater que l'ICC utilise une classe d'aide supplémentaire, AverageCalculator, qui est également disponible avec le code source complet dans l'extrait SQ/Calculators/AverageCalculator.java.

 

Exemple de la méthode OnBlockEvaluate() pour les signaux

L'ICC est supérieur au niveau

Le code pour le signal est beaucoup plus simple que pour l'indicateur. Il consiste généralement à obtenir une ou plusieurs valeurs d'un indicateur et à les comparer à quelque chose d'autre.

public boolean OnBlockEvaluate() throws TradingException {
    Indicateur CCI = Strategy.Indicators.CCI(Input, Period) ;
    double value1 = indicator.Value.getRounded(Shift, 4) ;
    
    return (value1 > Level) ;
}

 

 

Exemples étape par étape

Pour en savoir plus, consultez les exemples suivants, étape par étape :

 

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