Error nº 1 al modificar los pedidos

 

¿Cómo puedo deshacerme de este maldito error? Estoy harto. Estoy comprobando cada parámetro de entrada de la función. Para mí, en este momento, es así:

if (OrderOpenPrice() != ND (fd_MurreyLevelsValue[11]))
   New_OOP = ND (fd_MurreyLevelsValue[11]);
else New_OOP = OrderOpenPrice();
if (OrderStopLoss() != ND (fd_MurreyLevelsValue[12]))
   New_SL = ND (fd_MurreyLevelsValue[12]);
else New_SL = OrderStopLoss();
if (OrderTakeProfit() != ND (fd_MurreyLevelsValue[2]))
   New_TP = ND (fd_MurreyLevelsValue[2]);
else New_TP = OrderTakeProfit();

Es decir, si el parámetro no ha sido modificado, no es necesario cambiarlo. No lo he hecho antes, pero he decidido...

A continuación, los parámetros se pasan al método de modificación de la orden de la siguiente manera:

 if (!fOrderModify (Ticket,  New_OOP, New_SL, New_TP))
{
   if (_LastError != 0)
     WriteLog (StringConcatenate (__FUNCTION__, ". В строке ", __LINE__, " ", CErrs.ErrorToString (_LastError)),
                     CLogs.GetNeedLogs(), CLogs.GetPrintUP(), CLogs.GetCommentUP());
}

Nw salida en el registro:

modify #2  sell limit 0.10 EURUSD at 1.34048 sl: 1.34125 tp: 1.33362 ok
OrderModify error 1

Entonces, el diario nos notifica, como modificación: OK, pero luego un error. Ninguno de los parámetros ha cambiado.

La orden está pendiente. Así que podemos cambiar el precio de apertura, de parada y de toma. Y esto, según tengo entendido, no contradice la documentación.

¿Quién se ha encontrado con algo así? ¿Cómo solucionarlo?

 
hoz:

¿Cómo puedo deshacerme de este maldito error? Estoy harto. Estoy comprobando cada parámetro de entrada de la función. Para mí, en este momento, es así:

Es decir, si el parámetro no ha sido modificado, no es necesario cambiarlo. No lo he hecho antes, pero he decidido...

A continuación, los parámetros se pasan al método de modificación de la orden de la siguiente manera:

Nw salida en el registro:

Entonces, el diario nos notifica, como modificación: OK, pero luego... un error. Ninguno de los parámetros ha cambiado.

La orden está pendiente. Así que podemos cambiar el precio de apertura, de parada y de toma. Y esto, según tengo entendido, no contradice la documentación.

¿Quién se ha encontrado con algo así? ¿Cómo solucionarlo?

Está manejando mal el código de error, olvidando que el código de error ya está anulado después de sus numerosas funciones.

Así que cuando se produce un error, es necesario guardar el código de error en una variable local e imprimirlo desde allí, después de la masa de sus llamadas posteriores.

 
Renat:

Está manejando mal el código de error, olvidando que el código de error ya está anulado después de sus numerosas funciones.

Por lo tanto, cuando se produce un error, su código debe ser guardado en una variable local, y sólo entonces, después de la masa de sus llamadas posteriores, imprimirlo.

¿Por qué no creas también una matriz de errores? Está escrito en blanco y negro en la documentación que la variable _LastError almacena el número del último error. Y se restablece mediante la función ResetLastError(). Si no hay más errores entre las llamadas de _LastError, _LastError almacena el valor del último error. No hubo más errores en mi código. Bueno, esa no es la cuestión.

Además, no es muy lógico crear variables para los errores en cada método y luego imprimir estas variables en Expert Advisors.

Al fin y al cabo, si hay una variable que recoge los errores, ¿para qué crear otras nuevas?

 

evillive, ¿qué quieres decir con que no hay controles? Ya lo escribí antes:

if (OrderOpenPrice() != ND (fd_MurreyLevelsValue[11]))    \\ Если текущая цена не равна новой.. из массива, то..
   New_OOP = ND (fd_MurreyLevelsValue[11]);               \\.. новая цена равна этому новому значению цены из массива( расчитанного ).
else New_OOP = OrderOpenPrice();                          \\ Иначе новая цена равно текущей цене выбранного ордера. Т.е. не изменяется.
if (OrderStopLoss() != ND (fd_MurreyLevelsValue[12]))
   New_SL = ND (fd_MurreyLevelsValue[12]);
else New_SL = OrderStopLoss();
if (OrderTakeProfit() != ND (fd_MurreyLevelsValue[2]))
   New_TP = ND (fd_MurreyLevelsValue[2]);
else New_TP = OrderTakeProfit();

Incluso di un comentario para el primero. Aunque allí todo es elemental.

¿De qué otra forma se puede comprobar aquí?

 
¡Hago una doble comprobación de que no es igual y se dirige a donde se espera!
 
evillive:
Me he dado cuenta, por eso he limpiado)))
¡Estás siendo grosero! ;)
 
borilunad:
¡Vuelvo a comprobar que no es igual y se dirige a donde se espera!

Boris, ¿qué quieres decir con eso? Porque tengo escrito claramente que si el precio no es así... si no... actual... ¿Qué sentido tiene? Puedes comprobarlo 20 veces... :) No tiene sentido. Llevo dos días luchando con este código. Nunca me había encontrado con un fallo así. Ahora lo he afrontado. Ya he escrito y probado todos estos métodos muchas veces. Me he encontrado con un problema.

Lo que pasa es que yo soy más partidario de las tácticas ligeramente diferentes. Pero al escribir los últimos Búhos, me encontré con este fallo. Eso es a mí mismo no sé dónde cavar, porque pristrintovav todo el código a lo largo y de lo contrario no tengo más pensamientos. Por eso la función OrderModify() está incorporada. Y no conozco su aplicación.

 
hoz:

evillive, ¿qué quieres decir con que no hay controles? Ya lo escribí antes:

Incluso di un comentario para el primero. Aunque allí todo es elemental.

¿De qué otra forma se puede comprobar aquí?

Víctor, después de comprobar, el nuevo valor se asigna o no... Tienes que comprobarlo.

if (OrderOpenPrice() != ND (fd_MurreyLevelsValue[11])  // Если текущая цена не равна новой.. из массива
 || OrderStopLoss() != ND (fd_MurreyLevelsValue[12])   // или 
 || OrderTakeProfit() != ND (fd_MurreyLevelsValue[2])) // или
  // если одно из условий выполнено пойдём в модифай... 
 
AlexeyVik:

Victor, después de comprobar que el nuevo valor está asignado o no... Y tienes que comprobar

Alexey, ¿y dónde tienes una comprobación para asegurarte de que el valor de la función que se pasa no se modifica? Ya lo he tenido en cuenta más arriba. Y la necesidad de modificación en general se hace al principio. Allí hay niveles, si el indicador informa que el nivel ha cambiado, sigamos...

 
hoz:

Boris, ¿qué quieres decir con eso? Porque tengo claramente escrito que si el precio no es así... si no... actual... ¿Qué sentido tiene? Puedes comprobarlo 20 veces... :) No tiene sentido. Llevo dos días luchando con este código. Nunca me había encontrado con un fallo así. Ahora lo he afrontado. Ya he escrito y probado todos estos métodos muchas veces. Me he encontrado con un problema.

Lo que pasa es que yo soy más partidario de las tácticas ligeramente diferentes. Pero al escribir los últimos Búhos, me encontré con este fallo. Eso es a mí mismo no sé dónde cavar, porque pristrintovav todo el código a lo largo y de lo contrario no tengo más pensamientos. Por eso la función OrderModify() está incorporada. Y no conozco su aplicación...

¡Víctor, que Renat, en general, señaló correctamente, Alexey mostró la última comprobación necesaria, y antes, comprobar todos los controles necesarios para cada parámetro con todos los matices, para evitar la ambigüedad de significado y sin perder ninguna condición!
 
hoz:

evillive, ¿qué quieres decir con que no hay controles? Ya lo escribí antes:

if (OrderOpenPrice() != ND (fd_MurreyLevelsValue[11]))    \\ Если текущая цена не равна новой.. из массива, то..
   New_OOP = ND (fd_MurreyLevelsValue[11]);               \\.. новая цена равна этому новому значению цены из массива( расчитанного ).
else New_OOP = OrderOpenPrice();                          \\ Иначе новая цена равно текущей цене выбранного ордера. Т.е. не изменяется.
if (OrderStopLoss() != ND (fd_MurreyLevelsValue[12]))
   New_SL = ND (fd_MurreyLevelsValue[12]);
else New_SL = OrderStopLoss();
if (OrderTakeProfit() != ND (fd_MurreyLevelsValue[2]))
   New_TP = ND (fd_MurreyLevelsValue[2]);
else New_TP = OrderTakeProfit();

Incluso di un comentario para el primero. Aunque allí todo es elemental.

¿De qué otra forma se puede comprobar aquí?

También tenemos que comprobar que si ninguno de los 3 parámetros no ha cambiado, entonces OrderModify no debe ser tocado. O más bien, si al menos uno de estos parámetros ha cambiado, sólo entonces ir a OrderModify.