Fehler, Irrtümer, Fragen - Seite 1986

 
Alexey Kozitsyn:

In OnCalculate() findet beim ersten Durchlauf eine Initialisierung statt (prev_calculated == 0). Glauben Sie, dass das Verschieben zu OnInit() etwas ändern wird? Nun, ich werde es natürlich versuchen, aber das ist etwas außerhalb des Bereichs der Fantasie...

Schnitt. Wie gesagt, in OnDeinit() werden Arrays initialisiert, die beim nächsten Start nicht mehr verwendet werden (Änderung der Eingabeparameter). Wenn dies (Initialisierung eines Arrays, das nicht als Puffer verwendet wird) hilft - es wäre auch ein MT-Fehler. Es würde sich herausstellen, dass nicht nur die Arrays nicht verwendet werden, aber sie (nicht zugewiesen) könnte noch initialisiert werden und es würde die Zuordnung beeinflussen...

Ohne Code ist das schwierig. Lassen Sie uns wissen, was der Service Desk danach sagt.
 
Anatoli Kazharski:
Ohne den Code ist das schwierig. Lassen Sie mich wissen, was der Kundendienst danach sagt.
Das werde ich.
 
Anatoli Kazharski:
Ohne Code ist das schwierig. Lassen Sie mich später hier wissen, was der Kundendienst sagt.

Hier ist der Testcode, falls Sie daran interessiert sind.

Zu Beginn ist der Indikatorparameter falsch.

Wir setzen den Indikator auf das Diagramm. Es wird ein Histogramm gezeichnet.

Wir setzen die Parameter auf true.

Es zeichnet das Histogramm und die Pfeile.

Machen Sie den Parameter falsch. Auf der aktuellen TF verschwinden die Pfeile (nicht immer). Wenn wir zu verschiedenen TFs wechseln, erscheinen die Pfeile in einigen von ihnen chaotisch, obwohl die Puffer bei der Deinitialisierung gelöscht werden.

#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:
Sie wird nicht verschwinden. Servicedesk #1832411x64, 1643.
 
Alexey Kozitsyn:
Es geht nicht in irgendeine Richtung. Service Desk #1832411x64, 1643.

Unabhängig davon, ob Sie Arrays für die Pfeile als Puffer angeben, sind sie immer noch fest verdrahtet:

#property indicator_plots   3
#property indicator_buffers 4

//---

Wenn Pfeile nicht angezeigt werden müssen, können sie auch einfach durch DRAW_NONE von der Anzeige ausgeschlossen werden.

Versuchen Sie es auf diese Weise:

...
//--- Проверяем, нужно ли отображать объемы
   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:

Unabhängig davon, ob Sie Arrays für die Pfeile als Puffer angeben, sind sie immer noch fest verdrahtet:

//---

Wenn Pfeile nicht angezeigt werden müssen, können sie auch einfach durch DRAW_NONE von der Anzeige ausgeschlossen werden.

Versuchen Sie diese Variante:

Ich habe darüber nachgedacht, aber es gibt hier einen Nachteil. Arrays werden automatisch markiert und erweitert, wodurch Ressourcen verbraucht werden. Die Entwickler sollten den Fehler besser beheben lassen.

Und was ist mit der Hardcodierung... Wenn ich keine Puffer an grafische Reihen binde, warum sehe ich dann irgendeinen unbekannten Müll, den ich nicht loswerden kann?

Andernfalls können dynamische Indikatoren nicht normal erstellt werden.

Am besten ist es, die Puffer in Deinit zu reinigen und das war's. Aber Aufräumen hilft nicht...

 

In ME zeigen Sie bitte ALT+M in der Liste der Funktionen/Methoden den Typ des Rückgabewerts an.

 

Es wäre schön, eine Unterscheidung des Stringtyps, wie er in anderen Sprachen verwendet wird, in eine reguläre und eine "rohe" Zeichenkette einzuführen. Ich denke, sie werden sowieso dazu kommen, aber in der Anfangsphase würde dies viele Probleme in der Zukunft beseitigen.

Python verwendet zum Beispiel r "string", um eine "rohe" Zeichenkette zu erstellen
 

Was ist der Grund dafür, dass die Protokolle im Tester nicht vollständig ausgegeben werden? Alles, was Sie sich ansehen können, wurde geprüft und kontrolliert, das ist unschlagbar.

 
Andrey Dik:

Was ist der Grund dafür, dass die Protokolle im Prüfprogramm nicht vollständig angezeigt werden? Alles, was man sich anschauen kann - anschauen und überprüfen, kann es nicht besiegen.

Eine Menge Einträge. Siehe Protokolldatei.

Grund der Beschwerde: