Erreurs, bugs, questions - page 3151

 
Roman #:

Merci Artem !
C'est vrai, il devrait y avoir un contrôle, que j'avais oublié.
Tout fonctionne correctement avec le chèque. Merci.

Vous êtes les bienvenus. Corrigez le calcul. Ce n'est pas correct - je l'ai souligné plus haut.

int limit = rates_total-1-prev_calculated;

-1 ne devrait pas être ici.

Si rates_total est 5000, et que les barres calculées lors de l'appel précédent de OnCalculate() sont également 5000 (prev_calculated), alors la limite sera égale à -1. En conséquence, la boucle ne sera pas du tout exécutée.

Si vous voulez choisir comment lire l'indicateur (par ticks sur la barre zéro ou seulement à l'ouverture d'une nouvelle barre), alors entrez une variable, spécifiant comment le faire :

int end = (each tick ? WRONG_VALUE : 0) ;

la boucle sera la suivante : for(int i=limit ; i>end ; i--) { //... }

et le calcul de la limite sera correct, et la boucle sera comme vous le souhaitez.

 

Code correct.

i>=0 pour chaque tick

i>0 pour une nouvelle barre

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate (const int rates_total,       
                 const int prev_calculated,   
                 const int begin,             
                 const double& price[])      
{
   ArraySetAsSeries(price, true);
   ArraySetAsSeries(IndBuff, true);
   
   //-------------------------------------------------------------------------
   //Расчёт и проверка количества просчитываемых баров
   int limit = rates_total-prev_calculated;
   
   if(limit>1) 
      limit = rates_total-1;
   

   //-------------------------------------------------------------------------
   //Расчёт индикатора
   for(int i=limit; i>=0; i--)
   {

      IndBuff[i] = price[i]; 

   }
   

   return(rates_total);
}
 
Nikolai Semko #:
Ou

Tu n'as même pas demandé ce qu'il fallait faire... Les télépathes sont rentrés de vacances ? ;)

 
Roman #:

Code correct.

i>=0 pour chaque tick

i>0 pour une nouvelle barre

ArraySetAsSeries(IndBuff, true);

Il est préférable de déplacer cela dans OnInit()

 
Artyom Trishkin #:

Tu n'as même pas demandé ce qu'il fallait faire... Les télépathes sont rentrés de vacances ? ;)

:)
Artem, pas besoin d'être télépathe pour voir que l'homme s'est inscrit il y a quelques minutes et que la première chose qu'il a vue était "Bugs, bugs, questions"
Il est clair qu'il demande s'il peut avoir de l'argent gratuit, et de ne pas faire trop de problèmes...

 
Nikolai Semko #:

:)
Artem, pas besoin d'être télépathe pour voir que l'homme s'est inscrit il y a quelques minutes et que la première chose qu'il a vue était "Erreurs, bugs, questions"
Il est clair qu'il demande s'il peut obtenir de l'argent gratuitement, et de ne pas faire trop d'efforts...

Il a peut-être décidé de gagner un peu d'argent sur Bentley en investissant dans un tuteur ? :)

 
Artyom Trishkin #:

Il a peut-être décidé de gagner un peu d'argent pour sa Bentley en investissant dans un tuteur, en travaillant dur comme programmeur. :)

Je ne pense pas, Artem.
S'il avait le potentiel d'un programmeur, il n'aurait pas permis l'ambiguïté et l'incertitude.
:)
 
Roman #:

Tu sais ce qui est le plus ennuyeux ? Que tout comportement est trompé en silence, sans avertissement.
Et puis les gens sont blessés. J'en ai marre de ce metatrader.

La conception d'un cycle d'indicateurs est juste empruntée aux anciens jours par la méthode du copier-coller (et de l'autocomplétion tordue) sans réflexion.

tout est simple avec l'interface actuelle :

for(int bar=prev_calculated>0?prev_calculates-1:0 ; bar<rates_total; bar++) {

   int i=rates_total-1; // i используем если обращения как ArraySetSeries(x,true), иначе bar

   ....

}

return rates_total;

le push avec prev_calculated-1 dans ce cas est nécessaire si vous devez recalculer la dernière barre à chaque appel.

 
Maxim Kuznetsov #:

C'est juste que la conception du cycle des indicateurs est issue de la vieille époque du copier-coller (et de l'autocomplétion tordue) sans réflexion.

tout est simple avec l'interface actuelle :

for(int bar=prev_calculated>0?prev_calculates-1:0 ; bar<rates_total; bar++) {

   int i=rates_total-1; // i используем если обращения как ArraySetSeries(x,true), иначе bar

   ....

}

return rates_total;

le crowding avec prev_calculated-1 dans ce cas est nécessaire si vous devez recalculer la dernière barre à chaque appel.

Oui, je me suis un peu emballé avec ma déclaration.
Dès que quelque chose fonctionnait et ne fonctionne plus, les tics nerveux se déclenchent :))
. Vous commencez à tout revérifier et à rejeter la faute sur le crash, en oubliant une particularité dont vous ne vous souvenez pas, bien sûr.
Et le copier-coller est à blâmer. Je pense que beaucoup ont été confrontés à cette situation.

Je voudrais suggérer aux développeurs de créer des modèles personnalisés pour les indicateurs et les EA.
Ils pourront les sélectionner dans l'assistant.

m

Certains éditeurs C/C++ disposent de cette fonctionnalité.
Il est très pratique d'ajouter les modèles de base, avec lesquels vous travaillez principalement, et ensuite vous les chargez dans l'assistant.
Les modèles MQL standard ne sont pas du tout les mêmes.
Évidemment, nous pouvons dire que nous pouvons écrire des modèles et ensuite les copier.
Et nous revenons encore une fois au mot insidieux "copie". Et le fait que nous puissions l'automatiser et faciliter la vie du programmeur n'est pas pris en compte.

 
Roman #:

Oui, c'était une réaction excessive à la déclaration.
Quand quelque chose fonctionnait et ne fonctionne plus, vous avez des tics nerveux ;))
Et vous commencez à tout revérifier, et à rejeter la faute sur quelque chose de cassé, en oubliant une fonctionnalité spécifique dont vous ne vous souvenez pas bien sûr.
Et le copier-coller est à blâmer. Je pense que beaucoup de gens ont vécu cela.

Il n'y avait pas de directive stricte auparavant, donc l'erreur a été ignorée.

Raison: