Доброго времени суток.
Открываю новый график с нужным мне таймфреймом. Применяю шаблон. График открывается. Шаблон применяется. Сразу появляются два стандартных нужных мне индикатора в основном окне. Пытаюсь программно посчитать индикаторы на новом графике в основном окне, что бы потом через короткое имя получить хэндлы. Но мне сообщает, что индикаторов нет. А я их вижу. Вроде прописал правильно и все компилируется. Помогите понять, в чем ошибка?
Извините. Вот.
//+------------------------------------------------------------------+ //| 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); } //+------------------------------------------------------------------+
Извините. Вот.
У меня этот код работает. Только сообщения о том, что не найдены Биллы :) . Ну и для того, чтобы работало я вставил вместо Вашего "BW.tpl" свой шаблон.
P.S. 2014.04.23 20:29:05.909 Terminal MetaTrader 5 x64 build 930 started (MetaQuotes Software Corp.)
У меня этот код работает. Только сообщения о том, что не найдены Биллы :) . Ну и для того, чтобы работало я вставил вместо Вашего "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
Спасибо за помощь.
Проблема с шаблоном? Или целый терминал переустановить? у меня MetaTrader 5 (не знаю, но думаю 32) build 910
Спасибо за помощь.
Я пользую терминал скачанный с metaquotes.net, в терминале открыл демо-счет на MetaquoteDemo. Раз два в неделю подключаюсь к этому демо-счету и терминал всегда вовремя обновляется.
У меня терминал от брокера. Я к сожалению так не смогу.
У меня терминал от брокера. Я к сожалению так не смогу.
Можете, и все могут:
- 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); } //+------------------------------------------------------------------+
И ни фига не могу получить хэндл индикатора на вновь открываемом окне. Просто недоумеваю ПОЧЕМУ? Весь день документацию учил ))
Первый прикрепленный это по очереди скрипты, второй индикатор.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Доброго времени суток.
Открываю новый график с нужным мне таймфреймом. Применяю шаблон. График открывается. Шаблон применяется. Сразу появляются два стандартных нужных мне индикатора в основном окне. Пытаюсь программно посчитать индикаторы на новом графике в основном окне, что бы потом через короткое имя получить хэндлы. Но мне сообщает, что индикаторов нет. А я их вижу. Вроде прописал правильно и все компилируется. Помогите понять, в чем ошибка?