Erreurs, bugs, questions - page 2222

 

Question.

Supposons que je travaille avec plusieurs symboles dans un Expert Advisor ou un indicateur, ou plutôt avec tous les symboles qui sont affichés dans la fenêtre Market Watch.

La tâche consiste à saisir le moment d'un nouveau tick sur l'un des symboles.

Pour l'instant, je ne vois que deux options :
  1. Par le biais d'une minuterie avec interrogation de tous les symboles. (bien sûr, vous pouvez seulement interroger la nouvelle valeur deTimeCurrent(), mais dans ce cas l'erreur sera de 1 seconde, car cette fonction renvoie une valeur en secondes)
  2. à chaque symbole dans OnTick (ou OnCalculate) pour générer un événement personnalisé via EventChartCustom

L'inconvénient de la première option est sa non-optimalité en termes de ressources et de pertinence des données. OnTimer va principalement marteler en idle, et quand il attrape une nouvelle citation, l'erreur de temps d'arrivée sera égale à la périodicité du timer.

L'inconvénient de la deuxième variante est la lourdeur, surtout s'il y a des dizaines de symboles.

Ai-je bien compris qu'il n'existe pas d'autres options (plus simples et plus élégantes) ? Ou (j'espère) ai-je tort ?

 
Nikolai Semko:

Question.

Supposons que je travaille avec plusieurs symboles dans un Expert Advisor ou un indicateur, ou plutôt avec tous les symboles qui sont affichés dans la fenêtre Market Watch.

La tâche consiste à saisir le moment d'un nouveau tick sur l'un des symboles.

Je ne vois que deux options pour l'instant :
  1. Par le biais d'une minuterie avec interrogation de tous les symboles. (bien sûr, vous pouvez seulement interroger la nouvelle valeur deTimeCurrent(), mais dans ce cas l'erreur sera de 1 seconde, car cette fonction renvoie une valeur en secondes)
  2. à chaque symbole dans OnTick (ou OnCalculate) pour générer un événement personnalisé via EventChartCustom

L'inconvénient de la première option est sa non-optimalité en termes de ressources et de pertinence des données. OnTimer va principalement marteler en idle, et quand il attrape une nouvelle citation, l'erreur de temps d'arrivée sera égale à la périodicité du timer.

L'inconvénient de la deuxième variante est la lourdeur, surtout s'il y a des dizaines de symboles.

Ai-je bien compris qu'il n'existe pas d'autres options (plus simples et plus élégantes) ? Ou (j'espère) ai-je tort ?

Peut-être que cela vous aidera ? https://www.metatrader5.com/ru/terminal/help/trading_advanced/custom_instruments

Instruments synthétiques avec cotations en temps réel

La plateforme de trading vous permet de créer des instruments financiers synthétiques - des instruments basés sur un ou plusieurs instruments existants. Il vous suffit de définir une formule pour calculer les cotations et la plateforme générera des ticks en temps réel pour l'instrument synthétique ainsi que l'historique de ses minutes.
Comment cela fonctionne

Vous créez un instrument synthétique et vous en définissez la formule.
La plateforme calculera ses ticks avec une fréquence de 10 fois par seconde (et seulement si le prix d'au moins un instrument de la formule change).
 
SEM:

Peut-être que cela vous aidera ? https://www.metatrader5.com/ru/terminal/help/trading_advanced/custom_instruments

Instruments synthétiques avec cotations en temps réel

La plateforme de trading vous permet de créer des instruments financiers synthétiques - des instruments basés sur un ou plusieurs instruments existants. Il vous suffit de définir la formule de calcul des cotations et la plateforme générera les ticks de l'instrument synthétique en temps réel et créera son historique de minutes.
Comment cela fonctionne

Vous créez un instrument synthétique et vous en définissez la formule.
La plateforme calculera ses ticks avec une fréquence de 10 fois par seconde (et seulement si le prix d'au moins un instrument de la formule a changé).

Oui, bien sûr, cette variante a aussi le droit à la vie. Merci !
Mais, en fait, c'est la même chose que ma variante #1 avec une périodicité de timer de 100 ms et avec les mêmes inconvénients.

L'option 2 me semble plus rationnelle, cependant.

Au fait, je me suis souvenu que l'option 2 a déjà été discutée ici.


 
Nikolai Semko:

Oui, bien sûr, cette variante a aussi le droit à la vie. Merci !
Cependant, en substance, c'est la même chose que la variante #1 ci-dessus avec une période de temporisation de 100 ms.

Ne serait-il pas plus simple de faire un EA lié au symbole sur lequel il travaille. Ensuite, ouvrez tous les symboles et appliquez le modèle avec cet EA à chaque graphique.

for(int i=PositionsTotal()-1;i>=0;i--)
     {
      if(PositionGetSymbol(i)==Symbol())
        {
         //Код
        };

     }
 
SEM:
Ne serait-il pas plus simple de faire un EA lié au symbole sur lequel il travaille. Ensuite, ouvrez tous les symboles, et pour chaque graphique, appliquez un modèle avec cet EA.

Il est clair que cela peut être fait. Le fait est que je ne sais pas quelque chose et qu'il est possible de retracer le moment exact de l'apparition de la cotation pour un autre symbole à travers le code d'un seul EA multi-devises.
Mais il semble que la variante 2 via des interruptions personnalisées soit la seule solution rationnelle.

 
Nikolai Semko:

Oui, il est clair que cela peut être fait de cette façon. La question est que je ne sais pas quelque chose, et qu'il est possible d'attraper le moment exact de l'arrivée de la cotation pour un autre symbole à travers le code d'un seul Conseiller Expert multi-devises.
Mais il semble que la variante 2 via des interruptions personnalisées soit la seule solution rationnelle.

Mise en œuvre.

Особенности языка mql5, тонкости и приёмы работы
Особенности языка mql5, тонкости и приёмы работы
  • 2018.01.28
  • www.mql5.com
В данной теме будут обсуждаться недокументированные приёмы работы с языком mql5, примеры решения тех, или иных задач...
 
Nikolai Semko:
  1. via une minuterie avec interrogation de tous les caractères. (Bien sûr, vous pourriez simplement interroger la nouvelle valeur deTimeCurrent(), mais dans ce cas, l'erreur serait de 1 seconde, car cette fonction renvoie une valeur en secondes).

Ai-je raison de supposer qu'il n'existe pas d'autres options (plus simples et plus élégantes) ? Ou (j'espère) ai-je tort ?

Minuteur en millisecondes + SymbolInfoTick() obtiendra le temps en millisecondes.

 
Oui, j'ai déjà donné ce lien à votre mise en œuvre dans le post 22214. Je le répète : je pense que cette variante est la plus raisonnable jusqu'à présent. Et il semble qu'il n'y ait pas de meilleure mise en œuvre en termes de charge minimale du processeur et de pertinence du moment résultant d'un nouveau tick.
 
Nikolai Semko:
  1. через таймер c опросом всех символов. (можно, конечно, только опрашивать новое значение функции TimeCurrent(), но в этом случае погрешность будет равна 1 секунде, т.к. эта функция возвращает значение в секундах)

Я правильно понимаю, что других вариантов (более простых и изящных) не существует? Или (надеюсь) я не прав?

Minuterie en millisecondes + SymbolInfoTick() obtient le temps en millisecondes.

Alexey Kozitsyn:

Minuterie en millisecondes + SymbolInfoTick() obtenir le temps en millisecondes.

C'est la variante 1. Je voulais dire une telle construction (minuterie Millisecond + boucle SymbolInfoTick()). J'ai mentionnéTimeCurrent() parce qu'il renvoie"l'heure d'arrivée de la dernière cotation pour tout symbole disponible dans la fenêtre Market Watch", pas seulement pour le symbole actuel, mais malheureusement il ne renvoie que les secondes, ce qui est très grossier pour les ticks.
Objectivement, la variante avec interruptions utilisateur est plus raisonnable, car il n'est pas nécessaire d'organiser une boucle avec la coûteuse fonction SymbolInfoTick en permanence, même lorsque les cotations sont en sommeil, chargeant ainsi le processeur de temps mort. En outre, l'erreur de calcul d'un nouveau tick peut être égale à la périodicité du timer, et tous les ticks seront perdus entre l'exécution de OnTimer, si ces ticks étaient supérieurs à 1.
SZZ Nous parlons de mql5. Sur mql4, les interruptions de l'utilisateur ne fonctionnent pas correctement. Par conséquent, le mql4 ne peut utiliser que la minuterie.
 
Nikolai Semko:
Oui, j'ai déjà donné ce lien à votre mise en œuvre dans le post 22214. Je le répète : je pense que c'est l'option la plus raisonnable jusqu'à présent. Et il semble qu'il n'y ait pas de meilleure mise en œuvre en termes de charge minimale du processeur et de pertinence du moment d'un nouveau tick.

Il y aura une fonctionnalité normale dans les services.