[АРХИВ]Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 5. - страница 209

 
polycomp:
Вот эти функции, а объекты - это прямоугольники, которые изображаются на графике.

Файлы:
 
polycomp:


Файлы:
 
Надо посмотреть, займет время. 
 
polycomp:
Одна из возможных причин различия работы кода после переинициализации - это особенность инициализации static переменных в МТ4. В функции isNewBar() Вы используете такую переменную. При первичной инициализации BarTime = 0. А при последующей переинициализации это переменная будет содержать предыдущее значение (не 0). Для проверки этого предположения сделайте переменную BarTime глобальной и проверьте работу кода.
 
polycomp:
alsu:

Для начала выведите из библиотечных функций что-нибудь в Print, чтобы знать, происходит ли их вызов вообще

В библиотечных функциях создаются графические объекты . После первого вызова индикатора объекты создаются и отображаются в окне терминала.

При повторном вызове в списка объектов они отсутствуют, что говорит о том, что внешние функции при повторном просчете индикатора почему-то не пашут, а терминал по этому поводу молчит.

Ок. Может, все таки не судить по косвенным признакам, а тупо напечатать в самом индикаторе:  Print ("вызов такой-то функции"); Сразу увидим, вызывается она или нет.

Надо быть менее самонадеянным, тогда ошибки будут находиться быстрее)

 
polycomp:



А вообще Ваша проблема, скорее всего, в функции

bool isNewBar()
{
  static datetime BarTime;  
   bool res=false;
    
   if (BarTime!=Time[0]) 
      {
         BarTime=Time[0];  
         res=true;
      } 
   return(res);
}

Дело в том, что статика не обнуляется при реинициализации, поэтому при повторном запуске BarTime у Вас всегда равна времени последнего обсчитанного в прошлый раз бара, т.е. isNewBar () будет false, пока не придет новая свеча. Лучше бы перенести функцию из библиотеки в инклюдник mqh и обнулять BarTime=0 явно в init ()

Это я навскидку, по первому взгляду на код, так что не судите строго, если наврал.

 
polycomp:



Для начала я бы удалил из Вашей либы эту строчку

#property library

 Так как вы используете не библиотеку, а включаемый файл

 
alsu:

Насколько я помню, придется специально запоминать это время при установке отложки. Можно запомнить прямо в коммент к ордеру (или в магик, как особое извращение:).
Большое спасибо.
 

ВОПРОС 1.

Как закодировать такую идею.

Установить отложенный ордер   но сделать так,что бы он преобразовался в рыночный только если цена установки отложки будет совпадать с ценой открытия любой свечи ТФ60

ВОПРОС 2.

Как закодировать такую идею.

Если отложенный ордер преобразовался в рыночный ,то через 10 мин. установить еще один отложенный ордер с такими же значениями: цены открытия стоп-приказовобъема   как в предыдущей отложке, которая преобразовалась в рыночный ордер.

Спасибо.

 
alsu:

Ок. Может, все таки не судить по косвенным признакам, а тупо напечатать в самом индикаторе:  Print ("вызов такой-то функции"); Сразу увидим, вызывается она или нет.

Надо быть менее самонадеянным, тогда ошибки будут находиться быстрее)

alsu:

А вообще Ваша проблема, скорее всего, в функции

Дело в том, что статика не обнуляется при реинициализации, поэтому при повторном запуске BarTime у Вас всегда равна времени последнего обсчитанного в прошлый раз бара, т.е. isNewBar () будет false, пока не придет новая свеча. Лучше бы перенести функцию из библиотеки в инклюдник mqh и обнулять BarTime=0 явно в init ()

Это я навскидку, по первому взгляду на код, так что не судите строго, если наврал.


Огромное спасибо!

Убрал isNewBar () из библиотеки и поместил в файл индикатора. Все работает как часы!

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