ошибка 138 в тестере.

 
Код
    lots = NormalizeDouble(lots, 2);
    price = NormalizeDouble(price, Digits);
    sl = NormalizeDouble(sl, Digits);
    tp = NormalizeDouble(tp, Digits);
    
    t = OrderSend(Symbol(), op, lots, price, 0, sl, tp, NULL, MagicNumber, 0, Aqua);
    
    if (t == -1)
    {
        int err = GetLastError();
        Print("OrderSend error ", err, " ", ErrorDescription(err), ", op ", op, ", ", Bid, "/" , Ask, ", price ", price, ", sl/tp ", sl, "/", tp, ", lots ", lots);
        //if (err != 138) 
            Stop = true;
    }    


иногда печатает ошибку в лог тестера

2006.06.14 23:17:02 2005.10.24 02:27 EURUSD,M1: OrderSend error 138 requote, op 0, 1.1925/1.1927, price 1.1927, sl/tp 1.0925/1.2227, lots 0.01

Происходит на разных временных интервалах и разных режимах тестирования.

Куда цена может уйти в тестере во время OrderSend() и как с этим бороться?

Нулевой слипаж задан специально для тестирования.

 
А как формируется цена открытия?
Опубликуйте полный код - дадим точный ответ. Без полного кода будет только потеря времени.
 
Признаться, я ожидал именно такого ответа. Чисто статистически...
Тем не менее, свой код я публиковать не буду. Вы, ведь, не собираетесь выкладывать исходники OrderSend()? Хотя именно эта функция возвращает ошибку при тестировании с корректной, как видно из трассировки, ценой.
Однако, такую возможность я рассмотрю, если Вы объясните, какая разница для OrderSend(), как формируется цена открытия? Это же просто число, и именно его величина, а не процесс ее получения является аргументом функции.
Вообще, вопрос о том, как формируется цена открытия, заданный в контексте этой темы, звучит весьма интригующе. Особенно на фоне заверений, что никакая информация об алгоритме, т.е. именно о том, как формируется цена, не может быть использована в терминале и сервере. (Шутка, конечно). :)

Если по существу, последняя фраза в посте была ключевой. Ошибка коррелирует с нулевым слипажом. Код выше, повторенный дважды со slippage = 1 и slippage = 0 (без проверки на -1) печатает в лог следующее:
2006.06.15 11:49:35 2005.10.20 19:37 EURUSD,M1: OrderSend error 138 requote, op 0, 1.2006/1.2008, price 1.2008, sl/tp 1.1006/1.231, lots 0.02
2006.06.15 11:49:35 2005.10.20 19:37 EURUSD,M1: OrderSend error 0 no error, op 0, 1.2006/1.2008, price 1.2008, sl/tp 1.1006/1.231, lots 0.02
Очевидно, верхнее, более позднее сообщение относится к вызову с 0-м слипажом.
 
"Ошибка 138: requote"
Почитайте обсуждение, начиная с поста Александра 07.11.05 19:41

Обращаю Ваше внимание на пункт 3
===
3. Проверка переданных клиентом цен на наличие в ценовом потоке. В случае отсутствия - клиенту возвращается реквот с текущими рыночными ценами.
===
 
Читал я то обсуждение.
Но все-таки жду релевантного ответа.
Я не понимаю, отчего Вы игнорируете ключевые моменты, как, например, то, что ошибка возникает в тестере. Разве тестер меняет ценовой поток асинхронно? Если так, почему эта информация нигде не озвучена?
Скорее всего, потому, что при тестировании цена не меняется до выхода из обработчика тика. В любом случае, RefreshRates() не избавляет от ошибки, оставляя бид/аск, очевидно, неизменными. И удачная операция в двойном OrderSend() происходит по той же самой цене, что и проваливается неудачная.
Зачем тестер возвращает клиенту реквот, если текущая рыночная цена не меняется? Или куда она исчезает из ценового потока тестера? И если исчезает, почему рефреш ее не восстанавливает?
 
>> Без полного кода будет только потеря времени.

К сожалению, это происходит в очередной раз.
 
Ещё раз перечитайте фразу "В случае отсутствия переданной цены в ценовом потоке клиенту возвращается реквот"

Если Вы используете бид или аск, а не расчётную цену, то реквота на тестере быть не должно.
 
>> Без полного кода будет только потеря времени.

К сожалению, это происходит в очередной раз.
Остается только позавидовать Вашим программистам, которые времени не теряют. Теряют его пользователи.
 
Ещё раз перечитайте фразу "В случае отсутствия переданной цены в ценовом потоке клиенту возвращается реквот"

Если Вы используете бид или аск, а не расчётную цену, то реквота на тестере быть не должно.
Да я использую аск, и это прекрасно видно в логе. Да, реквота быть не должно. Но он есть.
 
Ещё раз проверим.
 
Кстати, в случае инстант ордера OrderSend() мог бы сам брать необходимое текущее значение цены из ценового потока, игнорируя четвертый аргумент. Все равно, его значение безальтернативно. Тогда, если вернется реквот, не придется гадать, действительно ли устарела цена, или просто использовано неправильное значение.

Лучший способ избежать ошибки - не иметь возможности ее совершить. К тому же, ошибка 129 (ERR_INVALID_PRICE) стала бы неактуальной для рыночных ордеров.

На перформансе это врядли скажется. Цену в любом случае приходится подбирать в эксперте в зависимости от типа ордера.
Причина обращения: