Error; 4756 (10013) - No me sirve ninguna solución

 

Hola,

Soy principiante y estoy haciendo mis prácticas. Pero no soy capaz de solucionar el siguiente error. Todo lo he podido arreglar entre la documentación y los foros pero esto no hay manera.

Quiero aprender a modificar la posición en curso usando TRADE_ACTION_MODIFY. Es un código con una sóla posición abierta por vez.

Pensé que era algo sencillo, poner la orden (action) y el campo que deseara modificar con el nuevo valor pero no hay manera.

En este caso sólo quiero modificar el valor del Stop Loss.

Os dejo un ejemplo:

 	 mrequest.action = TRADE_ACTION_MODIFY;   
         mrequest.symbol = _Symbol;                
         mrequest.magic = EA_Magic;        
         mrequest.sl = NormalizeDouble(sl_nuevo,_Digits);       // Stop Loss
         Alert("STOP LOSS = ",sl_previo," - ",sl_nuevo," - ",mrequest.sl);	// Esto siempre aparece correcto, o sea consigo lo que deseo
         mrequest.tp = 0; // Take Profit
         //--- send order
         bool exito = OrderCheck(mrequest, mcheck);
         Alert("EXITO? = ",exito," --- FUNCION?",OrderCheck(mrequest, mcheck));	// Aquí sale todo FALSE
         bool res = OrderSend(mrequest,mresult);
         Alert("RES? = ",res," --- FUNCION?",OrderSend(mrequest,mresult));	// TODO FALSE
         Alert("   ",mresult.retcode);						// 10013
         // get the result code
         if(exito && res && (mresult.retcode==10009 || mresult.retcode==10008)) { //Request is completed or order placed
            Alert("¡¡La orden de VENTA",mresult.order," ha sido MODIFICADA CON ÉXITO con un nuevo STOP LOSS de:",mrequest.sl,"!!");
         } else {
                Alert("La orden de VENTA",mresult.order," no ha podido ser MODIFICADA -error:",GetLastError());	// 4756
                ResetLastError();   
                }


He visto en el error 10013 que se suele deber a que no hay operación en curso. Entonces uso lo siguiente:

       int total=OrdersTotal(); // total number of placed pending orders

      Alert("ORDENES ABIERTAS = ",total);

Y siempre aparece 0 (CERO). Sin embargo es mentira.


No sé si se me escapa algo, ¿o debo decirle a la orden MODIFY que orden debe modificar aparte de lo ya especificado?

He visto que hay comandos de Ticket, Operation, etc., Pero he intentado usarlos durante 2 días sin éxito.

He probado el mismo código con SLTP (no tengo claro si debe ser MODIFY o SLTP) pero el error es el mismo.


Espero que alguien me pueda ayudar.

Gracias de antemano.


ACTUALIZO:

Parece que ahora funciona correctamente con dos correcciones:

1. He puesto SLTP el position ticket como se muestra en https://www.mql5.com/es/docs/constants/tradingconstants/enum_trade_request_actions#trade_action_sltp

ulong  position_ticket= PositionGetTicket(0); 

.....y entre los mrequests:

       mrequest.position = position_ticket;   // ticket de la posición

En el enlace, hacen un for iterativo y consiguen cada ticket con PositionGetTicket(i); 

Se me ha ocurrido poner  PositionGetTicket(0); en la asunción de que sólo hay una posición y debe ser la 0.

Pero no sé si sería lo más ortodoxo o pueda ocasionar problemas. Acepto comentarios y recomendaciones.


2. Tras esto daba todo TRUE salvo el OrderSend de la alerta y el error 10025 (mientras el res daba TRUE).

10025

TRADE_RETCODE_NO_CHANGES

Sin cambios en la solicitud

Tuve que quitar la ALERTA de OrderSend porque claro se enviaba de nuevo y al ser false (por no haber cambios respecto a la anterior) se iba al ELSE y me decía que no había podido podificarse :S


Un Saludo

Documentación para MQL5: Constantes, Enumeraciones y Estruturas / Constantes comerciales / Tipos de operaciones comerciales
Documentación para MQL5: Constantes, Enumeraciones y Estruturas / Constantes comerciales / Tipos de operaciones comerciales
  • www.mql5.com
Tipos de operaciones comerciales - Constantes comerciales - Constantes, Enumeraciones y Estruturas - Manual de referencia de MQL5 - manual de usuario para el lenguaje del trading algorítmico/automático para MetaTrader 5