Recherche automatique des divergences et des convergences – articles MQL5

Le terme "divergence" vient du mot latin "divergere" ("pour détecter un écart"). La divergence est généralement définie comme une différence dans les lectures de l’indicateur et le mouvement des prix. Le terme antonyme est "convergence" venant du mot latin "convergo" ("Je réunir"). Il existe des systèmes plus larges de classification de divergence / de convergence, y compris les définitions que "divergence cachée", "divergence étendue", Les divergences de classe A, B et C, etc.

Dans cet article, nous traiterons d’abord les conditions de base: divergence et de convergence. Ensuite, nous nous arrêterons sur d’autres méthodes de leur classification, leur analyse comparative effectuer ainsi que d’identifier les avantages et les inconvénients. Enfin, nous allons développer notre propre classification qui est plus complète et n’a pas des inconvénients évidents, ainsi qu’un indicateur universel pour la recherche et l’affichage des convergences / divergences sur la carte la chirurgie laparoscopique pour utérus fibrome. Divergences et convergences (définition concept)

Ainsi, la divergence est une différence dans les lectures des indicateurs et le mouvement des prix. Nous avons aussi le second terme – convergence – ayant le sens opposé. Selon cette logique, si la divergence est une différence dans les lectures des indicateurs et le mouvement des prix, alors la convergence signifie la conformité. Cependant, ce n’est pas le cas puisque la conformité ne peut être assimilée à la convergence.

Pour les deux termes – divergence et de convergence – d’avoir un sens plus précis, ils ont besoin des définitions plus étroites. Regardons les tableaux de prix et indicateurs. Si le prix monte, alors que l’indicateur diminue, nous avons une divergence. Si le prix descend, tandis que l’indicateur monte, nous avons une convergence (fig. 1).

Nous sommes habitués au fait que l’indicateur est habituellement placé au-dessous du tableau de prix, de sorte que cette définition semble acceptable à première vue. Cependant, si on inverse les positions de l’indicateur et le tableau des prix, tout change radicalement: divergence se transforme en convergence et vice-versa (fig. 2).

Maintenant, un coup d’oeil aux Figures 1 et 2 du point de vue de choisir la direction du commerce. Supposons que le prix monte, alors que l’indicateur se déplace vers le bas, nous avons donc décidé de vendre. À la suite de l’analogie, nous devrions vendre lorsque le prix descend, tandis que l’indicateur se déplace vers le haut (Fig. 3).

Il se trouve que dans le cas de la vente, le prix et l’indicateur diverger, alors qu’en cas d’achat, ils convergent, bien acheter et vendre des conditions sont identiques mais contraire. Cela signifie que nous pouvons appeler l’une des conditions baissières, tandis que le second est haussier. Cela signifie que l’emplacement de l’indicateur ci-dessous le tableau des prix ne suffit pas de définir la convergence et de divergence.

Toutes les définitions fournies ont à voir avec la vente de direction, alors que le cas est contraire à l’achat. Mais il existe une version plus simple et plus précise de la définition fondée sur l’essence même de l’analyse technique. Si l’on ajoute l’hypothèse de la poursuite du mouvement des prix à la définition de divergence et de la convergence, il devient simple et concis.

La principale conclusion que j’ai fait tout en naviguant à travers des matériaux disponibles sur la divergence est le manque de terminologie claire et la couverture incomplète des versions possibles. Par conséquent, nous allons analyser les différentes options pour combiner le prix et les directions des indicateurs et les vidéo de chirurgie systématiser d’élimination rénale. complète du systématisation mouvement des prix et un indicateur

Si vous créez un indicateur qui vous permet de choisir l’une des options envisagées, alors vous êtes en mesure de choisir la divergence, la convergence, la divergence cachée ou étendue vous pensez être correct. En d’autres termes, nous obtenons un indicateur universel utile, même pour ceux qui ne sont pas d’accord avec la systématisation et les définitions données dans cet article.

Jusqu’à présent, la direction du prix et le mouvement de l’indicateur a été déterminé par deux points: en haut, en bas et horizontalement. Nous pouvons ajouter le troisième point d’augmenter le nombre d’options possibles mouvement des prix et des indicateurs. Au total, il y a neuf options:

Dans ce cas, il serait plus correct de parler de la forme de mouvement plutôt que la direction. les types de mouvement défini par les trois sommets sont affichés à la Fig. 12.

Ainsi, vous pouvez déterminer le mouvement par un certain nombre de points. Si l’on ajoute le quatrième point, nous aurons 81 variations du mouvement des prix ou de l’indicateur et 6561 (81 * 81) versions possibles de leur combinaison. Bien sûr, les options les plus possibles, moins ils sont susceptibles. Peut-être, il n’y a pas de sens dans l’application du quatrième point, mais l’indicateur de l’article actuel est d’avoir aucune limite sur le nombre de points utilisés pour définir le type de mouvement après la chirurgie fibrome. Indicateur universel pour définir la divergence

Sélection d’un oscillateur. Afin de ne pas être limité par un seul oscillateur pour définir la divergence, nous allons utiliser l’oscillateur universel décrit dans cet article. Il a les pièces jointes: iUniOsc (oscillateur universel) et iUniOscGUI (le même oscillateur avec l’interface graphique). Nous utiliserons la version de base – iUniOsc.

Création d’un nouvel indicateur. Créons le nouvel indicateur de iDivergence dans MetaEditor. Nous allons utiliser la fonction OnCalculate. La fonction OnTimer () n’est pas nécessaire. Cochez la case "Indicateur dans une fenêtre séparée" option. Nous créons trois tampons: une ligne d’affichage de l’oscillateur et deux tampons de flèche pour dessiner des flèches lorsqu’une divergence se produit. Après un nouveau fichier est ouvert dans l’éditeur, changer les noms de tampons: 1 – buf_osc, 2 – buf_buy, 3 – buf_sell procédures de chirurgie du cerveau. Les noms doivent être modifiés si les tableaux sont déclarés, ainsi que dans la fonction OnInit (). Nous pouvons également ajuster les propriétés tampons: indicator_label1, indicator_label2, indicator_label3 – les valeurs de ces propriétés sont affichées dans l’infobulle lors du survol de la souris sur la ligne ou sur l’étiquette de l’indicateur, ainsi que dans la fenêtre de données. Appelons-les "osc", "acheter" et "vendre".

L’application des oscillateurs universels. Insérez tous les paramètres externes de l’indicateur iUniOsc au nouvel indicateur. Les paramètres ColorLine1, ColorLine2 et ColorHisto ne sont pas nécessaires dans la fenêtre des propriétés. Nous les cacher. Le paramètre Type a le type OscUni_RSI personnalisé décrit dans le fichier UniOsc / UniOscDefines.mqh. Nous allons inclure ce fichier. Par défaut, la valeur du paramètre Type est réglé sur OscUni_ATR – indicateur ATR. Mais ATR ne dépend pas de la direction du mouvement des prix qui signifie qu’il ne convient pas à la définition de divergence. Par conséquent, réglez OscUni_RSI – indicateur RSI – par défaut: #include

A ce stade, nous pouvons vérifier l’exactitude des actions effectuées en attachant l’indicateur iDivergence au tableau. Si tout est fait correctement, vous pouvez voir la ligne de l’oscillateur dans la sous-fenêtre.

Définition de l’oscillateur valeurs extrêmes chirurgie d’ablation de l’utérus fibrome. Nous avons déjà examiné trois façons de définir les valeurs extrêmes. Nous les inclure dans l’indicateur et de fournir la possibilité de sélectionner l’un d’eux (variable externe avec une liste déroulante). Dans le dossier Inclure, nous créons le dossier UniDiver, dans lequel tous les fichiers supplémentaires avec le code doivent être situés. Créer le UniDiver / UniDiverDefines.mqh inclure le fichier et écrire l’énumération EExtrType en elle: ENUM EExtrType {

Dans l’indicateur, créez le paramètre externe ExtremumType et insérez-dessus tous les autres paramètres externes. Lors de la définition des valeurs extrêmes par des barres, nous exigerons deux paramètres – nombre de barres à gauche et à droite de la valeur extrême, alors que lors de la définition de seuil, nous aurons besoin du paramètre pour le calcul de la valeur seuil: entrée EExtrType ExtremumType = ExtrBars; // Extremum entrée de type int LeftBars = 2; // Bars à gauche pour l’entrée de ExtrBars int RightBars = – 1; // Bars vers la droite pour l’entrée de deux ExtrBars MinMaxThreshold = 5; // Valeur seuil pour ExtrThreshold

Implémentons la possibilité d’utiliser un paramètre, RightBars ou LeftBars, en plus d’utiliser deux à la fois. RightBars est égal à -1 par défaut. Cela signifie qu’il n’a pas été utilisé et la valeur du second paramètre ne doit pas être attribué.

Les valeurs extrêmes classes de définition de la prostate élimination des effets secondaires de la chirurgie. Il n’y a pas besoin de changer la méthode extrême de définition de la valeur au cours des travaux d’indicateurs, il serait donc plus raisonnable d’utiliser OOP à la place des opérateurs « si » et « switch ». Créer la classe de base et les trois dérivés de trois méthodes de définition d’une valeur extrême. L’une de ces classes dérivées doit être sélectionné lors du lancement de l’indicateur. Ces classes doivent être utilisées aussi bien pour la définition des valeurs extrêmes et effectuer tous les travaux nécessaires pour trouver une divergence coût de la chirurgie fibrome. Ils ne diffèrent que dans les façons de définir des valeurs extrêmes, alors que la définition de la convergence est tout à fait identique dans tous les cas. Par conséquent, la fonction de définition de divergence doit être situé dans la classe de base et être appelés des classes dérivées. Mais d’abord, nous devons fournir un accès facile à tous les indicateurs des valeurs extrêmes (comme cela a été fait avec le ZigZag en tête dans la " Wolfe ondes" article).

La structure de SExtremum est utilisé pour stocker des données sur une valeur extrême. La description de la structure est située dans UniDiverDefines: SExtremum struct {

La méthode setParameters () est utilisée pour régler les paramètres de comparaison supplémentaires: pt – différence disponible des valeurs de prix, où les points de prix sont supposés être situés sur un seul niveau. il – paramètre similaire pour comparer les sommets des indicateurs. Les valeurs de ces paramètres sont réglés par l’intermédiaire de la fenêtre de propriétés: entrée à double IndLevel = 0;

Dans le procédé de CheckBuy (), il est vérifié si le prix point 1 dépasse le point 2 une. La même chose vaut pour l’indicateur: point 1 prix doit être supérieure à la valeur au point 2. La méthode CheckSell () est symétrique en miroir de la méthode CheckBuy (). Toutes les autres classes sont similaires et ne diffèrent que dans les expressions logiques, à l’exception des CDiverConditions0. Les CheckSell () et CheckBuy () renvoient « vrai » à la fois dans cette classe. Il est utilisé lorsque les conditions cocher est désactivée (toute option est possible).

Se préparer à la vérification des conditions de divergence. Le tableau et la variable de sa taille sont déclarées dans la section « protégée » de la classe CDiverBase: CDiverConditionsBase * m_conditions [];

Dans la méthode SetConditions (), la taille du tableau de m_conditions est modifiée et les objets de vérification de l’état de divergence sont créées: SetConditions void (int num, // nombre double divergence pt, // paramètre pricelevel un double) {// paramètre IndLevel if (numlt ; 1) num = 1; // numéro de divergence ne doit pas être inférieure à 1 ArrayResize (m_conditions, 10); // nombre maximum de conditions

Ensuite, la matrice de m_conditions augmente jusqu’à la taille maximale possible (10 – longueur de la valeur maximale de la variable « int ») chirurgie de retrait fibrome. Après cela, l’objet de la vérification de l’état par l’intermédiaire de la méthode CreateConditions () est créée et les paramètres sont définis en utilisant la méthode setParameters () dans le «tandis que » la boucle en fonction de la valeur de chacun des chiffres de « num ». Après la boucle, la taille de la matrice change en fonction du nombre réel de conditions appliquées.

Définir divergence. Maintenant, on peut considérer la méthode CheckDivergence () de la classe CDiverBase. Tout d’abord, nous considérons tout le code de la méthode, puis envisager un par un: void CheckDiver (int i, // indice calculé barre int UCNT, // nombre de sommets dans le tableau m_upper int LCNT, // nombre de sommets dans le m_lower tableau datetime const & temps [], // tableau avec le temps barres const doubles &haut [], // tableau avec les prix des barres fixes const doubles &faible [], // tableau avec les prix des bas barres doubles & acheter [], // tampon indicateur avec des flèches doubles & vendre [], // tampon indicateur avec les flèches vers le bas

// pour les plateaux (vendre des signaux) si (ucntgt; m_ccnt) {// nombre suffisant de plateaux if (m_upper [ucnt- 1] .SignalBar == i) {// une partie supérieure détectée sur la barre calculée bool contrôle = true; // on suppose que la divergence a eu lieu pour (int j = 0; j

En dehors des flèches, iDivergence applique des objets graphiques pour afficher des flèches sur le tableau des prix et des lignes reliant les valeurs extrêmes sur le tableau des prix avec des sommets / bas sur le graphique de l’oscillateur.

Ensuite, il y a deux sections identiques de code pour vérifier les conditions de vente et d’achat. Considérons la première partie de la vente. Le nombre de sommets de l’oscillateur disponibles devrait être 1 plus que le nombre de conditions vérifiées. Par conséquent, le contrôle est effectué: // pour sommets (vendre des signaux) si (ucntgt; m_ccnt) {// il y a un nombre suffisant de sommets

Après cela, nous vérifions si haut sur la barre calculée existe. Ceci est déterminé par la correspondance entre l’indice de la barre et l’indice calculé à partir du tableau des données sur les sommets / semelles: if (m_upper [ucnt- 1] .SignalBar == i) {// haut détectée sur la barre calculée

Dans le « pour » boucle, passer par toutes les conditions données passant sur le sommet de leur: for (int j = 0; j

Si l’une des conditions est pas remplie, sortir de la boucle. « Faux » est affecté à la variable « contrôle ». Si toutes les conditions sont remplies, « check » sauve « true », une flèche est définie et un objet graphique est créé: if (vérifier) ​​{// divergence // lieu a eu lieu le tampon indicateur flèche

Affichage des objets graphiques peut être activée / désactivée dans les propriétés de l’indicateur fenêtre. Les variables suivantes sont déclarées pour que: bool entrée ArrowsOnChart = true;

Dans la section « protégée » de la classe CDiverBase, les variables appropriées sont déclarées: bool m_arrows; // correspond à la variable ArrowsOnChart bool m_lines; // correspond à la variable DrawLines

Les valeurs de ces variables sont définies dans la méthode SetDrawParmeters (): SetDrawParmeters vides (flèches bool, bool lignes, cbuy couleur, csell couleur) {

for (int j = 0; j

si (m_arrows) {// flèches activées sur le graphique des prix // ObjectDelete (0, MQLInfoString (MQL_PROGRAM_NAME) + "_"+ IntegerToString ((long) Bartime) + "_ba");

Les lignes de liaison hauts / bas et les flèches sont retirées séparément. Les noms de tous les objets graphiques commencent par le nom de l’indicateur suivi du temps de la barre, sur laquelle la divergence a été détectée traitement fibrome sans chirurgie. Les noms sont en outre formées dans la boucle correspond au nombre de conditions m_ccnt. "bp" est affiché pour les signaux d’achat sur le graphique des prix, "bi" est affiché pour des signaux d’achat sur le graphique de l’indicateur. De même, "sp" et "ip" sont ajoutés pour les signaux de vente. L’indice j est ajouté à la fin des noms. "_ba" (Acheter flèche de signal) ou "_SA" (Signal de vente flèche) sont ajoutés aux noms des flèches.

Création d’objets graphiques est effectué dans les procédés DrawSellObjects () et () DrawBuyObjects. Considérons un d’entre eux: DrawSellObjects vides (Bartime datetime, double arprice, int UCNT) {

si (m_lines) {// activer l’affichage de lignes // forment la chaîne de préfixe commun pref = MQLInfoString (MQL_PROGRAM_NAME) + "_"+ IntegerToString ((long) Bartime) + "_";

Les noms d’objets sont formés de la même manière que lors de l’enlèvement. Après cela, les objets graphiques sont créés en utilisant les fonctions fObjTrend () et fObjArrow (). Ils sont situés dans le fichier comprennent UniDiver / UniDiverGObjects.mqh. Les fonctions sont assez simples, il n’y a aucun sens à les analyser.

l’achèvement de l’indicateur. Nous avons seulement d’appliquer les classes créées dans l’indicateur. Créer l’objet correspondant dans la fonction OnInit () en fonction du type sélectionné de la définition des valeurs extrêmes: switch (ExtremumType) {

L’un des paramètres externes – est – pricelevel mesurée en points, il convient de le corriger en fonction du nombre de décimales de citations. Pour ce faire, déclarer une autre variable pour pouvoir désactiver cette correction: entrée bool Auto5Digits = true;

Lorsque l’indicateur aura terminé ses travaux, doivent être supprimés les objets graphiques. Cela se fait dans la classe destructor CDiverBase. Les objets conditions de divergence de vérification sont supprimés là aussi: void ~ CDiverBase () {

À ce stade, la scène principale du développement des indicateurs est terminée. Fig. 15 montre le diagramme de l’indicateur attaché à lui (dans la sous-fenêtre) avec l’affichage activé des flèches sur le tableau des prix et des lignes tracées entre les sommets.

Maintenant, nous avons seulement besoin d’ajouter la fonction d’alertes. Il est très simple et a déjà été décrit dans d’autres articles. Dans les pièces jointes ci-dessous, vous pouvez trouver un indicateur ready-made avec la fonction d’alerte ainsi que tous les fichiers nécessaires à l’indicateur. Conclusion

Malgré la polyvalence de l’indicateur, nous pouvons également noter ses inconvénients. Le principal inconvénient est la dépendance du paramètre IndLevel sur les types de l’oscillateur appliquée, ainsi que la dépendance des paramètres pricelevel sur un laps de temps. Pour exclure cette dépendance, les valeurs par défaut de ces paramètres sont 0. Mais en même temps, il est presque impossible de remplir les conditions pour certaines combinaisons du mouvement des prix et de l’indicateur. Si le contrôle d’un mouvement horizontal est inclus dans la vérification de divergence, sa mise en œuvre est peu probable. Dans ce cas, les options de divergence 1, 3, 7 et 9 restent la chirurgie des tumeurs fibrome. Cela peut être un problème que lors de l’application du testeur pour optimiser une évaluation environnementale en utilisant l’indicateur.

Dans le cas de l’approche correcte à l’optimisation, ce ne sera pas un problème puisque l’optimisation est généralement effectuée sur un seul symbole et le calendrier. Tout d’abord, nous devons déterminer le symbole appliqué et le calendrier et définir la valeur appropriée pour le paramètre pricelevel. Ensuite, nous devons sélectionner l’oscillateur appliqué et définissez la valeur appropriée pour le paramètre IndLevel. Il n’y a pas de point dans la lutte pour l’optimisation automatique du type d’oscillateur appliqué et les valeurs des paramètres et pricelevel IndLevel, car il y a beaucoup d’autres paramètres d’optimisation à côté d’eux. Tout d’abord, c’est le type de divergence (la variable Number) et la période de l’oscillateur. Pièces jointes