феномен в тестере

 

Коллеги и разработчики МТ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

Что это? Баг? Или я чего-то не знаю?

 

После любой операции модификации ордера нужно делать его повторный селект.

Иначе вы будете работать со старыми закешированными данными. Что вы и обнаружили.

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

 
MetaQuotes:

После любой операции модификации ордера нужно делать его повторный селект.

Иначе вы будете работать со старыми закешированными данными. Что вы и обнаружили.

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

Спасибо! Но где об этом в документации? Смотрел на OrderModify - там ничего.

И только в тестере нужно это делать или и при обычной торговле тоже?



 
mt4trade:

Спасибо! Но где об этом в документации? Смотрел на OrderModify - там ничего.

И только в тестере нужно это делать или и при обычной торговле тоже?



Прямо в документации и написано

Функция OrderSelect() копирует данные об ордере в программное окружение, и последующие вызовы OrderClosePrice(), OrderCloseTime(), OrderComment(), OrderCommission(), OrderExpiration(), OrderLots(), OrderMagicNumber(), OrderOpenPrice(), OrderOpenTime(), OrderPrint(), OrderProfit(), OrderStopLoss(), OrderSwap(), OrderSymbol(), OrderTakeProfit(), OrderTicket(), OrderType() возвращают ранее скопированные данные. Это означает, что самого ордера может уже и не быть (или же в нем изменились цена открытия, уровни Stop Loss / Take Profit или момент истечения), а данные этому ордеру можно еще получать. Для гарантированного получения свежих данных об ордере рекомендуется вызывать функцию OrderSelect() непосредственно перед обращением за ними.

 
stringo:

Прямо в документации и написано


Не релевантный ответ.

Дело в том, что перед каждой модификацией я конечно же делаю OrderSelect()!

>> MetaQuotes пишет: После любой операции модификации ордера нужно делать его повторный селект.

Так где ОБ ЭТОМ в документации?

И почему бы не встроить в код терминала после каждой модификации автоматический вызов OrderSelect(),

чтобы "можно было доступаться до любого члена без страха, что данные будут не синхронизированными"?

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