Errores, fallos, preguntas - página 540

 

Mi Asesor Experto, que está participando en el Campeonato, está realizando acciones incorrectas debido al funcionamiento incorrecto de la biblioteca estándar de CTrade.

Utilizo la función PositionClose para cerrar posiciones. Pero además de cerrar posiciones, esta función abre operaciones.

La función se utiliza así:

//--- Объект класса СTrade
CTrade mytrade;
//--- Объект класса СPositionInfo
CPositionInfo myposition;

//+------------------------------------------------------------------+
//| Проверяет и если нужно, закрывает открытую позицию               |
//+------------------------------------------------------------------+
bool ClosePosition(string ptype,double clp)
  {
   bool R=false, marker=false; int i;
     
      if(myposition.Select(_Symbol)==true)
        {
         if(myposition.Symbol()==_Symbol)
           {
            //--- Делаем попытки закрыть позицию, если позиция не закрылась с первого раза
              for (i=5; i>=1; i--) 
                {R=mytrade.PositionClose(_Symbol,50,5); if (R == true && myposition.Select(_Symbol)==false) break;}
               if(i >= 1) 
                 {//--- запрос успешно выполнен
                  Alert("Открытая позиция была успешно закрыта!!");
                  marker=true;
                 }
               else
                 {
                  Alert("Запрос на закрытие позиции не выполнен - ошибка: ",mytrade.ResultRetcodeDescription());
                 }
            //  }
           }
        }
      return(marker);
     }

PositionClose acaba abriendo órdenes a veces innecesarias.

Aquí, la operación de compra se cerró primero y luego se abrió una operación de venta adicional del mismo tamaño. Además, AccountInfoDouble(ACCOUNT_FREEMARGIN) no ha notado esta operación extra. Porque fue seguido por un comercio con lote más grande, aunque no había suficiente dinero para ello según el MM usado.

Me doy cuenta de que quizás no estoy utilizando las funciones MQL de forma óptima. Pero el hecho de que una función de la biblioteca propietaria de MQL destinada a cerrar operaciones abra operaciones por sí misma no se ajusta a mi idea del comportamiento aceptable de las funciones.

 
masharov:

Entiendo que puede que no esté utilizando las funciones MQL de forma óptima. Pero el hecho de que una función de la biblioteca propietaria de MQL destinada a cerrar operaciones abra a su vez operaciones no se ajusta a mi idea del comportamiento aceptable de las funciones.

Lea el artículo Eventos comerciales en MetaTrader 5:

Los eventos comerciales y los cambios en el historial comercial se comunican a través de canales independientes. Al enviar una solicitud de compra mediante la función OrderSend(), puede reconocer inmediatamente el ticket del pedido, que se ha creado si la solicitud se ha comprobado con éxito. Pero al mismo tiempo, la orden en sí puede no aparecer todavía en el terminal del cliente, y un intento de seleccionarla usando la función OrderSelect() fallará.

Vea también el artículo Órdenes, posiciones y operaciones en MetaTrader 5
 

No he utilizado la función OrderSend. Se utiliza la función PositionClose de la biblioteca estándar de MQL, que está diseñada para trabajar con órdenes.

La ayuda de esta función no describe que pueda abrir operaciones.

Cita de la referencia:

PosiciónCierre

Cierra una posición en el símbolo especificado.

bool PosiciónCerrada(
const string symbol, // símbolo
ulong deviation=ULONG_MAX // desviación
)

Parámetros

símbolo

[Nombre del instrumento comercial sobre el que debe cerrarse la posición.

desviación=ULONG_MAX

[in] Desviación máxima del precio actual (en puntos).

Valor devuelto

true - si la comprobación básica de las estructuras tiene éxito, en caso contrario, false.

Nota

La finalización exitosa del método PositionClose(...) no siempre significa la ejecución exitosa de una operación comercial. Es necesario comprobar el resultado de una solicitud de comercio (código de retorno del servidor de comercio) llamando al método ResultRetcode().

 
masharov:

No he utilizado la función OrderSend. Se utiliza la función PositionClose de la biblioteca estándar de MQL, que está diseñada para simplificar el trabajo con las órdenes.

La ayuda de esta función no describe que pueda abrir operaciones.

Cita de la referencia:

PosiciónCierre

Cierra una posición en el símbolo especificado.

bool PosiciónCerrada(
const string symbol, // símbolo
ulong deviation=ULONG_MAX // desviación
)

Parámetros

símbolo

[Nombre del instrumento comercial sobre el que debe cerrarse la posición.

desviación=ULONG_MAX

[in] Desviación máxima del precio actual (en puntos).

Valor devuelto

true - si la comprobación básica de las estructuras tiene éxito, en caso contrario, false.

Nota

La finalización exitosa del método PositionClose(...) no siempre significa la ejecución exitosa de una operación comercial. El resultado de la ejecución de la solicitud de comercio (el código de retorno del servidor de comercio) debe comprobarse llamando al método ResultRetcode().

No hay ningún error en la función de la biblioteca PositionClose(...). Pero hay uno en su código. Aquí está la cita de la referencia.

Успешное окончание работы метода PositionClose(...) не всегда означает успешное совершение торговой операции. 
Необходимо проверять результат выполнения торгового запроса (код возврата торгового сервера) вызовом метода ResultRetcode(). 

Yo, por ejemplo, no veo esta comprobación en su código.

 
masharov:

No he utilizado la función OrderSend. Se utiliza la función PositionClose de la biblioteca estándar de MQL, que está diseñada para trabajar con órdenes.

La ayuda de esta función no describe que pueda abrir operaciones.


Y puedes ver la implementación de la función PositionClose:

bool CTrade::PositionClose(const string symbol,ulong deviation)
  {
   bool   partial_close=false;
   int    retry_count  =10;
   uint   retcode      =TRADE_RETCODE_REJECT;
//--- check stopped
   if(IsStopped(__FUNCTION__)) return(false);
//--- variables
   string action,result;
//--- clean
   ClearStructures();
   do
     {
      //--- checking
      if(PositionSelect(symbol))
        {
         if((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
           {
            //--- prepare request for close BUY position
            m_request.type =ORDER_TYPE_SELL;
            m_request.price=SymbolInfoDouble(symbol,SYMBOL_BID);
           }
         else
           {
            //--- prepare request for close SELL position
            m_request.type =ORDER_TYPE_BUY;
            m_request.price=SymbolInfoDouble(symbol,SYMBOL_ASK);
           }
        }
      else
        {
         //--- position not found
         m_result.retcode=retcode;
         return(false);
        }
      //--- setting request
      m_request.action      =TRADE_ACTION_DEAL;
      m_request.symbol      =symbol;
      m_request.deviation   =(deviation==ULONG_MAX) ? m_deviation : deviation;
      m_request.type_filling=m_type_filling;
      m_request.volume      =PositionGetDouble(POSITION_VOLUME);
      //--- check volume
      double max_volume=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MAX);
      if(m_request.volume>max_volume)
        {
         m_request.volume=max_volume;
         partial_close=true;
        }
      else
         partial_close=false;
      //--- order check
      if(!OrderCheck(m_request,m_check_result))
        {
         //--- copy return code
         m_result.retcode=m_check_result.retcode;
         if(m_log_level>LOG_LEVEL_NO)
            printf(__FUNCTION__+": %s [%s]",FormatRequest(action,m_request),FormatRequestResult(result,m_request,m_result));
         return(false);
        }
      //--- order send
      if(!OrderSend(m_request,m_result))
        {
         if(--retry_count!=0) continue;
         if(retcode==TRADE_RETCODE_DONE_PARTIAL)
            m_result.retcode=retcode;
         if(m_log_level>LOG_LEVEL_NO)
            printf(__FUNCTION__+": %s [%s]",FormatRequest(action,m_request),FormatRequestResult(result,m_request,m_result));
         return(false);
        }
      retcode=TRADE_RETCODE_DONE_PARTIAL;
      if(partial_close) Sleep(1000);
     }
   while(partial_close);
   if(m_log_level>LOG_LEVEL_ERRORS)
      printf(__FUNCTION__+": %s [%s]",FormatRequest(action,m_request),FormatRequestResult(result,m_request,m_result));
//--- ok
   return(true);
  }
 

Pensé que no necesitaba estudiar el código fuente de las bibliotecas estándar.

La ayuda no describe la posibilidad de abrir operaciones con la función PositionClose. Las comprobaciones y protecciones contra la apertura de operaciones con la función PositionClose, que su equipo ha desarrollado, deberían contenerse. Creo que las bibliotecas estándar son un código ideal que debería servir de modelo para los demás. Por lo tanto, no debería ser necesario analizar el código de las bibliotecas antes de utilizarlas.

Cita:

La biblioteca estándar MQL5 está escrita en lenguaje MQL5 y está diseñada para facilitar la escritura de programas (indicadores, scripts, expertos) a los usuarios finales. La biblioteca proporciona un fácil acceso a la mayoría de las funciones internas de MQL5.

 
masharov:

Pensé que no necesitaba estudiar el código fuente de las bibliotecas estándar.

La ayuda no describe la posibilidad de abrir operaciones con la función PositionClose. Las comprobaciones y protecciones contra la apertura de operaciones con la función PositionClose, que su equipo ha desarrollado, deberían contenerse. Creo que las bibliotecas estándar son un código ideal que debería servir de modelo para los demás. Por lo tanto, no debería ser necesario analizar el código de las bibliotecas antes de utilizarlas.

La ignorancia de la ley no le exime de responsabilidad. ¿En qué parte de tu código está la comprobación de que la posición se ha cerrado?

            //--- Делаем попытки закрыть позицию, если позиция не закрылась с первого раза
              for (i=5; i>=1; i--) 
                {
                 R=mytrade.PositionClose(_Symbol,50,5); 
                 if (R == true && myposition.Select(_Symbol)==false) break;
                }

Expresión

R == true

sólo indica que la función PositionClose() se ejecutó con éxito, pero no que la posición se cerró:

Nota

La finalización exitosa del método PositionClose(...) no siempre significa la ejecución exitosa de una operación comercial. Es necesario comprobar el resultado de la ejecución de una solicitud de comercio (código de retorno del servidor de comercio) llamando al método ResultRetcode().

La segunda expresión

myposition.Select(_Symbol)==false)

equivale a

PositionSelect(_Symbol)==false)

y tampoco ofrece ninguna garantía para las operaciones comerciales asíncronas. Ya se ha cerrado una posición en el servidor de operaciones y el terminal aún no ha recibido un mensaje al respecto. Resulta que ha creado un error en su código.

En la vida real, no todo es tan fluido como en el probador; puede haber pequeños retrasos entre el envío de una solicitud de operación y el resultado de su ejecución. Cada uno resuelve este problema por sí mismo, para empezar no estaría de más comprobar el código de retorno utilizando la función ResultRetcode(), tal y como está escrito en la ayuda.

 

Otra vez.

Me doy cuenta de que quizás no estoy utilizando las funciones MQL de forma óptima. Pero el hecho de que una función de la biblioteca propietaria de MQL destinada acerrar operacionesabra operaciones por sí misma no se ajusta a mi idea del comportamiento aceptable de las funciones.

Todo lo que dices se aplica al cierre de operaciones. Sí, el EA no comprueba de forma óptima las posiciones de cierre. Pero eso no permite que una función diseñada para cerrar abra operaciones por sí misma.

La ayuda dice:

PosiciónCierre

Cierra la posición según el símbolo especificado.

No se describen condiciones para que la función pueda abrir una operación. La recomendación de comprobar el código de retorno también sirve sólo para comprobar adicionalmente si la operación está cerrada o no.

 
masharov:

Otra vez.

Entiendo que puede que no esté utilizando las funciones MQL de forma óptima. Pero el hecho de que la función de la biblioteca propietaria de MQL destinada acerrar operacionesabra operaciones por sí misma no se ajusta a mi idea del comportamiento aceptable de las funciones.
No hay función de cierre de posiciones, sólo existe la función de envío de una solicitud de compra o venta (y se desconoce cuál será el resultado: apertura o cierre de una posición). En su caso, debido a un error algorítmico, se envían peticiones repetidas sin comprobar si la petición anterior se ejecutó.
 
Rosh:
No hay función de cierre de posiciones, sólo existe la función de enviar una solicitud de compra o venta (y el resultado -la apertura o el cierre de una posición- es desconocido). En su caso, debido a un error algorítmico, se envían peticiones repetidas sin comprobar si se ejecutó la petición anterior.

La ayuda tiene esta función

Referencia MQL5 / Biblioteca Estándar / Clases de Negociación / CTrade / PositionClose

Cierra la posición por el símbolo especificado.

El usuario no debe preocuparse por cómo se implementa la función en el nivel bajo. Desde que existe esta función, MetaQuotes ha garantizado que no tendrá ningún comportamiento no estándar que no esté descrito en la ayuda.

La biblioteca estándar de MQL5 está escrita en MQL5 y está destinada a facilitar la escritura de programas (indicadores, scripts y Asesores Expertos) por parte de los usuarios finales. La biblioteca proporciona un fácil acceso a la mayoría de las funciones internas de MQL5.

Razón de la queja: