SOBRE ORDENAR DE MENOR A MAYOR...

 

Buenas noches. Estoy realizando un indicador en el que quiero sacar los precios LOW de los ultimos 5 fractales de abajo. Bien, pero ahora quiero conseguir que el prgrama sepa buscar el precio de cierre más bajo entre éstos 5 fractales, y despues busque el SEGUNDO precio de cierre más bajo de los 4 fractales que quedan (excluyendo el ya encontrado), y asi sucesivamente hasta ordenar los 5 fractales según su precio LOW, del precio más bajo al más alto...

He conseguido extraer cuál es el fractal, de entre los 5, más bajo (con su precio de cierre),pero no consigo hacer que busque el siguiente más bajo, logicamente excluyendo el que ya ha encontrado.... ¿Alguien me puede dar alguna idea?. Estaría my agradecido.

Dejo el pequeño programa hasta donde he llegado....

int Fractal1,Fractal2,Fractal3,Fractal4;
double PrecioFractal1,PrecioFractal2,PrecioFractal3,PrecioFractal4,FractalMasBajo,FractalMasBajo2,FractalMasBajo3,FractalMasBajo4; 
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   
//---
   return(INIT_SUCCEEDED);
  }
  
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   for (int i=0; i<600; i++)
   {
    if (iFractals(NULL,PERIOD_M5,MODE_LOWER,i)!=NULL)
    break;
    Fractal1=i+1;
    PrecioFractal1=Low[Fractal1];  
   }
  
   for (int i=Fractal1+1; i<600; i++)
   {  
    if (iFractals(NULL,PERIOD_M5,MODE_LOWER,i)!=NULL)
    break;
    Fractal2=i+1;
    PrecioFractal2=Low[Fractal2];
   } 
   
    for (int i=Fractal2+1; i<600; i++)
   {  
    if (iFractals(NULL,PERIOD_M5,MODE_LOWER,i)!=NULL)
    break;
    Fractal3=i+1;
    PrecioFractal3=Low[Fractal3];
   } 
   
    for (int i=Fractal3+1; i<600; i++)
   {  
    if (iFractals(NULL,PERIOD_M5,MODE_LOWER,i)!=NULL)
    break;
    Fractal4=i+1;
    PrecioFractal4=Low[Fractal4];
   } 
   
   for (int r=Fractal1-1; r<Fractal4+1; r++)
   {
   FractalMasBajo=iFractals(NULL,PERIOD_M5,MODE_LOWER,r);
   
   }
   
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 

Prueba esto ;)

double array_precios_bajos[4],
       array_ordenados[4];

array_precios_bajos[0] = PrecioFractal1;
array_precios_bajos[1] = PrecioFractal2;
array_precios_bajos[2] = PrecioFractal3;
array_precios_bajos[3] = PrecioFractal4;

for(char i=0; i<4; i++)
{
    int posicion = ArrayMinimum(array_precios_bajos);
    array_ordenados[i] = array_precios_bajos[posicion];
    array_precios_bajos[posicion] = ArrayMaximum(array_precios_bajos)+1;
}

FractalMasBajo  = array_ordenados[0];
FractalMasBajo2 = array_ordenados[1];
FractalMasBajo3 = array_ordenados[2];
FractalMasBajo4 = array_ordenados[3];

 
Imanol Salazar Garcia:

Prueba esto ;)

double array_precios_bajos[4],
       array_ordenados[4];

array_precios_bajos[0] = PrecioFractal1;
array_precios_bajos[1] = PrecioFractal2;
array_precios_bajos[2] = PrecioFractal3;
array_precios_bajos[3] = PrecioFractal4;

for(char i=0; i<4; i++)
{
    int posicion = ArrayMinimum(array_precios_bajos);
    array_ordenados[i] = array_precios_bajos[posicion];
    array_precios_bajos[posicion] = ArrayMaximum(array_precios_bajos)+1;
}

FractalMasBajo  = array_ordenados[0];
FractalMasBajo2 = array_ordenados[1];
FractalMasBajo3 = array_ordenados[2];
FractalMasBajo4 = array_ordenados[3];

Muchas Gracias Imanol por responder. He hecho lo que me sugeristes, pero mucho me temo que algo estoy haciendo mal... El primer valor, el fractal Mas Bajo es correcto, pero en los demás me sale 1.0... Te mando de nuevo el programa incluyendo lo que me dijistes así como pantallazo con el resultado, por si pudieras decirme qué hago mal o qué podríamos modificar para que salga bien... Mil gracias.

#property copyright " Copyright 2017"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window

int Fractal1,Fractal2,Fractal3,Fractal4,Fractal5,Posicion;
double PrecioFractal1,PrecioFractal2,PrecioFractal3,PrecioFractal4,FractalMasBajoPrice,FractalMasBajo1,FractalMasBajo2,FractalMasBajo3,FractalMasBajo4,FractalMasBajo5;
datetime FractalMasBajoTime=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   
//---
   return(INIT_SUCCEEDED);
  }
  
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   
   for (int i=0; i<Bars-1; i++)
   {
    if (iFractals(NULL,PERIOD_M5,MODE_LOWER,i)!=NULL)
    break;
    Fractal1=i+1;    
   }
   
  
   for (int i=Fractal1+1; i<Bars-1; i++)
   {  
    if (iFractals(NULL,PERIOD_M5,MODE_LOWER,i)!=NULL)
    break;
    Fractal2=i+1;   
   } 
   
   
    for (int i=Fractal2+1; i<Bars-1; i++)
   {  
    if (iFractals(NULL,PERIOD_M5,MODE_LOWER,i)!=NULL)
    break;
    Fractal3=i+1;    
   } 
   
   
    for (int i=Fractal3+1; i<Bars-1; i++)
   {  
    if (iFractals(NULL,PERIOD_M5,MODE_LOWER,i)!=NULL)
    break;
    Fractal4=i+1;    
   }    
   
    for (int i=Fractal4+1; i<Bars-1; i++)
   {  
    if (iFractals(NULL,PERIOD_M5,MODE_LOWER,i)!=NULL)
    break;
    Fractal5=i+1;    
   }    
 
   
datetime Fractal1Time=iTime(NULL,PERIOD_M5,Fractal1);
datetime Fractal2Time=iTime(NULL,PERIOD_M5,Fractal2);
datetime Fractal3Time=iTime(NULL,PERIOD_M5,Fractal3);
datetime Fractal4Time=iTime(NULL,PERIOD_M5,Fractal4);  
datetime Fractal5Time=iTime(NULL,PERIOD_M5,Fractal5);

double   Fractal1Price=iLow(NULL,PERIOD_M5,Fractal1);
double   Fractal2Price=iLow(NULL,PERIOD_M5,Fractal2);
double   Fractal3Price=iLow(NULL,PERIOD_M5,Fractal3);
double   Fractal4Price=iLow(NULL,PERIOD_M5,Fractal4);
double   Fractal5Price=iLow(NULL,PERIOD_M5,Fractal5);



double ArrayPreciosBajos[5],
       ArrayPrecioOrdenado[5];

ArrayPreciosBajos[0]=Fractal1Price;
ArrayPreciosBajos[1]=Fractal2Price;
ArrayPreciosBajos[2]=Fractal3Price;
ArrayPreciosBajos[3]=Fractal4Price;
ArrayPreciosBajos[4]=Fractal5Price;

for (int i=0; i<5; i++)
{
  Posicion=ArrayMinimum(ArrayPreciosBajos);
  ArrayPrecioOrdenado[i]=ArrayPreciosBajos[Posicion];
  ArrayPreciosBajos[Posicion]=ArrayMaximum(ArrayPreciosBajos)+1;
}

FractalMasBajo1 = ArrayPrecioOrdenado[0];
FractalMasBajo2 = ArrayPrecioOrdenado[1];
FractalMasBajo3 = ArrayPrecioOrdenado[2];
FractalMasBajo4 = ArrayPrecioOrdenado[3];
FractalMasBajo5 = ArrayPrecioOrdenado[4];


Comment("Fractal Mas Bajo 1 :   ",FractalMasBajo1,"\n","Fractal Mas Bajo 2 :   ",FractalMasBajo2,
"\n","Fractal Mas Bajo 3 :   ",FractalMasBajo3,"\n","Fractal Mas Bajo 4 :   ",FractalMasBajo4,
"\n","Fractal Mas Bajo 5 :   ",FractalMasBajo5);

  
   
 
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Pantallazo con el resultado...


 

Perdona, veo que usas mt4 y yo programo en mt5.
A ver si otro te puede ayudar con todo lo demás.

 
Imanol Salazar Garcia:

Perdona, veo que usas mt4 y yo programo en mt5.
A ver si otro te puede ayudar con todo lo demás.

Disculpame a mi Imanol. Se me olvidó mecionar algo tan importante como eso. Efectivamente, hablamos de MT4. Gracias por tu aportacion.

Razón de la queja: