Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 1144

 
Valeriy Yastremskiy:

Je comprends cela, mais mql5 est difficile à comprendre malheureusement. Je suis d'accord avec fxsaber, je pense qu'il est plus facile d'utiliser 4 et pour l'optimisation et d'autres choses nous devrions utiliser 5. En général, j'aimerais savoir s'il y a quelqu'un qui a maîtrisé mql5 sans pratique de la POO ? Bien sûr, après C++ 4 n'est pas pertinent, bien que je puisse me tromper.

Les deux langues sont absolument identiques. Ni plus ni moins. Et la POO (qui intimide tout le monde) est exactement la même dans les deux cas. Vous ne saviez pas ? Avez-vous lu des histoires d'horreur sur Internet et regardé des blogueurs sur YouTube qui "sèment le bien, le sage et l'éternel" ? Qui disent intelligemment des bêtises, en faisant délibérément fuir les gens de MQL5.

Je m'empresse de vous décevoir - les deux langues sont exactement les mêmes. Tant au niveau de la facilité de compréhension, que des caractéristiques et de la présence de la POO.
Mais MQL5 offre davantage de possibilités.

 
Alexey Viktorov:

Je vous ai envoyé l'Espagnol là-bas - eh bien, faites-lui peur. Faites-lui un indicateur - Je n'ai pas le temps. C'est en anglais. Je t'expliquerai s'il y a quelque chose. Mais... tu trouveras.

 
Alexey Viktorov:

Je ne me souviens pas de la réponse d'Artem, et je ne vais pas la chercher. Tous les codes de ses articles sont soit multi-terminaux, soit en deux versions, pour mql5 et mql4. J'ai vérifié ces versions sur mql4, tout fonctionne correctement et détecte la fermeture par stop ou take et ne fait aucune erreur.

Oui, ces articles sont difficiles à comprendre, mais cela en vaut la peine si vous n'êtes pas plus âgé que moi. Et moi, pour un programmeur, je suis obscènement vieux.

L'autre variante est plus simple, mais elle sera beaucoup plus lente. Ecrire le ticket de commande dans un tableau, et par ce tableau, sélectionner la commande et vérifier l'heure de clôture de la commande. S'il est supérieur à zéro, cela signifie que l'ordre est fermé. Si le commentaire d'un ordre fermé contient les lettres "sl", cela signifie que l'ordre est fermé en utilisant un stop. Si l'ordre est clôturé, il est supprimé du tableau. Ou, une fois le tableau complété, il est rechargé avec les ordres ouverts restants. L'imagination vole en général.

C'est à vous de choisir l'option qui vous convient le mieux. Et lisez certains de mes posts sur le manuel de Kovalev. C'est le manuel qui suggère d'écrire int start(), alors que dans la mql4 mise à jour, void OnTick() devrait être écrit pour les Expert Advisors.

Pour les indicateurs et les scripts, veuillez vous référer à la documentation. Et d'ailleurs, il est beaucoup plus facile d'écrire des indicateurs dans la version actualisée de mql4 que lorsque Sergey a écrit ce tutoriel.

Merci beaucoup. Vos informations ont été très précieuses pour moi. Surtout en ce qui concerne la fonction start().

 
Alexey Viktorov:

Je ne me souviens pas de la réponse d'Artem, et je ne vais pas la chercher, je peux deviner ce qu'il aurait pu répondre. ...

Voici ma réponse. Avec une indication claire de ce qui doit être fait :

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégies de trading

Toutes les questions des débutants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes.

Artyom Trishkin, 2020.04.28 08:22

L'explication est simple : vous devez surveiller le nombre d'ordres et de positions, et les comparer avec l'état précédent. Si nous avons 12 positions sur le tick précédent, et 8 positions sur le tick actuel, nous avons un changement de 4 positions. Par conséquent, nous devons prendre les quatre dernières positions (à l'heure de la clôture) pour comprendre ce qui leur est arrivé.

Mais, à en juger par le code ci-joint, dans lequel les "miracles" sont écrits, vous n'avez vraiment pas besoin d'une explication en mots. Mais il est là pour aider, pas pour écrire pour/pour.


 
ANDREY:

Merci beaucoup. Vos informations m'ont été très précieuses. Surtout en ce qui concerne la fonction start()

La bonne chose est de créer dans l'éditeur ce dont nous avons besoin, EA, script, indicateur et l'éditeur créera un modèle avec les bons champs.
 
Artyom Trishkin:

Et que fait votre code à part qu'il ouvre deux positions de vente, chacune à une heure strictement spécifiée, et imprime l'heure d'ouverture de la dernière position quand elle est autorisée ? Tout. L'utilisation de variables non initialisées, qui peuvent conduire à des "merveilles" dans le comportement du code, et un très, très vieux gestionnaire start(), qui a été tiré d'une étagère poussiéreuse avec des années de toiles d'araignée, et sur le marché (un jour vous voulez vendre quelque chose) avec des gestionnaires anciens ne manquera jamais validateur - il dira que le type de programme erroné.

Merci pour votre contribution. Sur la paire GBP/USD, j'ai trouvé un modèle dans le comportement des prix lors des tests. Ce modèle avec de petites corrections, ainsi qu'avec de petits drawdowns, le graphique de la balance mène constamment vers le haut depuis 2008 et jusqu'au moment actuel. Comme je l'ai dit, les corrections et les retraits du graphique d'équilibre ne sont pas importants, mais ils peuvent durer plusieurs mois.
J'ai commencé à tester différentes variantes de ce modèle et j'ai eu recours à l'optimisation à cette fin. Mais il s'est avéré que l'optimisation utilisant plusieurs paramètres à la fois prend énormément de temps. Dans mon cas, cela a pris environ un an. Un algorithme génétique ne me convient pas.
Puis j'ai eu l'idée que les tests et l'optimisation peuvent être effectués plus rapidement à l'aide d'un code correctement formulé, de la fonction Pront() et d'un tableau Excel.

Le code ci-dessous est une tentative d'écrire un tel code. Je vais encore améliorer ce code. Mais j'ai rencontré un problème que je ne savais pas comment résoudre.
S'il vous plaît, ne me jugez pas, moi et mon code, très sévèrement..... Je suis un débutant qui commence tout juste à comprendre les bases du codage et un peu plus. Mais j'accepte les critiques avec calme et je ne m'offense pas..... surtout aux critiques constructives.

Merci pour votre aide.

int s1,Mn,a,CH;
double Hay,Lou=Bid,Nm_PL[700]={0},PrS,DL=0.0030,X;
int start()
{
int ot = OrdersTotal();                                         
int Ht = OrdersHistoryTotal();
////******************************************************************
if (OrderSelect (Ht-1,SELECT_BY_POS, MODE_HISTORY))                                             
if (X!=OrderTicket( ))
{
Mn=OrderMagicNumber();CH=TimeHour(OrderOpenTime());PrS=OrderProfit( );Nm_PL[CH+Mn*24]=Nm_PL[CH+Mn*24]+PrS;
Print("----------------- ПРОФИТ-----------------------=",CH,"    Ном орд.(1-26)   ",Mn," ТП    ",PrS," ФИН.РЕЗУЛЬТ.   ",Nm_PL[CH+Mn*24]," НОМ. ИНДЕКСА   ",Mn*24);X=OrderTicket();
}
////******************************************************************
if (Bid < Lou)
{
Lou=Bid;
}
//=======================
if (Bid > Hay)
{
Hay=Bid;
}
////=======================
if (Bid - Lou > DL&& Lou!=0)
{
for(int c=0; c<=500;c+=20) 
{
a++;
OrderSend(Symbol(),OP_SELL,0.1,Bid, 3,Ask+0.0030+c*Point,Ask-0.0010-c*Point,"300",a );
}
Lou=Bid;
Hay=Bid;
a=0;
s1=0;
}
return(0);
}

Si deux ou plusieurs ordres sont fermés par stop ou take sur le même tick, le programme imprime Print() seulement après le dernier ordre fermé sur ce tick. J'ai besoin de Print() après la clôture de chaque commande. Je ne sais pas comment y parvenir. Mais si je vois le code nécessaire, je vais immédiatement le comprendre et m'en souvenir.

Voici un exemple de mon problème.


Генетические алгоритмы - это просто!
Генетические алгоритмы - это просто!
  • www.mql5.com
Введение Генетический алгоритм (ГА) относится к эвристическим алгоритмам (ЭА), который даёт приемлемое решение задачи в большинстве практически значимых случаев, однако при этом правильность решения математически не доказана и применяют чаще всего для задач, аналитическое решение которых весьма затруднительно или вовсе невозможно. Классическим...
 
Valeriy Yastremskiy:
La bonne chose est de créer dans l'éditeur ce dont nous avons besoin, un EA, un script, un indicateur et l'éditeur créera un modèle avec les bons champs.

Oui. J'ai remarqué ces champs corrects, c'est-à-dire de nouvelles fonctions au lieu de START. Mais je n'y ai pas prêté beaucoup d'attention et j'ai utilisé START pour les tests comme avant.
Je ne sais pas où je peux trouver plus de détails sur les dernières mises à jour de MQL4. J'aime beaucoup le livre de Kovalev, car toutes les informations sont structurées de manière logique et faciles à comprendre. Et il est suffisamment détaillé pour que l'on puisse comprendre tous les détails nécessaires. Je me demande pourquoi il n'a pas écrit le même manuel pour MQL5.

 
Artyom Trishkin:

Deux langues absolument identiques. Ni plus ni moins. Et la POO (qui intimide tout le monde) est exactement la même dans les deux cas. Vous ne saviez pas ? Avez-vous lu des histoires d'horreur sur Internet et regardé des blogueurs sur YouTube qui "sèment le bien, le sage et l'éternel" ? Qui disent intelligemment des bêtises, en faisant délibérément fuir les gens de MQL5.

Je m'empresse de vous décevoir - les deux langues sont exactement les mêmes. Tant au niveau de la facilité de compréhension, que des caractéristiques et de la présence de la POO.
Mais MQL5 offre davantage de possibilités.

Oui en général je suis d'accord, et OOP en 4ka glad))) mais dans l'accès des débutants dans mon expérience manuels Kovalev, Zhdan sur 4ka et incompréhensible Mishin sur 5ka et OOP. Je ne sais pas comment le comprendre. Peu importe le nombre de fois où vous répétez l'encapsulation, la compréhension du polyformisme ne viendra pas. Et vous ne savez pas quels articles lire en premier. Et où chercher quoi. C'est pourquoi, jusqu'à présent, dans la codobase d'ontik, la sortie de la fonction de démarrage se trouve à l'adresse ))))).
 
ANDREY:

Oui. J'ai remarqué les champs corrects, c'est-à-dire les nouvelles fonctions au lieu de START. Mais je n'y ai pas prêté beaucoup d'attention, j'ai donc utilisé START pour les tests comme avant.
Je ne sais pas où je peux trouver plus de détails sur les dernières mises à jour de MQL4. J'aime beaucoup le livre de Kovalev, car toutes les informations sont structurées de manière logique et faciles à comprendre. Et il est suffisamment détaillé pour que l'on puisse comprendre tous les détails nécessaires. Je me demande pourquoi il n'a pas écrit le même manuel pour MQL5.

Comme l'a ditAlexey Viktorov:Comprenez la simple vérité, mql5 ne diffère de mql4 que par OrderSend() et quelques autres fonctions, dont je ne me souviens pas. Uneautre différence importante est le sens de l'indexationdes tampons indicateurs. Cependant, il peut être résolu très rapidement, mais vous feriez mieux de vous habituer aux nouvelles fonctionnalités. Mais l'obtention des valeurs indicatrices reste la même.
Les articles sur la POO pour les débutants ont été utiles. Et l'aide de l'éditeur.
 
ANDREY:

Merci de votre participation.

...

Le code ci-dessous est une tentative d'écrire un tel code. Je vais améliorer ce code à l'avenir. Mais j'ai rencontré un problème que je ne savais pas comment résoudre.
S'il vous plaît, ne me jugez pas, moi et mon code, très sévèrement..... Je suis un débutant qui commence tout juste à comprendre les bases du codage et un peu plus. Mais j'accepte les critiques avec calme et je ne m'offense pas..... surtout aux critiques constructives.

Merci pour votre aide.

Si deux ou plusieurs ordres sont fermés par stop ou take sur le même tick, le programme imprime Print() seulement après que le dernier ordre ait été fermé sur ce tick. J'ai besoin de Print() après la clôture de chaque commande. Je ne sais pas comment y parvenir. Mais si je vois le code nécessaire, je vais immédiatement le comprendre et m'en souvenir.

Voici un exemple de mon problème.


Je vous ai déjà répondu :

L'explication en quelques mots : vous devez surveiller le nombre d'ordres et de positions et les comparer avec l'état précédent. Si nous avions 12 positions au tick précédent et 8 au tick actuel, nous avons un changement de 4 positions. Par conséquent, nous devrions prendre les quatre dernières positions (à l'heure de la clôture) pour voir ce qu'elles sont devenues.

Vous prenez la dernière commande de la liste :

int Ht = OrdersHistoryTotal();
////******************************************************************
if (OrderSelect (Ht-1,SELECT_BY_POS, MODE_HISTORY))

Et vous devez d'abord déterminer dans quelle mesure l'état de la liste des commandes a changé. Vous en aviez 12, vous en avez maintenant 8 - c'est un changement de 4 ordres. En conséquence, vous devez imprimer les quatre commandes. Et vous n'imprimez toujours que la dernière commande de la liste.

Comment puis-je savoir si les choses ont changé ? Nous devons écrire le nombre d'ordres dans une variable, par exemple int last_total, lorsque nous exécutons l'EA. Ensuite, à chaque tick, comparez OrdersTotal() avec last_total. S'ils ne sont PAS égaux, il s'agit d'un changement. Inscrivez la différence entre OrdersTotal() et last_total dans une variable, par exemple, num_changes et enregistrez le nouvel état de OrdersTotal() dans last_total.
Il peut y avoir quelques subtilités ici, par exemple, lorsqu'un ordre en attente est déclenché. Mais pour l'instant, vous devriez faire ce que vous devez faire en premier.
En connaissant le nombre d'ordres en attente, vous pouvez les consulter dans l'historique. Cependant, vous pouvez également limiter le suivi des ordres dans la liste historique - faites tout ce qui précède pour la liste des ordres historiques, et non pour la liste des ordres au marché. La différence entre ce qui était et ce qui est devenu - c'est le nombre de commandes que vous devez analyser. Vous n'analysez toujours que le dernier ordre de la liste.

Toutefois, cela ne peut garantir que la dernière commande dans la liste historique sera la dernière commande clôturée. Il s'agit également d'une nuance à prendre en compte. Mais alors.

Raison: