Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 2723

 
Vitaly Muzichenko #:

Приветствую!

Что не так в этом коде и как можно оптимизировать?

Проблема в том, что если открыть позицию вчера и закрыть сегодня, то нет доступа к цене  открытия, поэтому разницу в пунктах за сегодня считает не корректно


Да в сама функция GetPriceIn(posID) тяжёлая

--

--

Такой код считает корректно, но тяжёлый

Функция GetPriceIn() абсолютно неправильная. Зачем перебирать все сделки в цикле когда есть HistorySelectByPosition() и есть идентификатор позиции… Эта функция вернёт всего 2 сделки IN и OUT, конечно при условии если открывали одной сделкой и закрывали одной. Но это по любому будет меньше, чем все сделки в истории… А если пишется исключительно для себя любимого и предполагается открывать и закрывать позиции только целиком, то можно вообще обойтись без цикла. Сделка IN будет всегда индексом 0, а OUT всегда 1.
 
Alexey Viktorov #:
Функция GetPriceIn() абсолютно неправильная. Зачем перебирать все сделки в цикле когда есть HistorySelectByPosition() и есть идентификатор позиции… Эта функция вернёт всего 2 сделки IN и OUT, конечно при условии если открывали одной сделкой и закрывали одной. Но это по любому будет меньше, чем все сделки в истории… А если пишется исключительно для себя любимого и предполагается открывать и закрывать позиции только целиком, то можно вообще обойтись без цикла. Сделка IN будет всегда индексом 0, а OUT всегда 1.
Мнится мне, что после вызова HistorySelectByPosition() опять придётся вызывать HistorySelect(), так как она затрётся. Нет?
 
Aleksandr Slavskii #:
Мнится мне, что после вызова HistorySelectByPosition() опять придётся вызывать HistorySelect(), так как она затрётся. Нет?

Затрётся, но разве это проблема? Ведь последовательность в списке останется прежней. И соответственно начинать цикл сначала не надо.

Чтобы сильно не заморачиваться, можно после получения цены открытия сразу вызвать HistorySelect() и только потом вернуть полученную цену.

 
Alexey Viktorov #:
предполагается открывать и закрывать позиции только целиком
Ожидания могут не совпасть с реальностью
 
Artyom Trishkin #:
Ожидания могут не совпасть с реальностью
Могут, но это редко. И не у всех…
 
Alexey Viktorov #:
Могут, но это редко. И не у всех…
И всё же, а если? То что?
 
Artyom Trishkin #:
И всё же, а если? То что?
Артём, ты мыслишь в защите от действий дурака. Это может быть если открывать 100500 лот одновременно. А если, как у многих лот не превышает 0.1 то такое может случиться только у одного программиста. Как его звать не скажу. И потом ты просто вырвал из контекста. Я писал с оговоркой, «только для себя» и на свой страх и риск.
 
Alexey Viktorov #:
«только для себя» и на свой страх и риск
Если б я писал для себя, то точно бы делал так, чтобы мне мой код не подложил бяку. И, впрочем, стараюсь (насколько хватает знаний) делать всё как для себя.
 
Aleksandr Slavskii #:
Мнится мне, что после вызова HistorySelectByPosition() опять придётся вызывать HistorySelect(), так как она затрётся. Нет?
Именно это и происходило
 
Artyom Trishkin #:
Если б я писал для себя, то точно бы делал так, чтобы мне мой код не подложил бяку. И, впрочем, стараюсь (насколько хватает знаний) делать всё как для себя.

Артём, не придирайся. Я не агитировал за такое написание, а просто отметил, что такое возможно с определёнными рисками.

По хорошему надо в цикле считать среднюю цену открытия, но это утяжелит код. Так-же и цену закрытия надо считать среднюю. Ведь закрытие тоже может быть не одной сделкой. И по хорошему всё это надо делать в одном цикле по сделкам выбранным по идентификатору позиции, как цену открытия так и цену закрытия…