Erreurs, bugs, questions - page 1343

 
Karputov Vladimir:
L'indicateur est toujours dessiné comme il l'est dans le terminal. Peut-être que dans le testeur, vous devez essayer plusieurs modes (tous les ticks, les prix mathématiques, etc.).
J'ai essayé "Tous les ticks", "OHLC sur M1", "Prix d'ouverture seulement". Le résultat est le même - l'indicateur est redessiné. L'option"Calculs mathématiques" n'est pas active, non disponible.
 
StrategyTester:
J'ai essayé "Tous les ticks", "OHLC sur M1", "Prix d'ouverture uniquement". Le résultat est le même - l'indicateur se redessine. L'option"Calculs mathématiques" n'est pas active, non disponible.
Dans ce cas, veuillez me fournir le code.
 

Question aux développeurs : Dans quelles conditions l'historique du symbole est-il considéré comme non synchronisé, c'est-à-dire que SeriesInfoInteger(symbol, period, SERIES_SYNCHRONIZED) renvoie false ?

Le problème est que je rencontre parfois une situation où des valeurs fausses sont renvoyées pour un certain symbole dans toutes les périodes, même s'il existe un historique pour ce symbole (les barres et autres fonctions renvoient des valeurs non nulles). Quelle peut en être la raison ?

 

Il y a aussi un tel problème. Lors de la lecture de l'historique de plusieurs symboles / timeframes dans l'indicateur via CopyTime, CopyClose, etc. l'indicateur clignote souvent.Ce n'est pas le résultat d'un rendu (il n'y a pas de recalcul des barres), mais simplement l'image entière disparaît pendant une fraction de seconde, puis réapparaît. Et parfois pas pendant des fractions, mais pendant des secondes entières. Généralement, cela est observé pendant le défilement du graphique. Si la série temporelle demandée est petite, le problème ne se pose pas.

J'aimerais entendre le commentaire des développeurs sur la façon dont cela peut être lié.

 
Karputov Vladimir:
Dans ce cas, veuillez fournir le code.

Je joins une illustration des différences entre le terminal et le testeur et le code de l'indicateur.

//+------------------------------------------------------------------+
//|                                             Indicator1_6test.mq5 |
//+------------------------------------------------------------------+
#property copyright ""
#property link      ""
#property version   "1.6"
#property indicator_separate_window
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots 2
#property  indicator_color1 SkyBlue
#property  indicator_color2 Yellow
#property  indicator_type1 DRAW_LINE
#property  indicator_type2 DRAW_LINE
//---
enum TT{_close=0,_open=1,_high=2,_low=3};
//---
input string activ1="GBPUSD",activ2="EURUSD";
input TT PriceType=_close;
input int Len=100;
//---
double ratio[],avr[];string NN[]={"rr1","rr2","aa1","aa2"};
//---
void setv(int i,double v){ObjectSetDouble(0,NN[i],OBJPROP_PRICE,v);}
//---
int OnInit()
{
   SetIndexBuffer(0,ratio);
   PlotIndexSetString(0,PLOT_LABEL,"Ratio");
   SetIndexBuffer(1,avr);
   PlotIndexSetString(1,PLOT_LABEL,"Avr");
   ArraySetAsSeries(ratio,1);
   ArraySetAsSeries(avr,1);
   for(int i=0;i<4;i++)ObjectCreate(0,NN[i],22,0,0,0);
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[])
{
int limit=0;double zz[4];

  if(prev_calculated==0){limit=MathMin(Bars(activ1,0),Bars(activ2,0));limit--;}
  else limit=rates_total-prev_calculated;
  if(limit==0)limit=1;
  double Price1[],Price2[]; ArraySetAsSeries(Price1,1); ArraySetAsSeries(Price2,1);
  getV(Price1,Price2,limit);
  for(int i=0;i<limit;i++){if(Price1[i]>0&&Price2[i]>0)ratio[i]=Price1[i]/Price2[i];else ratio[i]=ratio[i+1];}
  
  double sred=0,sum=0; 
  for(int i=0;i<limit;i++)
      {
      sred=0;
      avr[i]=SimpleMA(i,Len,ratio);
      
      for(int j=i;j<i+Len;j++)
        {
        if(j>=ArraySize(ratio))break;
      if(ratio[j]==0||ratio[j]==EMPTY_VALUE){sred=0;break;}
      sred=1;
        }
      }
      
  if(prev_calculated!=0)for(int i=0;i<10;i++)if(ratio[i]==0)ratio[i]=ratio[i+1];
  
zz[0]=ratio[1];zz[1]=ratio[2]; zz[2]=avr[1];zz[3]=avr[2];
for(int i=0;i<4;i++)setv(i,zz[i]);
return(rates_total);
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void getV(double&Price1[],double&Price2[],int limit)
{
if(PriceType==_close){CopyClose(activ1,PERIOD_CURRENT,0,limit,Price1);CopyClose(activ2,PERIOD_CURRENT,0,limit,Price2);}
if(PriceType==_open){CopyOpen(activ1,PERIOD_CURRENT,0,limit,Price1);CopyOpen(activ2,PERIOD_CURRENT,0,limit,Price2);}
if(PriceType==_high){CopyHigh(activ1,PERIOD_CURRENT,0,limit,Price1);CopyHigh(activ2,PERIOD_CURRENT,0,limit,Price2);}
if(PriceType==_low){CopyLow(activ1,PERIOD_CURRENT,0,limit,Price1);CopyLow(activ2,PERIOD_CURRENT,0,limit,Price2);}
}
//---
double SimpleMA(const int position,const int period,const double &price[])
  {
//---
   double result=0.0;
//--- check position
      //--- calculate value
      if(position+period+1>ArraySize(price))return(0);
      for(int i=0; i<period; i++) result+=price[position+i];
      result/=period;
   return(result);
  }
//---
 

En général, avec les fonctions

Copy

ont d'autres problèmes,

Je suis tombé sur le fait que lorsque cette fonction est appelée, elle peut "geler" l'EA, j'ai écrit un programme utilisant un grand nombre de symboles et j'ai fait des calculs sur l'historique pour littéralement les 3 derniers jours sur chaque symbole,

Il m'est arrivé d'avoir des moments où tout se bloquait pendant quelques minutes, j'ai eu du mal à comprendre qu'il s'agissait de la fonction Copie. La fonction pouvait gérer sans problème 150-200 symboles, puis se bloquait, se bloquait sur différents symboles ...

Le temps de suspension varie de 5 secondes à 2-3 minutes...

 
Les fonctions de copie dans les EA sont synchrones et prévoient la pagination des données si elles ne sont pas disponibles.
 
StrategyTester:

Je joins une illustration des différences entre le terminal et le testeur et le code de l'indicateur.

Il y a une erreur dans la fonction :

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void getV(double&Price1[],double&Price2[],int limit)
  {
   if(PriceType==_close)
     {
      CopyClose(activ1,PERIOD_CURRENT,0,limit,Price1);
      CopyClose(activ2,PERIOD_CURRENT,0,limit,Price2);
     }
   if(PriceType==_open)
     {
      CopyOpen(activ1,PERIOD_CURRENT,0,limit,Price1);
      CopyOpen(activ2,PERIOD_CURRENT,0,limit,Price2);
     }
   if(PriceType==_high)
     {
      CopyHigh(activ1,PERIOD_CURRENT,0,limit,Price1);
      CopyHigh(activ2,PERIOD_CURRENT,0,limit,Price2);
     }
   if(PriceType==_low)
     {
      CopyLow(activ1,PERIOD_CURRENT,0,limit,Price1);
      CopyLow(activ2,PERIOD_CURRENT,0,limit,Price2);
     }
  }

Vous essayez de copier les données d'un autre symbole à la hâte. Vous ne devriez pas faire ça. Les données doivent d'abord être téléchargées, préparées et vérifiées... Voici la description :Organisation de l'accès aux données

 
Karputov Vladimir:

Il y a une erreur dans la fonction :

Vous essayez de copier les données d'un autre personnage dans la précipitation. Ce n'est pas la façon de faire. Il faut d'abord charger les données, les préparer, s'assurer... Voici la description :Organiser l'accès aux données

Merci pour le conseil. J'y jetterai un coup d'œil.
 
Un bogue est apparu avec les objets graphiques depuis une certaine version : si ObjectMove est appelé pendant que l'on fait glisser un objet avec la souris, il renvoie toujours true, même s'il ne déplace pas réellement l'objet (et ne peut pas le déplacer du tout, puisque l'utilisateur tient l'objet). Auparavant, tout allait bien, il renvoyait false, et vous pouviez toujours dire si l'objet était en train d'être déplacé ou non.