Ошибки, баги, вопросы - страница 1234

 
Tapochun:
Тогда такой вопрос. Если индикатор запущен на М15. Образовалась новая свеча. При запросе данных для М15 и М30 они должны быть доступны в один момент?

Да.

После создания индикатора(включения его в цикл нормальной обработки) и попадания в нормальный цикл обработки тиков(онтик), данные будут с большой вероятностью доступны. Но не забывайте, что гарантии нет из-за возможной докачки истории по другим символам.

То есть, всегда проверяйте результаты запросов данных индикаторов. Если в онтике запрашиваете данные и их нет, то сразу выходите, чтобы провериться на следующем тике.

Не совершайте типичной ошибки "все всегда готово, я не думаю о технических процессах доставки и расчета данных, меня это не должно касаться, мне всегда везет". Всегда реализовывайте логику ленивой инициализации и контроль данных.

Обязательно тестируйте свои программы на пустой базе чартов. Обычно хватает перезапуска терминала со стертой вручную базой истории, чтобы получить разнообразные ошибки доступа по неверному индексу или делению на ноль.

 

Если получили бар м15 на символе, то бар м30 на этом же символе точно есть. 

 
Renat:

Да.

Еще вопрос. Функция BarsCalculated() ведет себя одинаково при вызове из советника и индикатора?
 
Tapochun:
Еще вопрос. Функция BarsCalculated() ведет себя одинаково при вызове из советника и индикатора?
А что не так?
 
Renat:
А что не так?

Просто экспериментально я получил другие сведения. Как я понимаю, должны работать они одинаково. Но это не так. Так как сегодня воскресенье, проверить в текущем времени не получится. Но в тестере тоже работают по разному. Привожу два примера кода. Суть в следующему. Пытаемся получить данные с семи ТФ. Запускаем (и советник, и индикатор) не с самого старшего ТФ. Например, с М15. Если на текущем тике произошла синхронизация образования новой свечи и получения данных по этой свече через BarsCalculated() - производим запись количества рассчитанных баров по BarsCalculated() и время образования текущей свечи. Подробности в коде.

Индикатор.

Первый тик.

По каждому ТФ образуется новая свеча. Однако, на ТФ М1, М5, М15 - BarsCalculated() возвращает 0. Но, на ТФ М30, Н1, Н4, D1 - возвращает -1. Тут сразу возникает вопрос почему функция работает по-разному? Соответственно, если мы запускаем на ТФ М30 - для ТФ М1, М5, М15, М30 - BarsCalculated() возвращаем 0. И, соответственно, для ТФ Н1, Н4, D1 - возвращает -1. Из этого можно сделать вывод, что для старших ТФ данные изначально недоступны.

Второй тик. 

По логике кода - происходит синхронизация, т.е. запись параметров (все по логам примеров);

Третий и последующий тики.

Мы получаем новый бар по индикатору для ТФ М30, Н1, Н4, D1. Хотя, данные уже, вроде, были получены. А получается, что количество по ТФ, большим текущего больше на 1. Очень странное поведение. В дальнейшем (с использованием текущего примера) синхронизацию мы получить не сможем.

Советник.

Первый тик. 

Синхронизация происходит сразу же. Получение нового значения по BarsCalculated() происходит синхронно с образованием новой свечи.

Второй и последующие тики.

Логичное поведение функции. Все синхронизируется.

 

Запустите оба примера по тикам в тестере, сами все поймете. Текущее поведение функции разнится для советников и индикаторов. Также получение данных из индикаторов для старших ТФ запаздывает. Таким образом, я думаю что при запросе данных для М15 и М30 они не будут доступны в один и тот же момент. Актуальные данные - точно нет!

Если я все же ошибаюсь, подскажите как правильно получать данные индикатора со старшего ТФ? Спасибо.

 
//+------------------------------------------------------------------+
//| Search position of an element in a sorted list                   |
//+------------------------------------------------------------------+
CObject *CList::QuickSearch(CObject *element)
  {
   int      i,j,m;
   CObject *t_node=NULL;
//--- check
   if(m_data_total==0)
      return(NULL);
//--- check the pointer is not needed
   i=0;
   j=m_data_total;
   while(j>=i)
     {
      //--- ">>1" is quick division by 2
      m=(j+i)>>1;
      if(m<0 || m>=m_data_total)
         break;
      t_node=GetNodeAtIndex(m);
      if(t_node.Compare(element,m_sort_mode)==0)
         break;
      if(t_node.Compare(element,m_sort_mode)>0)
         j=m-1;
      else
         i=m+1;
      t_node=NULL;
     }
//--- result
   return(t_node);
  }
Стандартная библиотека  CList
Зачем два раза вызывать Compare ??? Это может быть дорогая операция (если надо проверить равенство больших объектов, а не эквивалентность по некоторым полям).
Можно ведь просто сохранить результат после первого вызова Compare.
 
Renat:
Мне стоит здесь ждать от Вас ответа? Или лучше оформить в сервисдеск?
 

Откуда берутся эти значки снизу на графике?

Никакого индикатора на графике нет, а значки появляются каждый раз.  Я уже замучался их удалять.  Как отключить эту хрень?  В настройках терминала не нашёл ничего связанного с этим.

 
meat:

Откуда берутся эти значки снизу на графике?

Никакого индикатора на графике нет, а значки появляются каждый раз.  Я уже замучался их удалять.  Как отключить эту хрень?  В настройках терминала не нашёл ничего связанного с этим.

Это события из вкладки "Календарь". Для удаления: правой кнопкой мышки внутри вкладки "Календарь" -> "Показать на графиках" -> "Удалить все события.

P. S. И снимите галочку с пункта "Автообновление". Теперь новые события Календаря не будут отображаться на графике.

 
crOss:
Возьмите любой эксперт (из примеров от MetaQuotes),запустите под билдом 975 на определённом периоде и с параметрами,
получите результаты работы, т.е. график кривой доходности и таблицу сделок.


Теперь запустите этот же эксперт под билдом 1010 на этом же периоде и с этими же параметрами, получите совершенно другие результаты...

P.S. Метатестер 32-разрядный

Какие из результатов являются верными? В билде 975 или в билде 1010?
 

Всем здрасте) Помогите пожалуйста запустить таймер:

 

 int OnInit()

{

   bool setTimer=EventSetTimer(60);

   Print("Установка таймера"); 

 }

void OnTimer()

{

   Print("Прохождение времени"); 

} 

 

 Вопрос: почему не работает? Весь мозг себе вынес...(((

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