Как решаются вопросы в сервис-деске

 

Отправил заявку в СД по обнаруженному багу.  Прошло 2.5 недели, никакого ответа не последовало.  Я напомнил о проблеме.  В ответ я услышал какую-то бессмыслицу, да ещё и явно недружелюбной манере.  На мои уточняющие вопросы человек раздражённо сослался на то, что мол он уже кому-то на форуме что-то объяснял (возможно в "Клубе телепатов"), и по хамски закрыл заявку, так и не попытавшись разобраться в проблеме.  

Вот выкладываю переписку здесь.


Версия и битность терминала

1653

Описание проблемы

Ниже приведён код индикатора, рисующего две линии.  Затем отрисовка первой линии отключается в таймере, но при этом и вторая линия тоже пропадает с экрана.

#property indicator_separate_window

#property indicator_buffers 2
#property indicator_plots 2

double Buf0[];
double Buf1[];

//+------------------------------------------------------------------+

int OnInit()
  {
   SetIndexBuffer(0, Buf0);
   ArraySetAsSeries(Buf0, true);
   PlotIndexSetInteger(0, PLOT_DRAW_TYPE, DRAW_LINE);
   PlotIndexSetInteger(0, PLOT_LINE_COLOR, clrRed);

   SetIndexBuffer(1, Buf1);
   ArraySetAsSeries(Buf1, true);
   PlotIndexSetInteger(1, PLOT_DRAW_TYPE, DRAW_LINE);
   PlotIndexSetInteger(1, PLOT_LINE_COLOR, clrYellow);

   EventSetTimer(1);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+

int OnCalculate (const int rates_total, const int prev_calculated, const int begin, const double& price[])
  {
   int count= rates_total - prev_calculated;

   for (int i=count-1; i>=0; i--)
   {
     Buf0[i]= i%3; 
     Buf1[i]= i%3 + 10; 
   }
   return(rates_total);
  }
//+------------------------------------------------------------------+

void OnTimer()
  {
   static datetime time= TimeLocal();
   if (TimeLocal()-time >=4)
     { 
       PlotIndexSetInteger(0, PLOT_DRAW_TYPE, DRAW_NONE);
       ChartRedraw(0);
       Print("Hide line 0");
       time= INT_MAX;
     }
  }

2017.09.09 17:14
Вы можете получить ответ на заявку в Сервисдеске с понедельника по пятницу с 6:30 до 15:30 (GMT). В рабочие дни обычное время ответа не превышает 24 часов. 
Приносим извинения за возможные неудобства.
Support Team 2017.09.11 13:05
Статус: Необработана  Открыта
Ваша заявка принята к рассмотрению.
Alexey Navoykov 2017.09.25 00:00
Будет ли ответ по этой заявке?
Support Team 2017.09.25 09:26

1. Перестаньте путать расчётную часть индикатора и рисовательную часть индикатора

2. Индикаторные буфера не предназначены для динамики. Если не хотите рисовать, прописывайте EMPTY_VALUE.

Alexey Navoykov 2017.09.25 10:00

1.  Как понять "перестаньте"?   И почему вы решили, что я "путаю расчётную часть индикатора и рисовательную часть индикатора" ?

2.  Фраза "Индикаторные буфера не предназначены для динамики"  звучит очень странно.  Как это буфера не предназначены для динамики, если в OnCalculate они заполняются значениями, которые динамически отображаются.    И вообще, при чём здесь буфера, если я веду речь о графических построениях (Plot).  У них без проблем можно менять любые любые свойства, связанные с отображаением (цвет, толщину линий и прочее), используя ту же самую функцию PlotIndexSetInteger.  И все эти изменения динамически отображаются на экране.   В общем перечитайте, пожалуйста, ещё раз моё сообщение.  Складывается впечатление, что вы не поняли о чём речь.

Support Team 2017.09.25 10:02

1. Потому что много раз на форуме MQL5.com уже про это рассказывали.

2. Эта фраза не звучит очень странно. Не путайте заполнение значениями и свойства отображения

Support Team 2017.09.25 10:06

Я прекрасно понял, о чём речь.

Открытым текстом заявляю: "указанное Вами поведение индикатора не является ошибкой".

Всегда имейте в виду ограничения архитектуры. Ради одного-двух-трёх человек со странными запросами мы не будем менять нашу архитектуру.

Слава Стариков.

Support Team 2017.09.25 10:06
Статус: Открыта  Закрыта
 

А что не так ? Вам объяснили, что для того, чтобы "потушить" линию - надо заполнить ее EMPTY_VALUE. Изменять свойства отображения "на лету" не следует.

Что еще непонятно ? И где прям "хамство" ? Вы точно знаете смысл этого слова ?

 

Так а  EMPTY_VALUE ты проверил?

 
George Merts:

А что не так ? Вам объяснили, что для того, чтобы "потушить" линию - надо заполнить ее EMPTY_VALUE. Изменять свойства отображения "на лету" не следует.

Что еще непонятно ? И где прям "хамство" ? Вы точно знаете смысл этого слова ?


Вот тут на лету меняется цвет линии, это из хелпа пример

#property indicator_chart_window 
#property indicator_buffers 2 
#property indicator_plots   1 
//---- plot ColorLine 
#property indicator_label1  "ColorLine" 
#property indicator_type1   DRAW_COLOR_LINE 
#property indicator_color1  clrRed,clrGreen,clrBlue 
#property indicator_style1  STYLE_SOLID 
#property indicator_width1  3 
//--- indicator buffers 
double         ColorLineBuffer[]; 
double         ColorBuffer[]; 
int            MA_handle; 
//+------------------------------------------------------------------+ 
//| Custom indicator initialization function                         | 
//+------------------------------------------------------------------+ 
void OnInit() 
  { 
//--- indicator buffers mapping 
   SetIndexBuffer(0,ColorLineBuffer,INDICATOR_DATA); 
   SetIndexBuffer(1,ColorBuffer,INDICATOR_COLOR_INDEX); 
//--- get MA handle 
   MA_handle=iMA(Symbol(),0,10,0,MODE_EMA,PRICE_CLOSE); 
//--- 
  } 
//+------------------------------------------------------------------+ 
//| get color index                                                  | 
//+------------------------------------------------------------------+ 
int getIndexOfColor(int i) 
  { 
   int j=i%300; 
   if(j<100) return(0);// first index 
   if(j<200) return(1);// second index 
   return(2); // third index 
  } 
//+------------------------------------------------------------------+ 
//| 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[]) 
  { 
//--- 
   static int ticks=0,modified=0; 
   int limit; 
//--- first calculation or number of bars was changed 
   if(prev_calculated==0) 
     { 
      //--- copy values of MA into indicator buffer ColorLineBuffer 
      int copied=CopyBuffer(MA_handle,0,0,rates_total,ColorLineBuffer); 
      if(copied<=0) return(0);// copying failed - throw away 
      //--- now set line color for every bar 
      for(int i=0;i<rates_total;i++) 
         ColorBuffer[i]=getIndexOfColor(i); 
     } 
   else 
     { 
      //--- copy values of MA into indicator buffer ColorLineBuffer 
      int copied=CopyBuffer(MA_handle,0,0,rates_total,ColorLineBuffer); 
      if(copied<=0) return(0);
 
      ticks++;// ticks counting 
      if(ticks>=5)//it's time to change color scheme 
        { 
         ticks=0; // reset counter 
         modified++; // counter of color changes 
         if(modified>=3)modified=0;// reset counter  
         ResetLastError(); 
         switch(modified) 
           { 
            case 0:// first color scheme 
               PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,clrRed); 
               PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,clrBlue); 
               PlotIndexSetInteger(0,PLOT_LINE_COLOR,2,clrGreen); 
               Print("Color scheme "+modified); 
               break; 
            case 1:// second color scheme 
               PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,clrYellow); 
               PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,clrPink); 
               PlotIndexSetInteger(0,PLOT_LINE_COLOR,2,clrLightSlateGray); 
               Print("Color scheme "+modified); 
               break; 
            default:// third color scheme 
               PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,clrLightGoldenrod); 
               PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,clrOrchid); 
               PlotIndexSetInteger(0,PLOT_LINE_COLOR,2,clrLimeGreen); 
               Print("Color scheme "+modified); 
           } 
        } 
      else 
        { 
         //--- set start position 
         limit=prev_calculated-1; 
         //--- now we set line color for every bar 
         for(int i=limit;i<rates_total;i++) 
            ColorBuffer[i]=getIndexOfColor(i); 
        } 
     } 
//--- return value of prev_calculated for next call 
   return(rates_total); 
  } 
//+------------------------------------------------------------------+

***

 

Я не знаю, где, что и кому объяснял этот Слава Стариков,  и почему он решил, что указанное поведение индикатора не является ошибкой, равно как и причём здесь ограничение архитектуры, и прочие его странные заявления без каких либо объяснений.  И правила этикета бы соблюдать не мешало.

Причём здесь заполнение буфера? Речь идёт о свойствах графического построения, а не буферов. 

Налицо явный баг.  Причём в приведённом мной примере вовсе необязательно отключать отображение первой линии именно в таймере. Я просто сделал для наглядности.  А так можно сделать это и в OnInit:

int OnInit()
  {
   SetIndexBuffer(0, Buf0);
   ArraySetAsSeries(Buf0, true);
   PlotIndexSetInteger(0, PLOT_DRAW_TYPE, DRAW_NONE);  // Отключили отображение
   PlotIndexSetInteger(0, PLOT_LINE_COLOR, clrRed);

   SetIndexBuffer(1, Buf1);
   ArraySetAsSeries(Buf1, true);
   PlotIndexSetInteger(1, PLOT_DRAW_TYPE, DRAW_LINE);
   PlotIndexSetInteger(1, PLOT_LINE_COLOR, clrYellow);

   EventSetTimer(1);
   return(INIT_SUCCEEDED);
  }

И на экране не будет ничего видно: ни первой, ни второй линии.   Если же отключить вторую линию, то первая линия будет рисоваться.

 
George Merts:

А что не так ? Вам объяснили, что для того, чтобы "потушить" линию - надо заполнить ее EMPTY_VALUE. Изменять свойства отображения "на лету" не следует.

Что еще непонятно ? И где прям "хамство" ? Вы точно знаете смысл этого слова ?

Речь идёт о графическом построении.  Видимо некоторые путают МТ5 и МТ4.

А хамство - это когда в сервис-деске ответ на обращение начинают со слова "Перестаньте...".  Мы даже не знакомы с этим человеком.  Если у него плохое настроение, то я то тут причём

 
Alexey Navoykov:

Я не знаю, где, что и кому объяснял этот Слава Стариков,  и почему он решил, что указанное поведение индикатора не является ошибкой, равно как и причём здесь ограничение архитектуры, и прочие его странные заявления без каких либо объяснений.  И правила этикета бы соблюдать не мешало.

Причём здесь заполнение буфера? Речь идёт о свойствах графического построения, а не буферов. 

Налицо явный баг.  Причём в приведённом мной примере вовсе необязательно отключать отображение первой линии именно в таймере. Я просто сделал для наглядности.  А так можно сделать это и в OnInit:

И на экране не будет ничего видно.   Если же отключить вторую линию, то первая линия будет рисоваться.


Попробую объяснить то, о чём Вам сказали, но Вы не поняли: эти две строки в шапке

#property indicator_buffers 2
#property indicator_plots 2

являются указаниями для распределения памяти для индикаторных буверов. Эти параметры НЕ МОГУТ быть изменены ниже в коде.

Ключевое слово: "НЕ МОГУТ" - это аналог слов "НЕЛЬЗЯ", "ЗАПРЕЩЕНО".


Надеюсь объяснил очень понятно и доступно.

 
Vladimir Karputov:

Попробую объяснить то, о чём Вам сказали, но Вы не поняли: эти две строки в шапке

являются указаниями для распределения памяти для индикаторных буверов. Эти параметры НЕ МОГУТ быть изменены ниже в коде.

Ключевое слово: "НЕ МОГУТ" - это аналог слов "НЕЛЬЗЯ", "ЗАПРЕЩЕНО".


Надеюсь объяснил очень понятно и доступно.

Покажите мне место в коде, где я пытался изменить эти значения.
 
Alexey Navoykov:
Покажите мне место в коде, где я пытался изменить эти значения.

Вот здесь:

void OnTimer()
  {
   static datetime time= TimeLocal();
   if (TimeLocal()-time >=4)
     { 
       PlotIndexSetInteger(0, PLOT_DRAW_TYPE, DRAW_NONE);
       ChartRedraw(0);
       Print("Hide line 0");
       time= INT_MAX;
     }
  }

Строка:

       PlotIndexSetInteger(0, PLOT_DRAW_TYPE, DRAW_NONE);

изменяет ранее заданное поведение буфера. Один раз назначенный для вывода, он не может быть переназначен. Чтобы убрать показания этого буфера попросту заполните его пустыми значениями.

 
Ihor Herasko:

Вот здесь:

Строка:

изменяет ранее заданное поведение буфера. Один раз назначенный для вывода, он не может быть переназначен. Чтобы убрать показания этого буфера попросту заполните его пустыми значениями.


О боже... Ребята, ну как так можно тупить!  При чём здесь поведение буфера?  Это не МТ4.  Здесь буферы отдельно, графические построения отдельно.  В данном случае я меняю свойство графического построения.  С равным успехом я могу поменять цвет или стиль линии этого построения.  Я ничего не делаю с буфером

 
Alexey Navoykov:
Покажите мне место в коде, где я пытался изменить эти значения.

Вы пытаетесь в OnTimer (который является расчётной частью индикатора) управлять рисовательной частью индикатора.

Выставляя EMPTY_VALUE в буфера индикатора, Вы никак не нарушаете взаимосвязь расчётной и рисовательной частей.


Я специально представился своим именем Слава Стариков в сервис-деске, чтобы было понятно, что Вам напрямую отвечает реальный сотрудник, знакомый с реальным положением вещей, что не было передаточной цепочки в несколько звеньев.

Почему Вы не наезжаете на меня лично, а ставите под сомнение сразу весь сервис-деск?

Причина обращения: