programmation
Maintenant vous lisez
MQL pratiquement. Panic Button, part II [Cours de programmation]
0

MQL pratiquement. Panic Button, part II [Cours de programmation]

établi Radek SzafronMars 29 2019

Bienvenue dans la deuxième partie de Panic Button! Cette semaine, nous allons examiner à nouveau le code de notre bouton panique. Notre tâche aujourd’hui est d’ajouter ce qui est le plus important, c’est-à-dire de nous libérer du poids des positions ouvertes et des contraintes de regarder constamment le moniteur.

Nous allons développer les fonctionnalités de base avec autre chose. Nous allons nous assurer que l'outil que nous concevons est sûr et que les clics accidentels seront inébranlables et calmes. Comme n'importe quel bouton sérieux sur notre planète, nous aurons une sorte de fusible qui vous permettra de fermer la position uniquement lorsque le clic sera accompagné en appuyant sur une touche [Maj] sur le clavier.


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


Nous ouvrons une fabrique d'algorithmes

Nous allumons donc MetaEditor.

Passons à l'édition du code de notre application de la semaine dernière. Ouvrir le fichier Bouton panique.mq4 du catalogue Experts et jetons un coup d'oeil à la fonction OnInit (). Votre fonction devrait être presque identique à la fonction placée ci-dessous avec une petite différence. Aujourd'hui, un nouvel élément du code est apparu // commenter .

int OnInit ()
{
if(IsDemo () == non)
{
 
retourner INIT_FAILED;
 
}
bool bleu = non;
if(Tylko_ten_instrument == oui)
{
 
bleu = oui;
 
}
Przycisku_utworz_sie (5, 15, bleu);
// <- [Voici comment nous faisons des commentaires] EventSetMillisecondTimer(250); // Fin de nouveauté
retourner INIT_SUCCEEDED;
}
Code MQL4

Ajouter le code manquant à la fonction OnInit ().

Nous commençons l'horloge

La fonction API MQL ajoutée au code ci-dessus bool EventSetMillisecondTimer(int milliseconde)vous permet de configurer la minuterie. Timer est une méthode qui vous permet d'appeler une autre fonction API - OnTimer () chaque nombre spécifique de millisecondes. Cette solution nous permet d’exécuter périodiquement certaines parties du code en les plaçant dans la fonction. OnTimer (). Dans notre cas, 4 fois par seconde, ou quoi 250 millisecondes.

L'horloge tourne, alors écrivons une nouvelle fonction.

annuler OnTimer()
{
 
Przycisku_badz_czujny ();
 
}
Code MQL4

Bon travail Vous venez de créer un algorithme chargé de sécuriser notre bouton contre les clics accidentels. C'était cette partie difficile. A partir de maintenant, pour cliquer sur le bouton, vous devez maintenir la touche enfoncée. [Maj] sur le clavier. Les spins sur les électrons sont dévissés en fonction Przycisku_badz_czujny ()que nous avons importé de la bibliothèque Biblioteka_panic_button.ex4 la semaine dernière.

La plate-forme nécessite que le minuteur soit désactivé lorsque nous n'en avons plus besoin. Nous pouvons le faire en ajoutant la fonction API EventKillTimer () fonctionner OnDeinit ()que nous avons créés dans la section précédente et qui, pour rappel, seront appelés par la plate-forme lors de la fermeture de notre application. Modifions la fonction OnDeinit ()faites-le ressembler à la fonction ci-dessous.

annuler OnDeinit(const int raison)
{
 
Przycisku_bye_bye ();
 
EventKillTimer ();
}
Code MQL4

Vous pouvez lancer l'application ici et voir comment l'algorithme répond en appuyant sur une touche [Maj].

Nous surveillons chaque mouvement

Le moment est venu de penser à la fonction de fermeture de position. Pour ce faire, nous devons reconnaître le moment où le bouton est cliqué. La fonction API nous aide annuler OnChartEvent(const int ça const long & lParam const double & dparam, chaîne const & SPAR).

fonction OnChartEvent (...) il est appelé par la plate-forme chaque fois qu'un événement survenant sur le graphique peut être pertinent pour le fonctionnement du programme, par exemple l'utilisateur clique sur l'objet ou déplace la souris. Écrivons la fonction appropriée.

annuler OnChartEvent(const int ça const long & lParam const double & dparam, chaîne const & SPAR)
{
 
}
Code MQL4

Plate-forme, fonction d'appel OnChartEvent (...) il fournit des informations supplémentaires à l'aide de paramètres id, lParam, dparamoraz espar. Cela nous permet d'identifier ce qui s'est passé et le type d'événement est stocké dans la variable idqui est le type int, c’est-à-dire un entier. mot const lorsque le type de variable signifie qu’une variable donnée ne peut pas être modifiée et n’est utilisé que pour lire des informations.

Développons notre fonction avec un autre élément.

annuler OnChartEvent(const int ça const long & lParam const double & dparam, chaîne const & SPAR)
{
 
if(id == CHARTEVENT_OBJECT_CLICK)
{
 
}
 
}
Code MQL4

En utilisant l'opérateur if ci-dessus, nous vérifions si la variable id est égal == la valeur définie dans la variable générée automatiquement par le nom CHARTEVENT_OBJECT_CLICK. Si tel est le cas, nous sommes sûrs que l'utilisateur a cliqué sur un objet non spécifié sur le graphique sur lequel notre algorithme fonctionne.

Nous savons déjà que lorsque l'expression conditionnelle d'opérateur if il sera logiquement vrai que le code entre les accolades sera créé {} appartenant à cet opérateur. Ajoutons à notre code ce qui devrait se passer lorsque le graphique clique sur un objet.

annuler OnChartEvent(const int ça const long & lParam const double & dparam, chaîne const & SPAR)
{
 
if(id == CHARTEVENT_OBJECT_CLICK)
{
 
if(Button_you_you_t_click_turned (sparam) == oui)
{
 
}
 
}
 
}
Code MQL4

Le code ci-dessus vérifie si c'est notre bouton qui a été cliqué à l'aide de la fonction bool Przycisku_czy_jestes_klikniety (un magnifique object_name)cela vient de la bibliothèque importée. La fonction en tant que paramètre suppose une variable avec le type de données un magnifique, qui est une variable de texte qui doit contenir le nom de l’objet sur lequel l’utilisateur a cliqué. La fonction compare la valeur reçue avec le nom de l'élément graphique du bouton et la réponse à la question si un bouton a été cliqué répondra avec la valeur de type boolou valeur oui lub non.

Comment connaissons-nous le nom de l'objet sur lequel vous avez cliqué? fonction OnChartEvent (...) reçoit de la plate-forme le nom du dernier objet cliqué à l'aide du paramètre un magnifique nommé esparque nous pouvons directement passer en paramètre de notre fonction, oh oui Przycisku_czy_jestes_klikniety (SPAR).

Nous réalisons la tâche confiée [Konkrety]

Quand fonctionButton_or_jestes_klikniety (...) renverra la valeur oui nous saurons qu'il n'y a pas de blagues, il faut sauver la situation.

Ajoutons à notre code une fonction qui accomplira la tâche principale de notre algorithme, à savoir fermer la position sur le compte. La fonction a la déclaration suivante:

bool Zamknij_pozycje_i_zlecenia (bool tylko_ten_instrument),

En pratique, nous le mettons dans le code comme dans l'encadré ci-dessous.

annuler OnChartEvent(const int ça const long & lParam const double & dparam, chaîne const & SPAR)
{
 
if(id == CHARTEVENT_OBJECT_CLICK)
{
 
if(Button_you_you_t_click_turned (sparam) == oui)
{
 
Zamknij_pozycje_i_zlecenia (Tylko_ten_instrument);
 
}
 
}
 
}
Code MQL4

fonction Fermer_positions_et_ commandes (...) prend une variable de type en argument boolqui devrait porter des informations, oui lub nondevrions-nous fermer les positions de l'instrument sur lequel l'algorithme fonctionne? Vous vous souvenez du paramètre Tylko_ten_instrument à partir du volet des paramètres dans la première partie? Nous venons d'être utiles. Selon notre choix dans les paramètres, le programme fermera les éléments compatibles avec le graphique sélectionné ou tous les éléments du compte.


conseillers experts


Nous créons la fonction principale

Nous commençons à éditer le fichier "Fonctions_utiles.mqh" depuis le répertoire MQL4 \ Include \ Panic Button \

Jusqu'à présent, nous n'utilisions que des fonctions provenant de l'API MQL ou importées de la bibliothèque. Biblioteka_panic_button.ex4. Dans le monde réel, toutefois, la programmation exige que nous créions nous-mêmes la majorité des fonctions, tout en prenant en charge l’ensemble des solutions prêtes à l’emploi. fonction Fermer_positions_et_ commandes (...) , à partir duquel nous utilisons ce qui précède, vous trouverez dans le fichier Przydatne_funkcje.mqh, qui dans la partie précédente nous avons placé dans le catalogue MQL4 \ Inclure \ Bouton Panique \ et nous avons rejoint le code en utilisant le mot-clé #comprendre. Ouvrez le fichier dans MetaEditor car, surprise, la fonction qui ferme les entrées se trouve déjà dans le fichier, mais nous devons tout de même lui donner du contenu.

Définition de la fonction

Après ouverture du dossier Przydatne_funkcje.mqh vous verrez qu'il est dedans définition fonction de fermeture de position. Cela ressemble aux fonctions que nous avons utilisées jusqu’à présent, à la différence que c’est la nôtre, et nous pouvons lui donner le type d’âme que le nom, le type et le jeu de paramètres voudront. Votre fonction devrait ressembler plus ou moins à la fonction ci-dessous:

bool Zamknij_pozycje_i_zlecenia (bool tylko_ten_instrument)
{
retourner oui;
}
Code MQL4

Ainsi, dans tête , nous avons défini une fonction nommée Zamknij_pozycje_i_zlecenia renvoyer le type de données bool et en prenant un paramètre nommé tylko_ten_instrument aussi sur le type de données bool.

Le contenu de la fonction

Tout ce que nous plaçons entre accolades {} après l'en-tête de la fonction, il est constitué de son contenu. Alors enrichissons notre contenu avec le premier code.

bool Zamknij_pozycje_i_zlecenia (bool tylko_ten_instrument)
{
if(isConnected() == non) retourner non;
int i = 0; int number_of_the_power_and = OrdersTotal();
if(number_of_content_and == 0) retourner oui;
bool résultat = oui;
retourner résultat;
}
Code MQL4

Ci-dessus, premier if, nous vérifions si nous sommes connectés au serveur en utilisant la fonction API isConnected() et en cas de problème, nous quittons la fonction avec l'aide de l'opérateur retourner en retournant la valeur nonpour vous faire savoir que quelque chose ne va pas. C'est juste après if il n'y a pas d'accolades, car nous utilisons un enregistrement raccourci possible dans les situations où, après l'expression conditionnelle, nous souhaitons effectuer une seule opération.

Lorsque nous sommes en ligne, l'algorithme va plus loin et crée deux variables int à propos des noms i oraz liczba_pozycji_i_zlecen en assignant à la première valeur 0et la deuxième valeur de la fonction API OrdersTotal(), qui vous informe sur le nombre de positions ouvertes et de commandes sur votre compte.

Un autre opérateur if vérifie si parfois tous les éléments ne sont plus fermés, et l'utilisateur clique sur le bouton uniquement pour le plaisir ou l'affection, ce qui entraîne la sortie de la fonction avec le transfert de valeur ouiparce que tout va bien.

Quand une fonction a encore quelque chose à faire, elle crée une variable bool nommé résultat, qui servira ultérieurement à indiquer si tous les éléments ont été correctement fermés à l'aide de l'opérateur final retournerque nous avons légèrement modifié dans cette étape.

Pour boucle

Opérateur en, qui dans sa popularité est susceptible de céder le passage à l'opérateur if, est utilisé pour effectuer un certain ensemble d'opérations selon un nombre spécifié de répétitions. Idéalement adapté à des situations comme la nôtre, car nous devons effectuer une opération de clôture pour chaque commande séparément. Ajoutons une boucle à notre fonction en.

bool Zamknij_pozycje_i_zlecenia (bool tylko_ten_instrument)
{
if(isConnected() == non) retourner non;
int i = 0; int number_of_the_power_and = OrdersTotal();
if(number_of_content_and == 0) retourner oui;
bool résultat = oui;
en(i = nombre d'articles_i_ commandes - 1; i> = 0; je--)
{
 
}
retourner résultat;
}
Code MQL4

W têteaprès l'opérateur en nous voyons un disque mystérieux: (i = nombre d'articles_i_ commandes - 1; i> = 0; je--) .

L'enregistrement signifie que la boucle commence par la variable créée précédemment i égal à la variable liczba_pozycji_i_zlecen moins un et va répéter l'opération entre accolades {} tant que variable i est supérieur ou égal à zéro [i> = 0], et après la fin de chaque cycle réduira la variable i par un [je--] pour que la boucle ait une chance de se terminer un jour. Simple, simple et confortable à lire.

Parlant dans la langue des gens, la boucle en effectue l'opération entre parenthèses {} autant de fois que nous avons des positions ouvertes.

Ajoutons du contenu à notre boucle.

bool Zamknij_pozycje_i_zlecenia (bool tylko_ten_instrument)
{
if(isConnected() == non) retourner non;
int i = 0; int number_of_the_power_and = OrdersTotal();
if(number_of_content_and == 0) retourner oui;
bool résultat = oui;
en(i = nombre d'articles_i_ commandes - 1; i> = 0; je--)
{
if(OrderSelect(Et, SELECT_BY_POS) == non)
{
résultat = non; continuer;
}
if(only_ten_instrument == oui && OrderSymbol()! = Symbole()) continuer;
if(OrderType() == OP_BUY || OrderType() == OP_SELL)
{
if(CommandeFermer(OrderTicket() OrderLots() OrderClosePrice() 0) == non)
{
résultat = non; continuer;
}
}
Sinon si(OrderDelete(OrderTicket()) == non) résultat = non;
}
retourner résultat;
}
Code MQL4

Physique des fusées

Analysons pas à pas ce qui se passe dans notre boucle enque nous avons courageusement écrit à l'étape précédente.

Dans la première étape en utilisant la fonction API OrderSelect(...) nous choisissons une commande du terminal en utilisant le numéro de sa position dans la liste des commandes (le premier ordre de la liste a le numéro zéro). Nous avons une variable à cet effet icela change la valeur à chaque boucle. En cas d'échec, on écrit l'erreur dans la variable résultat et informer la boucle en en utilisant l'opérateur continuerqu'elle devrait s'arrêter à ce stade et commencer un nouveau cycle avec une variable i moins un [je--].

Quand tout va bien, un autre opérateur if utilisera, nouveauté, opération logique "et" &&qui retourne une valeur oui seulement si les deux expressions, sur chacune de ses pages, retournent une valeur oui. Ainsi, lorsque l'instrument de l'ordre sélectionné [OrderSymbol()] ne répond pas [!=] un instrument graphique [Symbole()] et variable tylko_ten_instrument a une valeur oui, on ignore l'ordre donné et on utilise l'opérateur continuer nous allons au prochain cycle de la boucle en. Dans tous les autres cas, l'algorithme va en dessous.

Ensuite, notre programme vérifie quelle commande nous avons le plaisir de faire et le fait en utilisant la fonction API OrderType() et fonctionnement logique"ou" ||qui retourne une valeur ouilorsqu'au moins une des expressions de chacune de ses pages renvoie une valeur oui. Sinon, lorsque l'expression logique de l'opérateur if dans son ensemble, il retournera la valeur non l'opérateur sera exécuté Sinon sicela fonctionne avec le premier if'em et lui sert de plan B, quand il ne peut pas accepter sa propre expression logique.

En fonction du type de commande en premier if lorsqu'il s'agit d'un ordre d'achat au marché [OP_BUY] ou vendre sur le marché [OP_SELL] fermera la position en utilisant la fonction API CommandeFermer(...)et l'autre ifen fait Sinon si annule les commandes en attente à l'aide de la fonction OrderDelete(...).

Je m'incline, le programme est prêt!

Nous sauvegardons les modifications dans le fichier Przydatne_funkcje.mqh, on retourne au code de l'application principale Bouton panique.mq4 et enthousiaste, plein d'énergie et de curiosité résultant de la volonté de tester une nouvelle œuvre, presse ... compiler! Ensuite, nous corrigeons les erreurs et à la semaine prochaine! 🙂

TELECHARGER UN ENSEMBLE DE FICHIERS MQL

Qu'en penses-tu?
Je
95%
intéressant
8%
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.