Ошибки, баги, вопросы - страница 2449

 

Подскажите способ получить данные (текст) из этого списка

 
fxsaber:

Подскажите способ получить данные (текст) из этого списка

https://www.mql5.com/ru/docs/convert/enumtostring

Документация по MQL5: Преобразование данных / EnumToString
Документация по MQL5: Преобразование данных / EnumToString
  • www.mql5.com
//| Script program start function                                    |
 

Мне нужен список всех enum из всплывающей подсказки.

Пробовал несколько программ по работе с окнами. Не выходит, т.к. список исчезает при уходе фокуса.
Программы для работы с окнами приложений | Темная сторона Силы | Blog. Just Blog
  • ManHunter / PCL
  • www.manhunter.ru
В процессе разработки программ, а также их исследования, очень часто приходится работать с окнами приложений на уровне системы. То есть просматривать или менять стили окон, передавать или отслеживать сообщения и уведомления, обрабатывать другие параметры окон. У меня накопилась небольшая подборка программ, значительно облегчающих выполнение...
 

Подскажите, по OnTradeTransaction(). Нижеописанное - нормальное поведение? В тестере проверил - так и есть :( А на "живом" счёте?

В OnTick() есть цикл, закрывающий позиции по порядку.

В OnTradeTrancaction() подсчёт количества открытых позиций.

Советник поступает так: сначала до конца выполняет цикл закрытия, потом переходит к OnTradeTransaction и в том же порядке выполняет подсчёты.

Другими словами не

закрытие тикета #1 -> подсчёт с учетом закрытия тикета #1 -> закрытие тикета #2 -> подсчёт с учетом закрытия тикета #2 -> ...

а

закрытие тикета #1 -> закрытие тикета #2 -> ... -> подсчёт с учетом закрытия тикета #1 -> подсчёт с учетом закрытия тикета #2 -> ...

т.е. работает не параллельно, а последовательно.

Если вышеописанное нормально, то получается, что безопасно OnTradeTransaction() можно использовать только в советниках, открывающих/закрывающих только один ордер. Если сетка или мультисимвольный (или мультисимвольнаяя сетка, где это и обнаружилось :) ) - алгоритм ломается.

 
Igor Zakharov:

Подскажите, по OnTradeTransaction(). Нижеописанное - нормальное поведение? В тестере проверил - так и есть :( А на "живом" счёте?

На реале всегда все много сложнее, чем на демо и в тестере.

OnTradeTransaction-концепция слабо продумана, но мнение "Вы просто не умеете их готовить" звучит постоянно.


Либо пишите без данных о транзакциях, либо получайте их со стороны в любом месте программы, не дожидаясь входа в OnTradeTransaction.

Для мультисимвольной сетки хороша асинхронность. Поэтому выбрал бы второй вариант.
 
В terminal64.exe или metatester64.exe сидит Тестер? Нужно понять, какой файл менять, чтобы уйти от бага.
 
Alexey Navoykov:

О, спасибо, я даже я не в курсе был о таком.  Правда у вас там именно и сказано о спотыканиях об макросы.  Впрочем будем проверять конечно.

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

Для обработки макросов надо реализовать доп. слой где-то ближе к началу всей цепочки - описать грамматику макросов, распарсить их в исходниках и интерпретировать (получить результат исходник/значение по каждому макросу). Это сложно, а применение требуется только для некоторых MQL-программистов, поэтому развития нет.

Что касается использования хэша для идентификации изменений в продуктах, то мне кажется это не выход (или я не представляю, о каком use-case идет речь). Обычно требуется спустя год-два после генерации какого-то ex-файла понять, какой версии был конкретный встроенный в него модуль и его исходник. Для этого, видимо, нужно процесс сборки стыковать с системами контроля версий. Хэшами не обойтись.

 
Igor Zakharov:

Подскажите, по OnTradeTransaction(). Нижеописанное - нормальное поведение? В тестере проверил - так и есть :( А на "живом" счёте?

В OnTick() есть цикл, закрывающий позиции по порядку.

В OnTradeTrancaction() подсчёт количества открытых позиций.

Советник поступает так: сначала до конца выполняет цикл закрытия, потом переходит к OnTradeTransaction и в том же порядке выполняет подсчёты.

Другими словами не

а

т.е. работает не параллельно, а последовательно.

Если вышеописанное нормально, то получается, что безопасно OnTradeTransaction() можно использовать только в советниках, открывающих/закрывающих только один ордер. Если сетка или мультисимвольный (или мультисимвольнаяя сетка, где это и обнаружилось :) ) - алгоритм ломается.

Цитата из документации

Один торговый запрос, отправленный из терминала вручную или через торговые функции OrderSend()/OrderSendAsync(), может порождать на торговом сервере несколько последовательных торговых транзакций. При этом очередность поступления этих транзакций в терминал не гарантирована, поэтому нельзя свой торговый алгоритм строить на ожидании поступления одних торговых транзакций после прихода других.

Следовательно всё будет посчитано, но не в той последовательности в какой ожидается.

А можете объяснить почему вы решили в OnTradeTrancaction() подсчитывать количество позиций? Если не правильно организовать подсчёт, то не исключён вариант, что будут лишние операции. Ведь если закрыть в цикле несколько позиций нет необходимости пересчитывать все позиции после закрытия каждого. Достаточно посчитать один раз после завершения цикла. Или в в OnTradeTrancaction() организовать так, чтобы при типе IN количество увеличивалось на 1, а при типе OUT уменьшалось. И даже в этом случае, если закрыть позицию не полностью, то это нужно учитывать.

 
Alexey Viktorov:

А можете объяснить почему вы решили в OnTradeTrancaction() подсчитывать количество позиций?

Если считать на каждом тике - это ресурсоёмко, особенно заметно в тестере стратегий. Не правильнее ли пересчёт делать только при событии Trade, т.е. когда реально меняется что-то в перечне открытых позиций? С OnTradeTransaction() упрощается контроль за вмешательством пользователя в работу советника. (есть прецеденты :)

В данном роботе тестил возможность закрытия сеток по схеме: убыточная + прибыльная > Х , то закрыть обе (как правило, на разных символах). Но сбой получается, т.к. не смотря на то, что они закрыты, тестер не знает об этом, и переходит к следующей итерации, ошибочно "спаривая" существующие с уже закрытыми. Т.е. пришлось добавить пересчёт после каждого закрытия.

Пересчёт у меня со сбросом счётчика и сначала по всем отрытым, не +1 / -1

Alexey Viktorov:

Цитата из документации

Согласен, рисковано было изначально использовать OnTradeTransaction() Вообще, наверное, откажусь от неё в случаях когда запросы не асинхронные - одни проблемы от неё.

 
fxsaber:

Для мультисимвольной сетки хороша асинхронность. Поэтому выбрал бы второй вариант.

Уже думаю в этом направлении ;)