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

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

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

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

Vladislav Andruschenko
223901
Vladislav Andruschenko  
Slava:

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

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


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

Slava
Модератор
12309
Slava  
Vladislav Andruschenko:

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

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

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

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

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

fxsaber
14309
fxsaber  
Slava:

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

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

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

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

fxsaber, 2018.01.24 21:48

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

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

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

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

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

Slava
Модератор
12309
Slava  
fxsaber:

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

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

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

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

Я - про Sleep(1000)
Vladislav Andruschenko
223901
Vladislav Andruschenko  
Slava:

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

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

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

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


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

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

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

fxsaber
14309
fxsaber  
Slava:
Я - про Sleep(1000)

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

Slava
Модератор
12309
Slava  
fxsaber:

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

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

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

fxsaber
14309
fxsaber  
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("Прошло меньше секунды."); 
}
И это не проблема, а тонкость.
fxsaber
14309
fxsaber  

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

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

fxsaber, 2018.01.25 10:14

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

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

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