Version bêta du livre en ligne sur la programmation MQL4 - par Sergey Kovalev (SK.) - page 3

 
Climber:
J'ai essayé Meta Trader pour la première fois il y a une semaine et j'ai découvert qu'il est beaucoup plus pratique que mes terminaux précédents (Rumus et Forex Trader). Il y a environ deux ans, lorsque j'ai découvert le Forex et ouvert mon premier compte de démonstration, je me suis demandé comment tout automatiser. Puis j'ai ouvert le terminal et j'ai vu le message Autotrading dans la section courrier. Et me voici))) Je lis intensément le livre, et j'espère que bientôt j'écrirai mon premier conseiller expert pour ma stratégie développée. Je n'avais absolument rien à voir avec la programmation auparavant, il était même difficile d'imaginer que je puisse un jour étudier la programmation))). Au fil de ma lecture, des questions se sont posées, mais elles ont aussi disparu au fur et à mesure. La question est apparue, j'ai regardé devant moi et j'étais satisfait, car j'ai vu la réponse après quelques chapitres et je suis retourné lire tout dans l'ordre. J'ai été particulièrement attiré par la possibilité de tester la stratégie sur des données historiques et d'ajuster la stratégie en conséquence.
En tout cas, merci beaucoup pour le livre.


Il est excellent. Vous êtes un nouvel utilisateur de MT. Et vous ne connaissez pratiquement rien à la programmation pour le moment.

Permettez-moi de vous suggérer de rendre compte au moins deux ou trois fois par mois de la façon dont les choses se passent (et plus souvent si vous le souhaitez). Ce serait extrêmement intéressant.

En attendant, si vous me le permettez, j'ai une question. Vous dites qu'une question s'est posée, à laquelle il est répondu dans les sections suivantes. J'ai essayé de l'organiser de manière à éviter cette situation. Pourriez-vous préciser à quelle question vous faites référence ?

 
SK. писал (а):
Climber:
Il y a une semaine, j'ai installé et essayé Meta Trader pour la première fois. Il s'est avéré que ce terminal est beaucoup plus pratique que mes précédents (Rumus et Forex Trader). Il y a environ deux ans, lorsque j'ai découvert le Forex et ouvert mon premier compte de démonstration, je me suis demandé comment tout automatiser. Puis j'ai ouvert le terminal et j'ai vu le message Autotrading dans la section courrier. Et me voici))) Je lis intensément le livre, et j'espère que bientôt j'écrirai mon premier conseiller expert pour ma stratégie développée. Je n'avais absolument rien à voir avec la programmation auparavant, il était même difficile d'imaginer que je puisse un jour étudier la programmation))). Au fil de ma lecture, des questions se sont posées, mais elles ont aussi disparu au fur et à mesure. La question s'est posée, j'ai regardé devant moi et j'étais satisfaite, car j'ai vu la réponse après quelques chapitres et je suis retournée lire tout dans l'ordre. J'ai été particulièrement attiré par la possibilité de tester la stratégie sur des données historiques et de la corriger en conséquence.
En tout cas, merci beaucoup pour le livre.


Il est excellent. Vous êtes un nouvel utilisateur de MT. Et vous ne connaissez pratiquement rien à la programmation pour le moment.

Puis-je vous proposer : de me faire savoir au moins 2 ou 3 fois par mois comment vous allez (ou plus souvent, si vous le souhaitez). Ce serait très intéressant.

En attendant, si vous me le permettez, j'ai une question. Vous dites qu'une question s'est posée, à laquelle il est répondu dans les sections suivantes. J'ai essayé de l'organiser de manière à éviter cette situation. Pourriez-vous préciser la question à laquelle vous faites référence ?

J'ai déjà utilisé Sign of Misery pour faciliter mon travail, où l'on peut écrire un programme sans connaître la moindre programmation. Il suffisait de spécifier les actions dans l'ordre où elles étaient effectuées (je l'ai principalement utilisé comme un automate, bien qu'il y ait beaucoup plus de possibilités). Disons que j'ai beaucoup de valeurs dans 4 colonnes d'Excel (données de levés électriques provenant de la géophysique, tous les 20 cm). Pour le traitement ultérieur de ces données, j'avais besoin de prendre des données uniquement sur les compteurs (c'est-à-dire sur 0, 1, 2, 3, 4 ....). J'ai fait ce programme pour automatiser les actions, par des commandes pour émuler les touches et changer les coordonnées de la souris. Je l'ai compilé dans l'ehe. Mais c'était juste une digression. Le programme devait faire des étiquettes et fixer les conditions de passage à ces étiquettes, c'est-à-dire faire un cycle d'opérations, avec la condition de sortie de ce cycle. Lorsque j'ai commencé à construire l'EA, j'avais une idée de la vue générale de la structure du code. Mais lorsque j'ai commencé à lire le livre, j'ai été un peu confus par la structure de la construction du programme et ensuite par la fonction int start () qui est répétée à chaque tick et si au moment de son exécution je découvre le prix de l'offre, il est écrit dans une variable et y est stocké tout au long de son exécution, alors comment saurai-je que le prix a changé et que le programme peut effectuer toute autre action basée sur le nouveau prix ? Je pensais que le prix dans mon programme serait mis à jour par une sorte de code en boucle, le demandant constamment. J'avais également une autre question : lors de l'appel d'une fonction et de son exécution, j'imaginais que la fonction suivante serait exécutée, mais il s'avère que le contrôle revient à la fonction qui suit celle qui a initialement appelé la fonction. Mais ce fait m'a particulièrement plu, parce qu'il est devenu clair pour moi (parce que j'ai pensé, qu'en est-il des autres actions, qui ont suivi cette fonction, sont-elles sautées de cette façon ?) Maintenant, j'ai une question comme celle-ci : J'ai compris que lors de l'exécution de la fonction init, j'appellerai une fonction permettant de calculer un prix d'ouverture approprié pour mon ordre, ainsi que de calculer une taille de lot sur la base des données de solde de mon compte ; une fois l'init terminée, l'exécution de la fonction start commencera, qui contiendra un code d'"attente" de Le prix nécessaire de la transaction, et dès qu'il viendra, l'ordre d'ouverture sera exécuté (le take profit n'est pas supposé mettre car s'il y aura un saut qui dépassera la valeur ТР, il ne se déclenchera pas, et le saut ce potentiellement favorable que la valeur ТР, donc je veux former l'ordre de fermer l'ordre au dernier prix connu lorsque le prix actuel soit est égal, soit < , soit > spécifié.ou >) ; alors la chose la plus mystérieuse pour moi est de savoir où écrire le code d'attente du prix de l'ordre "close" et de revenir au tout début, c'est-à-dire calculer à nouveau le prix fixé et utiliser l'ordre "close". C'est-à-dire que je dois calculer le prix à fixer pour l'ouverture, attendre ce prix, etc. J'ai regardé en avant dans les sections ; je pense avoir vu quelque chose dans les titres, qui répondra probablement à ma question. Je finis de lire la section sur les ordres d'ouverture et de fermeture. J'ai commencé à le lire hier matin.
Je vous tiendrai au courant de l'évolution bien sûr, comme dans ma situation et sans communication)). J'espère un retour constructif.
Merci de votre temps et de votre attention.
 

Veuillez diviser les messages suivants en paragraphes, car il est difficile de comprendre ce qui est écrit.

Climber:
Mais après avoir commencé à lire le livre, j'ai été un peu confus par la structure de la construction du programme et ensuite par la fonction int start (), qui est répétée à chaque tick et si au moment de son exécution je connais le prix de l'offre, alors il est écrit dans une variable et y est stocké pendant toute la durée de l'exécution, alors comment saurai-je que le prix a changé et que le programme peut effectuer toute autre action basée sur le nouveau prix ? Je pensais que le prix dans mon programme serait mis à jour par un code en boucle, le demandant constamment.

Vous avez raison de dire que pour que le programme puisse fonctionner en temps réel, il est nécessaire d'être informé périodiquement du fait d'un nouveau prix et du prix lui-même.

En fait, il existe 2 méthodes :

La première méthode consiste à exécuter une fonction en boucle sans fin et à demander périodiquement le prix.
Mais cette méthode présente des inconvénients :
- Si les requêtes sont fréquentes, il en résulte une charge importante sur le canal de communication et un gaspillage des ressources du PC ;
- Si vous effectuez des requêtes peu fréquentes, vous risquez de manquer un nouveau prix entre deux requêtes.

La deuxième méthode (acceptée comme une méthode de base dans la technologie MQ) est assez différente dans la mesure où le lancement du code nécessaire appartient au terminal. Le terminal reçoit des informations du serveur, comprend qu'un nouveau tick est arrivé (le fait d'un nouveau prix et le prix lui-même) et sur la base de ces informations, le terminal lance la fonction(). Tout ceci est décrit dans la section Programme dans MQL4.

Grimpeur:
Maintenant, j'ai une question : je me suis rendu compte que lors de l'exécution de la fonction init, je vais appeler la fonction de calcul du prix ouvert de mon ordre, et aussi le calcul de la taille du lot, sur la base des données du solde de mon compte ; après l'exécution de la fonction init, l'exécution va commencer...

C'est faux. init() et start() sont des fonctions spéciales. Ils sont appelés par le terminal client en fonction de leurs propriétés propres (ou plus simplement, en fonction des règles, des conditions dans lesquelles ils sont appelés à être exécutés). Cette fonction est décrite dans la section Fonctions spéciales. La fonction init() est exécutée une fois, lorsque le programme est chargé dans la fenêtre. Et start() est appelé à chaque tic. C'est très pratique. Un tick est arrivé et a apporté un nouveau prix = le terminal lance start() qui est exécuté jusqu'à ce qu'il soit exécuté. Tous les calculs doivent y être insérés - calcul du nombre de lots, conditions des ordres d'ouverture/fermeture et tout le reste.

Grimpeur:
Ensuite, ce qui m'intrigue le plus, c'est de savoir où écrire le code qui attend le prix de "clôture" de l'ordre et revient au début, c'est-à-dire qu'il faut à nouveau calculer le prix d'ouverture, attendre ce prix, etc. J'ai regardé en avant dans les sections ; je pense avoir vu quelque chose dans les titres, qui répondra probablement à ma question. Je prendrai plaisir à lire la section sur les ordres d'ouverture et de fermeture.

À en juger par vos questions, vous n'avez pas besoin d'écrire des programmes et vous n'avez pas besoin de lire ce que vous êtes en train de lire. Dans cette situation, il est fortement recommandé de recommencer la lecture du livre. Avec constance et sans se prendre la tête. Et au fur et à mesure, tapez tous les exemples présentés dans ME et exécutez-les sur votre PC. Et ne passez pas à la section suivante avant d'avoir bien compris chaque lettre du code. Recherchez les concepts de Coche, Contrôle, Fonction, Fonction spéciale, Opérateur, et consultez de temps en temps le dictionnaire des termes.

Grimpeur:
Je ne manquerai pas de rapporter les progrès comme dans mon poste et sans communication ;)) J'espère un retour constructif.
Merci pour vos commentaires.

J'espère que vous prendrez les conseils correctement et que vous les suivrez.

 
SK. a écrit (a) :
<br / translate="no">

Grimpeur:
Ensuite, ce qui m'intrigue le plus, c'est de savoir où écrire le code qui attend le prix de "clôture" et revient au début, c'est-à-dire compter à nouveau le prix d'ouverture, attendre ce prix, etc. J'ai regardé en avant dans les sections ; je pense avoir vu quelque chose dans les titres, qui répondra probablement à ma question. Je suis toujours en train de lire la section sur les ordres d'ouverture et de fixation.

À en juger par les questions que vous vous posez, vous n'avez pas encore besoin d'écrire des programmes et vous n'avez pas non plus besoin de lire ce que vous êtes en train de lire.

Ugh, je crois que j'ai la structure de l'expert.
Je l'ai rapidement griffonné dans le vdp, voilà :

Init

Début

J'ai fixé le nombre maximum d'ordres ouverts = 1 ;

Vérifiez combien de commandes sont ouvertes ;

si 1 est ouvert, alors j'appelle la fonction pour fermer l'ordre,

Si aucun ordre n'est ouvert, alors j'appelle la fonction "calculer le prix et le nombre de lots".

--------------------------

Nécessaire pour calculer un prix d'achat et de vente favorable et pour calculer le nombre de lots ;

--------------------------

l'interrogation du prix actuel ;

si le prix actuel >= prix d'achat pour vendre,

puis ouvrir un ordre de vente égal au nombre de lots déjà déterminé ;

sinon, comparez le prix actuel avec le prix de l'offre gagnante ;

si le prix actuel est <= Prix de l'offre,

respectivement ouvrir un ordre d'achat ;

--------------------------

Appelez la fonction pour clôturer la commande ;

retourner

deinit


C'est bien ça ?
 
Climber:
C'est bon ?

Bien, dans l'ensemble :) Félicitations à vous. C'est toujours agréable de comprendre autre chose.

Suivez tout de même mon conseil : vous devez revenir au début. Et reprendre depuis le début, sans sauter et sans revenir en arrière, en exécutant méthodiquement sur votre PC tous les codes proposés dans le tutoriel.

 
Parabellum:

Le livre contient un indicateur ROC intéressant - l'indicateur du taux de variation des prix(https://book.mql4.com/ru/samples/iroc). Je comprends que ce livre est un manuel et que l'auteur n'est pas obligé de donner un code source à moitié ou même à quart de grain, mais l'idée de l'indicateur est très bonne, et je l'ai un peu modifié pour rendre le décalage encore plus faible.

D'ailleurs, le texte de l'indicateur publié sur la page elle-même comporte deux fautes de frappe dans le code et il est donc impossible à compiler.
      Line_4[i]=(Line_1[i]+Line_2[i]+Line_3[i])3;// Суммарный массив
      //-------------------------------------------------------- 17 --

      Line_5[i]= Sum(Aver_Bars+1); // Индик. массив сглаженной линии
Deux fois, un caractère de division est manquant (disparu lors de la création du fichier html ?).
Le fichier indicateur lié dans le texte est normal.
 
SK. писал (а):

Bien, dans l'ensemble :) Félicitations à vous. C'est toujours agréable de comprendre autre chose.

Suivez tout de même mon conseil : vous devez revenir au début et reprendre depuis le début, sans sauter et sautiller, en exécutant méthodiquement sur votre PC tous les codes suggérés dans le tutoriel.


Oui, je suis d'accord, il est très important de voir et de ressentir tout résultat de ce que vous lisez, c'est à ce moment-là qu'il se fixe dans la mémoire à long terme, d'autant plus que sous l'influence du contenu émotionnel, plus d'une association apparaît :) En passant, je voulais également souligner que pour stimuler l'intérêt, il est nécessaire de revenir en arrière ou d'utiliser les chapitres les plus importants, puis l'intérêt lui-même mènera au but et élargira le cercle de la connaissance. Le plus difficile dans notre situation est de comprendre ce qui est intéressant au fur et à mesure, d'élaborer l'ordre qui sera le plus efficace, comme nous voyons l'efficacité de tout ce que nous possédons. Je rapprocherais le fonctionnement de la mémoire associative de la mémoire gérée, où une zone distribuée existe tant qu'il existe au moins un lien (association) avec elle, plus il y a de liens, plus la zone a de chances de ne pas être libérée, garantissant ainsi son utilisation et son utilité ultérieure. Il est donc nécessaire de réapprovisionner constamment le stock d'associations afin de consolider ce que vous avez lu.

P.S. : Désolé si je suis allé trop loin :)

 
timbo: D'ailleurs, le texte de l'indicateur publié sur la page elle-même comporte deux fautes de frappe dans le code, et est donc impossible à compiler.
      Line_4[i]=(Line_1[i]+Line_2[i]+Line_3[i])3;// Суммарный массив
      //-------------------------------------------------------- 17 --

      Line_5[i]= Sum(Aver_Bars+1); // Индик. массив сглаженной линии
Le symbole de la division manque deux fois (il a disparu lors de la création du fichier html ?).
Le fichier indicateur lié dans le texte est normal.


Oui, ça existe. Dans les codes sources, aucune erreur n'a été détectée pour l'instant, mais les codes textes sont déréglés à certains endroits pour une raison quelconque. Nous allons nous en occuper.
 
xnsnet:

P.S. : Désolé si j'ai réagi de manière excessive :)

:) Oui, un peu là)))
 
Il y a aussi une petite note sur le livre. Il est préférable d'utiliser des exemples concrets, je veux dire pas sur des chats, mais sur l'argent ou des choses qui sont pertinentes. Par exemple, lorsque je suis arrivé aux opérateurs de boucle, l'exemple avec les moutons vous distrait un peu, vous commencez à penser à la façon dont il peut être utilisé dans nos conditions, et cela distrait du processus de perception.

J'ai déjà du mal avec les boucles (je reviendrai plus d'une fois sur ces sections), et puis il y a ces moutons.

C'est juste mon avis, si l'on considère un exemple spécifique de commerce (presque de raid :)), ok, de commerce, alors si le lecteur rencontre un exemple similaire à son idée (qu'il ne sait pas comment mettre en œuvre), il considérera avec grand intérêt cet exemple et pensera comment le modifier et le personnaliser pour mettre en œuvre son idée (je pense que vous voyez ce que je veux dire).

J'ai eu un tel exemple, je m'intéressais à la façon d'ouvrir un ordre pour 1/3 du solde. Vous ne pouvez pas imaginer quel genre d'opérations mathématiques ont été effectuées dans ma tête pour convertir 1/3 en dollars, afin d'obtenir la somme en lots (0,1 ou 3,5 lots). Et quelle ne fut pas ma joie lorsque j'ai vu un exemple deopenbuy.mq4, qui ouvre un ordre d'achat d'une valeur de 35 % des fonds disponibles, avec certaines valeurs spécifiées d'ordres stop. Je l'ai regardé de bout en bout, j'ai examiné chaque ligne, quoi, pourquoi et où. J'ai examiné les fonctions standard qui y sont utilisées (MathFloor, MarketInfo. ....).