Нужна помощь профессионального программиста - страница 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 одинаковой позиции, таймаут что-бы позиция появилась в МТ,

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

--

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