Erreurs, bugs, questions - page 1986

 
Anatoli Kazharski:
C'est difficile sans le code. Faites-moi savoir ce que le service après-vente dira après.
Je le ferai.
 
Anatoli Kazharski:
C'est difficile sans code. Faites-moi savoir plus tard ce que dit le service d'assistance.

Voici le code de test, si vous êtes intéressé.

Initialement, le paramètre indicateur est faux.

Nous mettons l'indicateur sur le graphique. Il trace un histogramme.

Nous définissons les paramètres comme vrais.

Il dessine l'histogramme et les flèches.

Rendez le paramètre faux. Sur le TF actuel, les flèches disparaissent (pas toujours). Si nous passons à des TF différentes, les flèches apparaissent de manière chaotique dans certaines d'entre elles, malgré la suppression des tampons lors de la désinitialisation.

#property indicator_separate_window
#property indicator_plots 3
#property indicator_buffers 4
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
input bool inpUseArrows=false;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double bufGisto[];
double bufGistoColor[];
double bufArrowUp[];
double bufArrowDn[];
//---
const double EMPTY=EMPTY_VALUE;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Размечаем массив цветов
   color colors[2];
   colors[ 0 ]= clrLime;
   colors[ 1 ] = clrRed;
//--- Устанавливаем параметры графических серий
   SetPlotParametersColorHistogram(0,0,bufGisto,bufGistoColor,false,"test gisto",colors,EMPTY,2);
//--- Проверяем, нужно ли отображать объемы
   if(inpUseArrows) // Если отображать нужно
     {
      SetPlotParametersArrow(1,2,bufArrowUp,false,"test up",EMPTY,clrLime,233,10);
      SetPlotParametersArrow(2,3,bufArrowDn,false,"test dn",EMPTY,clrRed,234,-10);
     }
//---
   IndicatorSetInteger(INDICATOR_DIGITS,0);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   if(inpUseArrows)
     {
      ArrayInitialize(bufArrowUp,EMPTY);
      ArrayInitialize(bufArrowDn,EMPTY);
     }
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
//---
   if(prev_calculated==0)
     {
      ArrayInitialize(bufGisto,EMPTY);
      //---
      if(inpUseArrows)
        {
         ArrayInitialize(bufArrowUp,EMPTY);
         ArrayInitialize(bufArrowDn,EMPTY);
        }
      //---
      for(int i=0; i<rates_total; i++)
        {
         bufGisto[i]=(open[i]-close[i])/_Point;
         bufGistoColor[i]=(bufGisto[i]<0) ? 1 : 0;
         //---
         if(inpUseArrows)
           {
            if(bufGisto[i]>20)
               bufArrowDn[i]=bufGisto[i];
            else if(bufGisto[i]<-20)
               bufArrowUp[i]=bufGisto[i];
           }
        }
     }
   else if(rates_total>prev_calculated)
     {
      bufGisto[rates_total-1]=EMPTY;
      //---
      if(inpUseArrows)
        {
         bufArrowUp[ rates_total-1 ] = EMPTY;
         bufArrowDn[ rates_total-1 ] = EMPTY;
        }
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Параметры графического построения: цветная гист-а от 0 линии                |
//+------------------------------------------------------------------+
void SetPlotParametersColorHistogram(const int plotIndex,// Индекс графической серии
                                     const int bufferNum,// Номер первого буфера серии
                                     double& value[],                              // Буфер значений
                                     double& clr[],                                 // Буфер цветов
                                     const bool asSeries,                           // Флаг нумерации как в таймсерии
                                     const string label,                           // Имя серии
                                     const color& colors[],                        // Цвета линии
                                     const double emptyValue = EMPTY_VALUE,         // Пустые значения серии
                                     const int width = 0,                           // Толщина линии
                                     const ENUM_LINE_STYLE style = STYLE_SOLID,      // Стиль линии
                                     const int drawBegin = 0,                        // Количество баров без отрисовки
                                     const int shift=0                           // Сдвиг построения в барах
                                     )
  {
//--- Привязываем буферы
   SetIndexBuffer(bufferNum,value,INDICATOR_DATA);
   SetIndexBuffer(bufferNum+1,clr,INDICATOR_COLOR_INDEX);
//--- Устанавливаем порядок нумерации в массивах-буферах
   ArraySetAsSeries(value,asSeries);
   ArraySetAsSeries(clr,asSeries);
//--- Устанавливаем тип графического построения
   PlotIndexSetInteger(plotIndex,PLOT_DRAW_TYPE,DRAW_COLOR_HISTOGRAM);
//--- Устанавливаем имя графической серии
   PlotIndexSetString(plotIndex,PLOT_LABEL,label);
//--- Устанавливаем пустые значения в буферах
   PlotIndexSetDouble(plotIndex,PLOT_EMPTY_VALUE,emptyValue);
//--- Устанавливаем количество цветов индикатора
   const int size=ArraySize(colors);
   PlotIndexSetInteger(plotIndex,PLOT_COLOR_INDEXES,size);
//--- Устанавливаем цвета индикатора
   for(int i=0; i<size; i++)
      PlotIndexSetInteger(plotIndex,PLOT_LINE_COLOR,i,colors[i]);
//--- Устанавливаем толщину линии
   PlotIndexSetInteger(plotIndex,PLOT_LINE_WIDTH,width);
//--- Устанавливаем стиль линии
   PlotIndexSetInteger(plotIndex,PLOT_LINE_STYLE,style);
//--- Устанавливаем количество баров без отрисовки и значений в DataWindow
   PlotIndexSetInteger(plotIndex,PLOT_DRAW_BEGIN,drawBegin);
//--- Устанавливаем сдвиг графического построения по оси времени в барах
   PlotIndexSetInteger(plotIndex,PLOT_SHIFT,shift);
  }
//+------------------------------------------------------------------+
//| Параметры графического построения: стрелки                                                          |
//+------------------------------------------------------------------+
void SetPlotParametersArrow(const int plotIndex,// Индекс графической серии
                            const int bufferNum,// Номер первого буфера серии
                            double &value[],// Буфер значений
                            const bool asSeries,// Флаг нумерации как в таймсерии
                            const string label,// Имя серии
                            const double emptyValue=EMPTY_VALUE,// Пустые значения серии
                            const color clr=clrRed,// Цвет стрелок
                            const int arrowCode= 159,// Код стрелок
                            const int arrowShift = 0,// Сдвиг стрелок по вертикали
                            const int width=0,// Толщина стрелок
                            const int drawBegin=0,// Количество баров без отрисовки
                            const int shift=0                     // Сдвиг построения в барах
                            )
  {
//--- Привязываем буферы
   SetIndexBuffer(bufferNum,value,INDICATOR_DATA);
//--- Устанавливаем порядок нумерации в массивах-буферах
   ArraySetAsSeries(value,asSeries);
//--- Устанавливаем тип графического построения
   PlotIndexSetInteger(plotIndex,PLOT_DRAW_TYPE,DRAW_ARROW);
//--- Устанавливаем имя графической серии
   PlotIndexSetString(plotIndex,PLOT_LABEL,label);
//--- Устанавливаем пустые значения в буферах
   PlotIndexSetDouble(plotIndex,PLOT_EMPTY_VALUE,emptyValue);
//--- Устанавливаем цвет индикатора
   PlotIndexSetInteger(plotIndex,PLOT_LINE_COLOR,0,clr);
//--- Устанавливаем код стрелок
   PlotIndexSetInteger(plotIndex,PLOT_ARROW,arrowCode);
//--- Устанавливаем смещение стрелок по вертикали
   PlotIndexSetInteger(plotIndex,PLOT_ARROW_SHIFT,arrowShift);
//--- Устанавливаем толщину стрелок
   PlotIndexSetInteger(plotIndex,PLOT_LINE_WIDTH,width);
//--- Устанавливаем количество баров без отрисовки и значений в DataWindow
   PlotIndexSetInteger(plotIndex,PLOT_DRAW_BEGIN,drawBegin);
//--- Устанавливаем сдвиг графического построения по оси времени в барах
   PlotIndexSetInteger(plotIndex,PLOT_SHIFT,shift);
  }
//+------------------------------------------------------------------+
 
Anatoli Kazharski:
Il ne va nulle part. Servicedesk #1832411x64, 1643.
 
Alexey Kozitsyn:
Ça ne va pas dans tous les sens. Service Desk #1832411x64, 1643.

Que vous spécifiez ou non des tableaux pour les flèches comme tampons, ils sont toujours câblés :

#property indicator_plots   3
#property indicator_buffers 4

//---

Par ailleurs, si les flèches n'ont pas besoin d'être affichées, elles peuvent simplement être exclues de l'affichage par DRAW_NONE.

Essayez de cette façon:

...
//--- Проверяем, нужно ли отображать объемы
   if(inpUseArrows) // Если отображать нужно
     {
      SetPlotParametersArrow(1,2,bufArrowUp,false,"test up",EMPTY,clrLime,233,10);
      SetPlotParametersArrow(2,3,bufArrowDn,false,"test dn",EMPTY,clrRed,234,-10);
     }
   else
     {
      //--- Устанавливаем тип графического построения
      PlotIndexSetInteger(1,PLOT_DRAW_TYPE,DRAW_NONE);
      PlotIndexSetInteger(2,PLOT_DRAW_TYPE,DRAW_NONE);
     }

...

 
Anatoli Kazharski:

Que vous spécifiez ou non des tableaux pour les flèches comme tampons, ils sont toujours câblés :

//---

Par ailleurs, si les flèches n'ont pas besoin d'être affichées, elles peuvent simplement être exclues de l'affichage par DRAW_NONE.

Essayez cette variante:

J'y ai pensé, mais il y a un inconvénient. Les tableaux sont automatiquement marqués et développés, ce qui consomme des ressources. Les développeurs feraient mieux de laisser le bug être corrigé.

Et qu'en est-il du fait d'être codé en dur... Si je ne lie pas les tampons aux séries graphiques, pourquoi est-ce que je vois des déchets inconnus, dont je ne peux pas me débarrasser.

Sinon, il s'avère que les indicateurs dynamiques ne peuvent pas être construits normalement.

L'option la plus idéale est de nettoyer les tampons dans deinit et c'est tout. Mais le nettoyage n'aide pas...

 

En ME, veuillez indiquer ALT+M dans la liste des fonctions/méthodes le type de valeur de retour.

 

Il serait bien d'introduire une distinction sur le type de chaîne tel qu'il est utilisé dans d'autres langues, à savoir une chaîne régulière et une chaîne "brute". Je pense qu'ils y viendront de toute façon, mais au stade initial, cela permettrait d'éliminer de nombreux problèmes à l'avenir.

Par exemple, Python utilise r "string" pour créer une chaîne "brute".
 

Quelle est la raison pour laquelle les journaux ne s'affichent pas complètement dans le testeur ? Tout ce que vous pouvez regarder a été regardé et vérifié, c'est imbattable.

 
Andrey Dik:

Quelle est la raison pour laquelle les journaux ne sont pas entièrement affichés dans le testeur ? Tout ce qui peut être regardé - regardé et vérifié, ne peut pas le vaincre.

Beaucoup d'entrées. Voir le fichier journal.

 
fxsaber:

Beaucoup d'entrées. Voir le fichier journal.

"Beaucoup d'entrées" est un mot fort... La plupart des entrées ne sont tout simplement pas là. Mais la question est de savoir ce qui pourrait empêcher la sortie dans le fichier journal.

Par exemple, un EA qui n'est pas très sophistiqué :

void OnTick ()
{
  Print (TimeCurrent());
}

En mode "ticks réels", il affiche ces logs :

2017.09.05 09:38:56.994 Testeur EURUSD : l'historique des données commence à partir de 2014.07.29 00:00
2017.09.05 09:38:56.996 Tester EURUSD : le téléchargement préliminaire des ticks de l'historique a commencé, cela peut prendre un certain temps.
2017.09.05 09:38:58.001 Testeur EURUSD : téléchargement préliminaire des ticks de l'historique terminé, 35.52 Ko en 0:01.030 (34.48 Ko/sec)
2017.09.05 09:38:58.001 Testeur EURUSD : les données des ticks commencent à partir de 2017.06.01 00:00
2017.09.05 09:38:58.002 Le processus de l'agent Core 1 a été lancé.
2017.09.05 09:38:58.346 Core 1 se connectant à 127.0.0.1:3000
2017.09.05 09:38:58.347 Core 1 connecté
2017.09.05 09:38:58.350 Core 1 autorisé (agent build 1653)
2017.09.05 09:38:58.352 Tester EURUSD,M15 (MetaQuotes-Demo) : test d'experts\Test.ex5 de 2017.08.30 00:00 à 2017.08.31 00:00
2017.09.05 09:38:58.404 Synchronisation commune du noyau 1 terminée
2017.09.05 09:38:58.455 Core 1 EURUSD : ticks déjà synchronisés [43 bytes]
2017.09.05 09:39:04.609 Core 1 2017.08.30 00:36:55 2017.08.30 00:36:55
2017.09.05 09:39:10.760 Core 1 2017.08.30 00:48:27 2017.08.30 00:48:27
2017.09.05 09:39:16.866 Core 1 2017.08.30 01:02:20 2017.08.30 01:02:20
2017.09.05 09:39:22.976 Core 1 2017.08.30 01:24:08 2017.08.30 01:24:08
2017.09.05 09:39:27.668 Core 1 déconnecté
2017.09.05 09:39:27.668 Core 1 connexion fermée
2017.09.05 09:39:27.681 Tester arrêté par l'utilisateur

Cela dit, le testeur est terriblement lent, comme vous pouvez le constater, les sauts se comptent en dizaines de minutes...

Machine sur VPS.