cerrado

Hoy quiero daros un problema a resolver, el siguiente script es muy sencillo, explicaremos qué hace y cómo lo hace. Pero hay un error que tenéis que detectar y resolver, podéis dejar un comentario con vuestra respuesta.

El script CierraTodasLasOrdenes hace lo que su nombre indica: cerrar todas las órdenes abiertas que tenemos en la plataforma MetaTrader. ¿En qué momento puede sernos útil? A todo trader le ha pasado alguna vez que operando manualmente se ha emocionado en exceso (demasiada confianza) por la última racha positiva y ha empezado a abrir posiciones sin control. En un momento te das cuenta que no puedes seguir tantas operaciones, están empezando a perder y se están comiendo tus ganancias… tienes que cerrar. Cerrar todo, respirar hondo y volver a empezar. ¿Os suena?

Veamos cómo programar un script que cierre posiciones. El código es el siguiente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
int start()
  {
   int error;
 
   for(int pos = OrdersTotal()-1; pos >= 0; pos--)
   {
      Print("Cerrando orden #",pos);
      OrderSelect(pos,SELECT_BY_POS,MODE_TRADES);
      if(OrderType() == OP_BUY)
      {
         RefreshRates();
         if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,Yellow))
            {error=GetLastError(); Print("LastError = ",error); }
      }
      if(OrderType() == OP_SELL)
      {
         RefreshRates();
         if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,Yellow))
            {error=GetLastError(); Print("LastError = ",error); }
      }
   }
 
   return(0);
  }

La linea más importante es la del bucle for:

for(int pos = OrdersTotal()-1; pos >= 0; pos--)

Vamos a recorrer las posiciones (que corresponden a operaciones abiertas), las recorremos en orden descendente. Si hay 10 posiciones abiertas MetaTrader numera a la primera con un 0, a la segunda con un 1, y así sucesivamente hasta la décima con un 9. Es decir, 10 posiciones numeradas del 0 al 9.

Por eso, inicializamos la variable pos con OrdersTotal()-1, y vamos descontando pos–. ¿Por qué decreciente? Porque si lo hacemos creciente, cuando cerremos la orden 0, la orden 1 pasará a numerarse como 0… y nuestro bucle for pasará a la siguiente operación numerada con 1, saltandose una posición.

Lo demás es muy sencillo, tomamos cada posición:

OrderSelect(pos,SELECT_BY_POS,MODE_TRADES);

Y en función del tipo (BUY o SELL) la cerramos a un precio u otro (Bid o Ask).

Sin embargo este script no funciona… No cierra ninguna posición, debe tener algún error y para encontrarlo hemos utilizado la función GetLastError. Esto ya nos debería dar una pista de cuál es el error… Pero ¿sabéis cómo resolverlo?

La respuesta en los comentarios del foro…