Petición inválida - acaba de empezar y no puede resolverlo... - página 8

 
papaklass:

Lo tengo implementado de la misma manera, sólo que a través de funciones.


Ya veo. Su código es similar al de MK - entre OrderCheck y OrderSend hay una capa de manejo de errores por parte del usuario.

 
papaklass:

Yo lo tengo implementado así, sólo a través de funciones.

OrderCheck está implícito y se comprueba necesariamente dentro de OrderSend.

Así, si el pedido no se rellena correctamente, la respuesta se devuelve inmediatamente sin enviarla de nuevo al servidor.

 
papaklass:

Vea lo que dice el manual al respecto:

Primera selección: vemos que la función es para las transacciones comerciales y no se mencionan los cheques.

Bueno, si digo que hay controles, entonces es verdad.

Ningún pedido sale de la terminal sin controles estrictos.

Segundo punto destacado: vemos que las comprobaciones se realizan en el servidor y los desarrolladores recomiendan utilizar OrderCheck() para comprobar la petición antes de enviarla al servidor. De nuevo, no se menciona que OrderSend() realice ninguna validación.

En concreto, recomendamos que los operadores tengan la oportunidad de averiguar de antemano si la orden se ejecuta correctamente, y tomar las medidas oportunas.

Quien lo desee, puede comprobarlo previamente. Quien no lo desee, comprobará y devolverá respuestas similares por ellos de todos modos.

El único lugar en el que se menciona que la comprobación antes de enviar la solicitud es "En caso de que la comprobación básica de las estructuras (comprobación de punteros) tenga éxito ....". Pero la comprobación de los punteros y la comprobación de los valores de los campos de la estructura de petición para los errores no es la misma cosa. Y la recomendación de los desarrolladores de utilizar la función OrderCheck() es una prueba indirecta de que OrderSend() no realiza una verdadera comprobación de errores antes de enviar una solicitud al servidor. Si no es así, ¿por qué debemos hacer "manteado": OrderSend() comprueba primero, y luego la misma comprobación debe ser realizada por OrderCheck() de nuevo?

Por lo tanto, de la referencia se deduce inequívocamente que la comprobación se realiza únicamente en el servidor.

Nadie echará de menos un flujo erróneo o excesivo de peticiones al servidor.

La lógica básica es suficiente para entender esto. Y ampliaremos la documentación.

 
sergeev:

No lo tiene. Todos los errores son manejados por la lógica del negocio.

Yo tengo uno. La lógica de negocio se encarga de los eventos relacionados con la lógica de negocio (por ejemplo, el fallo en la realización del pedido), pero todo lo demás (por ejemplo, el retraso en la respuesta del servidor) - una plantilla universal, basada en la que se puede implementar absolutamente cualquier experto.

Pero MT5 es muchas veces más complicado en términos de manejo de códigos de retorno + asincronía.

De eso estamos hablando, como ya he escrito antes de forma similar, y hay cero información sobre este tema. Y desde hace años los MKs intentan por todos los medios desvincularse de su prestación. Esto es lo que escribí: los concesionarios se benefician de un producto en el que hay puntos que conducen a la fuga, es decir, para MQ es un factor de aumento de las ventas. Por desgracia, estamos en un mercado en el que los competidores (nosotros y MQ), no los camaradas.

Estás pidiendo lo imposible a un envoltorio. La biblioteca estándar no es lógica de negocio. Es una envoltura "sobre" las funciones de la terminal. Un envoltorio sobre el relleno del caramelo.

Entonces no tiene mucho sentido esa estructuración.

Pero el envoltorio no puede garantizar nada, ya que es usted quien actúa como garante. Su lógica empresarial. :)

Al igual que la función de impresión no puede garantizar el espacio libre en el disco. Y los errores de registro. Tienes que usar otras funciones para el manejo de errores y son específicas para cada caso.

Ni siquiera la envoltura adecuada puede garantizarlo todo, pero sí muchas cosas relacionadas con las funciones relacionadas.

-Alexey-, hablemos de los defectos específicos y tú expresas los defectos específicos que te gustaría arreglar.

Ya se ha escrito sobre lo específico más de una vez. Si MQ no es capaz de proporcionar una solución preparada, que al menos haga un manual sobre la gestión de errores y los códigos de retorno. Desbloqueado de todas las maneras posibles. En la documentación de 4 esto estaba presente en parte (por ejemplo, esperar 30 segundos en tal caso), en parte los usuarios han identificado por experiencia el manejo de situaciones no documentadas. Para el 5 no hay nada en absoluto. Y como lo hay, nadie lo usará.

Pues bien, si así responde MQ porque la infraestructura de negociación simplemente creada no lo permite en principio, entonces qué puedo decir: es un fracaso total de todo el proyecto MT5, dado que hay una masa increíble de otros escollos también.

Si quieres, puedes repasar cada código de retorno y ver las principales situaciones posibles.

Con gusto lo haría con un Asesor Experto en MQL5 tan experimentado como tú. Esperaremos el tiempo y la necesidad. Gracias a Dios sigo teniendo el 4 que es mucho más cómodo en muchos aspectos.

 

-Alexey-:

una solución lista, al menos una guía para el manejo de errores y códigos de retorno


¿Qué código causa problemas de procesamiento?


Código

Identificador

Descripción

10004

TRADE_RETCODE_REQUOTE

Requote

10006

TRADE_RETCODE_REJECT

Solicitud rechazada

10007

TRADE_RETCODE_CANCEL

Solicitud anulada por el comerciante

10008

TRADE_RETCODE_PLACED

Pedido realizado

10009

TRADE_RETCODE_DONE

Orden ejecutada

10010

TRADE_RETCODE_DONE_PARTIAL

Requisición parcialmente ejecutada

10011

TRADE_RETCODE_ERROR

Error de procesamiento de la solicitud

10012

TRADE_RETCODE_TIMEOUT

Solicitud anulada por expiración de plazo

10013

TRADE_RETCODE_INVALID

Solicitud incorrecta

10014

TRADE_RETCODE_INVALID_VOLUME

Volumen incorrecto en la solicitud

10015

TRADE_RETCODE_INVALID_PRICE

Precio incorrecto en la solicitud

10016

TRADE_RETCODE_INVALID_STOPS

Paradas incorrectas en la solicitud

10017

TRADE_RETCODE_TRADE_DISABLED

Comercio prohibido

10018

TRADE_RETCODE_MARKET_CLOSED

El mercado está cerrado

10019

TRADE_RETCODE_NO_MONEY

Insuficiencia de fondos para la ejecución de la solicitud

10020

TRADE_RETCODE_PRICE_CHANGED

Los precios han cambiado

10021

TRADE_RETCODE_PRICE_OFF

No hay presupuesto para tramitar la solicitud

10022

TRADE_RETCODE_INVALID_EXPIRATION

Fecha de caducidad no válida en la solicitud

10023

TRADE_RETCODE_ORDER_CHANGED

Se ha modificado el estado del pedido

10024

TRADE_RETCODE_TOO_MANY_REQUESTS

Solicitudes demasiado frecuentes

10025

TRADE_RETCODE_NO_CHANGES

No hay cambios en la solicitud

10026

TRADE_RETCODE_SERVER_DISABLES_AT

El servidor deniega el comercio automático

10027

TRADE_RETCODE_CLIENT_DISABLE_AT

Autotrading prohibido por el terminal del cliente

10028

TRADE_RETCODE_LOCKED

Solicitud bloqueada para su tramitación

10029

TRADE_RETCODE_FROZEN

Orden o posición congelada

10030

TRADE_RETCODE_INVALID_FILL

Se indica un tipo de orden de balance no soportado

10031

TRADE_RETCODE_CONNECTION

No hay conexión con el servidor de comercio

10032

TRADE_RETCODE_ONLY_REAL

La operación está permitida sólo para las cuentas reales

10033

COMERCIO_RETODECÓDIGO_LIMITE_DE_PEDIDOS

Límite del número de órdenes pendientes alcanzado

10034

VOLUMEN_DEL_CÓDIGO_DE_COMERCIO_ALCANZADO

Alcanzado el límite de volumen de órdenes y posiciones para este símbolo


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

Por ejemplo, 10004. ¿Dónde está escrito lo que hay que hacer? Y había al menos algo en la documentación cuádruple:

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

 
sergeev:

¿qué código plantea problemas de procesamiento?

10006 (¿qué motivo se rechaza, qué otros motivos puede haber que no figuren en los demás códigos?)

10011, 10013, 10028

 
A100:

10006 (¿qué motivo se rechaza, qué otros motivos puede haber que no se indiquen en los otros códigos?)

10011, 10013, 10028

Apoyo la pregunta. MQ, una fuerte petición para ti. Por favor, comente estos 4 códigos con el mayor detalle posible.
 

Los colegas, ya hartos de buscar la verdad. ¡El tema es similar a lo que necesito, así que escribo aquí pidiendo ayuda!

Coloco la orden con ejecución inmediata, mientras está colgada compruebo el precio cada tick y si es posible lo rastreo, pero por alguna razón siempre me da el error 10013. He mirado en todos los foros posibles y he añadido casi todas las líneas de la orden inicial (aunque en la descripción pone que para este tipo de acciones sólo basta con el símbolo, la acción y sl y tp. Nada funciona. Aquí está el código.

// проверяем условие на открытую сделку
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;
}