Erreurs, bugs, questions - page 1390

 
Renat Fatkhullin:

N'attendez pas dans l'initia la création complète de l 'indicateur.

Créez l'indicateur et le contrôle de retour et tout l'environnement et l'historique seront préparés plus tard et votre code de recalcul sera appelé.

Merci, c'est-à-dire que la vérification du 4806 doit être effectuée chaque fois que des données sont reçues après le retour de OnInit() ?
 
A chaque point de lecture des données
 

C'est ici que l'indicateur est appelé et que ses valeurs sont calculées dans OnCalculate. Vous pouvez attendre indéfiniment, aucun nouveau calcul n'est effectué. Pour fonctionner sur le graphique périodique D1

int i_ich=INVALID_HANDLE;
double ind_buf[];

int OnInit(){
   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);
}


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[]){
   double temp[];
   int copied=CopyBuffer(i_ich,0,0,1,temp);
   if(copied<=0){
      datetime now=TimeLocal();
      while(BarsCalculated(i_ich)<=0 && !IsStopped()){  
         Comment("Ждем пересчета индикатора Ишимоку... ",int(TimeLocal()-now));
      }
      if(BarsCalculated(i_ich)>0){
         Print("Расчитано ", BarsCalculated(i_ich), " баров за ",int(TimeLocal()-now)," секунд");
      }
      Comment("");
   } 

   return(rates_total);
}

Veuillez expliquer pourquoi la lecture Ishimoku n'est pas calculée.

 
Ilya Malev:

C'est ici que l'indicateur est appelé et que ses valeurs sont calculées dans OnCalculate. Vous pouvez attendre indéfiniment, aucun nouveau calcul n'est effectué. Pour fonctionner sur le graphique périodique D1

Veuillez expliquer pourquoi la lecture Ishimoku n'est pas calculée.

Que dites-vous de ça ?

//+------------------------------------------------------------------+
//|                                                      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()
  {
   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);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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;
   Print(count);
   double temp[];
   datetime now=TimeLocal();
   int copied=CopyBuffer(i_ich,0,0,1,temp);
   if(copied>0)
      Print("Расчитано ",BarsCalculated(i_ich)," баров за ",int(TimeLocal()-now)," секунд");
   count++;
   return(rates_total);
  }
//+------------------------------------------------------------------+
?
 

Vous ne devez jamais boucler l'attente dans le code de l'indicateur. Dans les scripts et les conseillers experts, vous pouvez le faire, mais dans les indicateurs, c'est absolument impossible.

La stratégie pour les calculs et les demandes de données externes dans les indicateurs doit être la suivante : si la demande de données n'a pas abouti, on sort immédiatement, en reportant les calculs au prochain tick. Lors du prochain tick/appel, nous essaierons à nouveau de demander les données nécessaires.

 
Karputov Vladimir:

Et si c'est le cas :

?
Sort "0" (comme c'est dimanche, il n'y a pas de redémarrage de OnCalculate )
 
Renat Fatkhullin:

Vous ne devez jamais boucler l'attente dans le code de l'indicateur. Dans les scripts et les conseillers experts, vous pouvez le faire, mais dans les indicateurs, c'est absolument impossible.

La stratégie pour les calculs et les demandes de données externes dans les indicateurs doit être la suivante : si la demande de données n'a pas abouti, on sort immédiatement, en reportant les calculs au prochain tick. Lors du prochain tick/appel, nous essaierons à nouveau de demander les données nécessaires.

D'accord, mais que se passe-t-il si les lectures de l'indicateur doivent être calculées en une seule fois, sans attendre le prochain tick ? Par exemple, s'il y a un week-end ou simplement une période de faible liquidité, lorsque le tick est hors d'une minute ? Utiliser OnTimer au lieu de OnCalculate ?
 
Ilya Malev:
Sort "0" (puisque c'est dimanche, pas de réexécution de OnCalculate ).
Dans le testeur, dans le testeur ! Et le week-end, vous devez cliquer avec le bouton droit de la souris sur le graphique et "Rafraîchir".
 

Après avoir appuyé sur "rafraîchir", tout est calculé. Il serait plus pratique que les données de l'indicateur, créées dans l'inite, soient calculées avant le premier appel de OnCalculate/OnTimer, etc.

Il serait utile d'avoir une possibilité d'attendre leur calcul après l'initialisation dans la boucle à l'intérieur de l'indicateur.

Pour calculer l'indicateur, l'utilisateur doit appuyer plusieurs fois sur "rafraîchir" sur le graphique. En a-t-il besoin ? Il se souviendra du bon vieux MT4 et y restera, malgré certains avantages du MT5.

 
Ilya Malev:

Après avoir appuyé sur "rafraîchir", tout est calculé. Il serait plus pratique que les données de l'indicateur, créées dans l'inite, soient calculées avant le premier appel de OnCalculate/OnTimer, etc.

Il serait utile d'avoir une possibilité d'attendre leur calcul après l'initialisation dans la boucle à l'intérieur de l'indicateur.

Pour calculer l'indicateur, l'utilisateur doit appuyer plusieurs fois sur "rafraîchir" sur le graphique. En a-t-il besoin ? Il se souviendra du bon vieux MT4 et restera avec lui, malgré certains avantages du MT5.

Tout calcul dans les indicateurs DOIT être effectué uniquement dans OnCalculate().
Raison: