nav-left cat-right
cat-right

Problema: Script para cerrar todas las órdenes

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…

Artículos Relacionados

  1. El apalancamiento. Un arma de doble filo
  2. Mostrar el Profit o Beneficio total en Pips
  3. Primer Expert Advisor para MetaTrader
  4. El primer indicador

468 ad

Leave a Reply

You must be logged in to post a comment.