Особенности языка mql5, тонкости и приёмы работы - страница 67

 
fxsaber:
Нюанс сравнения целых чисел на реальном примере

Собираетесь слипом Sleep(1000) отмерить ровно секунду?

А то, что таймер в процессоре имеет погрешномть 15 мс, это Вам неизвестно?

 
Slava:

Собираетесь слипом Sleep(1000) отмерить ровно секунду?

А то, что таймер в процессоре имеет погрешномть 15 мс, это Вам неизвестно?


Здравствуйте, подскажите пожалуйста, мозжно ли как то сбросить буфер таймера? чтобы исключить ошибку установки таймера

 
Vladislav Andruschenko:

Здравствуйте, подскажите пожалуйста, мозжно ли как то сбросить буфер таймера? чтобы исключить ошибку установки таймера

Ошибка выставления таймера возникает из-за того, что очередь системных сообщений переполнена. Для этого может быть масса причин. Как правило переполнение очереди - это временное явление (если не временное, то вы просто не сможете работать на своём компьютере)

Для контроля таймера используйте OnTick. Если таймер не выставлен, то выставьте его в OnTick

А пока мы работаем над тем, чтобы выставление таймера отвязать от состояния очереди сообщений.

PS Разрешение системного таймера и выставление таймера приложению - эти вопросы никак не связаны между собой

 
Slava:

Собираетесь слипом Sleep(1000) отмерить ровно секунду?

Нет, речь об этих двух строках сравнения целых чисел.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Особенности языка mql5, тонкости и приёмы работы

fxsaber, 2018.01.24 21:48

Нюанс сравнения целых чисел на реальном примере
//  if (GetMicrosecondCount() > StartTime + 1000000) // Неправильно
  if (GetMicrosecondCount() - StartTime > 1000000) // Правильно

На первый взгляд обе строки должны давать одинаковые результаты. Но это не так. Первая иногда будет выдавать не то, что требуется.

Пример со временем выбран только для наглядности.
Slava:

А то, что таймер в процессоре имеет погрешномть 15 мс, это Вам неизвестно?

Странно, что Вы до сих пор пользуетесь GetTickCount. На форуме было доказано (искать лень), что микросекундный таймер не тормозит сильнее миллисекундного. При этом дикой погрешностью не обладает.

 
fxsaber:

Нет, речь об этих двух строках сравнения целых чисел.

На первый взгляд обе строки должны давать одинаковые результаты. Но это не так. Первая иногда будет выдавать не то, что требуется.

Пример со временем выбран только для наглядности.

Странно, что Вы до сих пор пользуетесь GetTickCount. На форуме было доказано (искать лень), что микросекундный таймер не тормозит сильнее миллисекундного. При этом дикой погрешностью не обладает.

Я - про Sleep(1000)
 
Slava:

Ошибка выставления таймера возникает из-за того, что очередь системных сообщений переполнена. Для этого может быть масса причин. Как правило переполнение очереди - это временное явление (если не временное, то вы просто не сможете работать на своём компьютере)

Для контроля таймера используйте OnTick. Если таймер не выставлен, то выставьте его в OnTick

А пока мы работаем над тем, чтобы выставление таймера отвязать от состояния очереди сообщений.

PS Разрешение системного таймера и выставление таймера приложению - эти вопросы никак не связаны между собой


именно так и делаю, 

ошибка таймера возникает спустя какое то время - не сразу. и именно из-за переполнения - когда идет много данных, например история ордеров, или текущие ордера 50 и более. 

поэтому и думал, может быть внести функцию очистки буфера,? ок буду как -то решать своими путями. 

 
Slava:
Я - про Sleep(1000)

Да, Вы заболтали тему сравнения целых чисел.

 
fxsaber:

Да, Вы заболтали тему сравнения целых чисел.

Проблемы сравнения целых чисел не существует.

Покажите то же самое без слипа и без GetMicrosecondsCount

 
Slava:

Проблемы сравнения целых чисел не существует.

Покажите то же самое без слипа и без GetMicrosecondsCount

ulong GetMicrosecondCount2()
{
  static ulong StartTime = 0;
  
  if (StartTime)
    StartTime += 1000001;            // При повторном - добавляем больше "секунды"
  else
    StartTime = ULONG_MAX - 1000000; // При первом запуске возвращаем это "время"
    
  return(StartTime);
}

void OnStart()
{
  const ulong StartTime = GetMicrosecondCount2();
  
//  Sleep(1000);
  
//  if (GetMicrosecondCount2() > StartTime + 1000000) // Неправильно
  if (GetMicrosecondCount2() - StartTime > 1000000) // Правильно
    Print("Прошло больше секунды.");
  else
    Print("Прошло меньше секунды."); 
}
И это не проблема, а тонкость.
 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Обсуждение статьи "В MetaTrader 5 добавлена хеджинговая система учета позиций"

fxsaber, 2018.01.25 10:14

  1. Показан пример торговой ситуации, на которую Андрей обратил внимание при прочтении данной статьи.
  2. HistorySelectByPosition может не выбрать ордер, который был причиной сделки.
  3. Ордер и сделка, которую он породил, могут быть с разными ID.
Второй и третий пункт должны хоть где-то быть озвучены. Что и сделал.

Речь про анализ истории даже ручной торговли, про написание ТС не говорим.

Например, хотим понять, как проскользила сделка.
Причина обращения: