Questions des débutants MQL5 MT5 MetaTrader 5 - page 850

 
Artyom Trishkin:
Corriger l'indicateur de courbe. Il ne peut tracer une ligne que lors d'un recalcul complet, ce qui est fait par une commande du menu contextuel.
Alexey Viktorov:

Il y en a un dans mql4 aussi.

Merci.

 
Je l'ai sorti avec une béquille). Je voulais que l'indicateur se mette à jour après avoir fait glisser manuellement la ligne verticale, à partir de laquelle il prend le temps. J'ai utilisé la fonction événement de glisser un objet et y ai mis la fonction de changement de TF avec retour à l'initial. Mais pour une raison quelconque, la mise à jour est retardée, de plusieurs secondes. La fonction de commutation TF fonctionne si lentement, je ne comprends pas.
 
khorosh:
Je me suis débrouillé avec une béquille). J'avais besoin de mettre à jour l'indicateur après le déplacement manuel d'une ligne verticale, à partir de laquelle il prend le temps. J'ai utilisé la fonction de glisser un objet et y ai mis la fonction de changer de TF avec un retour à l'initiale. Mais pour une raison quelconque, la mise à jour est retardée, de plusieurs secondes. La fonction de commutation TF est trop lente, je ne la comprends pas.

Cette fonction est asynchrone. Il ne renvoie que le résultat de la commande dans la file d'attente des événements.

Pour effectuer une mise à jour immédiate, vous devez exécuter la commande ChartRedraw() après la commande de changement de graphique

Il s'agit, bien entendu, d'une mauvaise approche. Si vous voulez mettre à jour le graphique seulement après l'achèvement du déplacement de la ligne, la boucle de recalcul de l'indicateur doit être appelée non pas à partir de OnCalculate() mais à partir de ChartEvent() - le déplacement de la ligne est attrapé - la fonction de recalcul de l'indicateur est appelée, qui exécutera le cycle complet de recalcul de la ligne avec les nouvelles données (la ligne est nécessaire pour certaines données, n'est-ce pas ?)

Ou l'indicateur n'est tout simplement pas fait correctement et ne met pas à jour la barre de zéro sur les données actuelles, et vous l'avez botté ?

 
ilyav:

Quelqu'un peut-il aider à corriger le code EA sur MT5 ?

J'ai lu les manuels, mais je ne peux pas battre 2 vernis lors de la compilation.

la déclaration de 'xxxx ' cache la déclaration globale

и

perte éventuelle de données due à la conversion de type

Voir le conseil ci-joint.

J'ai juste stupidement corrigé les noms des variables globales et fait correspondre les types.

C'est 10.000.000 que vous pouvez facturer - pour avoir vaincu votre paresse.

Dossiers :
 
Artyom Trishkin:

J'ai juste corrigé les noms des variables globales et mis les types en conformité.

Tu me dois 10 000 000 pour avoir vaincu ta paresse.

Merci beaucoup.

J'ai honte de montrer comment je l'ai réparé).

int CountTrades(long PositionID1)

 
Artyom Trishkin:

Cette fonction est asynchrone. Il ne renvoie que le résultat de la commande dans la file d'attente des événements.

Pour effectuer une mise à jour immédiate, vous devez exécuter la commande ChartRedraw() après la commande de changement de graphique

Il s'agit, bien entendu, d'une mauvaise approche. Si vous avez besoin de mettre à jour le graphique seulement après l'achèvement du déplacement de la ligne, la boucle de recalcul de l'indicateur doit être appelée non pas à partir de OnCalculate() mais à partir de ChartEvent() - le déplacement de la ligne est attrapé - la fonction de recalcul de l'indicateur est appelée, qui effectuera le cycle complet de recalcul de la ligne avec les nouvelles données (la ligne est nécessaire pour certaines données, n'est-ce pas ?).

Ou peut-être que l'indicateur a été tout simplement mal conçu et qu'il ne met pas à jour la barre de zéro sur les données actuelles et que vous l'avez bousillé ?

L'indicateur compte les dernières barres non calculées. Et après avoir déplacé la verticale, il devrait recalculer complètement après avoir lu le nouveau temps vertical. J'en ai parlé ici et j'ai ajouté des captures d'écran de son fonctionnement.

Merci, je vais essayer de mettre en œuvre votre idée. Je ne suis généralement pas très bon avec les indicateurs, j'ai surtout eu affaire à des conseillers experts.

 
Artyom Trishkin:

Cette fonction est asynchrone. Il ne renvoie que le résultat de la commande dans la file d'attente des événements.

Pour effectuer une mise à jour immédiate, vous devez exécuter la commande ChartRedraw() après la commande de changement de graphique

Il s'agit, bien entendu, d'une mauvaise approche. Si vous voulez mettre à jour le graphique seulement après l'achèvement du déplacement de la ligne, la boucle de recalcul de l'indicateur doit être appelée non pas à partir de OnCalculate() mais à partir de ChartEvent() - déplacement de la ligne - appel de la fonction de recalcul de l'indicateur, qui exécutera le cycle complet de recalcul de la ligne avec les nouvelles données (la ligne est nécessaire pour certaines données, n'est-ce pas ?).

Ou peut-être que l'indicateur n'est tout simplement pas fait correctement et ne met pas à jour la barre de zéro sur les données actuelles, et vous l'avez botté ?

J'ai suivi votre conseil. Tout a fonctionné parfaitement. Maintenant, instantanément après avoir glissé, l'indicateur est complètement redessiné. Merci encore.

 
khorosh:

J'ai fait comme vous l'avez conseillé. Tout a fonctionné parfaitement. Maintenant, instantanément après avoir glissé l'indicateur est complètement redessiné. Merci encore.

Vous êtes les bienvenus. Mais il devrait être dessiné dans OnCalculate(), ou pas ?

Lorsqu'elle est glissée sur le graphique, l'indicateur n'est pas conscient des changements de la ligne, mais il doit dessiner la ligne.

 
Artyom Trishkin:

Vous êtes les bienvenus. Mais il devrait dessiner dans OnCalculate(), ou pas ?

Lorsque vous l'appliquez à un graphique, il n'est pas conscient des mouvements de la ligne, mais il doit tracer la ligne.

Lorsque l'indicateur est attaché au graphique, une ligne verticale est créée dans init() et un temps est initialement défini pour elle, par exemple Time[10]. J'ai dupliqué le code dansOnChartEvent() et OnCalculate(). Seulement dans OnChartEvent je recalcule par toutes les barres.

 
khorosh:

Lors de l'installation de l'indicateur sur le graphique dans init() une ligne verticale est créée et initialement elle est fixée à un certain temps, par exemple Time[10]. J'ai dupliqué le code dans OnChartEvent() et OnCalculate(). Seulement dans OnChartEvent je recalcule par toutes les barres.

Ne serait-il pas préférable de créer simplement la fonction Refresh(), par exemple, avec les paramètres formels requis, et de l'appeler lorsque cela est nécessaire ?

Et à propos, lorsque vous obtenez le taux_total dans l'indicateur au-delà de OnCalculate() en utilisant Bars() avec une plage de dates, vous pouvez attraper un accroc de l'indicateur :

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

Analogue de iBarShift

Nikolai Semko, 2018.04.05 23:47

Jusqu'à présent cette variante, mais je veux maintenant l'ajouter pour contourner ce bug des blocages de la fonction Bars, à propos duquel j'ai déjà écrit à servicedesk.

L'essence de ce bogue est que si, dans la fonction Bars, l'heure de début et l'heure de fin sont toutes deux à l'intérieur d'une barre ou sont dans le futur (à droite de la barre zéro), alors cette fonction se bloque pendant plus de 10 secondes.

Peut-être que je ferai une version plus rapide mais plus encombrante plus tard.