Особенности языка mql5, тонкости и приёмы работы - страница 83

 
fxsaber:

Прочтите мой ответ еще раз. Открываете короткий исходник, разбираетесь и... профит!

Конечно я открыл исходник, а то как же. Правда я не указал, что мне все это нужно для MT5, но ищу ж идею...

Можете подсказать,  в какой строчке решается эта задача(спрятана идея) - в функции GetBarSize()?

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

Конечно я открыл исходник, а то как же. Правда я не указал, что мне все это нужно для MT5, но ищу ж идею...

Можете подсказать,  в какой строчке решается эта задача(спрятана идея) - в функции GetBarSize()?

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

Чувствую себя дураком, что значит "<<"? И при чём тут масштаб графика?

 
Aleksey Vyazmikin:

Чувствую себя дураком, что значит "<<"?

Это побитовый сдвиг влево. 1 (в двоичном представлении 0000 0001) будет сдвинут влево столько раз, какое значение вернет ChartGetInteger. По большому счету это возведение в степень 2.

Итогом будет количество пикселов, приходящееся на 1 бар.

 
Ihor Herasko:

Это побитовый сдвиг влево. 1 (в двоичном представлении 0000 0001) будет сдвинут влево столько раз, какое значение вернет ChartGetInteger. По большому счету это возведение в степень 2.

Итогом будет количество пикселов, приходящееся на 1 бар.

Спасибо за разъяснения, попробую реализовать!

fxsaber:

Спасибо!

 

Rosh, большое Спасибо за помощь в поиске!

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

Ilyas, 2016.08.24 11:08

В массиве ("внутри") хранится allocated - под сколько элементов массив распределён.

Логика работы с резервом(условный код):
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);
  }

Жаль, что allocated совсем недоступен (обертки массивов - не вариант). Может, все же добавить функционал?

int ArrayAllocated( const void&  array[] );

Ведь есть же для строк StringBufferLen.

 
Комментарии, не относящиеся к этой теме, были перенесены в "Ошибки, баги, вопросы".
 
Комментарии, не относящиеся к этой теме, были перенесены в "Ошибки, баги, вопросы".
 
string Str = "123.456";

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


Гораздо быстрее этот вариант (Release, не 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); // Возможна потеря точности при делении
}

При парсинге объемных данных получается значительное ускорение.

 
fxsaber:


Гораздо быстрее этот вариант (Release, не Debug)


При парсинге объемных данных получается значительное ускорение.

Can you provide the benchmark code to demonstrate that ?

Причина обращения: