Filtrar operaciones dentro del loop por símbolo

 

Hola, necesito filtrar las órdenes abiertas dentro del loop por símbolo para calcular volumen, breakeven, etc.

De esta manera, únicamente consigo los datos del símbolo de la gráfica:

If(PositionGetString(POSITION_SYMBOL)==_Symbol){

También he probado de esta manera, pero sin éxito:

if(PositionGetSymbol(i)==PositionGetString(POSITION_SYMBOL)){

Y por último, lo he intentado con esto pero tampoco ofrece el resultado esperado:

            if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY){
               if(PositionGetSymbol(i)==true){
                  VT+=Volume;Alert(PS," volume total is ",VT);
                  BE+=(OP*Volume)/VT;Alert(PS," breakeven is ",BE);
                  }
               Alert(PS," breakeven at ",OP+(PartialClose1*10)*SPoint);
               }
            if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL){
               if(PositionGetSymbol(i)==true){
                  VT+=Volume;Alert(PS," volume total is ",VT);
                  BE+=(OP*Volume)/VT;Alert(PS," breakeven is ",BE);
                  }
               Alert(PS," breakeven at ",OP-(PartialClose1*10)*SPoint);
               }
¿Alguien me puede dar alguna idea? Gracias por adelantado.
 

quizas esto te oriente un poco:

double SymboloQueQuieroComparar="EURUSD";

if(PositionGetString(POSITION_SYMBOL) == SymboloQueQuieroComparar)
{
//hacer lo que necesitas
}
 
Miguel Antonio Rojas Martinez:

quizas esto te oriente un poco:

Con eso tendría que escribir al menos 30 líneas de código adicionales, no creo que sea la mejor solución.
 

Si lo que quieres es navegar por todos los simbolos disponibles usa esto:

for(int i=0; i<SymbolsTotal(false); i++)
{
        string name_symbol= SymbolName(i,false);
        
        //Ahora haces el chequeo y calculo para las operaciones de este simbolo
        for(int o=0; o<PositionsTotal(); o++)
        {       
                if(PositionSelectByTicket(PositionGetTiket(o)))
                {
                        if(PositionGetString(POSITION_SYMBOL) == name_symbol)
                        {
                                //Todas las posiciones de este symbolo pasaran por aqui
                                //haz tus calculos
                        }
                }
        }
}

No he acabado de entender cual es tu objetivo por la descripción de tu mensaje, pero espero haber acertado ... :P

Suerte

 
Imanol Salazar Garcia:

Si lo que quieres es navegar por todos los simbolos disponibles usa esto:

No he acabado de entender cual es tu objetivo por la descripción de tu mensaje, pero espero haber acertado ... :P

Suerte

Acabo de pasar tu código a limpio de la siguiente manera:

void OnStart(){
   for(int s=0;s<SymbolsTotal(false);s++){
      string CurrentS=SymbolName(s,false);
      //Ahora haces el chequeo para las operaciones de este símbolo
      for(int i=0;i<PositionsTotal();i++){ 
         ulong Ticket=PositionGetTicket(i);      
         if(PositionSelectByTicket(Ticket)){
            string PS=PositionGetString(POSITION_SYMBOL);
            if(PositionGetString(POSITION_SYMBOL)==CurrentS){
            //Todas las posiciones de este símbolo pasaran por aquí
               if(PositionGetInteger(POSITION_TYPE)==ORDER_TYPE_BUY){
                  Alert(PS," buy positions are ",PositionsTotal());
                  }
               if(PositionGetInteger(POSITION_TYPE)==ORDER_TYPE_SELL){
                  Alert(PS," sell positions are ",PositionsTotal());
                  }
               }
            }
         }
      }
   }

En caso de que este código funcionase debería devolverme el número de posiciones de cada símbolo en una u otra dirección, pero lo que obtengo es el total de posiciones abiertas. ¿Alguna otra idea?

 

Jejeje claro crack, de hecho el codigo funciona y esta haciendo justo lo que tu le pides, le estas pidiendo que te diga el total de posiciones abiertas todo el rato!!

Venga vamos a ver, si lo que quieres es el numero de operaciones de cada simbolo sería así:

void OnStart(){
        for(int s=0;s<SymbolsTotal(false);s++){
                string CurrentS=SymbolName(s,false);
                //Ahora haces el chequeo para las operaciones de este símbolo

                //Sumaremos compras y ventas de cada simbolo y las almacenaremos aqui
                int BuyPos=0, SellPos=0;
      
                for(int i=0;i<PositionsTotal();i++){ 
                        ulong Ticket=PositionGetTicket(i);      
                        if(PositionSelectByTicket(Ticket)){
                                string PS=PositionGetString(POSITION_SYMBOL);
                                if(PositionGetString(POSITION_SYMBOL)==CurrentS){
                                        
                                        //Todas las posiciones de este símbolo pasaran por aquí
                                        if(PositionGetInteger(POSITION_TYPE)==ORDER_TYPE_BUY) BuyPos++;

                                        if(PositionGetInteger(POSITION_TYPE)==ORDER_TYPE_SELL) SellPos++;
                                        
                                }
                        }
                }

                //Y las mostramos como Alert (SOLO SI HAY POSICIONES PARA NO SATURAR)
                if(BuyPos>0) Alert(CurrentS," buy positions are ",BuyPos);
                if(SellPos>0) Alert(CurrentS," sell positions are ",SellPos);
        }
}

Ahora te dice el numero total de posiciones de cada simbolo en una u otra dirección como querias ;)

Ya nos dirás.

 
Imanol Salazar Garcia:

Jejeje claro crack, de hecho el codigo funciona y esta haciendo justo lo que tu le pides, le estas pidiendo que te diga el total de posiciones abiertas todo el rato!!

Venga vamos a ver, si lo que quieres es el numero de operaciones de cada simbolo sería así:

Ahora te dice el numero total de posiciones de cada simbolo en una u otra direccióncomo querias ;)

Ya nos dirás.

Funciona, y es justo lo que estaba buscando.

He preguntado en castellano, he preguntado en inglés, e incluso he ofrecido dinero, pero nadie me había planteado una solución tan clara y sencilla. Mil gracias.

Edito: he encontrado un pequeño error al tratar de sacar el precio de breakeven, mañana continúo el hilo que ya es tarde.

 

Ohh me enorgullece, de nada ^_^

 


"No nos chupemos las po**** todavia"

Sr. Lobo (Pulp Fiction)

 
Imanol Salazar Garcia:

Ohh me enorgullece, de nada ^_^

Hola de nuevo, mira el problema que he encontrado es que no se pueden calcular las órdenes en conjunto.

Puede ser que se deba a que lo estoy ejecutando como script mediante la llamada OnStart en lugar de OnTick, hasta el lunes no puedo comprobarlo.

Si de paso andas por aquí y sabes algo me lo comunicas, un saludo fuerte.

 

Hola de nuevo, pego el código tal y como lo tengo ahora y el error que me da:

void OnStart(){
   for(int s=0;s<SymbolsTotal(false);s++){ // Define a counter loop for all broker symbols.
      int Long=0,Short=0;
      string CSymbol=SymbolName(s,false);  // Declare current working symbol from the loop.
      for(int i=0;i<PositionsTotal();i++){ // Here it goes the main loop for the advisor tool.
         ulong Ticket=PositionGetTicket(i);      
         if(PositionSelectByTicket(Ticket)){
            string PS=PositionGetString(POSITION_SYMBOL);       // Declare position symbol value.
            if(PositionGetString(POSITION_SYMBOL)==CSymbol){    // Check if position symbol is current working symbol.
               int SD=(int)SymbolInfoInteger(PS,SYMBOL_DIGITS); // Declare symbol digits to get its value (working).
               if(PositionGetInteger(POSITION_TYPE)==ORDER_TYPE_BUY){
                  Long++;if(Long>0){Alert(PS," buy orders are ",Long);}       // Count long orders from each symbol to print its value.
                  }
               if(PositionGetInteger(POSITION_TYPE)==ORDER_TYPE_SELL){
                  Short++;if(Short>0){Alert(PS," sell orders are ",Short++);} // Count short orders from each symbol to print its value.
                  }
               }
            }
         }
      }
   }

Aquí una captura de pantalla donde se puede ver que no realiza la suma correctamente:

Según he podido comprobar el error en el cálculo se produce dentro del módulo POSITION_TYPE, pero desconozco el motivo.

Razón de la queja: