Invalid request - только начал, и понять не могу... - страница 8

 
papaklass:

 У меня это реализовано именно так, только через функции.


понял. в вашем коде аналогично как и у МК - между OrderCheck и OrderSend  есть прослойка обработки ошибки юзером. 

 
papaklass:

 У меня это реализовано именно так, только через функции.

OrderCheck неявно и обязательно проверяется внутри OrderSend.

Так что при неправильном заполнении ордера сразу же вернется ответ без отсылки на сервер.

 
papaklass:

Смотрим что по этому поводу сообщает справочник:

 Первое выделение: видим, что функция предназначена для совершения торговых операций и ни слова о проверках.

Ну если я говорю, что проверки есть, значит это правда.

Ни одна заявка не выходит за пределы терминала без жестких проверок.

Второе выделение: видим, что проверки осуществляются на сервере и для проверки запроса перед отправкой на сервер разработчики рекомендуют воспользоваться функцией OrderCheck(). И опять ни слова о том, что функция OrderSend() осуществляет какую-либо  проверку.

Специально рекомендуем, чтобы трейдеры имели возможность предварительно точно узнать - правильно ли заполнен ордер и принять соответствующие меры.

Кто хочет - может предварительно провериться. Кто не хочет, за него все равно мы проверим и вернем аналогичные ответы.

Единственное место, где упоминается о проверке до отправке запроса - "В случае успешной базовой проверки структур (проверка указателей) ....". Но проверка указателей и проверка значений полей структуры запроса на ошибки это не одно и тоже. Да и рекомендация разработчиков об использовании функции OrderCheck() является косвенным доказательством того, что реальной проверки на ошибки перед отправкой запроса на сервер OrderSend() не осуществляет. Иначе зачем же делать "масло маслянное": сначала OrderSend() осуществляет проверку, а затем еще раз такую же проверку нужно провести при помощи OrderCheck()?

Так что из справочника следует однозначный ответ, что проверка осуществляется исключительно на сервере! 

Никто не пропустит ошибочный или чрезмерный поток заявок на сервер.

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

 
sergeev:

нет её у вас.  все ошибки обрабатываются бизнес логикой.

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

Но МТ5 в разы сложнее по обработке кодов возвратов + асинхронность.

Вот об этом и речь, как я ранее аналогично писал, а информации по этому вопросу - ноль. И МК уже который год стараются всячески отмежеваться от ее предоставления. Об этом я и написал - дилерам выгоден продукт, где есть моменты, приводящие к сливу, т.е. для MQ это фактор увеличения продаж. Увы, мы на рынке где конкуренты(мы и MQ), а не товарищи.

Вы просите невозможного от обвертки. Стандартная библиотека - это не бизнес логика. Это обвертка "над" функциями терминал. Обвертка над начинкой конфеты.

Тогда смысла в таком структурном оформлении немного.

Но гарантировать обвертка ничего не может, так как это вы выступаете гарантом. Ваша бизнес логика. начинка. :)

Как и функция Print не может гарантировать свободное место на диске.  И ошибок записи в лог. Для этого надо использовать обработку ошибок другими функциями и они конкретны для случаев.

Не может гарантировать всего даже правильная обертка, но может многое, относящееся к смежным функциям.

-Alexey-, давайте пообщаемся про конкретные недостатки и вы озвучите конкретные недоработки, что бы вам хотелось исправить.

Уже писали про конкретное неоднократно. Если MQ не в силах предоставить готовое решение, пусть хотя бы руководство по обработке ошибок и кодов возврата сделают. Отпираются всеми возможными способами. В документации на четверку это частично присутствовало(например, подождать 30 сек в таком-то случае), частично пользователи определили из опыта обработку недокументированных ситуаций. Для 5-ки вообще ничего нет. А раз так - то использовать ее никто не будет.

Ну а если MQ так отвечают потому, что просто созданная инфраструктура торговли в принципе не позволяет этого сделать, то что тут сказать - это полный провал всего проекта MT5, учитывая, что и других косяков неимоверная масса.

Если хотите, можно пройтись по каждому коду возврата и рассмотреть основные возможные ситуации.

Я бы с удовольствием занялся этим с таким опытным в MQL5 человеком как вы, подождем по наличию времени и необходимости. Слава богу, пока есть еще 4-ка, которая гораздо удобнее во многих планах.

 

-Alexey-:

готовое решение, пусть хотя бы руководство по обработке ошибок и кодов возврата


какой код вызывает вопросы по обработке?


Код

Идентификатор

Описание

10004

TRADE_RETCODE_REQUOTE

Реквота

10006

TRADE_RETCODE_REJECT

Запрос отвергнут

10007

TRADE_RETCODE_CANCEL

Запрос отменен трейдером

10008

TRADE_RETCODE_PLACED

Ордер размещен

10009

TRADE_RETCODE_DONE

Заявка выполнена

10010

TRADE_RETCODE_DONE_PARTIAL

Заявка выполнена частично

10011

TRADE_RETCODE_ERROR

Ошибка обработки запроса

10012

TRADE_RETCODE_TIMEOUT

Запрос отменен по истечению времени

10013

TRADE_RETCODE_INVALID

Неправильный запрос

10014

TRADE_RETCODE_INVALID_VOLUME

Неправильный объем в запросе

10015

TRADE_RETCODE_INVALID_PRICE

Неправильная цена в запросе

10016

TRADE_RETCODE_INVALID_STOPS

Неправильные стопы в запросе

10017

TRADE_RETCODE_TRADE_DISABLED

Торговля запрещена

10018

TRADE_RETCODE_MARKET_CLOSED

Рынок закрыт

10019

TRADE_RETCODE_NO_MONEY

Нет достаточных денежных средств для выполнения запроса

10020

TRADE_RETCODE_PRICE_CHANGED

Цены изменились

10021

TRADE_RETCODE_PRICE_OFF

Отсутствуют котировки для обработки запроса

10022

TRADE_RETCODE_INVALID_EXPIRATION

Неверная дата истечения ордера в запросе

10023

TRADE_RETCODE_ORDER_CHANGED

Состояние ордера изменилось

10024

TRADE_RETCODE_TOO_MANY_REQUESTS

Слишком частые запросы

10025

TRADE_RETCODE_NO_CHANGES

В запросе нет изменений

10026

TRADE_RETCODE_SERVER_DISABLES_AT

Автотрейдинг запрещен сервером

10027

TRADE_RETCODE_CLIENT_DISABLES_AT

Автотрейдинг запрещен клиентским терминалом

10028

TRADE_RETCODE_LOCKED

Запрос заблокирован для обработки

10029

TRADE_RETCODE_FROZEN

Ордер или позиция заморожены

10030

TRADE_RETCODE_INVALID_FILL

Указан неподдерживаемый тип исполнения ордера по остатку

10031

TRADE_RETCODE_CONNECTION

Нет соединения с торговым сервером

10032

TRADE_RETCODE_ONLY_REAL

Операция разрешена только для реальных счетов

10033

TRADE_RETCODE_LIMIT_ORDERS

Достигнут лимит на количество отложенных ордеров

10034

TRADE_RETCODE_LIMIT_VOLUME

Достигнут лимит на объем ордеров и позиций для данного символа


Обновлено: 2012.11.14
Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте
Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте
  • www.mql5.com
Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте - Документация по MQL5
 

Например 10004. Где написано, что делать? А в четверочной документации было хоть что-то:

Можно без задержки обновить данные при помощи функции RefreshRates и повторить попытку. Если ошибка не исчезает, необходимо прекратить все попытки торговых операций и изменить логику программы.

 
sergeev:

какой код вызывает вопросы по обработке?

10006 (по какой причине отвергнут, какие еще могут быть причины не указанные в других кодах?)

10011, 10013, 10028

 
A100:

10006 (по какой причине отвергнут, какие еще могут быть причины не указанные в других кодах?)

10011, 10013, 10028

Поддерживаю вопрос. MQ, убедительная просьба к вам. Прокомментируйте, пожалуйста, данные 4 кода максимально подробно.
 

Коллеги, уже задолбался искать правду. Тема похожа на то что мне нужно, поэтому пишу сюда, прошу о помощи!

Выставляю ордер с немедленным исполнением, пока он висит каждый тик проверяю цену и если есть возможность трейлю ее.  Но почему-то всегда возвращается ошибка 10013. Облазил все возможные форумы и добавил почти все строчки из начального ордера (хотя в описании написано что достаточно только символа, действия и sl и tp, для данного типа действия. Ничего не помогает! Вот код.

// проверяем условие на открытую сделку
if (f_IsDealOpened()>0)
{  
   // здесь надо написать условия для коррекции ордеров
 MqlTradeRequest chrequest={0};
    if (1)//(is_Str2)
   {
    PositionSelect(NULL);
    if(PositionGetInteger(POSITION_TYPE)==0)
    {
        chrequest.symbol=PositionGetSymbol(0);
        chrequest.order=PositionGetInteger(POSITION_IDENTIFIER);
        chrequest.volume=PositionGetDouble(POSITION_VOLUME);
        chrequest.action=TRADE_ACTION_SLTP;
        chrequest.sl = latest_price.bid - TrailingStop;
        chrequest.tp = PositionGetDouble(POSITION_TP);

     }
     else
     {
        chrequest.symbol=PositionGetSymbol(0);
        chrequest.order=PositionGetInteger(POSITION_IDENTIFIER);
        chrequest.volume=PositionGetDouble(POSITION_VOLUME);
        chrequest.action=TRADE_ACTION_SLTP;
        chrequest.sl = latest_price.ask + TrailingStop;
        chrequest.tp = PositionGetDouble(POSITION_TP);
        Alert(PositionSelect(NULL));
     
     }    
    }
     MqlTradeResult chresult;
     if (OrderSend(chrequest,chresult)==0) 
         {
             Alert("Ошибка расчета функции OrderSend!");
             return;
         }    
         // анализируем код возврата торгового сервера
         if(mresult.retcode==10009 || mresult.retcode==10008) //запрос выполнен или ордер успешно помещен
           {
            Alert("Ордер по изменению SL успешно помещен, тикет ордера #: ",mresult.order,"!!");
            open_order_ticket = mresult.order;
            open_order_price = mresult.price;
            return;
           }
         else
           {
            Alert("Запрос на измнение ордера не выполнен - код ошибки: ",GetLastError());
            return;
           }
   
   
   return;
}