fonction sommeil alternative - page 2

 
paulepanke:

Soyez prudent avec une telle déclaration. Il y a toujours une raison logique d'exécuter sleep(). dans Tester et même dans les indicateurs.

Je n'ai pas dit qu'il n'y avait aucune raison logique d'utiliser sleep(), il y en a beaucoup, j'ai dit qu'il n'y avait aucune raison de s'attendre à ce que sleep() fonctionne dans le Strategy Tester. Est-ce que cela fonctionne dans un indicateur fonctionnant sur un graphique du Strategy Tester, je ne sais pas, peut-être que oui . Peut-on mettre en pause un EA fonctionnant dans le Strategy Tester ? oui, c'est possible.
 
RaptorUK:
Regardez ce que vous donne TimeSeconds(), puis pensez à ce que vous donne TimeCurrent() . . lequel vous faut-il et pourquoi ?


Simon,

int TimeSeconds( datetime time)

Renvoie le nombre de secondes écoulées depuis le début de la minute pour l'heure spécifiée.

datetime TimeCurrent( )
Renvoie la dernière heure connue du serveur (heure d'arrivée de la dernière cotation) en nombre de secondes écoulées à partir de 00:00 le 1er janvier 1970.


"Lequel vous faut-il et pourquoi ? - Simon

J'utiliserais les deux e'm de concert, car ils vont de pair. - Nathan

TimeSeconds(datetime time) nécessite une variable placée à l'intérieur de ses accolades. TimeCurrent() est alors placé à l'intérieur de ces accolades, ce qui me présente une solution viable. Je l'ai déjà fait auparavant, mais je ne comprenais pas pourquoi les valeurs de temps renvoyées semblaient sauter et s'interrompre (en raison de l'absence d'un ou plusieurs tics actifs).

Que pensez-vous de cela ?


Merci.

 
WHRoeder:

  1. Aucun ticks d'aucune sorte n'est créé jusqu'à ce que vous retourniez et qu'il crée le suivant et appelle votre start(). Si vous calculez pendant 5 minutes et que vous retournez, le volume (nombre de ticks) lors du prochain appel sera de +1. Sur un graphique en direct, si vous calculez pendant 5 minutes, il vous manquera 5 minutes de ticks et sur le M1 plusieurs nouvelles barres se seront formées.

William,

Merci d'avoir développé ce sujet.

Mon interprétation du "2." est que, lorsqu'un tick est créé, la fonction return est appelée. Ensuite, la fonction Start() est appelée directement après l'appel de la fonction return(0), ce qui déclenche l'exécution du programme une fois de plus. Cette interprétation de cette partie du point 2. est-elle correcte ?


"Si vous calculez pendant 5 minutes", comment puis-je être sûr que l'EA calculera pendant cinq minutes (même si l'EA calcule pendant cinq minutes, je ne crois pas que cela garantira la création d'un tick. La probabilité de création d'un tick est augmentée) ?


Je vous prie de m'excuser, j'ai des difficultés à lire ce texte :

"Si vous calculez pendant 5 minutes et que vous revenez, le volume (nombre de tick) sur le prochain appel sera de +1. Dans un graphique en direct, si vous calculez pendant 5 minutes, alors vous manquerez 5 minutes de ticks et sur le M1 plusieurs nouvelles barres se seront formées."


Merci beaucoup pour votre réponse.

 
RaptorUK:
Je n'ai pas dit qu'il n'y avait aucune raison logique d'utiliser sleep(), il y en a beaucoup, j'ai dit qu'il n'y avait aucune raison de s'attendre à ce que sleep() fonctionne dans le Strategy Tester. Est-ce que cela fonctionne dans un indicateur fonctionnant sur un graphique du Strategy Tester, je ne sais pas, peut-être que oui.... Peut-on mettre en pause un EA fonctionnant dans le Strategy Tester ? Oui, c'est possible.

Simon,

"Peut-on mettre en pause un EA en cours d'exécution dans le testeur de stratégie? oui, c'est possible."

Pourriez-vous exprimer vos pensées concernant cette méthode que vous utiliseriez pour "mettre en pause" un EA dans le testeur ?


Merci de votre compréhension.

 
  1. L'EA retourne de start() au testeur. Le testeur crée le prochain tick et appelle start(). Si l'EA ne revient pas, il n'y a pas de prochain tick. Le temps que prend start() pour revenir n'a pas d'importance. Le prochain tick est créé lorsqu'il revient.
  2. Vous ne pouvez pas mettre l'EA en pause ou en sommeil dans le testeur. Vous pouvez appuyer sur le bouton de pause de manière programmatique pour mettre en pause le testeur après le retour de l'EA.
 

William,

Donc, un nouveau tick appelle la fonction start() dans un EA, oui ?

Ma question est la suivante : "Connaissez-vous un autre moyen d'appeler la fonction start() que celui d'un nouveau tick ? Peut-être une action répétitive cohérente pour substituer un appel à Start() ?"

(Je pense, y a-t-il un moyen de suivre les secondes de manière cohérente qui ne dépende pas des ticks)


"...Le tick suivant est créé quand il le fait."

Je crois que ce que vous vouliez écrire était : "A la création d'un nouveau tick, Start() est alors exécuté." ;)


Donc, vous dites qu'un EA ne peut pas être mis en pause ou en sommeil dans le testeur, oui ?


Je vais consulter le lien que vous m'avez fourni, mais en attendant, pouvez-vous m'expliquer cette méthode qui consiste à "appuyer sur un bouton de pause pour mettre le testeur en pause" après qu'un EA testé soit revenu de son démarrage ?

Lorsqu'elle est exécutée dans le testeur, cette méthode permet-elle de simuler les performances de l'EA mis en pause pendant un laps de temps déterminé en "temps réel" sur un compte réel ?


Je comprends que le testeur a des limites et que des "solutions de rechange" doivent être utilisées pour simuler les performances en "temps réel".


Merci beaucoup William.


Par ailleurs, cela vous dérange-t-il si je vous appelle simplement Will ? Cela me ferait gagner une seconde à chaque message. Votre appel.

J'aime une fonctionnalité que votre EA possède et c'est, "Je voulais fermer tous les ordres avant la fin de la semaine (fermeture du marché le vendredi,) pour éviter une perte si le marché s'écartait à la fin de la semaine, en passant le SL".

(Claquement de mains de joie.) Hahaha ! ;) En ajoutant cette fonction à votre EA, vous réduisez les pertes inutiles mais c'est différent de ce que j'essaie de faire actuellement. Actuellement, j'essaie de suivre les secondes de temps de manière cohérente sans avoir besoin de ticks pour mettre à jour les secondes. Je souhaite un moyen différent de mettre à jour la fonction Start(), compris ?


Merci.

 
WhooDoo22:

Actuellement, j'essaie de suivre les secondes du temps de manière cohérente sans avoir besoin de ticks pour mettre à jour les secondes. Je souhaite un moyen différent pour mettre à jour la fonction Start(), compris ?

Je soupçonne que ce que vous essayez de faire est une solution imparfaite à votre problème en raison d'un manque de compréhension. Pourquoi avez-vous besoin de connaître la seconde d'une seconde à l'autre si le prix n'a pas changé pendant 30 secondes ? lorsque le prix change, vous obtenez un tick.

Pour clarifier ce queWHRoeder a dit, tous les ticks sont créés avant que le Strategy Tester commence à les appeler/exécuter, ils sont sauvegardés dans un fichier .fxt dans tester/histoire, le ST appelle un premier tick et cela provoque l'exécution de start(), le tick suivant n'est pas appelé/utilisé tant que start() n'a pas fini de s'exécuter, il est très important de comprendre cela. Ce n'est que lorsque start() a terminé que le tick suivant est utilisé pour que l'EA puisse appeler start() à nouveau. Lorsque le ST fonctionne à pleine vitesse, c'est la vitesse à laquelle start() s'exécute qui régit la vitesse du ST, donc une fonction start() très simple permettra au ST de fonctionner très rapidement, une fonction start() complexe fera que le ST fonctionnera plus lentement.

Dans une situation Live/Demo, si la fonction start() est très complexe et prend beaucoup de temps à s'exécuter, peut-être quelques dixièmes de seconde, il est possible que le prochain tick arrive avant que start() ne soit terminé, dans cette situation le tick sera manqué et ne provoquera pas l'appel de start()... cela ne peut pas arriver avec le ST.

 
WhooDoo22:

Simon,

"Peut-on mettre en pause un EA en cours d'exécution dans le testeur de stratégie ? oui, c'est possible."

Pourriez-vous nous dire ce que vous pensez de cette méthode que vous utiliseriez pour "mettre en pause" un EA dans le testeur ?

Bien sûr, ce n'est pas très élégant donc je ne suggérerais pas à quiconque de l'utiliser. J'ai utilisé une GlobalVariable définie et désactivée par un script, lorsque l'EA dans le ST voyait que la GlobalVariable était définie, il s'asseyait dans une boucle vérifiant continuellement que la GlobalVariable soit désactivée, lorsque le script avait désactivé la GlobalVariable, l'EA sortait de la boucle et sa fonction start() pouvait se terminer.
 
WhooDoo22:

"Laquelle des deux est nécessaire et pourquoi ? - Simon

J'utiliserais les deux e'm en concert, car ils vont de pair. - Nathan

TimeSeconds(datetime time) nécessite une variable placée à l'intérieur de ses accolades. TimeCurrent() est alors placé à l'intérieur de ces accolades, ce qui me présente une solution viable. J'ai fait cela auparavant mais je ne comprenais pas pourquoi les valeurs de temps renvoyées semblaient sauter et se mettre en pause (en raison de l'absence d'un ou plusieurs tics actifs).

Supposons que vous avez 2 événements et que ces événements sont séparés de 10 secondes, quelle sera la différence entre les valeurs retournées parTimeSeconds(datetime time) pour ces 2 événements ?
 
RaptorUK:

Je soupçonne que ce que vous essayez de faire est une solution imparfaite à votre problème en raison d'un manque de compréhension. Pourquoi avez-vous besoin de connaître la seconde d'une seconde à l'autre si le prix n'a pas changé pendant 30 secondes ? lorsque le prix change, vous obtenez un tick.

Pour clarifier ce queWHRoeder a dit, tous les ticks sont créés avant que le Strategy Tester commence à les appeler/exécuter, ils sont sauvegardés dans un fichier .fxt dans tester/histoire, le ST appelle un premier tick et cela provoque l'exécution de start(), le tick suivant n'est pas appelé/utilisé tant que start() n'a pas fini de s'exécuter, il est très important de comprendre cela. Ce n'est que lorsque start() a terminé que le tick suivant est utilisé pour que l'EA puisse appeler start() à nouveau. Lorsque le ST fonctionne à pleine vitesse, c'est la vitesse à laquelle start() s'exécute qui régit la vitesse du ST, donc une fonction start() très simple permettra au ST de fonctionner très rapidement, une fonction start() complexe fera que le ST fonctionnera plus lentement.

Dans une situation Live/Demo, si la fonction start() est très complexe et prend beaucoup de temps à s'exécuter, peut-être quelques dixièmes de seconde, il est possible que le prochain tick arrive avant que start() ne soit terminé, dans cette situation le tick sera manqué et ne provoquera pas l'appel de start()... cela ne peut pas arriver avec le ST.

Simon,

Je soupçonne que ce que vous essayez de faire est une solution imparfaite à votre problème en raison d'un manque de compréhension. Pourquoi avez-vous besoin de connaître la seconde d'une seconde à l'autre si le prix n'a pas changé pendant 30 secondes ? lorsque le prix change, vous obtenez un tick.

J'admets que j'ai un manque de compréhension, c'est pourquoi je discute de ce sujet dans le forum MQL4. Je souhaite sauvegarder le prix lorsqu'il change (je comprends comment faire). De même, je comprends comment sauvegarder les prix toutes les secondes de manière cohérente sur un graphique LIVE/DEMO en utilisant Sleep(). Objectif : Je souhaite suivre les secondes de manière cohérente (sans suivre les secondes en fonction de la création de ticks) jusqu'à un maximum d'une minute ou moins, puis remettre les secondes suivies à zéro. Je comprends pourquoi je souhaite atteindre cet objectif. La raison est que je dois tester un EA dans le testeur et que je ne peux pas utiliser Sleep() pendant le test. Que faire ? Je rassemble les options.

Détails alors hm ? ;)

Codez un timer (utilisable dans le testeur) dans un EA. Ce timer compte vers le haut de 0-30 ou vers le bas de 30-0. Pendant que ce temps compte vers le haut/bas, j'ai un vecteur séparé qui suit l'action du prix (un vecteur de très grande taille).

Mes conditions sont les suivantes,

Si le prix se déplace de x points (dans les 0-30 ou 30-0 secondes), prendre une décision.

Si le prix ne parcourt pas x points (dans les 0-30 ou 30-0 secondes), ArrayInitialize().


Que dites-vous de ce Simon ?


Merci