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

 

Давно я не писал индикаторы, потому может чего забыл, но простейшая конструкция не работает:

//+------------------------------------------------------------------+
//|                                               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
//---- buffers
double ExtMapBuffer1[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,ExtMapBuffer1);
   for(int i=0; i<Bars; i++)
   {
    ExtMapBuffer1[i]=5;
   }
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {  
//----
//----
   return(0);
  }
//+------------------------------------------------------------------+
Подскажите почему?
 
Во-первых, отсутствует вызов IndicatorBuffers

Во-вторых, процесс регистрации (т.е. внутренней инициализации в терминале) индикаторных буферов, насколько я заметил, асинхронный. Инициализация буфера непосредственно после регистрации при загрузке индикатора не работает. При переинициализации без перезагрузки - работает.

Перенесите инициализацию в start(), должна сработать по первому же тику.
 
autoforex:

Давно я не писал индикаторы, потому может чего забыл, но простейшая конструкция не работает:

//+------------------------------------------------------------------+
//|                                               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
//---- buffers
double ExtMapBuffer1[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,ExtMapBuffer1);
   for(int i=0; i<Bars; i++)
   {
    ExtMapBuffer1[i]=5;
   }
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {  
//----
//----
   return(0);
  }
//+------------------------------------------------------------------+
Подскажите почему?
//+------------------------------------------------------------------+
//|                                               test_indicator.mq4 |
//|                                                    Павел Смирнов |
//|                                                 www.autoforex.ru |
//+------------------------------------------------------------------+
#property copyright "Павел Смирнов"
#property link      "www.autoforex.ru"
 
#property indicator_separate_window
#property indicator_minimum 0
#property indicator_maximum 6
#property  indicator_buffers 1
#property  indicator_color1  Red
 
 
 
 
//---- buffers
double ExtMapBuffer1[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   IndicatorBuffers(1);
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
  
   SetIndexBuffer(0,ExtMapBuffer1);
   IndicatorShortName("Мега индикатор!");
   
//----
   return(0);
  }
 
int start()
  {  
//----
 for(int i=0; i<Bars; i++)
   {
    ExtMapBuffer1[i]=5;
   }
//----
   return(0);
  }
//+------------------------------------------------------------------+

Вот так, все работает!

 
Irtron:
Во-первых, отсутствует вызов IndicatorBuffers

Перенесите инициализацию в start(), должна сработать по первому же тику.

Зачем здесь использовать IndicatorBuffers ???

 

Вот выдержка из инструкции:

Сразу же после присоединения к графику программа начинает работу с функции init(). Функция init() присоединенного к графику советника или пользовательского индикатора запускается также сразу после старта клиентского терминала и подгрузки (это касается только советников и не касается индикаторов) исторических данных, после смены финансового инструмента и/или периода графика, после перекомпиляции программы в редакторе MetaEditor, после смены входных параметров из окна настройки эксперта или пользовательского индикатора. Советник также инициализируется после смены счёта

Т.е. в момент перекомпилляции должна бы запустится функция init() индикатора, но этого не происходит. Или же есть какие-то нюансы.

Неужели нельзя из фунуции init() построить индикатор?

 

Насколько я понял функция start() все-же вызывается после перекомпилляции индикатора. Почему-то об этом нигде не сказано (может не нашел просто)?

 

Вот такая конструкция:

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

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

или же использовать в программе строки:

#property indicator_minimum 0
#property indicator_maximum 10

а такая конструкция не работает вообще:

//+------------------------------------------------------------------+
//|                                               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);
   
   for(int i=0; i<Bars; i++)
    {
      ExtMapBuffer1[i]=N;
    }
   return(0);
  }
int deinit()
  {
   return(0);
  }
 
int start()
  {  
   return(0);
  }
Спасибо
 

Ну все, кажись дошло. Глюк это или так и должно быть (по-мне дак это глюк, который требуется исправить или внести изменения в описание).

Вот такая вот конструкция работает так, как и должна работать:

//+------------------------------------------------------------------+
//|                                               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);
   
   for(int i=0; i<Bars; i++)
    {
      ExtMapBuffer1[i]=N;
    }
   return(0);
  }
int deinit()
  {
   return(0);
  }
 
int start()
  {  
   ExtMapBuffer1[0]=8;
   return(0);
  }

Т.е. различие с неработающей версией лишь в наличии одной строчки

ExtMapBuffer1[0]=8;

в функции start(). Уберите ее и начнутся глюки.

Хотя щас заметил еще один глюк - при нанесении этого индикатора на график (не указывая максимальное и минимальное значения для индикатора) ничего не выводится в окне индикатора, но стоит только перекомпилировать его , как все замечательно работает.

Спасибо.

 
Такое ощущение, что, во всех случаях приведенных выше, проблема в правильном определении максимального и минимального значений индикатора.
 
При выполнении init() не гарантируются значения предопределённых переменных. Реально по моим наблюдениям они иногда определены, иногда нет, зависит от предыстории действий в терминале. В данном случае делается попытка использовать в init() Bars и дело именно в этом.
 
lna01:
При выполнении init() не гарантируются значения предопределённых переменных. Реально по моим наблюдениям они иногда определены, иногда нет, зависит от предыстории действий в терминале. В данном случае делается попытка использовать в init() Bars и дело именно в этом.


Нет не в этом.

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

тестовый эксперт:

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