А что не так ? Вам объяснили, что для того, чтобы "потушить" линию - надо заполнить ее EMPTY_VALUE. Изменять свойства отображения "на лету" не следует.
Что еще непонятно ? И где прям "хамство" ? Вы точно знаете смысл этого слова ?
Так а EMPTY_VALUE ты проверил?
А что не так ? Вам объяснили, что для того, чтобы "потушить" линию - надо заполнить ее 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); }
И на экране не будет ничего видно: ни первой, ни второй линии. Если же отключить вторую линию, то первая линия будет рисоваться.
А что не так ? Вам объяснили, что для того, чтобы "потушить" линию - надо заполнить ее EMPTY_VALUE. Изменять свойства отображения "на лету" не следует.
Что еще непонятно ? И где прям "хамство" ? Вы точно знаете смысл этого слова ?
Речь идёт о графическом построении. Видимо некоторые путают МТ5 и МТ4.
А хамство - это когда в сервис-деске ответ на обращение начинают со слова "Перестаньте...". Мы даже не знакомы с этим человеком. Если у него плохое настроение, то я то тут причём
Я не знаю, где, что и кому объяснял этот Слава Стариков, и почему он решил, что указанное поведение индикатора не является ошибкой, равно как и причём здесь ограничение архитектуры, и прочие его странные заявления без каких либо объяснений. И правила этикета бы соблюдать не мешало.
Причём здесь заполнение буфера? Речь идёт о свойствах графического построения, а не буферов.
Налицо явный баг. Причём в приведённом мной примере вовсе необязательно отключать отображение первой линии именно в таймере. Я просто сделал для наглядности. А так можно сделать это и в OnInit:
И на экране не будет ничего видно. Если же отключить вторую линию, то первая линия будет рисоваться.
Попробую объяснить то, о чём Вам сказали, но Вы не поняли: эти две строки в шапке
#property indicator_buffers 2 #property indicator_plots 2
являются указаниями для распределения памяти для индикаторных буверов. Эти параметры НЕ МОГУТ быть изменены ниже в коде.
Ключевое слово: "НЕ МОГУТ" - это аналог слов "НЕЛЬЗЯ", "ЗАПРЕЩЕНО".
Надеюсь объяснил очень понятно и доступно.
Попробую объяснить то, о чём Вам сказали, но Вы не поняли: эти две строки в шапке
являются указаниями для распределения памяти для индикаторных буверов. Эти параметры НЕ МОГУТ быть изменены ниже в коде.
Ключевое слово: "НЕ МОГУТ" - это аналог слов "НЕЛЬЗЯ", "ЗАПРЕЩЕНО".
Надеюсь объяснил очень понятно и доступно.
Покажите мне место в коде, где я пытался изменить эти значения.
Вот здесь:
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);
изменяет ранее заданное поведение буфера. Один раз назначенный для вывода, он не может быть переназначен. Чтобы убрать показания этого буфера попросту заполните его пустыми значениями.
Вот здесь:
Строка:
изменяет ранее заданное поведение буфера. Один раз назначенный для вывода, он не может быть переназначен. Чтобы убрать показания этого буфера попросту заполните его пустыми значениями.
О боже... Ребята, ну как так можно тупить! При чём здесь поведение буфера? Это не МТ4. Здесь буферы отдельно, графические построения отдельно. В данном случае я меняю свойство графического построения. С равным успехом я могу поменять цвет или стиль линии этого построения. Я ничего не делаю с буфером
Покажите мне место в коде, где я пытался изменить эти значения.
Вы пытаетесь в OnTimer (который является расчётной частью индикатора) управлять рисовательной частью индикатора.
Выставляя EMPTY_VALUE в буфера индикатора, Вы никак не нарушаете взаимосвязь расчётной и рисовательной частей.
Я специально представился своим именем Слава Стариков в сервис-деске, чтобы было понятно, что Вам напрямую отвечает реальный сотрудник, знакомый с реальным положением вещей, что не было передаточной цепочки в несколько звеньев.
Почему Вы не наезжаете на меня лично, а ставите под сомнение сразу весь сервис-деск?
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Отправил заявку в СД по обнаруженному багу. Прошло 2.5 недели, никакого ответа не последовало. Я напомнил о проблеме. В ответ я услышал какую-то бессмыслицу, да ещё и явно недружелюбной манере. На мои уточняющие вопросы человек раздражённо сослался на то, что мол он уже кому-то на форуме что-то объяснял (возможно в "Клубе телепатов"), и по хамски закрыл заявку, так и не попытавшись разобраться в проблеме.
Вот выкладываю переписку здесь.
Версия и битность терминала
1653
Описание проблемы
Ниже приведён код индикатора, рисующего две линии. Затем отрисовка первой линии отключается в таймере, но при этом и вторая линия тоже пропадает с экрана.
Приносим извинения за возможные неудобства.
1. Перестаньте путать расчётную часть индикатора и рисовательную часть индикатора
2. Индикаторные буфера не предназначены для динамики. Если не хотите рисовать, прописывайте EMPTY_VALUE.
1. Как понять "перестаньте"? И почему вы решили, что я "путаю расчётную часть индикатора и рисовательную часть индикатора" ?
2. Фраза "Индикаторные буфера не предназначены для динамики" звучит очень странно. Как это буфера не предназначены для динамики, если в OnCalculate они заполняются значениями, которые динамически отображаются. И вообще, при чём здесь буфера, если я веду речь о графических построениях (Plot). У них без проблем можно менять любые любые свойства, связанные с отображаением (цвет, толщину линий и прочее), используя ту же самую функцию PlotIndexSetInteger. И все эти изменения динамически отображаются на экране. В общем перечитайте, пожалуйста, ещё раз моё сообщение. Складывается впечатление, что вы не поняли о чём речь.
1. Потому что много раз на форуме MQL5.com уже про это рассказывали.
2. Эта фраза не звучит очень странно. Не путайте заполнение значениями и свойства отображения
Я прекрасно понял, о чём речь.
Открытым текстом заявляю: "указанное Вами поведение индикатора не является ошибкой".
Всегда имейте в виду ограничения архитектуры. Ради одного-двух-трёх человек со странными запросами мы не будем менять нашу архитектуру.
Слава Стариков.