Erreurs, bugs, questions - page 1391

 
Karputov Vladimir:
Tout calcul dans les indicateurs DOIT être effectué uniquement dans OnCalculate().
Je parle des lectures de l'indicateur Ishimoku dans ce cas. Je parle des lectures de l'indicateur qui sont utilisées dans l'indicateur actuel, c'est-à-dire dans OnCalculate. Ils sont donc calculés avant l'appel de OnCalculate, comme c'était le cas dans MT4. Ou bien il serait possible d'attendre leur calcul dans OnCalculate. Sinon, les utilisateurs devront appuyer plusieurs fois sur la touche Update pour construire un indicateur. Comme tous les indicateurs ne sont pas construits sur l'ensemble de l'historique en 1 seconde, il existe des indicateurs complexes qui prennent plus de temps à calculer. Pendant tout ce temps, l'utilisateur devra attendre le bouton "Refresh", alors que dans MT4, il suffit d'attendre qu'il soit dessiné.
 
Ilya Malev:
Je parle des lectures de l'indicateur Ishimoku dans ce cas. Je parle de la lecture des indicateurs qui sont utilisés dans l'actuel, c'est-à-dire OnCalculate. Ils sont donc calculés avant que OnCalculate ne soit appelé, comme c'était le cas dans MT4.
Dans OnInit(), la préparation de l'environnement de trading pour l'indicateur est effectuée. Et seulement dans OnCalculate() vous pouvez utiliser les données de l'indicateur.
 
Ilya Malev:
Je parle des lectures de l'indicateur Ishimoku dans ce cas. Je parle de la lecture des indicateurs qui sont utilisés dans Current, c'est-à-dire dans OnCalculate. Ils sont donc calculés avant l'appel de OnCalculate, comme c'était le cas dans MT4. Ou bien il serait possible d'attendre leur calcul dans OnCalculate. Sinon, les utilisateurs devront appuyer plusieurs fois sur la touche Update pour construire un indicateur. Comme tous les indicateurs ne sont pas construits sur l'ensemble de l'historique en 1 seconde, il existe des indicateurs complexes qui prennent plus de temps à calculer. Pendant tout ce temps, l'utilisateur devra attendre le bouton "Refresh", alors que dans MT4, il suffit d'attendre qu'il soit dessiné.

Ce problème revient de temps en temps sur le forum. Malheureusement, l'appel de OnCalculate() dans OnTimer() ne résout pas le problème.

Mais vous pouvez essayer. Vous trouverez un exemple dans cet article : MQL5 Recipes - Development of a Multicurrency Volatility Indicator in MQL5.

Ensuite, vous pourrez écrire si cela a fonctionné ou non.

 
Karputov Vladimir:
OnInit() prépare l'environnement de trading pour l'indicateur. Et seulement dans OnCalculate() vous pouvez utiliser les données de l'indicateur.
Il s'avère que vous ne pouvez pas, sans appuyer une ou plusieurs fois sur le bouton "Update" du graphique (ou attendre 1/nombre de ticks), si l'indicateur utilise d'autres indicateurs d'autres symboles et/ou tf.
 
Anatoli Kazharski:

Ce problème revient de temps en temps sur le forum. Malheureusement, l'appel de OnCalculate() dans OnTimer() ne résout pas le problème.

Mais vous pouvez essayer. Vous trouverez un exemple dans cet article : MQL5 Recipes - Development of a Multicurrency Volatility Indicator in MQL5.

Ensuite, écrivez si cela a fonctionné ou non, si ce n'est pas trop difficile.

Merci pour le lien. Je vais l'essayer et je vous le ferai savoir.
 
Ilya Malev:
Il s'avère que vous ne pouvez pas, sans appuyer sur le bouton "Update" sur le graphique une ou plusieurs fois (ou attendre 1/quelques ticks), si l'indicateur utilise d'autres indicateurs d'autres symboles et/ou tf.

Et si vous regardez de plus près le fonctionnement du code que j'ai donné ? Et en particulier aux experts ? Après avoir redémarré le terminal pendant le week-end :

2015.10.11 14:44:01.672 test (USDCAD,M5)        0
2015.10.11 14:44:01.681 test (USDCAD,M5)        1
2015.10.11 14:44:01.682 test (USDCAD,M5)        Расчитано 16518 баров за 0 секунд
2015.10.11 14:44:01.705 test (USDCAD,M5)        2
2015.10.11 14:44:01.705 test (USDCAD,M5)        Расчитано 16518 баров за 0 секунд

Il est parfaitement visible que le calcul n'a été effectué que lors du deuxième appel à OnCaalculate(). Ainsi, personne n'enlève la responsabilité du programmeur pour les contrôles : vérifiez le résultat de CopyBuffer() dans OncalCulate() - si la fonction n'a rien retourné, il faut le vérifier à la prochaine entrée dans OnCalculate().

 
Anatoli Kazharski:

Ce problème revient de temps en temps sur le forum. Malheureusement, l'appel de OnCalculate() dans OnTimer() ne résout pas le problème.

Mais vous pouvez essayer. Vous trouverez un exemple dans cet article : MQL5 Recipes - Development of a Multicurrency Volatility Indicator in MQL5.

Veuillez écrire plus tard, si ce n'est pas trop difficile, si cela a fonctionné ou non.

Je n'ai pas encore lu l'article, mais cela fonctionne bien avec OnTimer.

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   0
int i_ich=INVALID_HANDLE;
double ind_buf[];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   EventSetTimer(1);
   i_ich=iIchimoku(Symbol(),PERIOD_H4,9,26,52);
   if(i_ich==INVALID_HANDLE)
     {
      Print("Невозможно создать индиктор Ишимоку!");
      return(INIT_FAILED);
     }
   SetIndexBuffer(0,ind_buf,INDICATOR_DATA);
   ArraySetAsSeries(ind_buf,true);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+

void OnTimer(){
   datetime Arr1[];
   double Arr2[];
   long Arr3[];
   int Arr4[];
   OnCalculate(0, 0, Arr1, Arr2, Arr2, Arr2, Arr2, Arr3, Arr3, Arr4);
}

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   static int count=0;
   static datetime now=0;
   if(now==0)  now=TimeLocal();
   if(count>=0){
      Print(count);
      double temp[];
      int copied=CopyBuffer(i_ich,0,0,1,temp);
      if(copied>0){
         Print("Расчитано ",BarsCalculated(i_ich)," баров за ",int(TimeLocal()-now)," секунд");
         EventKillTimer(); // Индикаторы рассчитались, далее работаем только с OnCalculate
         count=-1;
      }else
         count++;
   }
   if(rates_total==0)   return(0); // Если это вызов из OnTimer, то возврат
   
   // ...
   return(rates_total);
}

J'ai une image étrange qui montre que l'appel de OnCalculate à partir de OnTimer fonctionne). J'ai besoin d'ajouter les valeurs correctes dans les séries chronologiques.

 
Ilya Malev:

Je n'ai pas encore lu l'article, mais la réception avec OnTimer fonctionne bien.

Dans les indicateurs simples, cela fonctionne bien. Mais dans les cas plus complexes, pour une raison quelconque, ça colle parfois. )
 
Ilya Malev:

Je n'ai pas encore lu l'article, mais la réception avec OnTimer fonctionne bien.

Utilisez le Styler - il est meilleur pour identifier les erreurs.

   if(count>=0)
     {
      Print(count);
      double temp[];
      int copied=CopyBuffer(i_ich,0,0,1,temp);
      if(copied>0)
        {
         Print("Расчитано ",BarsCalculated(i_ich)," баров за ",int(TimeLocal()-now)," секунд");
         EventKillTimer(); // Индикаторы рассчитались, далее работаем только с OnCalculate
         count=-1;
        }
      else
         count++;
     }
Augmenter la variable de comptage avant la sortie de OnCalculate() - dans ce cas, cette variable comptera correctement toutes les exécutions dans OnCalculate.
 
Ilya Malev:

...

Quoi qu'il en soit, il est démontré de manière tordue que l'appel de OnCalculate à partir de OnTimer fonctionne).

Nous devons ajouter une transmission de valeur correcte dans les séries chronologiques.

L'article montre justement cet exemple. )

Voici un autre exemple de tests avec la même méthode :MQL5 Recipes - Development of Multicurrency Indicator for Price Divergence Analysis >>>