MT5 и скорость в боевом исполнении - страница 52

 

Переделал на макрос

#define µsSLEEP(µsRange)                              \
        {                                             \
           ulong c = GetMicrosecondCount() + µsRange; \ 
           while(GetMicrosecondCount() < c);          \
        }


//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   while(!_StopFlag)
   {
      µsSLEEP(5000000);
      Print("Прошло 5000000 микросекунд");
   }
}
 
Roman:

Крутит конечно, может не только одно ядро задействовать.

Я имел в виду, что while без Sleep.

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

 
Andrey Khatimlianskii:

Я имел в виду, что while без Sleep.

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

Конечно крутит и без слип.
Запущен же счётчик GetMicrosecondCount

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   ulong µs = 0;
   
   while(!_StopFlag)
   {
      µs = GetMicrosecondCount();
      
      Comment((string)µs);
      ChartRedraw();      
   }
   
   Comment("");   
}
 
Roman:

Конечно крутит и без слип.
Запущен же счётчик GetMicrosecondCount

Грузит не только счетчик. Пустой бесконечный цикл тоже будет грузить. Я об этом.

Плохое решение, в общем. Но лучше не предложу.

 
Andrey Khatimlianskii:

Грузит не только счетчик. Пустой бесконечный цикл тоже будет грузить. Я об этом.

Плохое решение, в общем. Но лучше не предложу.

Так пустой while понятное дело выбирает весь потенциал тактов процессора.
Не понял претензии о плохом решении. Если оно вам не подходит по ресурсам, это не значит что оно плохое.
µsSLEEP даёт задержку цикла меньше, чем стандартный Sleep(1); то есть в микросекундах, а не в миллисекундах.
5000000 в примерах выше, это всего лишь для примера, реальная частота в бою будет меньше 1 ms

Не пойму вашу задачу.
Вам нужно чтоб не грузило?
Поставьте обычный Sleep(20); в миллисекундах

 
Roman:

Так пустой while понятное дело выбирает весь потенциал тактов процессора.
Не понял претензии о плохом решении. Если оно вам не подходит по ресурсам, это не значит что оно плохое.
µsSLEEP даёт задержку цикла меньше, чем стандартный Sleep(1); то есть в микросекундах, а не в миллисекундах.
5000000 в примерах выше, это всего лишь для примера, реальная частота в бою будет меньше 1 ms

Не пойму вашу задачу.
Вам нужно чтоб не грузило?
Поставьте обычный Sleep(20); в миллисекундах

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

А для какой цели вам микросекундный слип?

 
Andrey Khatimlianskii:

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

А для какой цели вам микросекундный слип?

Если бы вы задумались почему грузит, и разобрались почему, то не было бы такого мнения.
Хочешь крутится меньше 1ms, увы платити ресурсом.
И мне кажется нагрузку в таком случае не снять, так как по любому нужен микросекундный таймер, чтоб считать интервал.
А с другой стороны, если постоянно крутится микросекундный таймер и даёт нагрузку равносильную пустому while,
возникает тогда вопрос, а нафига тогда эту задержку ставить, и использовать микросекундный таймер. Ну да ладно, это лирика.
А так, я пингую сервер, с определённой частотой в while без задержки.
И нужна микросекундная дискретность, ибо будут лишние вызовы.
Пользую первое решение, которое выкладывал чуть раньше, а µsSleep до кучи написал, может пригодится.


 
Andrey Khatimlianskii:


А для какой цели вам микросекундный слип?

Вот готовое решение.
Print() естественно заменяешь на свой код.

#define SEND_PING                                           \
{                                                           \   
   ulong currCount = GetMicrosecondCount();                 \
   switch((currCount - prevCount) > 5000000)                \
   {                                                        \
      case 0:                                               \
         break;                                             \
      case 1:                                               \
         prevCount = currCount;                             \
         Print("ping");                                     \
         break;                                             \
   }                                                        \
}
       

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   ulong  prevCount = 0;
   
   while(!_StopFlag)
   {
      SEND_PING;
   }  
 
}
 
Renat Fatkhullin:
В новом тестере, который пишем, постараемся это изменить.
fxsaber:

Отправил в ЛС.

В Тестере этот советник генерирует миллионы записей о полноценных и разумных (не спам) торговых приказах в виде модификаций. По этой причине лог Тестера катастрофически быстро забивается.

Эти логи в 99% случаев не нужны, но часто нужно то, что советник выводит через Print. Поэтому повторная просьба подумать на тему возможного отключения в Тестере автоматической генерации записей на каждый пук OrderSend.

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

 
Renat Fatkhullin:


А вот AMPGlobalEU-Live (на самом деле его лучше искать как AMPGlobalUSA-Live) для MetaTrader 5 с физическим ядром платформы в Чикаго на самом деле 19.53 мс, так как наши ближайшие серверы в Нью Йорке:

Специально просканил все их точки вручную - минималка 19 мс.

Мы постараемся в ближайшие дни поставить серверы в Чикаго. Руки не доходили.

В Чикаго сервер развернули.

В течение суток он просканирует все серверы и включится в распределение.