Индикаторы: Сетка - страница 2

 
Prival:
выложил в 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

 

 

Файлы:
setka__1.mq5  15 kb
 
Prival:

спасибо. учту. Сейчас вот над чем тружусь. сбой какойто идет. 

открыто 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);

Файлы:
setka.mq5  15 kb
 
antt:

Это следствие архитектуры терминала и алгоритма индикатора. Индикатор выполняется в потоке символа, т.е. в процессе его расчета невозможны многие операции с историей: обработка тиков, расчет других индикаторов, синхронизация истории с сервером, построение или загрузка истории по таймфремам символа итп.

Что то никак до меня не доходит это понятие поток, и справку раз 50 перечитал про доступ к данным (( там скрип приведен в качестве примера. Да и выполняется он около минуты (долго).Но кажется начало доходить. Правильно ли я понял, что пока идет расчет индикатора, т.е. начала выполняться функция

 int OnCalculate () {
все ресурсы компьютера (терминала)  отданы этой задаче, и пока она не выполниться (завершиться)

return(rates_total);  }

Ничего из ниже перечисленного нельзя делать:

- пытаться прочитать историю по этому символу если её не хватает

- запрашивать другой таймфрем

- запрашивать другой символ

Кажется я понял как нужно переделать программу нужно сразу при первом вызове расставить все линии и забыть про это прока не придет if(prev_calculated==0).

antt правильно ?

З.Ы.

  1. Трейдер - человек, наступающий на грабли.
  2. Чайник - начинающий трейдер, ни разу не наступавший на грабли и потому уверенный, что гpаблей не существует.
  3. Лох - трейдер, регулярно наступающий на грабли, но по-прежнему уверенный, что гpаблей не существует.
  4. Узкий специалист  - трейдер, в совершенстве владеющий технологией наступания на одни и те же грабли.
  5. Шиpокий  специалист - трейдер, наступающий параллельно на более чем двое граблей.
  6. Мехсистемщик - трейдер, способный автоматизировать получение ударов граблями.

 Согласно оценке Рената у меня 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 

 
Prival:

Что то никак до меня не доходит это понятие поток, и справку раз 50 перечитал про доступ к данным (( там скрип приведен в качестве примера. Да и выполняется он около минуты (долго).Но кажется начало доходить. Правильно ли я понял, что пока идет расчет индикатора, т.е. начала выполняться функция

http://ru.wikipedia.org/wiki/Thread


 int OnCalculate () {
все ресурсы компьютера (терминала)  отданы этой задаче, и пока она не выполниться (завершиться)

return(rates_total);  }

Не все ресурсы. Но большинство расчетов связанных с данным символом будут ожидать завершения выполнения OnCalculate().


Ничего из ниже перечисленного нельзя делать:

- пытаться прочитать историю по этому символу если её не хватает

Да. Если истории по текущему символу не хватает, то в процессе выполнения OnCalculate() точно лучше не станет.


- запрашивать другой таймфрем

Запрашивать можно, но если данных нет или не хватает, то ждать в OnCalculate() нет смысла. Аналогично с данными других индикаторов по текущему символу.

- запрашивать другой символ

Запрашивать можно, теоретически можно даже подождать в цикле появления всех необходимых данных, т.к. обработка данных другого символа (история,индикаторы) производится в другом потоке. Но лучше так не делать, цикл ожидания в OnCalculate() остановит обработку данных текущего символа.

Кажется я понял как нужно переделать программу нужно сразу при первом вызове расставить все линии и забыть про это прока не придет if(prev_calculated==0).

Общая рекомендация при написании кастомных индикаторов: при обнаружении любой ошибки, любой нехватки данных немедленно прекратить выполнение OnCalculate() с помощью return(0). На следующем тике по if(prev_calculated==0) сделать новую попытку расчета.
 
Prival:

если вас не затруднит. Утановите мак. баров в окне Unlimit и пройдитесь по М15, М5 и М1. результат что будет в логе выложите сюда. уменя что то не так на М1 - написал в сервис. Просто хочеться посмотреть это у меня так или у всех.

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
 
antt:
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). жаль что разработчики молчат  в сервис декс. хоть бы пару слов написали (( типа

проблему воспроизвели...думаем...спасибо

 
Prival:

спасибо. значит я наконец то все правильно написал и "индикатор" действительно работает так как и задумывал. возникший сбой у меня это - проблемы терминала (у вас все нормально _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);

ошибка в логах терминала пропадает (хоть линии и не рисуются).

В какую хоть сторону копать? Как реанимировать отличный инструмент?