Erreurs, bugs, questions - page 2722

 
Igor Makanu:
Mais ce schéma dans MQL, où il y a une sorte de contrôle sur les constantes, mais je peux moi-même assigner des constantes en mode aléatoire.

Combien de fois pouvez-vous avoir honte de votre ignorance des bases du C++?

 

cet exemple n'est pas du tout déroutant :

struct A
{
   const double a;
   A():a(SymbolInfoDouble(_Symbol,SYMBOL_ASK))
   {
      Print("a = ", a);
   }
};
void OnTick()
  {
   const A a;
  }
//+------------------------------------------------------------------+

2020.04.23 21:40:04.474 tst (EURUSD,H1) a = 1.07892

2020.04.23 21:40:04.546 tst (EURUSD,H1) a = 1.07893

2020.04.23 21:40:04.585 tst (EURUSD,H1) a = 1.07893

2020.04.23 21:40:05.254 tst (EURUSD,H1) a = 1.07893

2020.04.23 21:40:05.305 tst (EURUSD,H1) a = 1.07893

2020.04.23 21:40:05.306 tst (EURUSD,H1) a = 1.07892

 
Stanislav Korotky :

Il y a deux programmes qui travaillent sur le même fichier en même temps. Celui qui écrit utilise les drapeaux FILE_READ|FILE_WRITE|FILE_BIN|FILE_SHARE_READ. Celui qui lit - FILE_READ|FILE_BIN|FILE_SHARE_WRITE|FILE_SHARE_READ. Bien que le premier programme enregistre périodiquement le fichier avec FileFlush, le second programme ne voit la longueur du fichier que lorsqu'il est ouvert. J'ai essayé de faire FileSeek dans les deux sens - ça n'aide pas.

Question : comment faire en sorte que le programme qui lit le fichier reprenne les données en cours de réécriture ?

Cela semble être un bogue, il a été signalé il y a quelque temps sur le forum anglais. Je n'ai pas eu le temps de le signaler ici.

Les développeurs ne lisent-ils pas le forum anglais ?

 
Stanislav Korotky:

Il y a deux programmes qui travaillent sur le même fichier en même temps. Celui qui écrit utilise les drapeauxFILE_READ|FILE_WRITE|FILE_BIN|FILE_SHARE_READ. Celui qui lit - FILE_READ|FILE_BIN|FILE_SHARE_WRITE|FILE_SHARE_READ. Bien que le premier programme enregistre périodiquement le fichier à l'aide de FileFlush, le second programme ne voit la longueur du fichier que lorsqu'il est ouvert. J'ai essayé de faire FileSeek dans les deux sens - ça n'aide pas.

Question : comment faire pour que le programme qui lit le fichier récupère les données à écraser ?

Les deux programmes se trouvent-ils dans le même terminal ou dans deux terminaux différents ?

 

Les méthodes d'objets provenant d'un tableau d'objets passé par référence ne fonctionnent pas.

Exemple :

//+------------------------------------------------------------------+
//| Пример: добавленный метод для расширения файла ..\Include\String\String.mqh
//|--
//| Получает из указанной строки подстроки по заданному разделителю 
//| и возвращает количество полученных объектов-подстрок
//|         НЕ РАБОТАЕТ !!!!!!!!!!
//+------------------------------------------------------------------+
int CString::Split(const string separator,      // разделитель
                   CString      &result[] )     // массив строковых объектов
  {
   string tmp_result[];               

   if(StringLen(separator)==0) return(0);

   ushort u_sep=StringGetCharacter(separator,0); 
   
   int count=StringSplit(m_string,u_sep,tmp_result);

   // временно для проверки
   result[0].Assign("Buy"); // НЕ РАБОТАЕТ !!!!!!
   Alert("ressult[0] = ",result[0].Str()); // <--- уже не отрабатывает
   // конец временно
   
   /*
   for(int i=0;i<count;i++)
     {
      result[i].Assign(tmp_result[i]); // НЕ РАБОТАЕТ !!!!!
     };
   */
   
   return(count);
  }
//+------------------------------------------------------------------+
 
Slava:

Ces deux programmes se trouvent-ils dans le même terminal ou dans deux terminaux différents ?

Dans un terminal. L'expert écrit les données, l'indicateur les lit. Ils sont accrochés à des cartes différentes, mais pourraient évidemment être sur la même (si cela importe). Bild 2380.

 

VS2019

#include <iostream>

int x;

struct A 
{
    const int a;
    A() :a(x) {}
};
int main()
{
    std::cout << "x = ";
    std::cin >> x;
    const A a;
    std::cout << "a.a = " << a.a;
}

x = 12345

a.a = 12345

hmm, tout fonctionne comme dans MQL5

OK, je retire ce que j'ai dit, ça ne compile pas dans Sharp.

 
Vict:

Eh bien, vous avez aussi un constructeur. Cela dépend de vous, bien sûr, mais les structures sont des entités C, le modèle y est différent - des entités passives avec une logique externe (fonctions).

Pas nécessairement. Pourquoi le C ? Et le C# ? - Tous les discours sur les structures passives sont des notions archaïques, à mon avis. Je pense qu'au moins chaque type doit avoir un constructeur. Les champs non initialisés sont un mal qu'il faut éviter.

Dans votre cas, vous devez créer une méthode d'usine pour créer un tableau de structures, c'est-à-dire quelque chose comme ceci :

struct A
{
  const int a;
  A(int init_value) : a(init_value) { }

  static bool CreateArray(A &array[], int count, int init_value)
  {
    //...
  }
};

Et il existe déjà l'une des méthodes suggérées précédemment pour remplir les éléments d'un tableau.

 

J'ai rencontré le problème suivant. L'indicateur dessine des bougies

Elle est tracée sur le graphique. Il existe également un conseiller expert qui lit les tampons de l'indicateur.

Je me suis donc connecté et j'ai parcouru les étapes et j'ai découvert que l'indicateur dessine souvent les bougies avec un retard.

Cela signifie qu'il y a plusieurs ticks (jusqu'à quelques minutes exactement), les tampons ont déjà été calculés et mis à jour et que le conseiller expert est en train d'en lire les données.

(les deux chouettes et l'indicateur l'écrivent dans le journal). Mais on voit l'ancienne image sur le graphique. Par exemple, cette capture d'écran est réalisée au moment où la barre rouge a franchi le creux de la barre précédente. Mais sur le graphique, nous ne voyons que le rouge précédent et le vert sous-titré (il est en fait plus grand de deux barres).


Et voici la photo actuelle, elle a été dessinée plus tard. On voit la panne, elle a initié la capture d'écran. D'après les journaux, tout est clair.



Qui peut me dire ce qui se passe et comment accélérer le rafraîchissement des graphiques ? J'appelle la fonctionChartRedraw depuis l'EA mais il y a toujours un retard de quelques minutes.

Deux minutes, c'est un peu trop, je ne peux même pas imaginer la raison. Les calculs ne sont pas si cosmiques pour ralentir autant.

 
Aleksey Mavrin:

Pouvez-vous me dire ce qui ne va pas et comment accélérer la mise à jour des graphiques ? La fonction ChartRedraw est appelée depuis le conseiller expert, mais il y a toujours un retard de quelques minutes.

ChartRedraw est nécessaire uniquement pour le dessin (mise à jour) des objets graphiques, nous n'avons pas besoin de ChartRedraw pour un indicateur normal qui dessine par des tampons d'indicateur.

Je pense que vous devriez chercher le problème dans l'indicateur, peut-être que le calcul des tampons à chaque tick n'est pas correct, il y a des "auteurs" qui calculent l'historique complet à chaque tick.

ZZY : Je ne peux pas confirmer, mais peut-être que ChartRedraw met à jour le graphique entier avec l'historique synchronisé, si c'est le cas, vous redémarrez l'indicateur avec un calcul complet de l'historique entier à chaque fois.

UPD : essayez de limiter l'historique sur le graphique à un plus petit nombre de barres 10 000 est suffisant, dans MT4 il y avait un cas où un indicateur lourd "gobait" toute la mémoire et cherchait ensuite pourquoi l'EA ne fonctionnait pas correctement (il fonctionnait puis pas). Bien que dans MT5 il est peu probable que toute la mémoire ait été utilisée.... mais cela arrive.

Raison: