![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
выложил в Code Base новую версию 3.09 можете скачивать
Можно еще немного улучшить.
if(ObjectFind(0,nm)<0) ObjectCreate(0,nm,OBJ_VLINE,0,t1,2);
В таких конструкциях ObjectFind() явно лишнее. При создании по ObjectCreate() будет аналогичный поиск в списке по имени и либо создается новый объект, либо изменяются параметры точек привязок существующего.
ObjectSetInteger(0,nm,OBJPROP_SELECTABLE,false);
Для объектов создаваемых из MQL программы это свойство выставляется принудительно в false.
Аналогично нет смысла менять значение OBJPROP_WIDTH, оно и так будет равно 1.
По моим замерам эти правки уменьшают время построения примерно на 10%.
спасибо. учту. Сейчас вот над чем тружусь. сбой какойто идет.
открыто 8 графиков на них висит только сетка.
имитирую отключение от нэта на 5 минут. Эта картинка после включения нэта. на 2-х графиках сбой
прилагаю новый вариант сетки версия 4.01
спасибо. учту. Сейчас вот над чем тружусь. сбой какойто идет.
открыто 8 графиков на них висит только сетка.
имитирую отключение от нэта на 5 минут. Эта картинка после включения нэта. на 2-х графиках сбой
прилагаю новый вариант сетки версия 4.01
Это следствие архитектуры терминала и алгоритма индикатора. Индикатор выполняется в потоке символа, т.е. в процессе его расчета невозможны многие операции с историей: обработка тиков, расчет других индикаторов, синхронизация истории с сервером, построение или загрузка истории по таймфремам символа итп.
Т.к. индикатор Сетка считается долго и использует данные других таймфремов символа, то при любой ошибке желательно прервать его расчет. Если серьезно не перепиcывать код, то можно сделать так:
bool isNewBar_i(datetime date,ENUM_TIMEFRAMES timeFrame,bool& error)
{
...
else
{
Print("Timeframe ",fTimeFrameName(timeFrame)," is not ready");
error=true;
}
и так:
//--- определимся с цветом линии
if(_Period<PERIOD_H1) if(isNewBar_i(time[i],PERIOD_H1,error) && _Period<PERIOD_M30) line_color=new_hour;
if(_Period<PERIOD_D1) if(isNewBar_i(time[i],PERIOD_D1,error) && _Period<PERIOD_H4 ) line_color=new_day;
if(_Period<PERIOD_W1) if(isNewBar_i(time[i],PERIOD_W1,error) && _Period<PERIOD_D1 ) line_color=new_week;
if(_Period<PERIOD_MN1)if(isNewBar_i(time[i],PERIOD_MN1,error)&& _Period<PERIOD_MN1) line_color=new_mon;
//---
if(error) return(0);
Это следствие архитектуры терминала и алгоритма индикатора. Индикатор выполняется в потоке символа, т.е. в процессе его расчета невозможны многие операции с историей: обработка тиков, расчет других индикаторов, синхронизация истории с сервером, построение или загрузка истории по таймфремам символа итп.
Что то никак до меня не доходит это понятие поток, и справку раз 50 перечитал про доступ к данным (( там скрип приведен в качестве примера. Да и выполняется он около минуты (долго).Но кажется начало доходить. Правильно ли я понял, что пока идет расчет индикатора, т.е. начала выполняться функция
int OnCalculate () {
все ресурсы компьютера (терминала) отданы этой задаче, и пока она не выполниться (завершиться)
return(rates_total); }
Ничего из ниже перечисленного нельзя делать:
- пытаться прочитать историю по этому символу если её не хватает
- запрашивать другой таймфрем
- запрашивать другой символ
Кажется я понял как нужно переделать программу нужно сразу при первом вызове расставить все линии и забыть про это прока не придет if(prev_calculated==0).
antt правильно ?
З.Ы.
Согласно оценке Рената у меня 5-ый уровень :-) , https://www.mql5.com/ru/forum/1165/page3 пошол наступать дальше ))
полностью переписал код. другие таймфремы не запрашиваються.
если вас не затруднит. Утановите мак. баров в окне Unlimit и пройдитесь по М15, М5 и М1. результат что будет в логе выложите сюда. уменя что то не так на М1 - написал в сервис. Просто хочеться посмотреть это у меня так или у всех.
вот мой лог.
2010.06.17 11:39:55 Сетка (EURUSD,M1) Сбой или первый запуск Time= 1.2 sec for 1293476 bars ObjectsTotal= 48010 _time= 2002.10.25 06:41:00
2010.06.17 11:39:52 Сетка (EURUSD,M5) Сбой или первый запуск Time= 0.0 sec for 847192 bars ObjectsTotal= 423 _time= 2010.06.02 21:35:00
2010.06.17 11:39:48 Сетка (EURUSD,M15) Сбой или первый запуск Time= 0.0 sec for 285186 bars ObjectsTotal= 962 _time= 2010.05.04 22:00:00
заранее спасибо. версия сетки 4.11
Что то никак до меня не доходит это понятие поток, и справку раз 50 перечитал про доступ к данным (( там скрип приведен в качестве примера. Да и выполняется он около минуты (долго).Но кажется начало доходить. Правильно ли я понял, что пока идет расчет индикатора, т.е. начала выполняться функция
int OnCalculate () {
все ресурсы компьютера (терминала) отданы этой задаче, и пока она не выполниться (завершиться)
return(rates_total); }
Ничего из ниже перечисленного нельзя делать:
- пытаться прочитать историю по этому символу если её не хватает
- запрашивать другой таймфрем
Запрашивать можно, но если данных нет или не хватает, то ждать в OnCalculate() нет смысла. Аналогично с данными других индикаторов по текущему символу.
- запрашивать другой символ
Кажется я понял как нужно переделать программу нужно сразу при первом вызове расставить все линии и забыть про это прока не придет if(prev_calculated==0).
если вас не затруднит. Утановите мак. баров в окне Unlimit и пройдитесь по М15, М5 и М1. результат что будет в логе выложите сюда. уменя что то не так на М1 - написал в сервис. Просто хочеться посмотреть это у меня так или у всех.
2010.06.17 11:58:54 6op0k (EURUSD,M5) Сбой или первый запуск Time=0.0sec for 847196 bars ObjectsTotal=605_time=2010.06.02 21:55:00
2010.06.17 11:58:44 6op0k (EURUSD,M15) Сбой или первый запуск Time=0.0sec for 285187 bars ObjectsTotal=1108_time=2010.05.04 22:15:00
2010.06.17 11:58:59 6op0k (EURUSD,M1) Сбой или первый запуск Time=0.1sec for 4009008 bars ObjectsTotal=403_time=2010.06.15 07:45:00
2010.06.17 11:58:54 6op0k (EURUSD,M5) Сбой или первый запуск Time=0.0sec for 847196 bars ObjectsTotal=605_time=2010.06.02 21:55:00
2010.06.17 11:58:44 6op0k (EURUSD,M15) Сбой или первый запуск Time=0.0sec for 285187 bars ObjectsTotal=1108_time=2010.05.04 22:15:00
спасибо. значит я наконец то все правильно написал и "индикатор" действительно работает так как и задумывал. возникший сбой у меня это - проблемы терминала (у вас все нормально _time=2010.06.15 07:45:00). жаль что разработчики молчат в сервис декс. хоть бы пару слов написали (( типа
проблему воспроизвели...думаем...спасибо
спасибо. значит я наконец то все правильно написал и "индикатор" действительно работает так как и задумывал. возникший сбой у меня это - проблемы терминала (у вас все нормально _time=2010.06.15 07:45:00). жаль что разработчики молчат в сервис декс. хоть бы пару слов написали (( типа
проблему воспроизвели...думаем...спасибо
а можно подправить:
если на на H1 гравфике на нести вертикальную или горизонтальную линию, зетем переключиться на другой временной интервал то лини не имеющие отношения к индикатору удаляються.
Очень удобный индикатор для проверки истории визуально определять шаг цены, но из-за того что отметки (вертикальные и горизонтальные линии ) поставленные на старших временных интервалах проподают при переключении на меньший временной интервал, становиться недобно.
Индикатор отлично решал задачу юзабельного отображения шкалы цен в окнах терминала.
Компиляция в билдах до 3021 включительно не показывает ошибок и всё рисуется Ок ( и даже если закинуть ранее скомпилированную версию в новый билд терминала).
Компиляция в последующих билдах ошибок не показывает, но в терминале индюк не рисует вертикальную разметку и в логи пишет: 1 leaked strings left
Закомментировав строку:
StringConcatenate(line_name,IntegerToString(str.hour,2,'0'),":",IntegerToString(str.min,2,'0'),"_N",line_counter);
ошибка в логах терминала пропадает (хоть линии и не рисуются).
В какую хоть сторону копать? Как реанимировать отличный инструмент?