Muchas entradas a la misma dirección.

 

Tengo creada una estrategia pero cada vez que la ejecuto me saltan muchas operaciones en la misma dirección debido a que se recalcula cada vez (esto ya es normal, el problema es que la estrategia lo detecta todo el rato como una compra o venta y por esto siempre ejecuta la orden de compra/venta).

Lo he intentado solucionar de muchas formas pero no encuentro como hacerlo. Una de las maneras que lo he intentado solucionar ha sido de la siguiente forma:

bool g_long_position_open = false;

int comprado = (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY);

if (comprado){
g_long_position_open == true; //de esta forma si ya está en una compra no volverá a entrar
}

if (g_long_position_open == false){
   if (trade > 0)
      trade.Buy(0.1);
}
//de la misma forma si es una venta

Básicamente quiero que después de una compra solo pueda haber una venta o al reves.

Archivos adjuntos:
captura.PNG  4 kb
 
03491903:

En CodeBase encontrará cientos de ejemplos: https://www.mql5.com/es/code/mt4/experts 

MQL5 Code Base: Asesores Expertos
MQL5 Code Base: Asesores Expertos
  • www.mql5.com
Asesores Expertos para MetaTrader 4 con los códigos fuente
 
03491903:

Tengo creada una estrategia pero cada vez que la ejecuto me saltan muchas operaciones en la misma dirección debido a que se recalcula cada vez (esto ya es normal, el problema es que la estrategia lo detecta todo el rato como una compra o venta y por esto siempre ejecuta la orden de compra/venta).

Lo he intentado solucionar de muchas formas pero no encuentro como hacerlo. Una de las maneras que lo he intentado solucionar ha sido de la siguiente forma:

Básicamente quiero que después de una compra solo pueda haber una venta o al reves.

Lo estás haciendo incorrectamente, Te doy un ejemplo a detalle de cómo se debería verificar si ya existe una posición abierta en el símbolo y con el número mágico especificado. Si no hay posiciones abiertas, se colocará una orden de compra o venta:

El código comienza estableciendo una variable booleana "BuyorSell" en falso. Luego, un bucle for se ejecuta desde i = 0 hasta el número total de posiciones abiertas. Para cada posición, el código verifica si el símbolo es el mismo que el actualmente seleccionado (Symbol()) y si el número mágico de la posición es igual al valor especificado (MagicNumber). Si se cumple esta condición, el código verifica si la posición es una posición de compra o venta. Si la posición es una de ellas, la variable "BuyorSell" se establece en verdadero.

Después de que se hayan verificado todas las posiciones abiertas, el código verifica si "BuyorSell" es falso, lo que significa que no hay posiciones de compra o venta abiertas en el símbolo y con el número mágico especificado. Si esto es cierto, se ejecutará el código para colocar una orden de compra o venta en el mercado.


Espero que te ayude.

   bool BuyorSell = false;
   for(int i=0; i<=PositionsTotal(); i++)
     {
      if(PositionGetSymbol(i)== Symbol())
        {
         if(PositionGetInteger(POSITION_MAGIC) == MagicNumber)
           {
            if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY || PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
               BuyorSell  = true;
           }
        }
     }
   if(!BuyorSell)
     {
      // PLACE BUY OR SELL ORDER
     }
 
Muchas gracias por la ayuda!!!
Razón de la queja: