Archives de la version MT.

 

Chers amis, je vous propose de créer ici une archive des versions MT. Parfois, lors des mises à jour, des erreurs inattendues peuvent se produire et vous devez revenir à une version antérieure...

J'ai besoin de construire 2007 maintenant. Vous l'avez ? Partagez-le s'il vous plaît.

 
Сергей Таболин:

Chers amis, je vous propose de créer ici une archive des versions MT. Parfois, avec les mises à jour, des erreurs inattendues peuvent se produire et vous devez revenir à une version antérieure...

J'ai besoin de construire 2007 maintenant. Vous l'avez ? Partagez-le, s'il vous plaît.

Il y a un homme ici qui est en train de constituer une collection. Mais pour autant que je me souvienne, ses posts avec des liens vers les archives de la version MT sont parfois supprimés pour ne pas ralentir le progrès. ))

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

Nouvelle version de MetaTrader 5 build 2007 : Calendrier économique, MQL5-programmes en tant que service

Andrey Khatimlianskii, 2019.03.15 23:03

J'ai déménagé sur un autre compte google. Nouveau lien ici.

Si vous avez besoin d'autres constructions, parlez-en, il y en a beaucoup.

 


mon lien a été tué ici,

les développeurs suggèrent de télécharger uniquement à partir de sources vérifiées.

si vous voulez risquer ma construction, envoyez-moi un message.

vous devez garder le travail stable dans le portail ou l'archive et mettre consciemment à niveau vers les versions de test.

vous devez être très conscient de mettre à jour les dernières constructions.

 
Fast235:

mon lien a été tué ici,

les développeurs suggèrent de télécharger uniquement à partir de sources vérifiées.

si vous voulez risquer ma construction, envoyez-moi un message.

vous devez garder le travail stable dans le portail ou l'archive et mettre consciemment à niveau vers les versions de test.

vous devez garder le travail stable dans le portable ou l'archive et en général être conscient de la mise à jour des builds de test. Le build 2007 peut le faire dans DC

Ils ont raison de supprimer les anciennes versions.

Vous devez écrire des programmes normaux. N'ignorez pas les avertissements. Initialisez les variables et n'utilisez pas les variables globales autant que possible. Évitez les fragments de code potentiellement dangereux.

J'ai des dizaines de milliers de lignes de code et pas un seul avertissement en mode strict. La moitié de mes projets de base de code affichent des avertissements même sans strict, alors qu'ils ne contiennent même pas des milliers de lignes. Et ensuite vous commencez à vous plaindre que "tout fonctionnait dans l'ancienne version et ne fonctionne plus dans la nouvelle"...

 
Georgiy Merts:

Ils ont raison de supprimer les anciennes versions.

Vous devez écrire les programmes correctement. N'ignorez pas les avertissements. Initialisez les variables et n'utilisez pas les variables globales autant que possible. Évitez les fragments de code potentiellement dangereux.

Je n'ai pas un seul avertissementsur des dizaines de milliers de lignes de code en mode strict. La moitié des projets de ma base de code signalent des avertissements même sans strict, alors qu'ils ne contiennent même pas un millier de chaînes de caractères. Et ensuite vous commencez à vous plaindre que "tout fonctionnait dans l'ancienne version et ne fonctionne plus dans la nouvelle"...

Est-ce le programme Mars Rover ? Que pouvez-vous décrire en autant de lignes ???

 
Sergey Basov:

Il y a une personne ici qui est en train de constituer une collection. Mais pour autant que je me souvienne, ses posts avec des liens vers les archives de la version MT sont parfois supprimés pour ne pas ralentir le progrès. ))

Merci. Je l'ai téléchargé.

Fast235:

le lien a tué mon lien ici,

Les développeurs suggèrent de ne télécharger que depuis des sources vérifiées.

Si vous voulez risquer ma construction, envoyez-moi un message.

vous devez garder le travail stable dans le portail ou l'archive et mettre consciemment à niveau vers les versions de test.

Je suis à DC maintenant avec la construction de 2007 peut-être.

Je ne fais pas de mise à jour sur les constructions de test. Mais maintenant je vais économiser))).

Georgiy Merts:

Ils ont raison de supprimer les anciennes versions.

Il faut écrire les programmes correctement. N'ignorez pas les avertissements. Initialisez les variables et n'utilisez pas les variables globales autant que possible. Évitez les fragments de code potentiellement dangereux.

J'ai des dizaines de milliers de lignes de code et pas un seul avertissement sur le mode strict. La moitié de mes mannequins de base de code affichent des avertissements même sans strict, alors qu'ils ne contiennent même pas un millier de chaînes. Et ensuite vous commencez à vous plaindre que "tout fonctionnait dans l'ancienne version et ne fonctionne plus dans la nouvelle"...

George, lisez mon dernier message dans ce fil. J'ai trouvé la source du problème. Ce n'est pas dans mon code.

 
Сергей Таболин:

Merci. Téléchargé.

Je ne fais pas de mise à jour pour les tests. Mais maintenant je vais le sauvegarder ))))

George, lisez mon dernier message dans ce fil. J'ai trouvé la source du problème. Ce n'est pas dans mon code.

Je l'ai lu.

La source du problème est que les développeurs et vous avez abordé la situation de manière légèrement différente. C'est pourquoi j'insiste pour que le code soit toujours très simple et clair, sauf aux endroits où il peut y avoir des ambiguïtés.

Je me souviens, à l'époque où MT5 faisait ses premiers pas - j'étais stupéfait, les gens utilisaient des variables sans initialisation, pensant qu'elles contiendraient zéro.

On ne peut s'empêcher de se souvenir d'une blague:

Pinocchio a donné trois pommes à Pinocchio. Il en a mangé deux. Combien de pommes reste-t-il ?

Programmeur N1:
- Vous ne savez pas combien. Personne ne sait combien de pommes il avait avant !

Moralité: effacez les variables initiales.


Programmeur N2
- Le nombre n'est pas clair. Peut-être que pendant que Malvina donnait les pommes, Pierrot les mangeait aussi ?

Moralité: n'utilisez pas de variables globales.

Programmeur N3
- Nombre inconnu. Il n'est pas dit que Pinocchio a mangé exactement des pommes, il est dit qu'il en a mangé deux, mais ce n'est pas clair. De plus, étant donné que le nom "Pinocchio" n'est pas décliné - Pinocchio et Pinocchio sont des variables différentes.


Moralité: surveillez votre syntaxe

 
Сергей Таболин:

Merci. Téléchargé.

Je ne fais pas de mise à jour pour les tests. Mais maintenant je vais économiser))).

George, lisez mon dernier message dans ce fil. J'ai trouvé la source du problème. Ce n'est pas dans mon code.

Et la source du problème était "je n'ai pas lu la documentation", pas la nouvelle version. Donc vous êtes sournois en disant que ce n'est pas votre code.

1 :

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

Alors, que voulez-vous faire ensuite ?

Sergey Tabolin, 2019.06.16 00:17

J'ai trouvé la raison de cette indignation.

Le truc c'est que :

//--- пропустить бесполезные проходы оптимизации
//*
   if(!check_init && (MQLInfoInteger(MQL_OPTIMIZATION) || MQLInfoInteger(MQL_TESTER)))
   {
      if(period_HMA7C == 0 && move_profit)                                                            TesterStop();
      if(period_HMA7C == 0 && move_stop)                                                              TesterStop();
      if(period_HMA7C == 0 && shift_correction_HMA7C != 5)                                            TesterStop();
      if(indent_channel_line_a0 == 0.0 && indent_channel_line_a4 != 0.0)                              TesterStop();
      if(indent_channel_line_a4 == 0.0 && indent_channel_line_a0 != 0.0)                              TesterStop();
      if((stop_loss_buy > 0 && stop_loss_buy < 700) || (stop_loss_sell > 0 && stop_loss_sell < 700))  TesterStop();
      check_init = true;
   }
//*/

Il s'avère qu'après TesterStop(), OnTester() est également lancé dans la nouvelle version, alors qu'il ne devrait pas l'être.

Naturellement, aucune donnée n'est préparée et c'est ce que nous obtenons.

C'est la faute de MT 2085.

2 :

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

Que dois-je faire ensuite ?

Sergey Tabolin, 2019.06.16 09:02

Excuses. La description dit simplement que OnTester() est appelé après. (((

Je dois faire des contrôles là aussi. Je vais essayer de le remplacer par ExpertRemove()...

Et puis je vais "essayer" à nouveau. Et ensuite, si vos tentatives sont infructueuses, c'est encore la faute de MQ ?

Je ne me souviens pas, mais je pense qu'il existe une fonction spéciale pour sauter les "mauvaises" passes. Et si vous voulez essayer, les développeurs n'ont pas recommandé de l'utiliser - encore une fois - si ma mémoire est bonne.

Mais ce qui est important dans mon message - avant de rejeter la faute sur les développeurs, vous devez d'abord lire la documentation, demander une solution sur le forum, et seulement ensuite, et seulement si l'erreur est vraiment trouvée, écrire un rapport de bug avec un code minimal la reproduisant. Ce serait grave, mais sinon...

 
Artyom Trishkin:

Et la source du problème était "je n'ai pas lu la documentation", pas la nouvelle version. Donc vous mentez sur le fait que le code n'est pas le vôtre.

1 :

2 :

Et puis vous continuez à "essayer" encore... Et ensuite, si vos essais sont infructueux, c'est encore la faute de MQ ?

Je ne me souviens pas, mais je pense qu'il y a une fonction spéciale pour sauter les "mauvaises" passes. Et ce que vous voulez essayer, les développeurs n'ont pas recommandé de l'utiliser - encore une fois - si ma mémoire est bonne.

Mais ce qui est important dans mon message - avant de rejeter la faute sur les développeurs, vous devriez d'abord lire la documentation, demander une solution sur le forum, et seulement ensuite, et seulement dans le cas d'un bug vraiment trouvé - écrire un rapport de bug en le reproduisant avec un code minimal. Ce serait grave, mais sinon...

Artyom, le problème est dans la nouvelle construction !

Dites-moi, ici vous avez écrit un code qui fonctionne sans erreurs. Il fonctionne pendant une longue période. Et soudain, après la nouvelle version de MT, il se bloque avec un tas d'erreurs. A qui la faute ? D'autant plus que la documentation, comme beaucoup le savent, ne suit pas toujours les innovations.

Donc, mon code a fonctionné sans erreur.

J'ai utilisé ça :

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

Par quoi remplacer INIT_PARAMETERS_INCORRECT ? Solution trouvée :)))

Sergey Tabolin, 2019.04.24 08:48

J'ai trouvé la réponse à ma propre question dans le fil de discussion :

Il s'est avéré que c'était assez simple. Il suffit de déplacer la vérification des paramètres invalides de OnInit() à OnTick().

bool                 check_init              = false;                // флаг проверки входных параметров
..........
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
//--- пропустить бесполезные проходы оптимизации
//*
   if(!check_init && (MQLInfoInteger(MQL_OPTIMIZATION) || MQLInfoInteger(MQL_TESTER)))
   {
      if(period_HMA7C == 0 && move_profit)                                 ExpertRemove();
      if(period_HMA7C == 0 && move_stop)                                   ExpertRemove();
      if(period_HMA7C == 0 && shift_correction_HMA7C != 5)                 ExpertRemove();
      check_init = true;
   }
//*/ 
//+------------------------------------------------------------------+ 

Vérifié ! Ça marche. La génétique ne fait pas défaut ))))

Maintenant, après avoir rencontré des problèmes, j'ai ajouté quelques lignes supplémentaires :

bool                 check_init              = false;                // флаг проверки входных параметров
bool                 tester_stop             = true;                 // флаг проверки выхода по TesterStop
.............
void OnTick()
{
//--- пропустить бесполезные проходы оптимизации
//*
   if(!check_init && (MQLInfoInteger(MQL_OPTIMIZATION) || MQLInfoInteger(MQL_TESTER)))
   {
      if(period_HMA7C == 0 && move_profit)                                                            TesterStop();
      if(period_HMA7C == 0 && move_stop)                                                              TesterStop();
      if(period_HMA7C == 0 && shift_correction_HMA7C != 5)                                            TesterStop();
      if(indent_channel_line_a0 == 0.0 && indent_channel_line_a4 != 0.0)                              TesterStop();
      if(indent_channel_line_a4 == 0.0 && indent_channel_line_a0 != 0.0)                              TesterStop();
      if((stop_loss_buy > 0 && stop_loss_buy < 700) || (stop_loss_sell > 0 && stop_loss_sell < 700))
      {
         Print("Результат в OnTester() должен быть -99999999999.99");
         TesterStop();
      }
      check_init  = true;
      tester_stop = false;
   }
//*/
.........
}
Вызов TesterStop() считается нормальным завершением тестирования, и поэтому будет вызвана функция OnTester() 
с отдачей тестеру стратегий всей накопленной торговой статистики и значения критерия оптимизации.

On suppose, par raisonnement, que le transfert doit être exécuté immédiatement, sans exécuter le reste du code. N'est-ce pas ?

Et en fait, TesterStop() n'arrête pas le test du tout !

double OnTester()
{
   if(tester_stop) return(-99999999999.99);
   
   double   equity_dd_percent             = TesterStatistics(STAT_EQUITY_DDREL_PERCENT);
   if(equity_dd_percent > 0.0)
   {
      equity_dd_percent = 100.0 / equity_dd_percent;
   }
   else     equity_dd_percent    = 1.0;
   
   double   param                         = 0.0;
   double   profit                        = TesterStatistics(STAT_PROFIT);
   double   stability                     = 0.0;
   int      balance_arr_size              = ArraySize(balance_arr) - 1;
   int      alpha_size                    = balance_arr_size - 1;
   int      beta_size                     = alpha_size - 1;
   double   trade2time                    = ratioTrades2Time(TesterStatistics(STAT_TRADES));
   double   max_balance                   = balance_arr[0];
//+-------------------   
   if(balance_arr[balance_arr_size-1] - balance_arr[0] == 0.0) return(-99999999999.88);
//+-------------------   

J'ai entré un paramètre "invalide" et j'ai obtenu ce résultat :

LL      0       11:30:20.816    Core 1  2016.10.01 00:00:00   Советник получил MAGIC = 153128312914612747.
QN      0       11:30:20.816    Core 1  2016.10.03 00:00:00   Результат в OnTester() должен быть -99999999999.99
NJ      3       11:30:20.816    Core 1  TesterStop() called on 0% of testing interval
CD      0       11:30:20.816    Core 1  final balance 10000.00 USD
QF      0       11:30:20.816    Core 1  OnTester result -99999999999.88

C'est donc un bug ! Et c'est exactement le bug de MQ.

Je pense que TesterStop() etExpertRemove() devraient retourner true s'ils ne peuvent pas passer immédiatement le contrôle à OnTester(). Cela permettra de réagir en quelque sorte, par exemple, comme ceci :

bool                 tester_stop = false;                 // флаг проверки выхода по TesterStop
.......
void OnTick()
{
//--- пропустить бесполезные проходы оптимизации
   if(!check_init && (MQLInfoInteger(MQL_OPTIMIZATION) || MQLInfoInteger(MQL_TESTER)))
   {
      if(недопустимый параметр)          tester_stop = TesterStop();
........
}
double OnTester()
{
   if(tester_stop) return(-99999999999.99);

Dans ce cas, nous pouvons obtenir exactement le résultat qui est logiquement attendu, au lieu de tourner autour du pot et de prévoir toutes les erreurs qui pourraient théoriquement se produire à la suite de l'arrêt du test.

 
Сергей Таболин:

Artyom, le problème est dans la nouvelle construction !

Dites-moi, ici vous avez écrit un code qui fonctionne sans erreurs. Il fonctionne pendant une longue période. Et soudain, après la nouvelle version de MT, il se bloque avec un tas d'erreurs. A qui la faute ? D'autant plus que la documentation, comme beaucoup le savent, ne suit pas toujours les innovations.

Donc, mon code a fonctionné sans erreur.

J'ai utilisé celui-ci :

Maintenant, après quelques problèmes, j'ai ajouté quelques lignes supplémentaires :

Le transfert est censé, intelligemment, se faire immédiatement, sans exécuter le reste du code. N'est-ce pas ?

Et en fait, TesterStop() n'arrête pas le test du tout !

J'ai entré un paramètre "invalide" et j'ai obtenu ce résultat :

C'est donc un bug ! Et c'est exactement le bug de MQ.

Je pense que TesterStop() etExpertRemove() devraient retourner true s'ils ne peuvent pas passer immédiatement le contrôle à OnTester(). Cela permettra de réagir en quelque sorte, par exemple, comme ceci :

Dans ce cas, nous pouvons obtenir exactement le résultat qui est logiquement attendu, au lieu de tourner autour du pot et de prévoir toutes les erreurs qui pourraient théoriquement se produire à la suite de l'arrêt du test.

Tous vos calculs et tests ne doivent pas m'être montrés, et pas avec une certaine dose de sarcasme et d'irritation, mais de manière sèche et concise dans le fil"Erreurs, bugs, questions". Sauf, bien sûr, si vous voulez être entendu et obtenir une réponse.

ZS. Et de préférence, oubliez les mots comme "bug", "fault", "dancing with tambourine" et autres "shitcodes" dans les rapports de bug - nous sommes tous des humains, et vous n'êtes pas sans erreurs. Et les déclarations "psychotiques" ne semblent pas très sérieuses ou constructives.

 
Artyom Trishkin:

Il ne faut pas me montrer tous vos calculs et tests, et pas avec une certaine dose de sarcasme et d'irritation, mais de manière sèche et concise dans le fil"bugs, bugs, questions". Sauf, bien sûr, si vous voulez être entendu et obtenir une réponse.

Je suis désolé si vous vous sentez comme ça. Il y a de l'irritation, bien sûr, mais comment ne pas en avoir quand les problèmes surgissent de nulle part ? Et le sarcasme... - Je suis plus perplexe devant ce que je considère comme des ratés évidents. ))

Quant au sujet en question, il me semble que la question pourrait facilement s'y "perdre". Je pense donc qu'un nouveau sujet avec un problème spécifique est plus efficace ? Ou pas ?

En tout cas, vous, en tant que modérateur, pouvez plutôt attirer l'attention des développeurs sur certains problèmes, si vous êtes vous-même convaincu de leur existence ;))).

Je vais essayer d'y ajouter une question...

Raison: