Características da linguagem mql5, subtilezas e técnicas - página 83

 
fxsaber:

Leia a minha resposta novamente. Abra o código fonte curto, descubra-o e... Lucro!

Claro que eu abri o código fonte, é claro. Embora eu não tenha indicado que preciso de tudo para o MT5, mas estou à procura de uma ideia...

Você pode me dizer, qual linha resolve este problema (idéia oculta) - em funçãoGetBarSize()?

#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:

Claro que eu abri o código fonte, é claro. Embora eu não tenha especificado que preciso de tudo para o MT5, mas estou à procura de uma ideia...

Você pode me dizer, qual linha resolve este problema (idéia oculta) - em funçãoGetBarSize()?

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

Sinto-me como um tolo, o que significa "<<<"? E o que é que isto tem a ver com a escala do gráfico?

 
Aleksey Vyazmikin:

Sinto-me como um tolo, o que significa "<<<"?

Este é um deslocamento um pouco para a esquerda. Um 1 (em representação binária 0000 0001) será deslocado para a esquerda tantas vezes quanto o valor retornado pelo ChartGetInteger. Basicamente, é um poder de 2.

O resultado será o número de pixels por 1 barra.

 
Ihor Herasko:

Este é um deslocamento um pouco para a esquerda. 1 (na representação binária 0000 0001) será deslocado para a esquerda tantas vezes quanto o valor retornado pelo ChartGetInteger. Basicamente, é um poder de 2.

O resultado será o número de pixels por 1 barra.

Obrigado pelo esclarecimento, vou tentar implementá-lo!

fxsaber:

Obrigado!

 

Rosh, muito obrigado pela sua ajuda para encontrá-la!

Fórum sobre negociação, sistemas de negociação automatizados e testes estratégicos

Bugs, bugs, perguntas

Ilyas, 2016.08.24 11:08

O array ("dentro") armazena a quantos elementos o array está alocado.

A lógica para trabalhar com alocados (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);
  }

É pena que não esteja disponível (os invólucros de matriz não são uma opção). Talvez ainda pudéssemos acrescentar funcionalidade?

int ArrayAllocated( const void&  array[] );

Afinal, há o StringBufferLen para as cordas.

 
Comentários não relevantes para este tópico foram movidos para "Bugs, bugs, problemas".
 
Comentários não relevantes para este tópico foram movidos para "Bugs, bugs, problemas".
 
string Str = "123.456";

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


Muito mais rápido desta forma (Release, não 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); // Возможна потеря точности при делении
}

Quando se analisam grandes quantidades de dados, obtém-se uma velocidade significativa.

 
fxsaber:


Muito mais rápido desta forma (Release, não Debug)


Quando se analisam dados volumosos, obtém-se uma velocidade significativa.

Você pode fornecer o código de referência para demonstrar isso?