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

 

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

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

В общем после применения шаблона нужно дать немного времени графику, для того чтобы инициализировались и рассчитались индикаторы.

Задержка времени в индикаторах запрещена - так как индикатор работает в едином потоке. Значит задержку можно делать только в советнике или скрипте.

Вот немного урезанная версия индикатора - скрипт только добавляет шаблон и выводит в принт первый индикатор из шаблона:

//+------------------------------------------------------------------+
//|                                                  test_script.mq5 |
//|                              Copyright © 2014, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2014, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   int handle;                               // хэндл индикатора аллигатор старшего таймфрейма
   string sname="Alligator(13,8,5)";   // подсмотренное короткое имя
   long graf;                                // хэндл открываемого графика
   Alert(" ");
   graf=ChartOpen(_Symbol,PERIOD_H4);     // открываю новый график
   if(graf==0)
     {
      Alert("Не удалось открыть новый график. Ошибка № ",GetLastError());
      return;
     }
   Alert("Идентификатор нового графика - ",graf);
   ResetLastError();
   if(!ChartApplyTemplate(graf,"BW.tpl")) // применяю нужный шаблон
     {
      Alert("Неудачно накинул шаблон на вновь открытый график. Ошибка № ",GetLastError());
      return;
     }
   Print("Error ",GetLastError());
   Alert("К новому графику успешно применен нужный шаблон.");
   Sleep(2000);
   Print("На графике ",graf," ",ChartIndicatorsTotal(graf,0)," индикаторов");
   sname=ChartIndicatorName(
                            graf,   // идентификатор графика
                            0,      // номер подокна
                            0       // индекс индикатора в списке индикаторов, добавленных к данному подокну графика
                            );
   Print("sname ",sname);
   handle=ChartIndicatorGet(graf,0,sname); // получаю хэндл по короткому имени
   Alert(" Хэндл вновь открытого окна - ",handle);
   return;
  }
//+------------------------------------------------------------------+
P.S. Всё, я спать.
 
barabashkakvn:

В общем после применения шаблона нужно дать немного времени графику, для того чтобы инициализировались и рассчитались индикаторы.

barabashkakvn спасибо тебе огромное. Просто дал ему время и со следующим тиком все заработало )). Теперь "сам принцип" у меня в руках. Буду доделывать под себя остальное. Вот победный вариант, вдруг кто еще захочет, чтоб не мучился.

//+------------------------------------------------------------------+
//|                                                     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;                                                              // временя открытия текущего бара, что бы на нем больше не пересчитывать
long graf;                                                                       // хэндл открываемого графика
bool flag=false;                                                                 // флаг прокачки котировок

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("К новому графику успешно применен нужный шаблон.");
   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(flag==false)
 {
  int induk=ChartIndicatorsTotal(graf,0);                                                  // считаю количество индикаторов на графике
  if(induk==0)
  {
   Alert("На вновь открытом графике нет индикаторов.");                                    // пока индикаторов не вижу
   return(rates_total);  
  }
  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);
  }
 }
 if(lastbar==time[rates_total-1])                                                          // проверка на новый бар, иначе не пересчитываем
  return(rates_total);
 ArraySetAsSeries(firstBuffer,true);                                                       // устанавливаем индексацию в динамическом массиве, как в таймсерии
 for(int i=0;i<rates_total;i++)
  CopyLow(Symbol(),Period(),i,1,firstBuffer);
 flag=true;                                                                                // котировки прокачались ))
 lastbar=time[rates_total-1];                                                              // запомним текущий бар
 return(rates_total);
}
//+------------------------------------------------------------------+
Файлы:
Alert.jpg  98 kb
 
RedFish:

barabashkakvn спасибо тебе огромное. Просто дал ему время и со следующим тиком все заработало )). Теперь "сам принцип" у меня в руках. Буду доделывать под себя остальное. Вот победный вариант, вдруг кто еще захочет, чтоб не мучился.

Пожалуйста.

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