Documentation
Applications
Dernière mise à jour le 27. 5. 2020 par Mark Fric
Ajout d'indicateurs et de signaux
Contenu des pages
De nouveaux blocs d'indicateurs et de signaux peuvent être ajoutés à StrategyQuant à l'aide d'un outil intégré. Éditeur de code.
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