почему-то не работает простейший индикатор? - страница 2

 
Да, есть эффект. Сложно сказать в чём дело, возможно буфер всё же рассчитывается, но отображение до прихода тика не делается, нужно в рабочее время проверять. Насчёт Bars и других предопределённых переменных я всё же рекомендовал бы не использовать их в init().
 
lna01:
Да, есть эффект. Сложно сказать в чём дело, возможно буфер всё же рассчитывается, но отображение до прихода тика не делается, нужно в рабочее время проверять. Насчёт Bars и других предопределённых переменных я всё же рекомендовал бы не использовать их в init().


Ну конечно предопределенные переменные нельзя использовать в init(), но значение Bars, как мне кажется, должно расчитываться без проблем в любой момент времени (не уверен, но мне так кажется).

Эффект есть, подождем ответов разработчиков.

 
В init доступна не вся информация об рыночном окружении. Поэтому в init не нужно заниматься рыночными расчетами.

Этот момент многократно обсуждался в форуме.
 
Renat:
В init доступна не вся информация об рыночном окружении. Поэтому в init не нужно заниматься рыночными расчетами.

Этот момент многократно обсуждался в форуме.


С этим все понятно.

Что скажете по существу вопроса?

 
Задайте полный, точный и однозначный вопрос, пожалуйста.
 
Renat:
Задайте полный, точный и однозначный вопрос, пожалуйста.


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

Вопрос: это особенность работы терминала, или глюк?

тестовый индикатор:

//+------------------------------------------------------------------+
//|                                               test_indicator.mq4 |
//|                                                    Павел Смирнов |
//|                                                 www.autoforex.ru |
//+------------------------------------------------------------------+
#property copyright "Павел Смирнов"
#property link      "www.autoforex.ru"
 
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_minimum 0
#property indicator_maximum 10
#property indicator_color1 Red
 
extern int N=5;
double ExtMapBuffer1[];
 
int init()
  {
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,ExtMapBuffer1);
   
   for(int i=0; i<10; i++)
    {
      ExtMapBuffer1[i]=N;
    }
   return(0);
  }
int deinit()
  {
   return(0);
  }
 
int start()
  {  
   ExtMapBuffer1[0]=8;
   return(0);
  }
Спасибо.
 
Вероятно, Вы пропустили точный ответ:
В init доступна не вся информация об рыночном окружении. Поэтому в init не нужно заниматься рыночными расчетами.
Индикатор некорректный, так как в нем нет заполнения данными. В init даже массив ExtMapBuffer (Вы ведь его просто описали, но не выделили под него память - выделением индикаторного буфера занимается сама подсистема MQL4) может быть не распределен (он перераспределяется в момент необходимости расчетов). Моментом необходимости расчетов индикатора является вызов функции start.

Ваш индикатор вообще содержит только одно значение, которое не отрисовывается, так как это просто точка без продолжений. Нормальный индикатор должен содержать примерно такой код (заполняющий всю область индикатора):
int start()
  {
   int counted_bars=IndicatorCounted();
//----
   int limit=Bars-counted_bars;
   if(counted_bars>0) limit++;
   for(int i=0; i<limit; i++)
      ExtMapBuffer[i]=...;   // какое-то вычисление;
//----
   return(0);
  }
 

Хорошо я понял все с init(). Можно было бы об этом поподробней в хелпе рассказать. Заодно и дать определение, какие действия являются рыночными расчетами, чтобы знать.

Вот такая конструкция индикатора тоже не работает, что здесь не так?:

//+------------------------------------------------------------------+
//|                                               test_indicator.mq4 |
//|                                                    Павел Смирнов |
//|                                                 www.autoforex.ru |
//+------------------------------------------------------------------+
#property copyright "Павел Смирнов"
#property link      "www.autoforex.ru"
 
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Red
 
extern int N=5;
double ExtMapBuffer1[];
 
int init()
  {
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,ExtMapBuffer1);
   return(0);
  }
int deinit()
  {
   return(0);
  }
 
int start()
  {  
  for(int i=0; i<Bars; i++)
    {
      ExtMapBuffer1[i]=N;
    }
   return(0);
  }

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

Кстати в хелпе так и сказано, что функция Start() вызывается только по приходу новой котировки. Тогда возникает вопрос, а как же индикатор нанесенный на график будет пересчитан для уже имеющегося графика в офлайн режиме, если котировки больше не поступают?

Спасибо.

 
У меня все нормально отрисовывает:


Как и требовалось - горизонтальная линия со значением 5.

А если изменить индикатор вот так, то получится синусоида:
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Red
#property indicator_minimum -1
#property indicator_maximum  1
 
double ExtMapBuffer1[];
 
int init()
  {
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,ExtMapBuffer1);
   return(0);
  }
int start()
  {  
   for(int i=0; i<Bars; i++) ExtMapBuffer1[i]=MathSin(i);
   return(0);
  }


Кстати в хелпе так и сказано, что функция Start() вызывается только по приходу новой котировки. Тогда возникает вопрос, а как же индикатор нанесенный на график будет пересчитан для уже имеющегося графика в офлайн режиме, если котировки больше не поступают?
У индикатора start() вызывается также при первом наложении и при подгрузке/импорте данных.
 

Renat и все остальные, спасибо, что уделили время для разъяснений.

Все оказалось до банального просто. Все дело в том, что после перекомпилляции индикатора, который находится на графике, не происходит вызова функции start(). Она происходит только по приходу новой котировки или подгрузке истории. У меня, мой простейший индикатор, работал на некоторых графиках, а на некоторых нет. Теперь понимаю, что он работал на тех графиках, которые подгружали историю (дело было в выходной, когда новые котировки не поступали). На остальных же он работал только после удаления его и наложении снова (тут понятно, функция start() запускалось при наложении).

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

Право, это было крайне поучительно.

Спасибо всем, кто откликнулся в этой ветке.

Тему можно закрыть.

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