Erreurs, bugs, questions - page 567

 
Donc CTrade a fonctionné... Il suffit d'un fichier pour tout refaire... Un sous-marin hélicoptère à nouveau... Et je vous ai dit que je ne sais pas comment, pas de boom... :)
 

Oui... c'est la même chose en principe...

 

La nouvelle construction a cessé de copier des structures simples dans la boucle. Voici un script de test :

//+------------------------------------------------------------------+
//|                                             Test_Copy_Struct.mq5 |
//+------------------------------------------------------------------+
struct  trade_settings
  {
   int      reopened;
   int      reverse; 
   int      TrailingStop;
   int      WithoutlossLevel;
   int      WithoutlossProfit;
   double   LossToReverse;
   int      MAPeriod;
   int      MA_use;
   double   Lots;
   int      takeprofit; 
  };
trade_settings arr_tr_set_ini[3]={  
 {60,90,1000,100,900,2000.0,105,1,0.13,2700},   // EURUSD
 {130,1298,400,300,600,1000.0,130,1,0.1,2800},  // GBPUSD
 {110,140,200,600,800,1000.0,85,0,0.15,1700}};   // AUDUSD 
trade_settings symb_default={110,130,200,1300,1500,3000.0,100,1,0.1,1000};

class CTest_Copy_Struct
  {  
protected:
   trade_settings    m_tr_set;
public:
   void              Copy_tr_set(const trade_settings& tr_set){m_tr_set=tr_set;}
   void              Print_tr_set(){printf("Setting reopened=%u overpos=%u TrailingStop=%u WithoutlossLevel=%u WithoutlossProfit=%u" 
                        ,m_tr_set.reopened,m_tr_set.reverse,m_tr_set.TrailingStop,m_tr_set.WithoutlossLevel,m_tr_set.WithoutlossProfit);
                        printf("LossToReverse=%.2f MAPeriod=%u MA_use=%u Lots=%.2f takeprofit=%u"
                        ,m_tr_set.LossToReverse,m_tr_set.MAPeriod,m_tr_set.MA_use,m_tr_set.Lots,m_tr_set.takeprofit);}
   void              Zero(){ZeroMemory(m_tr_set);} 
  };

void OnStart()
  {
   CTest_Copy_Struct Test; 
   Test.Zero();
   Test.Print_tr_set();
   Print("------------------------------");
   Test.Copy_tr_set(arr_tr_set_ini[0]);
   Test.Print_tr_set();
   Print("------------------------------");
   Test.Copy_tr_set(arr_tr_set_ini[2]);
   Test.Print_tr_set();
   Print("------------------------------");
   Test.Copy_tr_set(symb_default);
   Test.Print_tr_set();
   int total=ArraySize(arr_tr_set_ini);
   for(int i=0;i<3;i++)
     {
      Print("i=",i);
      Test.Copy_tr_set(arr_tr_set_ini[i]);
      Test.Print_tr_set();
     } 
  }
//+------------------------------------------------------------------+
Документация по MQL5: Основы языка / Типы данных / Структуры и классы
Документация по MQL5: Основы языка / Типы данных / Структуры и классы
  • www.mql5.com
Основы языка / Типы данных / Структуры и классы - Документация по MQL5
 
Valmars:

Résultat :

2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) Violation d'accès en lecture à 0x00000000209FFFAC dans 'E:\Program Files\Championship_2011\MQL5\Scripts\Test_Copy_Struct.ex5'.
2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) i=0
2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) LossToReverse=3000.00 MAPeriod=100 MA_use=1 Lots=0.10 takeprofit=1000
2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) Setting reopened=110 overpos=130 TrailingStop=200 WithoutlossLevel=1300 WithoutlossProfit=1500
2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) ------------------------------
2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) LossToReverse=1000.00 MAPeriod=85 MA_use=0 Lots=0.15 takeprofit=1700
2011.11.13 09:30:44 Test_Copy_Struct (EURUSD, M15) Setting reopened=110 overpos=140 TrailingStop=200 WithoutlossLevel=600 WithoutlossProfit=800
2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) ------------------------------
2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) LossToReverse=2000.00 MAPeriod=105 MA_use=1 Lots=0.13 takeprofit=2700
2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) Setting reopened=60 overpos=90 TrailingStop=1000 WithoutlossLevel=100 WithoutlossProfit=900
2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) ------------------------------
2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) LossToReverse=0.00 MAPeriod=0 MA_use=0 Lots=0.00 takeprofit=0
2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) Setting reopened=0 overpos=0 TrailingStop=0 WithoutlossLevel=0 WithoutlossProfit=0

 

https://www.mql5.com/ru/docs/basis/function/events dit à la fin :"Pour une meilleure compréhension, il sera utile d'exécuter l'indicateur dont le code est joint ci-dessous. "

Exécutez le code. Pendant le week-end. Il n'y a pas eu de meilleure compréhension - c'était bien comme ça, je pense, mais les pires impressions ont été ajoutées. Il n'y a pas de ticks pendant le week-end, donc prev_calculated = 0 à ce moment-là toujours, quand on passe d'une période à l'autre :

Cependant, à un moment donné, cette valeur apparaît (pas de reconnexion, honnêtement noble !) :

et de drôles de lignes sur le graphique :

Ou moitié moins amusant, comme ça :

Il y avait même des lignes au début de l'histoire sous forme de ZigZag (hélas, j'ai oublié de faire une capture d'écran et je n'ai pas pu la reproduire).

Des lignes apparaissent également sur d'autres TF, mais de manière plus éparse. Vous pouvez facilement le constater par vous-même.

Est-ce que c'est exactement ce que les auteurs voulaient dire ?

Pourquoi le résultat de prev_calculated est-il au moins inégal en l'absence de ticks, sinon étrange ? Y a-t-il un dysfonctionnement lors du passage d'un TF à l'autre ?

Ces lignes (ou d'autres) auraient-elles dû apparaître en dehors des tics ?

Dans de rares cas, les sauts relativement fréquents d'une TF à l'autre peuvent-ils générer une sorte de pseudotick qui déclenche le calcul des valeurs des barres sur l'historique, etc.

Dois-je m'attendre à ce que le comportement erratique du terminal soit éliminé ? Ou dois-je apprendre les mathématiques ?

Peut-être que j'essaie de faire quelque chose que je ne devrais pas vouloir faire ? Dans ce cas, justifiez votre point de vue.

J'ai beaucoup de questions... mais ce n'est que le début...

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 

Suite...

Sur le même lien, il y a une phrase :"Note: si la fonction OnCalculate renvoie une valeur nulle, aucune valeur d'indicateur n'est affichée dans la DataWindow du terminal client. "

Voilà le truc... Si besoin est, j'accepterai volontiers toute croissance du bras et courrai immédiatement le redresser si nécessaire. Mais. Dans les indicateurs de complexité simple et moyenne, vous pouvez vous sortir de certaines situations d'achoppement. Mais au fur et à mesure que le code devient plus complexe, toute fonction de Copy... () (à la fois prenant un autre handle d'indicateur comme argument, et sans lui) commence à compliquer la situation, comme je le pense personnellement, traitant de la programmation MQL il y a une semaine. C'est à ce moment-là que l'on ne sait plus ce que l'on peut changer dans le code, car tout ce qui peut être changé l'a été, et le reste, me semble-t-il, ne doit pas être changé, car il n'a rien à voir avec le problème. Ou bien une pensée absolument désarmante surgit : changer tout l'algorithme, car les particularités et les aléas du terminal n'ont pas été pris en compte. Après tout, en étudiant le MQL à travers la documentation, vous devez faire face aux nuances, que les développeurs ont passées sous silence, très probablement par inadvertance. Et le programmeur MQL n'apprend jamais beaucoup de choses après avoir étudié complètement la documentation... Et ce qui est le plus décevant, c'est qu'en utilisant MQL, soit vous ne pouvez pas du tout corriger les nombreux caprices du terminal, soit vous pouvez utiliser des béquilles douteuses et un jour vous planter douloureusement...

Eh bien... Je suis devenu un peu fou aujourd'hui. C'est le week-end.

Et voici ce que je voulais vous dire ce matin...

https://www.mql5.com/ru/forum/1111/page570#comment_117425 - J'ai complètement résolu le problème principal de l'indicateur qui ne se dessine pas au début du terminal initial (j'espère que personne ne contestera que rien ne devrait empêcher un indicateur fractal de s'afficher correctement sur l'ensemble de l'historique même s'il n'y a pas de ticks ?)

C'était :

            CopyHigh(_Symbol,PERIOD_M1,TimeUpBuffer[shift+1]-1,
                                    TimeUpBuffer[shift],
                                    exact_extremum);

remplacé par :

            if(CopyHigh(_Symbol,PERIOD_M1,TimeUpBuffer[shift+1]-1,
                                       TimeUpBuffer[shift],
                                       exact_extremum)<0) return(0);

Je reconnais mon inattention et le formalisme pernicieux qui en découle.

Mais. Il a aidé dans le cas le plus simple (j'ai volontairement simplifié l'indicateur initial). Dans un indicateur plus complexe, ces opérations n'ont pas été utiles - à un certain moment, les changements n'ont pas montré de différence, surtout maintenant qu'il y a beaucoup de fonctions de copie. Et j'aimerais beaucoup obtenir des instructions sensées sur la façon et l'endroit où aller ensuite. Après tout, on consacre tellement de temps à quelque chose qui fonctionne dès le départ. Jusqu'à présent, je ne sais même pas si c'est ma faute ou celle du terminal. Et je ne suis pas sûr que ce soit juste un manque de si et deretours... Ça a l'air suspect ici et là, comme d'autres, par exemple...

J'enverrai le code aux développeurs de mon personnel si nécessaire ; je peux également joindre un code similaire, mais implémenté d'une manière différente et qui fonctionne sans problèmes (bien qu'il ne corresponde pas tout à fait aux tâches et aux objectifs que j'explore).

 
Le processus de journalisation des fonctions d'impression dans l'onglet Experts du terminal, ainsi que dans la RAM et le fichier sur le disque, est-il un processus distinct ou non ? Il semble être séparé, le terminal ne se bloque pas, mais pourquoi pendant le processus intensif de journalisation il ralentit comme s'il était chargé de briques ? Y a-t-il un moyen de le décharger ? Si j'ai décidé de sortir des éléments de tableau d'une taille moyenne, les décalages sont plutôt perceptibles, et j'oublierai de sortir les valeurs des éléments de tableau de plus grande taille en une seule fois.
Документация по MQL5: Основы языка / Переменные
Документация по MQL5: Основы языка / Переменные
  • www.mql5.com
Основы языка / Переменные - Документация по MQL5
 

Il y a une forte suspicion que le terminal s'amuse avec le cache (je suis presque hors du circuit, donc...). Pire encore, même MetaEditor affecte d'une manière ou d'une autre la gestion de ce qui se passe dans le terminal à ce moment-là.

Plus d'une fois j'ai rencontré un problème, lorsque j'ai modifié le code du programme MQL (qui imprime les données de débogage dans le journal de l'onglet Expert Advisor), que je l'ai recompilé, que je suis allé dans la fenêtre du Terminal et que j'ai vu les résultats précédents se répéter, bien que je puisse définitivement dire qu'il ne s'agit pas d'une sorte de reprise retardée d'un programme précédent non terminé. Donc, je compile et envoie le code mis à jour à MetaEditor avec F7, et pendant ce temps le terminal reçoit la commande pour rejouer l'ancien code (à partir du cache, ou quelque chose comme des pages de mémoire "truquées" par l'OS). Il est intéressant de noter qu'il est possible de défaire/décharger la version précédente du code .ex5 "coincée entre les dents" non seulement en déchargeant complètement le processus terminal.exe, mais dans certains cas rares - simplement en fermant MetaEditor. Comprenez-le comme vous voulez, je n'ai fait que relater ce que j'ai personnellement observé.

Récemment, il y a eu une situation où le design :

Print(1);
for(int e=0; e<ArraySize(Arr); e++)
{
   Print(Arr[e]);
}
Le graphique n'affiche que la valeur du premier Print, mais il était inutile d'attendre la sortie des éléments du tableau. Après la suppression de la première impression et la recompilation, la sortie cyclique des éléments du tableau a commencé instantanément. S'agit-il d'une conspiration secrète des Princes contre la communauté MQL5 ou suis-je le seul à avoir autant de malchance ?

De plus, je tiens à préciser que ces cas étranges de comportement du terminal ont été observés non pas sur une instance de MT5 surchargée de fenêtres graphiques, d'objets graphiques et de programmes MQL, mais avec une seule fenêtre graphique propre (sans compter le contour d'un indicateur en cours d'exécution).

 
x100intraday Oubliez les problèmes - écrivez-le en C ou en tout autre langage. Après tout, tout ce dont nous avons besoin à partir du terminal est d'obtenir des cotations, des informations sur les comptes et d'exécuter des ordres, et le reste peut être écrit dans un environnement de programmation spécialisé et connecté via une bibliothèque. Sinon, ils changeront quelque chose à un moment donné et il n'y aura pas de réponse quant à la raison pour laquelle cela ne fonctionne pas, si le projet est important. Vous n'avez pas besoin de telles aventures :) Et si le Conseiller Expert doit en même temps recompiler et rattraper la maintenance des ordres en cours, vous perdrez de l'argent, car vous devrez découvrir quoi et pourquoi...
 
ivandurak:

1. Le code ArrayInitialize ne fonctionne pas, si la boucle est décommentée, tout va bien.

Et lorsque l'on déclare des variables dans une classe et un indicateur au niveau global avec le même nom, un avertissement apparaît.

1. La fonction PlotIndexSetDouble(z,EMPTY_VALUE) est utilisée pour les tampons indicateurs dans l'inite.

2. Ça s'affiche. Il est recommandé de marquer les membres de la classe avec le préfixe "m_".

Документация по MQL5: Пользовательские индикаторы / PlotIndexSetDouble
Документация по MQL5: Пользовательские индикаторы / PlotIndexSetDouble
  • www.mql5.com
Пользовательские индикаторы / PlotIndexSetDouble - Документация по MQL5