Не могу посчитать индикаторы?

 

Доброго времени суток. 

Открываю новый график с нужным мне таймфреймом. Применяю шаблон. График открывается. Шаблон применяется. Сразу появляются два стандартных нужных мне индикатора в основном окне. Пытаюсь программно посчитать индикаторы на новом графике в основном окне, что бы потом через короткое имя получить хэндлы. Но мне сообщает, что индикаторов нет. А я их вижу. Вроде прописал правильно и все компилируется. Помогите понять, в чем ошибка?

int OnInit()                                                                     // функция инициализации индикатора
  {
   if(SetIndexBuffer(0,firstBuffer,INDICATOR_DATA)==false)                       // связываем динамический массив с индикаторным буфером
   {
    Alert("Ошибка инициализации индикаторного буфера. Ошибка № ",GetLastError());
    return(INIT_FAILED);  
   }
   graf=ChartOpen(_Symbol,PERIOD_H4);                                            // открываю новый график
   if(graf==0)
   {
    Alert("Не удалось открыть новый график. Ошибка № ",GetLastError());
    return(INIT_FAILED);  

   }
   Alert("Хэндл нового графика - ",graf);
   if(ChartApplyTemplate(graf,"BW.tpl")==false)                                  // применяю нужный шаблон
   {
    Alert("Неудачно накинул шаблон на вновь открытый график. Ошибка № ",GetLastError());
    return(INIT_FAILED);  
   }
   Alert("К новому графику успешно применен нужный шаблон.");
   int induk=ChartIndicatorsTotal(graf,0);                                       // считаю количество индикаторов на графике
   if(induk==0)
   {
    Alert("На вновь открытом графике нет индикаторов.");
    return(INIT_FAILED);  
   }
   Alert("На графике вижу ",induk," индикатора.");
   string sname;
   int vertu;
   for(int i=0;i<induk;i++)                                                      // запускаю цикл по количеству найденных индикаторов
   {
    sname=ChartIndicatorName(graf,0,i);                                          // получаю короткое имя индикатора
    vertu=ChartIndicatorGet(graf,0,sname);                                       // получаю хэндл индикатора
    Alert("Короткое имя индикатора - ",sname," хэндл индикатора - ",vertu);
   }
   return(INIT_SUCCEEDED);                                                       // инициализация прошла успешно
  }
 
RedFish:

Доброго времени суток. 

Открываю новый график с нужным мне таймфреймом. Применяю шаблон. График открывается. Шаблон применяется. Сразу появляются два стандартных нужных мне индикатора в основном окне. Пытаюсь программно посчитать индикаторы на новом графике в основном окне, что бы потом через короткое имя получить хэндлы. Но мне сообщает, что индикаторов нет. А я их вижу. Вроде прописал правильно и все компилируется. Помогите понять, в чем ошибка?

Неужели трудно дать код с шапкой? А может это у Вас эксперт? Или все-таки индикатор?
 

Извините. Вот.

//+------------------------------------------------------------------+
//|                                                     Inditest.mq5 |
//+------------------------------------------------------------------+
#property indicator_chart_window                                                 // индикатор в основном окне графика
#property indicator_buffers 1                                                    // для построения индикатора используется один буфер
#property indicator_plots   1                                                    // будет одно графическое построение

#property indicator_label1  "first"                                              // имя индикатора
#property indicator_type1   DRAW_LINE                                            // отрисовка индикатора линией
#property indicator_color1  clrRed                                               // цвет линии красный
#property indicator_style1  STYLE_SOLID                                          // сплошная линия
#property indicator_width1  2                                                    // толщина линии

double firstBuffer[];                                                            // динамический массив под буфер
double bill[];                                                                   // динамический массив под данные старшего аллигатора

int handle;                                                                      // хэндл индикатора аллигатор старшего таймфрейма
datetime lastbar=0;                                                              // временя открытия текущего бара, что бы на нем больше не пересчитывать

long graf;                                                                       // хэндл открываемого графика
//string indicator=IND_ALLIGATOR;



    


int OnInit()                                                                     // функция инициализации индикатора
  {
   if(SetIndexBuffer(0,firstBuffer,INDICATOR_DATA)==false)                       // связываем динамический массив с индикаторным буфером
   {
    Alert("Ошибка инициализации индикаторного буфера. Ошибка № ",GetLastError());
    return(INIT_FAILED);  
   }
   graf=ChartOpen(_Symbol,PERIOD_H4);                                            // открываю новый график
   if(graf==0)
   {
    Alert("Не удалось открыть новый график. Ошибка № ",GetLastError());
    return(INIT_FAILED);  

   }
   Alert("Хэндл нового графика - ",graf);
   if(ChartApplyTemplate(graf,"BW.tpl")==false)                                  // применяю нужный шаблон
   {
    Alert("Неудачно накинул шаблон на вновь открытый график. Ошибка № ",GetLastError());
    return(INIT_FAILED);  
   }
   Alert("К новому графику успешно применен нужный шаблон.");
   int induk=ChartIndicatorsTotal(graf,0);                                       // считаю количество индикаторов на графике
   if(induk==0)
   {
    Alert("На вновь открытом графике нет индикаторов.");
    return(INIT_FAILED);  
   }
   Alert("На графике вижу ",induk," индикатора.");
   string sname;
   int vertu;
   for(int i=0;i<induk;i++)                                                      // запускаю цикл по количеству найденных индикаторов
   {
    sname=ChartIndicatorName(graf,0,i);                                          // получаю короткое имя индикатора
    vertu=ChartIndicatorGet(graf,0,sname);                                       // получаю хэндл индикатора
    Alert("Короткое имя индикатора - ",sname," хэндл индикатора - ",vertu);
   }
   return(INIT_SUCCEEDED);                                                       // инициализация прошла успешно
  }

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[])
{
 if(lastbar==time[rates_total-1])
  return(rates_total);
 ArraySetAsSeries(firstBuffer,true);                                             // устанавливаем индексацию в динамическом массиве, как в таймсерии
 ArraySetAsSeries(bill,true);                                                    // устанавливаем индексацию в динамическом массиве, как в таймсерии
 for(int i=0;i<rates_total;i++)
  CopyLow(Symbol(),Period(),i,1,firstBuffer);
  
 
 
 if(CopyBuffer(handle,0,0,2,bill)<0)
 {
  Alert("Не удалось скопировать старшего Билла. Ошибка - ",GetLastError());
  Alert("Результат Билл 1 = ",NormalizeDouble(bill[0],5),"  Билл 0 =",NormalizeDouble(bill[1],5));
  return(0);
 }
 Alert("Результат Билл 1 = ",NormalizeDouble(bill[0],5),"  Билл 0 =",NormalizeDouble(bill[1],5));
 lastbar=time[rates_total-1];
 return(rates_total);
}
//+------------------------------------------------------------------+
 
RedFish:

Извините. Вот.

У меня этот код работает. Только сообщения о том, что не найдены Биллы :) . Ну и для того, чтобы работало я вставил вместо Вашего "BW.tpl"  свой шаблон.

P.S. 2014.04.23 20:29:05.909 Terminal MetaTrader 5 x64 build 930 started (MetaQuotes Software Corp.) 

 
barabashkakvn:

У меня этот код работает. Только сообщения о том, что не найдены Биллы :) . Ну и для того, чтобы работало я вставил вместо Вашего "BW.tpl"  свой шаблон.

P.S. 2014.04.23 20:29:05.909 Terminal MetaTrader 5 x64 build 930 started (MetaQuotes Software Corp.) 

Проблема с шаблоном? Или целый терминал переустановить? у меня  MetaTrader 5 (не знаю, но думаю 32) build 910

Спасибо за помощь. 

 
Посмотрел код встроенного (стандартного) индикатора и не увидел там метки с установленным коротким именем. Можно переделать его в кустом добавив метку свою. Но почему он не считает их в окне? ... Не пойму.
 
RedFish:

Проблема с шаблоном? Или целый терминал переустановить? у меня  MetaTrader 5 (не знаю, но думаю 32) build 910

Спасибо за помощь. 

Я пользую терминал скачанный с metaquotes.net, в терминале открыл демо-счет на MetaquoteDemo. Раз два в неделю подключаюсь к этому демо-счету и терминал всегда вовремя обновляется.
 
barabashkakvn:
Я пользую терминал скачанный с metaquotes.net, в терминале открыл демо-счет на MetaquoteDemo. Раз два в неделю подключаюсь к этому демо-счету и терминал всегда вовремя обновляется.
У меня терминал от брокера. Я к сожалению так не смогу.
 
RedFish:
У меня терминал от брокера. Я к сожалению так не смогу.
Почему? Никаких ограничений нет. Нужно только знать название сервера и все.
 
RedFish:
У меня терминал от брокера. Я к сожалению так не смогу.

Можете, и все могут:

https://www.mql5.com/ru/forum/14520#comment_625757

Где MetaQuotes-Demo сервер?
Где MetaQuotes-Demo сервер?
  • www.mql5.com
А там, в качестве сервера предлагается только какой то адмирал маркетс с жуткими котировками в виде дневных свечей вместо минуток на давней истории.
 

barabashkakvn и i_logic благодарю.

Я тоже открыл демо и прокачал терминал. Теперь версия, как у barabashkakvn

Сделал скрипт.

#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
 Alert(" ");
 long graf=ChartOpen(_Symbol,PERIOD_H4);                                                  // открываю новый график
 if(graf==0)
 { 
  Alert("Не удалось открыть новый график. Ошибка № ",GetLastError());
  return;
 }
 Alert("Хэндл нового графика - ",graf);
 if(ChartApplyTemplate(graf,"BW.tpl")==false)                                             // применяю нужный шаблон
 {
  Alert("Неудачно накинул шаблон на вновь открытый график. Ошибка № ",GetLastError());
  return;  
 }
 Alert("К новому графику успешно применен нужный шаблон.");
 long lot=0;                                                                              // приемная переменная
 ResetLastError();                                                                        // обнулим ошибочки
 if(ChartGetInteger(graf,CHART_WINDOW_IS_VISIBLE,0,lot)==true)                            // узнаем свойство видимости окна
 {
  Alert("Свойство поддерживается. Окно видно. Значение lot = ",lot);
  return;
 }
 Alert(" Свойство не поддерживается. Ошибка № ",GetLastError()," Значение lot = ",lot);
}

 Работает. Сделал еще и накинул его на график открытый первым скриптом.

#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
 Alert(" ");
 long graf=ChartID();                                                                     // получаю идентификатор графика
 int induk=ChartIndicatorsTotal(graf,0);                                                  // считаю количество индикаторов на графике
 if(induk==0)
 {
  Alert("На вновь открытом графике нет индикаторов.");
  return;  
 }
 Alert("На графике вижу ",induk," индикатора.");
 string sname;
 int vertu;
 for(int i=0;i<induk;i++)                                                                 // запускаю цикл по количеству найденных индикаторов
 {
  sname=ChartIndicatorName(graf,0,i);                                                     // получаю короткое имя индикатора
  vertu=ChartIndicatorGet(graf,0,sname);                                                  // получаю хэндл индикатора
  Alert("Короткое имя индикатора - ",sname," хэндл индикатора - ",vertu);
 }
}

 Чудо! Все заработало (через попу). Но зато подглядел короткие имена индикаторов. Поправил индикатор.

//+------------------------------------------------------------------+
//|                                                     Inditest.mq5 |
//+------------------------------------------------------------------+
#property indicator_chart_window                                                 // индикатор в основном окне графика
#property indicator_buffers 1                                                    // для построения индикатора используется один буфер
#property indicator_plots   1                                                    // будет одно графическое построение

#property indicator_label1  "first"                                              // имя индикатора
#property indicator_type1   DRAW_LINE                                            // отрисовка индикатора линией
#property indicator_color1  clrRed                                               // цвет линии красный
#property indicator_style1  STYLE_SOLID                                          // сплошная линия
#property indicator_width1  2                                                    // толщина линии

double firstBuffer[];

int handle;                                                                      // хэндл индикатора аллигатор старшего таймфрейма
datetime lastbar=0;                                                              // временя открытия текущего бара, что бы на нем больше не пересчитывать
const string sname="Alligator(13,8,5)";                                          // подсмотренное короткое имя
long graf;                                                                       // хэндл открываемого графика

int OnInit()                                                                     // функция инициализации индикатора
  {
   Alert(" ");
   if(SetIndexBuffer(0,firstBuffer,INDICATOR_DATA)==false)                       // связываем динамический массив с индикаторным буфером
   {
    Alert("Ошибка инициализации индикаторного буфера. Ошибка № ",GetLastError());
    return(INIT_FAILED);  
   }
   graf=ChartOpen(_Symbol,PERIOD_H4);                                            // открываю новый график
   if(graf==0)
   {
    Alert("Не удалось открыть новый график. Ошибка № ",GetLastError());
    return(INIT_FAILED);  

   }
   Alert("Идентификатор нового графика - ",graf);
   if(ChartApplyTemplate(graf,"BW.tpl")==false)                                  // применяю нужный шаблон
   {
    Alert("Неудачно накинул шаблон на вновь открытый график. Ошибка № ",GetLastError());
    return(INIT_FAILED);  
   }
   Alert("К новому графику успешно применен нужный шаблон.");
   handle=ChartIndicatorGet(graf,0,sname);                                       // получаю хэндл по короткому имени
   Alert(" Хэндл вновь открытого окна - ",handle);   
   return(INIT_SUCCEEDED);                                                       // инициализация прошла успешно
  }

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[])
{
 if(lastbar==time[rates_total-1])
  return(rates_total);
 ArraySetAsSeries(firstBuffer,true);                                             // устанавливаем индексацию в динамическом массиве, как в таймсерии
 //ArraySetAsSeries(bill,true);                                                    // устанавливаем индексацию в динамическом массиве, как в таймсерии
 for(int i=0;i<rates_total;i++)
  CopyLow(Symbol(),Period(),i,1,firstBuffer);
  
 
 
 /*if(CopyBuffer(handle,0,0,2,bill)<0)
 {
  Alert("Не удалось скопировать старшего Билла. Ошибка - ",GetLastError());
  Alert("Результат Билл 1 = ",NormalizeDouble(bill[0],5),"  Билл 0 =",NormalizeDouble(bill[1],5));
  return(0);
 }
 Alert("Результат Билл 1 = ",NormalizeDouble(bill[0],5),"  Билл 0 =",NormalizeDouble(bill[1],5));*/
 lastbar=time[rates_total-1];
 return(rates_total);
}
//+------------------------------------------------------------------+

 И ни фига не могу получить хэндл индикатора на вновь открываемом окне. Просто недоумеваю ПОЧЕМУ? Весь день документацию учил ))

Первый прикрепленный это по очереди скрипты, второй индикатор. 

Файлы:
Alert.jpg  103 kb
MQDemo.jpg  67 kb
Причина обращения: