Нужна помощь профессионального программиста - страница 6

 
prostotrader #:

Ок, если у Вас такое видение, но буду Вас переубеждать.

Вы не путайте интерфейс и остальные потоки в процессе. Это такое видение у МС, я только излагаю, как могу))

 
Dmitriy Skub #:

Вы не путайте интерфейс и остальные потоки в процессе. Это такое видение у МС, я только излагаю, как могу))

Дмитрий, привыкли 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 function (synchapi.h) - Win32 apps
Sleep function (synchapi.h) - Win32 apps
  • 2022.09.23
  • karl-bridge-microsoft
  • learn.microsoft.com
Suspends the execution of the current thread until the time-out interval elapses.
 

Всем спасибо.

"Допилил" все же Классику под Квик (значительно меньше на нем финансовые издержки)

Результат, пока, совсем маленький (были потери из-за отладки на реале, в Джуниоре невозможно было отлаживать), но теперь, все работает как хотелось.

Даже в отладке, зарплата получилась совсем не плохая :)

 
prostotrader #:

А я не сказал, что вешает процессор, я писал "вешает процесс"...

Допустим, мы сказали Sleep(10), а команда пришла через 1 единицу, т.е 9 единиц времени мы просто теряем.

Насколько я понимаю, Sleep() надо вызывать тогда, когда процесс должен быть приостановлен. Как ж можно одновременно "приостановить" и при этом "не вешать" процесс???

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

Мне кажется, что ваш спор возник именно потому, что Sleep() применяется не по делу. Если процесс выполнил все команды, и ждёт очередную - ему Sleep() не нужен, он и так в ожидании.

Если же мы должны немедленно обработать какое-то событие - для этого Sleep() не годится. 

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

 
Georgiy Merts #:

Насколько я понимаю, 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

  while (Terminated = false) do
  begin
    Event.WaitFor(INFINITE); //Wait event signal
    FEvent.ResetEvent;
Нужна помощь профессионального программиста - Создайте обработчик события OnTerminate. Сделайте парсинг данных в потоке.
Нужна помощь профессионального программиста - Создайте обработчик события OnTerminate. Сделайте парсинг данных в потоке.
  • 2022.10.10
  • www.mql5.com
Так вы всегда будете знать сколько потоков запущено. Судя по коду у вас уже есть в методе Execute проверка инициировано ли завершение работы потока. Тогда поток будет уничтожен автоматически после завершения метода Execute
 
prostotrader #:

Всем спасибо.

"Допилил" все же Классику под Квик (значительно меньше на нем финансовые издержки)

Результат, пока, совсем маленький (были потери из-за отладки на реале, в Джуниоре невозможно было отлаживать), но теперь, все работает как хотелось.

Даже в отладке, зарплата получилась совсем не плохая :)

  Здравствуйте. Как это на классическом арбитраже у вас получилось 5 процентов за месяц?

 
diman1982 #:

  Здравствуйте. Как это на классическом арбитраже у вас получилось 5 процентов за месяц?

Я не объясняю как я лично торгую, только общие принципы.

Если бы я не занимался отладкой программы (что привело к просадкам), то было бы в 1,5-2 раза больше

 
prostotrader #:

Я не объясняю как я лично торгую, только общие принципы.

Таки да, но всегда думал, что прибыль примерно = ставке цб. Здесь же за месяц 5 проц. Подумал может не верно понял доходность.

 
diman1982 #:

Таки да, но всегда думал, что прибыль примерно = ставке цб. Здесь же за месяц 5 проц. Подумал может не верно понял доходность.

Нет, правильно поняли, именно 5,32% за месяц.

Добавлено

Руками и близко к этому проценту не заработаешь.

 
prostotrader #:

Разница между Sleep и Event заключается в том, что Sleep останавливает трэд на определенное время, тогда как Event ждет какого-то события (как водопроводный кран).

Применяя Event, Вы точно уверены, что трэд не будет "стоять" лишнее время.

В MQl  нет Event

Кусок кода с Event здесь https://www.mql5.com/ru/forum/434155/page3#comment_42564782

Я добавил 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();
--------------
static uint LastTimeTrade[TRADE_SYMBOLS];

у меня эта реализация что-бы не попасть на открытие 2 одинаковой позиции, таймаут что-бы позиция появилась в МТ,

проверка как видно идет только по определенному символу в массиве, по остальным символам продолжается работа

--

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

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