programmation
Maintenant vous lisez
MQL pratiquement. As de l'intelligence, c'est-à-dire des notifications au téléphone [Cours de programmation]
0

MQL pratiquement. As de l'intelligence, c'est-à-dire des notifications au téléphone [Cours de programmation]

établi Radek SzafronAvril 12 2019

Bienvenue dans la partie IV de notre cours de programmation pratique. Aujourd’hui, nous traiterons de questions d’une immense importance, nous créerons Asa de l'intelligence, qui en notre absence traitera des activités de renseignement axées sur les variations de prix sur le marché boursier. Quand les choses vont au bon rythme, le nôtre As enverra immédiatement un message secret (pas très) à notre téléphone portable qui nous permettra de prendre les choses en main.


Assurez-vous de lire: MQL pratiquement. Bouton panique, partie II


Notre application vous permettra de définir des niveaux de prix, sur lesquels nous recevrons une notification pousser sur notre téléphone. Les niveaux seront déterminés en faisant glisser les lignes colorées qui traceront après avoir cliqué sur la figure de notre Asa de l'intelligence. Commençons par décrire ces notifications et comment configurer nos appareils pour que tout soit ok.

notifications pousser

notifications pousser ils sont une fonction de la plate-forme Meta Trader, qui vous permet d'envoyer des messages du terminal à un appareil iOS ou Android sur lequel l'application mobile Meta Trader est installée. Si vous n'avez pas encore d'application sur votre mobile, téléchargez-la, car sans elle, la nôtre As il ne peut pas très bien gérer.

rys_1 rys_2

La configuration de l'appareil est très rapide. Dans un premier temps, vous devez connaître le vôtre MetaQuotes ID, c’est-à-dire le numéro par lequel nous dirigerons le message vers le téléphone approprié (ou le réfrigérateur avec système Android). nombre MetaQuotes ID est dans l'application mobile sur le menu Paramètres / Chat et Messagescomme dans l'image ci-dessous.

Programmation forex Rys_3

Le numéro est en cours de lecture MetaQuotes ID puis entrez dans le programme MetaTarder sur votre ordinateur dans le menu Outils / Options / Notifications.

Programmation forex Rys_4

Prêt!

Contexte technique

Au début, téléchargez le paquet situé un peu plus bas et installez le code source de l’application ou du fichier Comme Intelligence.mq4 dans le catalogue MQL4 \ experts \ .

Notre programme aura également une petite interface graphique placée dans la bibliothèque elementy_graficzne.ex4que vous copiez dans le répertoire MQL4 \ Bibliothèques \ As Intelligence .

TELECHARGER LES FICHIERS

nous commençons

Après ouverture du dossier Comme Intelligence.mq4dans la partie supérieure, vous verrez l'extrait de code suivant.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Propriété strict
# Import "As de l'Intelligence \\ elements_graficzne.ex4"
annuler AgencieRozpocznijMisje (int x, int s);
annuler AgencieByeBye ();
un magnifique AgencieIdentyfikujSie ();
# Import
couleur d'entrée Kolor = clrDodgerBlue;
couleur d'entrée Kolor_wylaczony = clrGold;
contribution ENUM_LINE_STYLE Styl = STYLE_SOLID;
entrée int épaisseur = 2;
un magnifique Nom de l'instrument = "" ;
un magnifique Id_line = "INTERVIEW_LINES" ;
Code MQL4

Nous commençons le code à partir de l'importation de la bibliothèque, puis en utilisant des mots-clés d'entrée, nous créons des paramètres pour la configuration dans la fenêtre des paramètres. Les paramètres nous permettront de définir l'apparence de la ligne, à l'aide de laquelle nous fixerons le prix de nos notifications.

Variables globales

Sous les définitions de type contribution on voit quelque chose de nouveau, des déclarations de variables Nazwa_instrumentu oraz Id_liniiqui sont en dehors du contenu de toute fonction. Qu'est ce que cela signifie? De cette façon, nous définissons variables globales, qui sera disponible partout dans notre code, c’est-à-dire que chaque fonction de l’algorithme sera capable de les lire et de leur donner une valeur. A partir de variables déclarées comme contribution ils ne diffèrent que par le fait que l'utilisateur ne peut pas y accéder dans la fenêtre des paramètres.

tableaux

Lors de l'écriture d'un logiciel, il est souvent nécessaire de gérer une telle quantité de données qu'il serait au moins fastidieux de créer une variable distincte pour chacune d'entre elles. Les tables viennent à la rescousse, vous permettant de créer un ensemble ordonné de données d’un type donné, par exemple un type double, disponible avec un nom que nous avons défini. Pour chaque table, nous pouvons (ne pas avoir à) définir sa taille, c'est-à-dire le nombre d'éléments de données d'un type donné qui y figureront. Jetons un coup d'oeil à l'extrait de code suivant.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
un magnifique Tablica_nazwy_linii [];
double Tablica_dane_linii [] [4];
#define CZAS_AKTYWACJI 0
#define TYP_SYGNALU 1
#define STATUS_LINII 2
#define CENA_LINII 3
#define SYGNAL_LONG 0
#define SYGNAL_SHORT 1
#define LINIA_WYLACZONA 0
#define LINIA_ZMODYFIKOWANA 1
#define LINIA_AKTYWNA 2
#define LINIA_USUNIETA 3
Code MQL4

Planches unidimensionnelles

Dans le code ci-dessus, dans les lignes 1 et 2, nous avons créé deux tables. Tablica_nazwy_linii il sera utilisé pour stocker les noms des objets que nous allons dessiner sur le graphique. Chaque ligne en représente une, définie par l'utilisateur, par notification et parce que notre application vous permet de définir le nombre de notifications dont vous avez besoin pour utiliser des tableaux.

Tablica_nazwy_linii est un tableau à une dimension, que nous reconnaissons après une paire de crochets []. Entre crochets, vous pouvez entrer le nombre de données que vous souhaitez mettre dans le tableau, mais dans notre cas, nous ne savons pas combien la ligne sera sur le graphique, car elle dépend de l'utilisateur. Laissez donc un crochet vide, ce qui signifie que nous déterminerons de manière dynamique et régulière et redimensionnez la table en fonction de vos besoins. Jetons un coup d'œil au dessin ci-dessous, qui décrit le fonctionnement des panneaux unidimensionnels.

Programmation forex Rys_5

Programmation Forex - Tableaux

Tableaux multidimensionnels

La deuxième planche, nommée Tablica_dane_linii servira à stocker des données supplémentaires pour chacune des notifications définies par l'utilisateur. Nous ne pouvons pas mettre d’informations supplémentaires dans le même tableau que des noms d’objets, car les noms sont de type un magnifiqueet données de type doubleet une table ne peut contenir qu'un seul type de données.

Tablica_dane_linii est un tableau en deux dimensions, qui symbolise deux crochets [] [4]. La première dimension sera utilisée pour l'identification, comme dans le tableau Tablica_nazwy_liniiquelle ligne nous voulons dire, et la deuxième dimension pour stocker des données supplémentaires 4 pour chacune des notifications définies.

Pour faciliter la navigation dans les éléments d'un tableau à deux dimensions à l'aide de mots-clés #define nous avons créé une liste de valeurs prédéfinies avec, dans la mesure du possible, des noms mémorisés. Sous chaque nom listé après le mot clé #define nous sommes sûrs qu’un nombre sera constant.

Dans la suite, nous allons utiliser les planches dans la pratique. Voyons le graphique ci-dessous qui explique le fonctionnement d'un tableau à deux dimensions.

rys_6

Structure d'application

Notre application utilisera cinq fonctions de l'API MQL, les plus connues, pour la gestion des événements.

OnInit () - préparation de l'algorithme

1
2
3
4
5
6
7
8
9
10
11
12
13
14
int OnInit ()
{
if(IsDemo() == non) retourner INIT_FAILED;
// Record! Explore Area () est une version courte
// Examiner le terrain () == false
if(! Zone d'investissement ()) BlurSlady ();
EventSetMillisecondTimer(250);
AgencieRozpocznijMisje (0, 0);
retourner INIT_SUCCEEDED;
}
Code MQL4

En fonction OnInit() nous commençons par vérifier si nous jouons au bon endroit, puis si les données de l'application sont correctes. Comme il est possible, depuis OnInit() la première fonction appelée par le programme pour que l'algorithme contienne des données incorrectes? Cela peut arriver, par exemple, lorsque nous exécutons l'algorithme sur le graphique d'un instrument, puis que nous changeons le symbole. Dans ce cas, je devrai supprimer les lignes précédemment tracées et toutes les notifications annulées. C’est ce que la fonction traite ZatrzyjSlady ().

Dans la prochaine étape, nous courons minuteur et nous appelons une fonction de la bibliothèque Agent StartMissions (...)dont la tâche est de tirer la nôtre Asa sur la carte.

Dans le code source, vous trouverez plusieurs autres fonctionnalités intéressantes. Pour ceux d'entre vous qui voudraient radiographier les nôtres Asa de A à Z, l’interprétation de matériaux supplémentaires doit constituer une bonne formation pour naviguer dans la documentation MQL. Le code entier de l'application d'aujourd'hui que j'ai essayé de garder dans les limites des points discutés, afin que son interprétation soit aussi facile que possible. Je vous souhaite un apprentissage fructueux et, comme vous connaissez déjà de nombreux éléments de la langue, amusez-vous à créer les premières solutions indépendantes!

OnChartEvent (...) - surveillance des événements

1
2
3
4
5
6
7
8
9
10
11
12
annuler OnChartEvent(const int ça const long & lParam const double & dparam,
chaîne const & SPAR)
{
if(id == CHARTEVENT_OBJECT_DRAG || id == CHARTEVENT_OBJECT_CHANGE)
{
if(StringFind(sparam, Line_ID)> = 0) Mise à jour des données (sparam);
}
Sinon si(id == CHARTEVENT_OBJECT_CLICK)
{
if (sparam == AgentIdentifySame ()) Create ();
}
}
Code MQL4

Merci à la fonction OnChartEvent(...) nous surveillons l'interaction de l'utilisateur avec l'application. Dans le premier cas, nous vérifions si l’utilisateur a fait glisser la ligne de notre notification sur la carte (ou a modifié ses paramètres dans la fenêtre de configuration) et, le cas échéant, nous mettons à jour les données concernant nos notifications dans la fonction. Mettre à jour les données (...)qui, en tant que paramètre, assume le nom de la ligne modifiée par l'utilisateur. En utilisant le nom de ligne reçu, la fonction localise la ligne appropriée dans les tables et met à jour les données pertinentes, entre autres. informations sur le prix fixé pour la notification.

Dans la deuxième partie de la fonction, nous surveillons les événements de cliquer sur des objets dans le graphique de notre algorithme. Chaque clic sur la figure que nous avons dessinée As de l'intelligence crée une nouvelle ligne sur le graphique. Les lignes créées, après le décalage, appellent la fonction Mettre à jour les données (...)qui planifiera une notification spécifique en fonction de l'emplacement de la ligne par rapport au prix au moment de l'interaction avec l'utilisateur.


conseillers experts


OnTimer () - activités récurrentes

1
2
3
4
annuler OnTimer ()
{
SynchronizujDane ();
}
Code MQL4

Minuteur appelé 4 fois par seconde, défini dans la fonction OnInit(), synchronise les données au sein de notre algorithme. Pour les tâches de la fonction SynchronizujDane () Celles-ci consistent notamment à vérifier quelles lignes ont déjà été supprimées et à leur attribuer la bonne couleur selon que la notification est activée ou non.

OnTick () - observation des prix

Toutes les fonctions de l'API MQL répertoriées jusqu'à présent nous sont familières. Temps pour quelque chose de nouveau. fonction onTick() est invoqué par la plate-forme à tout changement de prix de l'instrument sur lequel l'algorithme fonctionne. C'est une fonction fondamentale pour de nombreuses stratégies automatiques. Regardons le code ci-dessous.

1
2
3
4
annuler OnTick ()
{
PoczynWywiad ();
}
Code MQL4

En fonction onTick() notre As il se rend au travail et vérifie si le prix de l'instrument a atteint la valeur indiquée par l'utilisateur. Nous irons à la fonction PoczynWywiad () un peu plus loin, et analysons maintenant une dernière fonction nécessaire pour gérer les événements, OnDeinit(...).

OnDeinit (...) - fin de l'algorithme

1
2
3
4
5
6
7
8
9
annuler OnDeinit(const int raison)
{
EventKillTimer();
AgencieByeBye ();
if(raison! = REASON_CHARTCHANGE && raison! = REASON_PARAMETERS)
ZatrzyjSlady ();
}
Code MQL4

Nous nous arrêtons au début minuteur et nous supprimons la photo de notre agent puis, en utilisant l'opérateur if nous vérifions quelle est la raison de remplir la demande. Dans certains cas, après avoir appelé la fonction OnDeinit(...) le programme redémarre et lance son algorithme depuis le début, c’est-à-dire depuis la fonction OnInit(). C'est le cas, par exemple, lorsque l'utilisateur modifie l'intervalle du graphique. Dans cette situation, si l'instrument n'a pas changé, nous ne souhaitons pas supprimer les notifications que nous avons configurées. Vérification du motif de l'appel de la fonction OnDeinit(...)ou paramètre raison, nous pouvons décider de supprimer des objets et des données ou de laisser les notifications inchangées.

Tables en pratique

Voyons comment notre application utilise les tables précédemment créées sur l'exemple d'une fonction Enregistrer des données (...), dont la tâche est de créer une nouvelle ligne dans les tables pour les données de la nouvelle notification.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
bool ZapiszDane (un magnifique nazwa_linii, double cena_linii)
{
int number_lin = ArraySize(Tablica_nazwy_linii);
ArrayResize(Array_line_line, number_line, + 1);
ArrayResize(Array_path, line_number + 1);
// Write row_number ++ est la version abrégée number_line = number_line + 1
liczba_linii ++;
Line_name_array [nombre_ de lignes - 1] = nom de la ligne;
Line_Data_array [nombre_ de lignes - 1] [DAY_TIME] = 0;
Line_Data_array [nombre_ de lignes - 1] [TYPE DE SIRY] = SYGNAL_LONG;
Line_Data_array [nombre_ de lignes - 1] [STATUS_LINES] = LINE_DIRTY;
Line_Data_array [nombre_ de lignes - 1] [PRICE_LINE] = price_line;
retourner oui;
}
Code MQL4

Dans la ligne 3, vérifiez le nombre d'éléments qu'il contient. Tablica_nazwy_liniiet parce que Tablica_nazwy_linii est un tableau, le nombre unidimensionnel de ses éléments doit correspondre au nombre de lignes dans les deux tables. Ensuite, dans les lignes 5 et 6, nous augmentons le nombre de lignes de nos tables avec 1 à l'aide de l'API. ArrayResize(...). Une nouvelle ligne sera ajoutée à la fin de chaque tableau.

On augmente la variable liczba_linii o 1, car nous avons ajouté une ligne aux tables, puis nous avons renseigné les données relatives à la nouvelle notification en commençant par le numéro de ligne 11, où nous avons attribué le nom de la ligne à la ligne correspondante du tableau. Tablica_nazwy_linii. N'oubliez pas que les lignes (et les colonnes) des tableaux sont numérotées à partir de zéro. Par conséquent, si vous souhaitez, par exemple, enregistrer les informations de la cinquième notification, vous devez utiliser la ligne 4, donc entre crochets, après le nom du tableau nombre de lignes - 1 comme numéro de ligne.

Pour numéroter les colonnes du tableau Tablica_nazwy_linii nous utilisons des valeurs prédéfinies au début de notre algorithme en utilisant des mots-clés #define. Sous les noms de valeur, il y a des nombres de 0 à 3, car la table a des colonnes 4. Grâce à l'utilisation d'un tableau à deux dimensions, nous pouvons enregistrer des informations supplémentaires 4 pour chaque notification, entre autres le prix et le type de signal que vous utilisez dans la fonction Enregistrer des données (...) nous donnons des valeurs initiales.

Ace en action

Une autre fonction qui utilise des tableaux dans notre algorithme est la fonction PoczynWywiad ()où nous lisons les données préparées dans les tableaux et les interprétons afin de décider d’envoyer un message à l’utilisateur. Regardons le code de fonction PoczynWywiad ().

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
annuler PoczynWywiad ()
{
int i = 0;
int number_lin = ArraySize(Tablica_nazwy_linii);
en(i = 0; et <nombre de lignes; i ++)
{
if(Array_data_data [i] [STATUS_LINES] == LINE_ACTIVE)
{
if(Array_data_data [i] [SIRY_TYPE] == SYGNAL_LONG)
{
if(offre > = Line_Data_Array [i] [PRICE_LINE])
{
WyslijWiadomosc (i);
Array_data_data [i] [STATUS_LINES] = LINE_ INTERVAL;
}
}
d'autre
{
if(offre <= Line_Data_Array [i] [PRICE_LINE])
{
WyslijWiadomosc (i);
Array_data_data [i] [STATUS_LINES] = LINE_ INTERVAL;
}
}
}
}
}

Dans la fonction ci-dessus, en utilisant une boucle en nous avons accès à chaque ligne du tableau Tablica_dane_linii. Cela nous permet de vérifier l’état de la notification et le type de signal et, en fonction des données reçues, de vérifier si le prix offre il répond à la condition que nous attendons. Quand notre As il sentira qu'il serait imprudent de nous garder dans l'ignorance, il nous envoie rapidement une notification en utilisant la fonction Envoyer un message(…), qui donne astucieusement le numéro de la rangée où sont stockées les données relatives à la notification requise. Après avoir envoyé le message, la notification est désactivée et As, fermement, continue.

Regardez le code sur votre ordinateur pour la fonction Envoyer un message(…)pour voir comment notre algorithme utilise la fonction API MQL sendNotification(…) Lors de l'envoi de notifications pousser.

Résumé

Si la plateforme ne l’a pas encore fait pour vous, compilez le fichier. Comme Intelligence.mq4 et testez votre nouvelle application! Pour tracer une nouvelle ligne, cliquez simplement sur la belle image du graphique.

Dans le code source, vous trouverez plusieurs autres fonctionnalités intéressantes. Pour ceux d'entre vous qui voudraient radiographier les nôtres Asa de A à Z, l’interprétation de matériaux supplémentaires doit constituer une bonne formation pour naviguer dans la documentation MQL. Le code entier de l'application d'aujourd'hui que j'ai essayé de garder dans les limites des points discutés, afin que son interprétation soit aussi facile que possible. Je vous souhaite un apprentissage fructueux et, comme vous connaissez déjà de nombreux éléments de la langue, amusez-vous à créer les premières solutions indépendantes!

Qu'en penses-tu?
Je
33%
intéressant
67%
Heh ...
0%
Shock!
0%
Je n'aime pas
0%
blessure
0%
À propos de l'auteur
Radek Szafron
L'auteur de cette publication est Radek Szafron, propriétaire de la société Expert Advisors, qui accompagne les investisseurs depuis de nombreuses années en fournissant des technologies dédiées au marché des changes. L'auteur est diplômé de la Warsaw School of Economics avec la spécialisation "marchés financiers" et programmeur avec une expérience estivale proche de 20. La société implémente des conceptions d'algorithmes et d'applications écrites dans toutes les langues de la famille "C", y compris les plateformes populaires Meta Trader 4 et 5. Des conseillers experts peuvent être trouvés sur www.expertadvisors.pl.