Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Ищешь единомышленников? На форуме их много!
Forex Trader
114255
Forex Trader 2006.06.15 02:27 
Код
    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() и как с этим бороться?

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

MetaQuotes Software Corp.
Модератор
181142
MetaQuotes Software Corp. 2006.06.15 08:52  
А как формируется цена открытия?
Опубликуйте полный код - дадим точный ответ. Без полного кода будет только потеря времени.
Forex Trader
114255
Forex Trader 2006.06.15 15:01  
Признаться, я ожидал именно такого ответа. Чисто статистически...
Тем не менее, свой код я публиковать не буду. Вы, ведь, не собираетесь выкладывать исходники 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-м слипажом.
Forex Trader
114255
Forex Trader 2006.06.15 15:49  
"Ошибка 138: requote"
Почитайте обсуждение, начиная с поста Александра 07.11.05 19:41

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

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

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

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

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

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

На перформансе это врядли скажется. Цену в любом случае приходится подбирать в эксперте в зависимости от типа ордера.
12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий