После любой операции модификации ордера нужно делать его повторный селект.
Иначе вы будете работать со старыми закешированными данными. Что вы и обнаружили.
OrderSelect - это команда атомарного переноса в локальный кеш данных всего ордера, чтобы потом можно было доступаться до любого члена без страха, что данные будут не синхронизированными.
После любой операции модификации ордера нужно делать его повторный селект.
Иначе вы будете работать со старыми закешированными данными. Что вы и обнаружили.
OrderSelect - это команда атомарного переноса в локальный кеш данных всего ордера, чтобы потом можно было доступаться до любого члена без страха, что данные будут не синхронизированными.
Спасибо! Но где об этом в документации? Смотрел на OrderModify - там ничего.
И только в тестере нужно это делать или и при обычной торговле тоже?
Спасибо! Но где об этом в документации? Смотрел на OrderModify - там ничего.
И только в тестере нужно это делать или и при обычной торговле тоже?
Прямо в документации и написано
Функция OrderSelect() копирует данные об ордере в программное окружение, и последующие вызовы OrderClosePrice(), OrderCloseTime(), OrderComment(), OrderCommission(), OrderExpiration(), OrderLots(), OrderMagicNumber(), OrderOpenPrice(), OrderOpenTime(), OrderPrint(), OrderProfit(), OrderStopLoss(), OrderSwap(), OrderSymbol(), OrderTakeProfit(), OrderTicket(), OrderType() возвращают ранее скопированные данные. Это означает, что самого ордера может уже и не быть (или же в нем изменились цена открытия, уровни Stop Loss / Take Profit или момент истечения), а данные этому ордеру можно еще получать. Для гарантированного получения свежих данных об ордере рекомендуется вызывать функцию OrderSelect() непосредственно перед обращением за ними.
Не релевантный ответ.
Дело в том, что перед каждой модификацией я конечно же делаю OrderSelect()!
>> MetaQuotes пишет: После любой операции модификации ордера нужно делать его повторный селект.
Так где ОБ ЭТОМ в документации?
И почему бы не встроить в код терминала после каждой модификации автоматический вызов OrderSelect(),
чтобы "можно было доступаться до любого члена без страха, что данные будут не синхронизированными"?
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Коллеги и разработчики МТ4.
В тестере, модифицируя последовательно TP, затем SL, одного и того же ордера
(на одном тике) столкнулся с феноменом, при котором по логам TP успешно модифицирован,
но при буквально сразу следующей модификации SL он (TP) вдруг оказывается нулевым:
modify #5 buy 0.10 GBPUSD at 1.58660 sl: 0.00000 tp: 1.58934 ok
modify #5 buy 0.10 GBPUSD at 1.58660 sl: 1.58173 tp: 0.00000 ok
В результатах то же:
91 2014.11.10 00:00 modify 5 0.10 1.58660 0.00000 1.58934 0.00 9987.10
92 2014.11.10 00:00 modify 5 0.10 1.58660 1.58173 0.00000 0.00 9987.10
Феномен исчезает, если сразу после команды модификации поставить селект этого же ордера:
nlModResult = fnOrderModify(nlModOrderTicket, dlOPNew, dlSLNew, dlTPNew, 0, nlColor);
blOrderSelect=OrderSelect(nlModOrderTicket, SELECT_BY_TICKET, MODE_TRADES);
Тогда в логах:
modify #5 buy 0.10 GBPUSD at 1.58660 sl: 0.00000 tp: 1.58934 ok
modify #5 buy 0.10 GBPUSD at 1.58660 sl: 1.58173 tp: 1.58934 ok
И в результатах:
91 2014.11.10 00:00 modify 5 0.10 1.58660 0.00000 1.58934 0.00 9987.10
92 2014.11.10 00:00 modify 5 0.10 1.58660 1.58173 1.58934 0.00 9987.10
Что это? Баг? Или я чего-то не знаю?