Erreurs, bugs, questions - page 1936

 
Aleksey Vyazmikin:

le résultat est le code suivant

https://www.mql5.com/ru/code/18305

Высокопроизводительная библиотека iTimeSeries
Высокопроизводительная библиотека iTimeSeries
  • votes : 19
  • 2017.05.25
  • nicholishen
  • www.mql5.com
Эта библиотека предоставляет молниеносный доступ к таймсериям для реализации привычных методов MQL4 (например, iBarShift) в чувствительных к задержкам приложениях на MQL5.
 

Merci - J'ai vu cette bibliothèque - la description était confuse.


Lamajeure partie du temps est consacrée à la phase d'initialisation. À moins que vous ne prévoyiez d'accéder aux données de séries temporelles plusieurs fois - plus de quelques milliers de fois pendant la formation des barres - vous devriez envisager des méthodes alternatives.

Mon conseiller expert ne fonctionne que sur l'ouverture des barres - pensez-vous qu'il soit judicieux de l'essayer ?
 
Renat Fatkhullin:

Malheureusement, vous vous y prenez mal.

Au lieu d'écrire un code MQL5 natif et efficace, vous utilisez un émulateur MQL4 terriblement inefficace, qui ralentit l'opération des dizaines de fois.

Le problème, c'est que vous ne comprenez même pas ce que vous faites, puisque vous posez des questions sur la vitesse.

Bien sûr, je cherchais une solution - comment remplacer les fonctions MQL4 par MQL5, notamment en ce qui concerne les séries temporelles, et j'ai vu que c'est l'un des problèmes rencontrés par la plupart des personnes qui passent à MQL5.

J'ai donc trouvé la solution sur le même site, où l'un des articles recommandait ma méthode.

Personnellement, je ne comprends pas la raison d'exclure une fonction utile et pratique du langage.

Ma question est donc la suivante : quelle est la bonne façon de recevoir des informations, et comment tirer parti du MQL5?

 
Aleksey Vyazmikin:

Je vous pose donc la question suivante : comment organiser correctement la réception des données pour ressentir les avantages de MQL5?

Utiliser les fonctions natives et plus productives de MQL5, et ne pas s'accrocher au code de MQL4. Tout convertisseur/splitter MQL4 -> MQL5 a des performances des dizaines de fois plus faibles, puisqu'il essaie d'émuler les microfonctions d'accès direct de MQL4 par des opérations en masse de MQL5. Et l'émulation se fait complètement sans optimisation ni mise en cache.

À la base de l'utilisation d'une fonction particulière (un bout de code, y compris le code d'autres personnes), il devrait y avoir une compréhension de ce qui est fait exactement. Sinon, vous obtenez "Je viens d'utiliser le code de quelqu'un d'autre et la vitesse a baissé ! Vous ne pouvez pas obtenir un bon résultat sans comprendre l'outil et ce que vous faites avec.


En plus de "comment bien faire", je dois préciser que la tâche d'"apprendre à programmer" est extrêmement difficile, dès que l'on dépasse le niveau le plus élémentaire de fonctionnement (pas même de compréhension, mais de fonctionnement) avec un langage. Je ne vois donc pas d'autre moyen d'apprendre que de lire des masses d'articles, de documentation, de code prêt à l'emploi dans la bibliothèque et de pratiquer obligatoirement pendant plusieurs années.
 
Renat Fatkhullin:

Utilisez les fonctions natives et plus productives du langage MQL5 et ne vous accrochez pas au code MQL4.

À la base de l'utilisation d'une fonction particulière (un morceau de code, y compris le code d'autres personnes), il faut comprendre ce que l'on fait. Sinon, vous obtenez "Je viens d'utiliser le code de quelqu'un d'autre, regardez - la vitesse est en baisse ! Sans comprendre l'outil et ce que vous faites avec, vous ne pouvez pas obtenir un bon résultat.


En plus de la question "comment bien faire", je dois préciser que la tâche "d'apprendre à programmer" est extrêmement difficile, une fois que l'on dépasse le niveau le plus élémentaire d'utilisation (pas même de compréhension, mais d'utilisation) du langage. C'est pourquoi je ne vois pas d'autre moyen d'apprendre que de lire des articles, de la documentation, du code prêt dans la bibliothèque et de s'exercer pendant plusieurs années.

Renat, avez-vous regardé la base de code ? J'ai du code avec des fonctions exactement adaptées du langage MQL4.

Je vous demande spécifiquement d'écrire comment obtenir les bonnes informations sur l'environnement - faire référence à des livres abstraits n'est pas productif et ne fait que renforcer mon idée (probablement erronée) que ce n'est qu'une excuse pour ne pas vérifier.

Dire que je suis si bête que je ne comprends pas la signification d'une fonction, qui consiste à copier des informations dans un tableau, c'est dire que la documentation d'accompagnement d'un langage de programmation est de bas niveau. Je ne comprends pas l'intérêt de cette copie d'un tableau à un autre et pourquoi une fonction qui récupère des informations d'un tableau selon les besoins est un code terrible.

 
Aleksey Vyazmikin:

Bien sûr, je cherchais une solution - comment remplacer les fonctions MQL4 par MQL5, notamment en ce qui concerne les séries temporelles, et j'ai vu que c'était l'un des problèmes rencontrés par la plupart des personnes passant à MQL5.

J'ai donc trouvé la solution sur le même site, où l'un des articles recommandait ma méthode.

Personnellement, je ne comprends pas la raison d'exclure une fonction utile et pratique du langage.

C'est pourquoi je vous demande, quelle est la manière correcte de recevoir des informations pour que je puisse ressentir les avantages de MQL5?

Peut-être ai-je mal cherché ? Ici vous avez tout ce dont vous avez besoin au lieu de tout ce code en une seule copie

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

Erreurs, bogues, questions

Aleksey Vyazmikin, 2017.07.21 01:20

Merci - j'ai corrigé.

En conséquence, le code est le suivant

//-------------------------------------------------------------------
//==MQL4toMQL5
//+------------------------------------------------------------------+ 
//| Получим Open для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double Open(int index)
  {
   double open=0;
   int copied=CopyOpen(Symbol(),0,index,1,Open);
   if(copied>0) open=Open[0];
   return(open);
  }
//+------------------------------------------------------------------+ 
//| Получим Low для заданного номера бара                            | 
//+------------------------------------------------------------------+ 
double Low(int index)
  {
   double low=0;
   int copied=CopyLow(Symbol(),0,index,1,Low);
   if(copied>0) low=Low[0];
   return(low);
  }
//+------------------------------------------------------------------+ 
//| Получим High для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double High(int index)
  {
   double high=0;
   int copied=CopyHigh(Symbol(),0,index,1,High);
   if(copied>0) high=High[0];
   return(high);
  }
//+------------------------------------------------------------------+ 
//| Получим Close для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double Close(int index)
  {
   double close=0;
   int copied=CopyClose(Symbol(),0,index,1,Close);
   if(copied>0) close=Close[0];
   return(close);
  }


  
//+------------------------------------------------------------------+ 
//| Получим IOpen для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iOpen(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double open=0;
   int copied=CopyOpen(symbol,timeframe,index,1,OpenI);
   if(copied>0) open=OpenI[0];
   return(open);
  }
//+------------------------------------------------------------------+ 
//| Получим iLow для заданного номера бара                            | 
//+------------------------------------------------------------------+ 
double iLow(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double low=0;
   int copied=CopyLow(symbol,timeframe,index,1,LowI);
   if(copied>0) low=LowI[0];
   return(low);
  }
//+------------------------------------------------------------------+ 
//| Получим iHigh для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iHigh(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double high=0;
   int copied=CopyHigh(symbol,timeframe,index,1,HighI);
   if(copied>0) high=HighI[0];
   return(high);
  }
//+------------------------------------------------------------------+ 
//| Получим iClose для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iClose(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double close=0;
   int copied=CopyClose(symbol,timeframe,index,1,CloseI);
   if(copied>0) close=CloseI[0];
   return(close);
  }

Le temps passé dans le testeur a augmenté - déjà fatigué d'attendre :)

Pour l'utiliser, il suffit de comprendre ce qu'est la structure

struct MqlRates
  {
   datetime time;         // время начала периода
   double   open;         // цена открытия
   double   high;         // наивысшая цена за период
   double   low;          // наименьшая цена за период
   double   close;        // цена закрытия
   long     tick_volume;  // тиковый объем
   int      spread;       // спред
   long     real_volume;  // биржевой объем
  };


Документация по MQL5: Доступ к таймсериям и индикаторам / CopyRates
Документация по MQL5: Доступ к таймсериям и индикаторам / CopyRates
  • www.mql5.com
Доступ к таймсериям и индикаторам / CopyRates - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Alexey Viktorov:

Peut-être que je ne regardais pas assez fort ? Ici, en une seule copie, vous avez tout ce dont vous avez besoin au lieu de tout ce code.

Pour l'utiliser, il suffit de comprendre ce qu'est la structure



Nous obtenons la même chose - en fait...

La variante que vous suggérez convient, ifle :

- Le calcul n'a lieu qu'à l'ouverture d'un bar.

- Vous savez à l'avance combien de barres sont nécessaires

J'ai des boucles dans mon code, la quantité de calcul peut être inconnue à l'avance.

Et, quel est l'intérêt de copier des informations pour, disons, 300 barres à chaque fois que nous l'ouvrons, s'il serait plus raisonnable de simplement ajouter des informations sur une nouvelle barre - pourquoi le développeur n'a-t-il pas choisi cette voie ?

 
Je suis désolé, mais je n'ai absolument pas le temps de m'occuper de l'enseignement de la programmation à chaque débutant. Surtout quand on voit que la personne n'a même pas passé par les bases de la compréhension de la programmation et qu'elle demande des choses futiles.


Mais je vais vous montrer la direction :

  1. Documentation MQL5
  2. Codebase
  3. Articles
  4. Forum (pas dans le mode "écrivez pour moi, pourquoi ne m'apprenez vous pas et ne faites pas mon travail ?)
  5. Freelance (ils peuvent l'écrire correctement ici)
  6. Travail indépendant avec une analyse réfléchie de "pourquoi ce wrapper devrait-il ralentir et gaspiller des ressources, peut-être réécrire de manière optimale ?".
  7. Utilisation d'un profileur qui montre la consommation réelle des ressources dans chaque ligne de code
Профилирование кода - Разработка программ - Справка по MetaEditor
Профилирование кода - Разработка программ - Справка по MetaEditor
  • www.metatrader5.com
Профилирование — это сбор характеристик программы, таких как время выполнения отдельных ее фрагментов (функций, строк). В MetaEditor встроена...
 

Je n'ai aucune envie de communiquer de cette manière. Au lieu d'essayer de comprendre ce qui est dit, de comprendre ce qui va se passer, on lance des objections incroyables.

 
Renat Fatkhullin:
Je suis désolé, mais je n'ai absolument pas le temps de m'occuper de l'enseignement de la programmation à chaque débutant. Surtout lorsque vous pouvez voir que la personne n'a même pas passé par les bases de la compréhension de la programmation et qu'elle demande des choses futiles.


Mais je vais vous montrer la direction :

  1. Documentation MQL5
  2. Codebase
  3. Articles
  4. Forum (pas en mode "écrivez pour moi, pourquoi ne m'apprenez vous pas et ne faites pas mon travail ?)
  5. Freelance (ils peuvent l'écrire correctement ici)
  6. Travail indépendant avec analyse réfléchie "pourquoi ce wrapper devrait-il ralentir et gaspiller des ressources, peut-être réécrire de manière optimale ?".
  7. Utilisation d'un profileur qui montre la consommation réelle des ressources dans chaque ligne de code

Merci Renat !

Je ne me suis pas trompé sur toi !

Je propose d'obtenir le droit de télécharger ME et de communiquer avec vous en substance de fournir par le biais de la LC un diplôme d'enseignement supérieur dans le domaine de "Programmeur".