А я не сказал, что вешает процессор, я писал "вешает процесс"...
Допустим, мы сказали Sleep(10), а команда пришла через 1 единицу, т.е 9 единиц времени мы просто теряем.
Насколько я понимаю, Sleep() надо вызывать тогда, когда процесс должен быть приостановлен. Как ж можно одновременно "приостановить" и при этом "не вешать" процесс???
Sleep() - это правильный штатный способ приостановить выполнение текущего процесса (как правило, для того, чтобы остальные процессы успели что-то сделать). Как может за это время прийти команда для этого процесса? Для выполнения команды он не должен быть остановлен, а должен ожидать выполнения команды, и должен быть готовым к ее выполнению.
Мне кажется, что ваш спор возник именно потому, что Sleep() применяется не по делу. Если процесс выполнил все команды, и ждёт очередную - ему Sleep() не нужен, он и так в ожидании.
Если же мы должны немедленно обработать какое-то событие - для этого Sleep() не годится.
А вобще, чтобы понять, разумно ли применение Sleep() - надо глядеть на конкретный кусок кода.
Насколько я понимаю, Sleep() надо вызывать тогда, когда процесс должен быть приостановлен. Как ж можно одновременно "приостановить" и при этом "не вешать" процесс???
Sleep() - это правильный штатный способ приостановить выполнение текущего процесса (как правило, для того, чтобы остальные процессы успели что-то сделать). Как может за это время прийти команда для этого процесса? Для выполнения команды он не должен быть остановлен, а должен ожидать выполнения команды, и должен быть готовым к ее выполнению.
Мне кажется, что ваш спор возник именно потому, что Sleep() применяется не по делу. Если процесс выполнил все команды, и ждёт очередную - ему Sleep() не нужен, он и так в ожидании.
Если же мы должны немедленно обработать какое-то событие - для этого Sleep() не годится.
А вобще, чтобы понять, разумно ли применение Sleep() - надо глядеть на конкретный кусок кода.
Разница между Sleep и Event заключается в том, что Sleep останавливает трэд на определенное время, тогда как Event ждет какого-то события (как водопроводный кран).
Применяя Event, Вы точно уверены, что трэд не будет "стоять" лишнее время.
Так вы всегда будете знать сколько потоков запущено. Судя по коду у вас уже есть в методе Execute проверка инициировано ли завершение работы потока. Тогда поток будет уничтожен автоматически после завершения метода Execute
Разница между Sleep и Event заключается в том, что Sleep останавливает трэд на определенное время, тогда как Event ждет какого-то события (как водопроводный кран).
Применяя Event, Вы точно уверены, что трэд не будет "стоять" лишнее время.
//перед открытием позиции проверим время if(GetTickCount() - LastTimeTrade[number] < 30)
return;
//--- Скорректируем объем
lot=CalculateLot(number,Lot[number]);
//--- Откроем позицию
OpenPosition(number,lot,order_type,position_open_price,sl,tp,comment);
//---обновим время отправки ордера
LastTimeTrade[number] = GetTickCount();
--------------
staticuint LastTimeTrade[TRADE_SYMBOLS];
у меня эта реализация что-бы не попасть на открытие 2 одинаковой позиции, таймаут что-бы позиция появилась в МТ,
проверка как видно идет только по определенному символу в массиве, по остальным символам продолжается работа
--
вообще много всего обновляется именно после отправки ордера, это очень удобно для периодических расчетов, не тормозит расчеты, не нужно грузить таймерами или новом баре или вообще на каждом тике...
Ок, если у Вас такое видение, но буду Вас переубеждать.
Вы не путайте интерфейс и остальные потоки в процессе. Это такое видение у МС, я только излагаю, как могу))
Вы не путайте интерфейс и остальные потоки в процессе. Это такое видение у МС, я только излагаю, как могу))
Дмитрий, привыкли MQLлить, и сами все путаете, я вообще интерфейса не касался :)
MSDN
https://learn.microsoft.com/en-us/windows/win32/api/synchapi/nf-synchapi-sleep
Ясно написано
" Suspends the execution of the current thread until the time-out interval elapses. " - приостанавливает текущий поток
Я приостанавливаю поток до поступления события, которое не важно где произошло, эвенты специально созданы для управления и синхронизации потоков.
Но если Вам "милее" Sleep() - пользуйтесь на здоровье им.Всем спасибо.
"Допилил" все же Классику под Квик (значительно меньше на нем финансовые издержки)
Результат, пока, совсем маленький (были потери из-за отладки на реале, в Джуниоре невозможно было отлаживать), но теперь, все работает как хотелось.
Даже в отладке, зарплата получилась совсем не плохая :)
А я не сказал, что вешает процессор, я писал "вешает процесс"...
Допустим, мы сказали Sleep(10), а команда пришла через 1 единицу, т.е 9 единиц времени мы просто теряем.
Насколько я понимаю, Sleep() надо вызывать тогда, когда процесс должен быть приостановлен. Как ж можно одновременно "приостановить" и при этом "не вешать" процесс???
Sleep() - это правильный штатный способ приостановить выполнение текущего процесса (как правило, для того, чтобы остальные процессы успели что-то сделать). Как может за это время прийти команда для этого процесса? Для выполнения команды он не должен быть остановлен, а должен ожидать выполнения команды, и должен быть готовым к ее выполнению.
Мне кажется, что ваш спор возник именно потому, что Sleep() применяется не по делу. Если процесс выполнил все команды, и ждёт очередную - ему Sleep() не нужен, он и так в ожидании.
Если же мы должны немедленно обработать какое-то событие - для этого Sleep() не годится.
А вобще, чтобы понять, разумно ли применение Sleep() - надо глядеть на конкретный кусок кода.
Насколько я понимаю, Sleep() надо вызывать тогда, когда процесс должен быть приостановлен. Как ж можно одновременно "приостановить" и при этом "не вешать" процесс???
Sleep() - это правильный штатный способ приостановить выполнение текущего процесса (как правило, для того, чтобы остальные процессы успели что-то сделать). Как может за это время прийти команда для этого процесса? Для выполнения команды он не должен быть остановлен, а должен ожидать выполнения команды, и должен быть готовым к ее выполнению.
Мне кажется, что ваш спор возник именно потому, что Sleep() применяется не по делу. Если процесс выполнил все команды, и ждёт очередную - ему Sleep() не нужен, он и так в ожидании.
Если же мы должны немедленно обработать какое-то событие - для этого Sleep() не годится.
А вобще, чтобы понять, разумно ли применение Sleep() - надо глядеть на конкретный кусок кода.
Разница между Sleep и Event заключается в том, что Sleep останавливает трэд на определенное время, тогда как Event ждет какого-то события (как водопроводный кран).
Применяя Event, Вы точно уверены, что трэд не будет "стоять" лишнее время.
В MQl нет Event
Кусок кода без Event здесь https://www.mql5.com/ru/forum/434155/page3#comment_42564782
Я добавил Event
Всем спасибо.
"Допилил" все же Классику под Квик (значительно меньше на нем финансовые издержки)
Результат, пока, совсем маленький (были потери из-за отладки на реале, в Джуниоре невозможно было отлаживать), но теперь, все работает как хотелось.
Даже в отладке, зарплата получилась совсем не плохая :)
Здравствуйте. Как это на классическом арбитраже у вас получилось 5 процентов за месяц?
Здравствуйте. Как это на классическом арбитраже у вас получилось 5 процентов за месяц?
Я не объясняю как я лично торгую, только общие принципы.
Если бы я не занимался отладкой программы (что привело к просадкам), то было бы в 1,5-2 раза больше
Я не объясняю как я лично торгую, только общие принципы.
Таки да, но всегда думал, что прибыль примерно = ставке цб. Здесь же за месяц 5 проц. Подумал может не верно понял доходность.
Таки да, но всегда думал, что прибыль примерно = ставке цб. Здесь же за месяц 5 проц. Подумал может не верно понял доходность.
Нет, правильно поняли, именно 5,32% за месяц.
Добавлено
Руками и близко к этому проценту не заработаешь.
Разница между Sleep и Event заключается в том, что Sleep останавливает трэд на определенное время, тогда как Event ждет какого-то события (как водопроводный кран).
Применяя Event, Вы точно уверены, что трэд не будет "стоять" лишнее время.
В MQl нет Event
Кусок кода с Event здесь https://www.mql5.com/ru/forum/434155/page3#comment_42564782
Я добавил Event
у меня эта реализация что-бы не попасть на открытие 2 одинаковой позиции, таймаут что-бы позиция появилась в МТ,
проверка как видно идет только по определенному символу в массиве, по остальным символам продолжается работа
--
вообще много всего обновляется именно после отправки ордера, это очень удобно для периодических расчетов, не тормозит расчеты, не нужно грузить таймерами или новом баре или вообще на каждом тике...