OrderSend() para modificar SL funciona solo en la apertura

 

Tengo este código para modificar el stop-loss de una posición:

               MqlTradeRequest request;
               request.action = TRADE_ACTION_SLTP;
               request.symbol = _Symbol;
               request.sl = nuevoSL;
               request.tp = tpActual;
               request.position = tiquePosicion;

               MqlTradeResult result;
               if(!OrderSend(request, result))
                 {
                  PrintFormat("Error modifying the position: %d", GetLastError());
                 }

Para cada nueva vela, revisa si es momento de cambiar el nivel de stop-loss y, si es el caso, se ejecuta el código poniendo este valor en nuevoSL.

En la imagen de un caso ejemplo vemos una entrada en largo, y en la 4ta vela (primera línea punteada vertical roja) intenta la primera modificación.

ejemplo

Pero falla, devuelve lo siguiente:

//2020.05.07 20:00:00   failed modify #6 buy 0.06 GBPUSD sl: 1.23121, tp: 1.23971 -> sl: 1.23249, tp: 1.23971 [Invalid request]
//2020.05.07 20:00:00   Error modifying the position: 4756

Y vuelve a fallar en cada vela hasta la segunda  línea punteada vertical roja; pero en la siguiente funciona. En la imagen se ve en líneas punteadas verdes el momento en que no falla y se modifica el nivel de stop-loss y el nuevo nivel en el que queda establecido, en el que se dispara la salida de la posición cuatro velas más tarde.

Y esto es lo que tiene en común con todas las operaciones: La modificación del nivel de SL es exitosa tras la apertura del mercado. Antes y luego de eso fallarán todas, excepto que la operación dure hasta el siguiente cierre y apertura, cuando se comportará de la misma manera. Por ejemplo, si la operación dura tres días, la modificación del SL se producirá en la primera solicitud de cada nuevo día y fallarán todas las demás. Todas las modificaciones exitosas responden a esto sin excepción.

modified

¿Por qué sucede esto y cómo debería resolverlo?