Erros, bugs, perguntas - página 1986

 
Alexey Kozitsyn:

Há inicialização em OnCalculate() na primeira execução (pré-cálculo == 0). Pensa que mudá-lo para o OnInit() irá mudar alguma coisa? Bem, vou tentar, claro, mas isto é algo fora do reino da fantasia...

Corte. Como disse, em OnDeinit() as matrizes são inicializadas, que já não são utilizadas no próximo arranque (alteração dos parâmetros de entrada). Se isto (inicializando um array que não é utilizado como amortecedor) ajudar - seria também um bug MT. Acontece que não só as matrizes não são utilizadas, como ainda poderiam (não atribuídas) ser inicializadas e isso afectaria o mapeamento...

Sem código é difícil. Diga-nos depois o que diz o balcão de serviço.
 
Anatoli Kazharski:
É difícil sem o código. Depois digam-me o que diz o departamento de serviço.
Assim farei.
 
Anatoli Kazharski:
É difícil sem código. Avise-me aqui mais tarde o que diz o balcão de serviço.

Aqui está o código de teste, se estiver interessado.

Inicialmente, o parâmetro indicador é falso.

Colocamos o indicador no gráfico. Desenha um histograma.

Definimos os parâmetros como verdadeiros.

Desenha o histograma e as setas.

Tornar o parâmetro falso. Nas actuais setas TF desaparecem (nem sempre). Se mudarmos para diferentes TF, as setas aparecem caóticas em algumas delas, apesar dos amortecedores que se libertam na desinicialização.

#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:
Não vai a lado nenhum. Servicedesk #1832411x64, 1643.
 
Alexey Kozitsyn:
Não vai de forma alguma. Balcão de serviço #1832411x64, 1643.

Independentemente de se especificar arrays para as setas como amortecedores, elas continuam a estar ligadas por fios:

#property indicator_plots   3
#property indicator_buffers 4

//---

Em alternativa, se as setas não precisarem de ser exibidas, podem simplesmente ser excluídas da exibição por DRAW_NONE.

Tente desta forma:

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

Independentemente de se especificar arrays para as setas como amortecedores, elas continuam a estar ligadas por fios:

//---

Em alternativa, se as setas não precisarem de ser exibidas, podem simplesmente ser excluídas da exibição por DRAW_NONE.

Experimente esta variante:

Pensei nisso, mas há aqui uma desvantagem. As arrays serão automaticamente marcadas e expandidas, consumindo recursos. É melhor que os criadores deixem o bug ser corrigido.

E que tal ser codificado... Se não ligo os amortecedores às séries gráficas - porque é que vejo algum lixo desconhecido, do qual não me consigo livrar.

Caso contrário, verifica-se que os indicadores dinâmicos não podem ser construídos normalmente.

A opção mais ideal é limpar amortecedores em deinit e é isso. Mas a limpeza não ajuda...

 

Em ME, por favor mostrar ALT+M na lista de funções/métodos o tipo de valor de retorno.

 

Seria bom introduzir uma distinção no tipo de corda, uma vez que é usada noutras línguas para uma corda comum e uma corda "crua". Penso que chegaremos a isto de qualquer forma, mas na fase inicial eliminaria muitos problemas no futuro.

Por exemplo Python usa r "string" para criar uma string "crua
 

Qual é a razão para não se produzirem totalmente os registos no testador? Tudo o que se pode ver foi examinado e verificado, não há melhor que isso.

 
Andrey Dik:

Qual é a razão para os registos não serem totalmente afixados no testador? Tudo o que pode ser examinado - examinado e verificado, não pode ser superado.

Muitas entradas. Ver ficheiro de registo.