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
Contenu des pages
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
C'est très utile ! !!! Merci ! !!!
Cette solution ouvre la voie à de nombreuses possibilités.
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.
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 ?
J'aimerais ajouter l'indicateur supertrend à ma plateforme sqx.
, Comment puis-je faire cela ?
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