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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Alexey Navoykov
4571
Alexey Navoykov  

Отправил заявку в СД по обнаруженному багу.  Прошло 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
Статус: Открыта  Закрыта
Georgiy Merts
9181
Georgiy Merts  

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

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

Alexey Volchanskiy
27267
Alexey Volchanskiy  

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

Alexey Volchanskiy
27267
Alexey Volchanskiy  
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); 
  } 
//+------------------------------------------------------------------+

***

Alexey Navoykov
4571
Alexey Navoykov  

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

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

Налицо явный баг.  Причём в приведённом мной примере вовсе необязательно отключать отображение первой линии именно в таймере. Я просто сделал для наглядности.  А так можно сделать это и в 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);
  }

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

Alexey Navoykov
4571
Alexey Navoykov  
George Merts:

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

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

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

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

Vladimir Karputov
Модератор
182159
Vladimir Karputov  
Alexey Navoykov:

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

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

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

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


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

#property indicator_buffers 2
#property indicator_plots 2

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

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


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

Alexey Navoykov
4571
Alexey Navoykov  
Vladimir Karputov:

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

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

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


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

Покажите мне место в коде, где я пытался изменить эти значения.
Ihor Herasko
21126
Ihor Herasko  
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);

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

Alexey Navoykov
4571
Alexey Navoykov  
Ihor Herasko:

Вот здесь:

Строка:

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


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

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

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

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


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

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

123
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий