Caractéristiques du langage mql5, subtilités et techniques - page 239

 
Anatoli Kazharski #:

Comment puis-je savoir si un symbole a des données, afin de ne pas le laisser dans la fenêtre [Market Watch] s'il n'en a pas ?

SymbolInfoTick.

 
fxsaber #:

SymbolInfoTick.

J'ai essayé cette option. Malheureusement, elle ne fonctionne pas. Si un symbole est ajouté à la fenêtre [Market Watch] pour la première fois, il n'y a pas encore de données sur ce symbole et SymbolInfoTick renvoie des valeurs nulles.

J'ai également testé les fonctions CopyXXX, mais elles n'ont pas de délai d'attente et le processus d'attente des données du serveur dure environ 45 secondes, ce qui est trop long.

J'ai besoin d'un moyen rapide de savoir si un caractère est inutilisable. Je fais référence à des cas comme celui-ci :


//---

Ces symboles n'ont pas de données sur le serveur et il faut un moyen de les identifier pour qu'ils ne soient pas ajoutés à la fenêtre [Aperçu du marché] ou supprimés de la liste s'ils le sont.

P.S. Peut-être existe-t-il un moyen de supprimer le blocage de la suppression des symboles de la liste dans la fenêtre[ Market Watch] ?

 
Anatoli Kazharski #:

J'ai essayé cette option. Malheureusement, elle ne fonctionne pas. Si un symbole est ajouté à la fenêtre [Market Watch] pour la première fois, il n'y a pas encore de données le concernant et SymbolInfoTick renvoie des valeurs nulles.

Il est facile d'obtenir des symboles fonctionnels à la main.

  1. Ajoutez tous les symboles à la fenêtre Market Watch en quelques clics.
  2. En quelques secondes, vous recevrez les ticks sur ces symboles.
  3. Tri par heure en un clic de souris.
  4. Suppression de l'une des queues de la liste obtenue à l'aide de la touche Del.
Tout cela peut prendre jusqu'à une demi-minute.
 
Anatoli Kazharski #:

J'ai essayé cette option. Malheureusement, elle ne fonctionne pas. Si un symbole est ajouté à la fenêtre [Market Watch] pour la première fois, il n'y a pas encore de données le concernant et SymbolInfoTick renvoie des valeurs nulles.

J'ai également testé les fonctions CopyXXX, mais elles n'ont pas de délai d'attente et le processus d'attente des données du serveur dure environ 45 secondes, ce qui est trop long.

J'ai besoin d'un moyen rapide de savoir si un caractère est inutilisable. Je fais référence à des cas comme celui-ci :


//---

Ces symboles n'ont pas de données sur le serveur et ont besoin d'un moyen de les identifier afin qu'ils ne soient pas ajoutés à la fenêtre [Market Watch] ou supprimés de la liste s'ils le sont.

P.S. Peut-être existe-t-il un moyen de supprimer le verrou sur la suppression des symboles de la liste dans la fenêtre[Market Watch] ?

Cela fait environ 6 ans que je me bats avec ce problème et je demande aux développeurs de mettre de l'ordre dans tout cela.

Malheureusement, ce problème n'a pas été résolu et, à l'heure actuelle, il arrive que le terminal se bloque lorsque quelqu'un accède à un instrument financier pour la première fois.

 
Anatoli Kazharski #:

Comment puis-je savoir si un symbole a des données, afin de ne pas le laisser dans la fenêtre [Market Watch] s'il n'en a pas ?

J'utilise une telle vérification dans une boucle :

Mais après cela, je ne peux pas supprimer manuellement les symboles de la fenêtre [Market Watch], soit un par un, soit tous en même temps, pendant que l'Expert Advisor est sur le graphique:


Essayez de vérifier l'heure de la dernière cotation.

SymbolInfoInteger(name, SYMBOL_TIME);

Si elle est égale à 0, il n'y a pas de données.

Je viens de vérifier en ouvrant les graphiques.

2024.01.05 10:38:43.783 !00 (GBPUSD,H1) USDCAD 2024.01.05 09:38:51
2024.01.05 10:38:43.783 !00 (GBPUSD,H1) NZDUSD 2024.01.05 09:38:51
2024.01.05 10:38:43.783 !00 (GBPUSD,H1) USDCAD 2024.01.05 09:38:51
2024.01.05 10:38:43.783 !00 (GBPUSD,H1) EURGBP 2024.01.05 09:38:49
2024.01.05 10:38:43.783 !00 (GBPUSD,H1) GBPUSD 2024.01.05 09:38:49
2024.01.05 10:38:43.783 !00 (GBPUSD,H1) POZ3 1970.01.01 00:00:00
2024.01.05 10:38:43.783 !00 (GBPUSD,H1) EDH4 1970.01.01 00:00:00
2024.01.05 10:38:43.783 !00 (GBPUSD,H1) BRZ3 1970.01.01 00:00:00
 
Il est possible d'obtenir des données supplémentaires en passant d'un serveur à l'autre. Je ne sais pas s'il est possible de l'implémenter dans le code.
 
Nauris Zukas #:
Il est possible d'obtenir des données supplémentaires en passant d'un serveur à l'autre. Je ne sais pas s'il est possible de l'implémenter dans le code.

Si par "entre serveurs" vous entendez "entre courtiers", alors difficilement, sauf si vous essayez de jouer avec les profils.

Mais si j'avais vraiment besoin de basculer entre les différents serveurs d'un courtier (Open en avait plusieurs, Finam en avait deux), je le ferais via iptables/nftables et mes scripts bash. Mais c'est plus facile pour moi ici, j'ai Linux.

 
JRandomTrader #:

Si par "entre serveurs" vous entendez "entre courtiers".


.

 
Nauris Zukas #:


Oui, en principe, c'est possible.

Mais, comme il n'y a aucun moyen de trouver le nom et l'adresse IP du serveur à partir du programme MQL, vous devrez les trouver manuellement en changeant de serveur et en vérifiant l'adresse IP vers laquelle la connexion est établie.

Il est alors possible, en modifiant la configuration du pare-feu, d'interdire la connexion à certains serveurs (ici, il est nécessaire de rejacker les paquets, et non de les laisser tomber pour éviter le délai d'attente), ce qui oblige MT à basculer vers un autre serveur.

Encore une fois, il ne m'est pas difficile de faire cela sous Linux, mais je n'arrive pas à imaginer comment le faire sous Windows.

 
Alexey Viktorov #:

Essayez de vérifier l'heure de la dernière citation.

Si 0, il n'y a pas de données.

Je viens de vérifier par rapport aux graphiques ouverts.

Cela s'applique également à un cas similaire :

J'ai essayé cette option. Malheureusement, elle ne convient pas. Si un symbole est ajouté à la fenêtre [Market Watch] pour la première fois, il n'y a pas encore de données le concernant et SymbolInfoTick renvoie des valeurs nulles.

Si les ticks sont rares, tous ces symboles seront exclus.

fxsaber #:

Il est facile d'obtenir des symboles fonctionnels à la main.

  1. Ajoutez tous les symboles au Market Watch en quelques clics.
  2. En quelques secondes, les ticks sur ces symboles seront reçus.
  3. Trier en un clic de souris par heure.
  4. Suppression de l'une des queues de la liste obtenue à l'aide de la touche Del.
Tout cela peut prendre jusqu'à une demi-minute.

Non, vous avez besoin d'un logiciel entièrement automatique.

Vladimir Pastushak #:

Cela fait déjà 6 ans que je me bats avec ça, et je demande aux développeurs de mettre de l'ordre ici.

Malheureusement, ce problème n'est pas résolu et, à l'heure actuelle, il arrive que le terminal se bloque lorsque quelqu'un accède à un instrument financier pour la première fois.

Je ne l'ai remarqué que lors de l'appel des fonctions suivantes :

  • Bars()
  • iBars()
  • SeriesInfoInteger(symbol, PERIOD_M1, SERIES_BARS_COUNT)

//---

Développeurs de terminaux :

1. exclure la possibilité d'ajouter des symboles sans données sur le serveur commercial.

2. Rendre possible la désactivation du blocage de la suppression des symboles à partir de la fenêtre [Market Watch] ou le corriger s'il s'agit d'un bogue. Actuellement, cela ne peut se faire qu'en redémarrant le terminal.

3. Pour des fonctions comme CopyXXX , ajouter un paramètre optionnel supplémentaire pour définir le timeout (temps maximum d'attente des données du serveur).

Je ne peux pas reproduire ce problème pour l'instant. Jusqu'à présent, cela fonctionne sans délai. Mais il semble que dans certains cas cela puisse arriver.

4. correction du bug avec l'attente infinie lors de l'utilisation des fonctions Bars(), iBars(), SeriesInfoInteger(symbol, PERIOD_M1, SERIES_BARS_COUNT) dans les cas où :

  • pas de connexion au serveur
  • pas de données sur le symbole

Une tentative de suppression du programme du graphique peut entraîner un blocage du terminal pendant plusieurs minutes.

5. Correction du bug de l'attente infinie lors de l'utilisation des fonctions s'il n'y a pas de connexion au serveur :

  • SeriesInfoInteger(symbole, PERIOD_M1, SERIES_FIRSTDATE)
  • SeriesInfoInteger(symbole, PERIOD_M1, SERIES_LASTBAR_DATE)
  • SeriesInfoInteger(symbol, PERIOD_M1, SERIES_SERVER_FIRSTDATE)

Dans ce cas, vous pouvez également ajouter un paramètre facultatif supplémentaire pour définir le délai d'attente (temps maximum pour attendre les données du serveur).

//---

P.S. Jusqu'à présent, j'ai opté pour la variante qui consiste à vérifier la présence de données à l'aide de fonctions telles que CopyXXX. Mais je vais voir si le problème décrit ci-dessus va réapparaître.