Características del lenguaje mql5, sutilezas y técnicas - página 83

 
fxsaber:

Vuelve a leer mi respuesta. Abre el código fuente corto, descúbrelo y... ¡Ganancia!

Por supuesto que abrí el código fuente, por supuesto. Aunque no he indicado que lo necesite todo para MT5, pero estoy buscando una idea...

¿Puedes decirme, qué línea resuelve este problema (idea oculta) - en la funciónGetBarSize()?

#property show_inputs

extern int Width = 1280;
extern int Height = 800;

#import "user32.dll"
  int GetClientRect( int hWnd, int lpRect[] );
#import

#define  BORDER_SIZE 44

int GetBarSize()
{
  int Rect[4], PrevBars, PrevRect, Res = 1;
  int hwnd = WindowHandle(Symbol(), Period());

  GetClientRect(hwnd, Rect);
  PrevRect = Rect[2] - BORDER_SIZE;
  PrevBars = WindowBarsPerChart();

  PrevBars += PrevBars;
    
  while(PrevBars <= PrevRect)
  {
    Res += Res;
    PrevBars += PrevBars;
  }
  
  return(Res);
}

string StrNumToLen( string Num, int Len )
{
  Len -= StringLen(Num);
  
  while (Len > 0)
  {
    Num = "0" + Num;
    Len--;
  }
  
  return(Num);
}

void start()
{
  int Pos = WindowFirstVisibleBar(), Step, i = 1;
  string Directory = Width + "x" + Height + "_" + Symbol() + Period() + " (" +
                     TimeToStr(Time[Pos], TIME_DATE) + "-" +
                     TimeToStr(Time[0], TIME_DATE) + ")/";

  Pos += 2;
  Step = 1 + (Width - BORDER_SIZE) / GetBarSize();
  
  while (Pos >= 0)
  {
    WindowScreenShot(Directory + StrNumToLen(i, 5) + ".gif", Width, Height, Pos);
    i++;
    Pos -= Step;
  }
  
  return;
}
 
Aleksey Vyazmikin:

Por supuesto que abrí el código fuente, por supuesto. Aunque no he especificado que lo necesite todo para MT5, pero busco una idea...

¿Puedes decirme, qué línea resuelve este problema (idea oculta) - en la funciónGetBarSize()?

int GetBarSize( const ulong Chart = 0 )
{
  return(1 << (int)ChartGetInteger(Chart, CHART_SCALE));
}
 
fxsaber:

Me siento como un tonto, ¿qué quieres decir con "<<"? ¿Y qué tiene que ver esto con la escala del gráfico?

 
Aleksey Vyazmikin:

Me siento como un tonto, ¿qué significa "<<"?

Se trata de un desplazamiento en sentido de los bits hacia la izquierda. Un 1 (en representación binaria 0000 0001) se desplazará hacia la izquierda tantas veces como el valor devuelto por ChartGetInteger. Básicamente, es una potencia de 2.

El resultado será el número de píxeles por 1 barra.

 
Ihor Herasko:

Se trata de un desplazamiento en sentido de los bits hacia la izquierda. 1 (en representación binaria 0000 0001) se desplazará a la izquierda tantas veces como el valor devuelto por ChartGetInteger. Básicamente, es una potencia de 2.

El resultado será el número de píxeles por 1 barra.

Gracias por la aclaración, ¡intentaré aplicarla!

fxsaber:

Gracias.

 

Rosh, ¡muchas gracias por tu ayuda para encontrarlo!

Foro sobre comercio, sistemas de comercio automatizados y pruebas de estrategias

Bichos, errores, preguntas

Ilyas, 2016.08.24 11:08

El array ("inside") almacena el número de elementos del array.

La lógica para trabajar con asignados (código condicional):
ArrayResize(arr,int size,int reserve)
  {
   if(arr.allocated<size)
      if(!ArrayAllocateMemory(arr,size+reserve))  // -> arr.allocated=size+reserve;
         return(-1);
   //---
   CallConstructorsOrDestructors(arr,size);
   //---
   arr.size=size;
   return(size);
  }

Lástima que no esté disponible en absoluto (las envolturas de matrices no son una opción). ¿Tal vez podamos seguir añadiendo funcionalidades?

int ArrayAllocated( const void&  array[] );

Después de todo, existe StringBufferLen para las cadenas.

 
Los comentarios que no son relevantes para este tema se han movido a "Bugs, errores, problemas".
 
Los comentarios que no son relevantes para este tema se han movido a "Bugs, errores, problemas".
 
string Str = "123.456";

double Num1 = StringToDouble(Str);  
double Num2 = (double)Str; // Быстрее


Mucho más rápido de esta manera (Release, no Debug)

double StringToDouble2( const string Str, const uint StartPos = 0 )
{
  const uint Size = StringLen(Str);
  
  bool Sign = false;  
  uint i = StartPos;
  
  while (i < Size)
  {
    const int Digit = Str[i];

    if ((Digit != ' ') && (Digit != '\t') && (Digit != '\n') && (Digit != '\r'))
    {
      if ((Sign = (Digit == '-')) || (Digit == '+'))
        i++;
      
      break;
    }
      
    i++;
  }

  long Res = 0;
  int point = 0;
  
  while (i < Size)
  {
    const int Digit = Str[i];
    
    if (!point && (Digit == '.'))
      point = 1;
    else if (((Digit >= '0') && (Digit <= '9')))
    {
      Res = Res * 10 + Digit - '0';
      
      if (point)
        point *= 10;
    }
    else
      break;
      
    i++;
  }
  
  if (Sign)
    Res = -Res;
  
  return((point > 1) ? Res / (double)point : Res); // Возможна потеря точности при делении
}

Cuando se analizan grandes cantidades de datos, se obtiene un aumento significativo de la velocidad.

 
fxsaber:


Mucho más rápido de esta manera (Release, no Debug)


Cuando se analizan datos voluminosos, se obtiene un aumento significativo de la velocidad.

¿Puede proporcionar el código de referencia para demostrarlo?