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 :
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).
Naturellement, cette fois-ci, tout a fonctionné correctement :
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 ?
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...
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é ?
externint 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);
}
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.
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...
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.
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.
Salutations ! :)
J'ai à peu près le même code que cet indicateur :
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 :
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 :
Naturellement, cette fois-ci, tout a fonctionné correctement :

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 ? )
Salutations ! :)
J'ai à peu près le même code que l'indicateur :
C'est ma première expérience, ne jugez pas trop sévèrement :)
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.
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
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é ?
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é ?
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à.
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.
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...
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...
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.
J'ai essayé... ça ne marche pas...
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.