Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 6. - page 600

 

Salutations ! :)

J'ai à peu près le même code que cet indicateur :

bool busy=false;

int start()
{
   int counted_bars=IndicatorCounted();
   if(counted_bars<0) return(-1);
   limit=Bars-counted_bars+1;
   limit=MathMin(bBars-1, limit);
   if(IndicatorCounted()>0) limit=1;
   
   FileWrite(han, TimeToStr(TimeCurrent(), TIME_MINUTES|TIME_SECONDS), Bars, IndicatorCounted());
   FileFlush(han);
   //if(busy=false) return(0);
   for (i=0; i<limit; i++)
   { 
      busy=true;
      FileWrite(han, TimeToStr(TimeCurrent(), TIME_MINUTES|TIME_SECONDS), DoubleToStr(i, 0), DoubleToStr(IndicatorCounted(), 0));
      FileFlush(han);
      Здесь идут сложные вычисления которые занимают минуты 3
   }

   busy=false;
}

Je le laisse tomber sur le tableau M1. L'indicateur s'accroche au terminal et effectue prétendument des calculs.
Je le ferme de force au bout de 15 minutes et j'ouvre son journal :

Pic1

Il s'avère que l'indicateur ne réagit pas aux ticks nouvellement arrivés (c'est logique) jusqu'à ce qu'il calcule la première fois. Mais il oublie de dire au terminal pendant l'évaluation que IndicatorConted() doit déjà avoir une valeur différente de 0.
Il s'avère donc que les ticks entrants ordonnés pour l'évaluation se souviennent de la valeur actuelle de IndicatorCounted() ?

J'ai essayé de le contrôler via la variable busy (chaîne commentée - même résultat).

J'ai aussi essayé de cette façon :

int start()
{
   FileWrite(han, TimeToStr(TimeCurrent(), TIME_MINUTES|TIME_SECONDS), Bars, IndicatorCounted());
   FileFlush(han);
   return(0);
   .
   .
   .
}

Naturellement, cette fois-ci, tout a fonctionné correctement :

Pic2

Qu'avons-nous là ? Le système n'a pas le temps d'écrire une nouvelle valeur dans IndicatorCounted() ? En d'autres termes, je dois faire quelque chose comme sleep() ? Je sais que ce n'est pas possible dans l'indicateur)
Ou, quand un nouveau tick arrive, parce que l'ancien tick n'a pas terminé ses calculs, il se souvient que IndicatorCounte() est encore égal à zéro et quand son heure arrive, il recommence à calculer à partir de l'ancienne valeur IndicatourCounted()=0 ?

Que faire ? )

 
Expert:

Salutations ! :)

J'ai à peu près le même code que l'indicateur :


Tout y est. A propos de ce code, à propos de cette réponse...à écrire?
 
peace1984:
C'est ma première expérience, ne jugez pas trop sévèrement :)
Pour être honnête, il me semble que le testeur se souvient de la valeur passée de la variable - du dernier test. Comment - je ne sais pas, je n'ai pas beaucoup de temps pour le débogage. C'est peut-être un bug du terminal. J'ai juste mis un commentaire dans le code et sorti les valeurs dans le journal. Il s'avère donc qu'à chaque fois que je lance un nouveau test, la valeur du test précédent est stockée dans la variable sys. Quel gâchis. Peut-être que quelqu'un d'autre verra, peut-être que mon œil est humide...
Dossiers :
11_1.mq4  8 kb
 
AlexeyVik:
Cela dit tout. Pour approximativement ce code, approximativement cette réponse...écrire?


Le fait est que le reste du code n'est pas pertinent. L'essence de l'erreur est décrite dans cet article.
En général, j'avais peur de faire fuir les gens avec un gros poste. Alors je l'ai gonflé.

En bref, elle peut être formulée comme suit : si un indicateur est calculé pendant une longue période (plus d'une minute), IndicatorCounted() renvoie toujours 0.

 
artmedia70:
Pour être honnête, il me semble que le testeur se souvient de la valeur passée de la variable - du dernier test. Comment - je ne sais pas, il n'y a pas beaucoup de temps pour le débriefing. Peut-être un bug dans le terminal. J'ai juste mis un commentaire dans le code et sorti les valeurs dans le journal. Il s'avère donc qu'à chaque fois que je lance un nouveau test, la valeur du test précédent est stockée dans la variable sys. Quel gâchis. Peut-être que quelqu'un d'autre verra, peut-être que mon œil est humide...

C'est juste que vous avez oublié que la ligne

int       sys=(Sys<0)?0:Sys;

Lorsque les propriétés de l'indicateur sont rappelées, elles ne seront pas exécutées.

Je n'ai pas étudié la question à fond, mais peut-être cela permettra-t-il d'obtenir le résultat souhaité ?

extern int Sys=0;
int       sys;    // изменено
double    opb;
double    ops;
double    cb;
double    cs;
double    lot;
double    next_order;
int       i=0;
int       x;
double    max;
double    min;
int       ticket;
int       tip;
int       count;
bool      res;
double    bal;
double    sl;
datetime  d;
double    N;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
   sys=(Sys<0)?0:Sys;  // добавлено
   bal=AccountBalance();
   return(0);
  }
 
AlexeyVik:

Vous avez juste oublié que la chaîne

Lorsque les propriétés de l'indicateur sont rappelées, elles ne seront pas exécutées.

Je n'ai pas étudié la question à fond, mais peut-être cela permettra-t-il d'atteindre le résultat souhaité ?



Généralement un conseiller. Mais HZ, pas le temps d'expérimenter. Tous les EAs fonctionnent comme je l'ai écrit. Je vais devoir tracer cette merde dans le testeur. Quand j'aurai assez de temps.
 
Expert:


Le fait est que le reste du code n'est pas pertinent. L'essence de l'erreur est décrite dans cet article.
En général, j'avais peur de faire fuir les gens avec un gros poste. Alors je l'ai gonflé.

En bref, elle peut être formulée comme suit : si un indicateur est calculé pendant une longue période (plus d'une minute), IndicatorCounted() renvoie toujours 0.


Ce n'est pas la question. Personne n'a besoin de votre code secret complet. Il suffit d'écrire un morceau de code de test complet avec ce malentendu. Et par là.

bool busy=false;

int start()
{
   int counted_bars=IndicatorCounted();
   if(counted_bars<0) return(-1);
   limit=Bars-counted_bars+1;
   limit=MathMin(bBars-1, limit);
   if(IndicatorCounted()>0) limit=1;
   
   FileWrite(han, TimeToStr(TimeCurrent(), TIME_MINUTES|TIME_SECONDS), Bars, IndicatorCounted());
   FileFlush(han);
   //if(busy=false) return(0);
   for (i=0; i<limit; i++)
   { 
      busy=true;
      FileWrite(han, TimeToStr(TimeCurrent(), TIME_MINUTES|TIME_SECONDS), DoubleToStr(i, 0), DoubleToStr(IndicatorCounted(), 0));
      FileFlush(han);
      Здесь идут сложные вычисления которые занимают минуты 3
   }

   busy=false;
}

Quand avez-vous effacé la ligne en surbrillance ? Les télépathes n'aideront pas, les simples mortels encore moins...

Et puis il y a cette partie.

   int counted_bars=IndicatorCounted();
   if(counted_bars<0) return(-1);
   limit=Bars-counted_bars+1;
   limit=MathMin(bBars-1, limit);
   if(IndicatorCounted()>0) limit=1;

Je ne sais pas de quel programmeur ça vient, mais il y a quelque chose de mal écrit... Ce n'est pas de ta faute. Vous, comme beaucoup d'autres, avez juste pris le code et essayé de le réparer...

Si la variable counted_bars est égale au nombre de barres restées inchangées depuis le dernier appel de l'indicateur (la première ligne)

Comment il peut devenir inférieur à zéro qu'il est vérifié if(counted_bars < 0) je ne pourrai jamais comprendre....

Le reste est également absurde, mais je suis trop paresseux pour l'analyser...

 
AlexeyVik:

Vous avez juste oublié que la chaîne

les propriétés de l'indicateur ne seront pas exécutées lorsque les propriétés seront rappelées.

Je n'ai pas étudié la question à fond, mais peut-être cela permettra-t-il d'atteindre le résultat souhaité ?




J'ai essayé... ça ne marche pas...
 
artmedia70:
Généralement un conseiller. Mais HZ, pas le temps d'expérimenter. Tous les EAs fonctionnent comme je l'ai écrit. Je vais devoir tracer cette merde dans le testeur. Quand j'aurai assez de temps.

Eh bien, oui, bien sûr, le conseiller expert. Une autre question se pose alors : pourquoi l'EA a été placé sur le graphique comme indicateur de sous-sol ? Mais cela ne change rien au fait que lors du redémarrage de l'indicateur et de l'EA, les variables de niveau global ne sont pas réinitialisées et la ligne int sys=(Sys<0)?0:Sys ; n'est pas exécutée.
 
peace1984:

J'ai essayé... ça ne marche pas...
Ce n'est probablement pas exactement comme ça que j'ai essayé.
J'ai juste recompilé le code dans EA et l'ai exécuté. Lorsque je modifie le paramètre Sys dans le commentaire, cette valeur change.