Merkmale der Sprache mql5, Feinheiten und Techniken - Seite 83

 
fxsaber:

Lesen Sie meine Antwort noch einmal. Öffnen Sie den kurzen Quellcode, finden Sie es heraus und... Gewinn!

Natürlich habe ich den Quellcode geöffnet, natürlich. Ich habe zwar nicht angegeben, dass ich das alles für MT5 brauche, aber ich suche nach einer Idee...

Können Sie mir sagen, welche Zeile dieses Problem (versteckte Idee) in der FunktionGetBarSize() löst?

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

Natürlich habe ich den Quellcode geöffnet, natürlich. Obwohl ich nicht angegeben habe, dass ich alles für MT5 brauche, aber ich suche nach einer Idee...

Können Sie mir sagen, welche Zeile dieses Problem (versteckte Idee) in der FunktionGetBarSize() löst?

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

Ich komme mir wie ein Narr vor, was bedeutet "<<"? Und was hat das mit dem Maßstab der Grafik zu tun?

 
Aleksey Vyazmikin:

Ich komme mir wie ein Narr vor, was bedeutet "<<"?

Dies ist eine bitweise Verschiebung nach links. Eine 1 (in binärer Darstellung 0000 0001) wird so oft nach links verschoben, wie der von ChartGetInteger zurückgegebene Wert beträgt. Im Grunde ist es eine Potenz von 2.

Das Ergebnis ist die Anzahl der Pixel pro 1 Balken.

 
Ihor Herasko:

Dies ist eine bitweise Verschiebung nach links. 1 (in binärer Darstellung 0000 0001) wird so oft nach links verschoben, wie der von ChartGetInteger zurückgegebene Wert. Im Grunde ist es eine Potenz von 2.

Das Ergebnis ist die Anzahl der Pixel pro 1 Balken.

Danke für die Klarstellung, ich werde versuchen, sie umzusetzen!

fxsaber:

Ich danke Ihnen!

 

Rosh, vielen Dank für deine Hilfe bei der Suche!

Forum für Handel, automatisierte Handelssysteme und Strategietests

Wanzen, Wanzen, Fragen

Ilyas, 2016.08.24 11:08

Im Array ("inside") wird gespeichert, wie viele Elemente dem Array zugewiesen sind.

Die Logik für die Arbeit mit zugewiesenem (bedingtem) Code:
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);
  }

Schade, dass sie überhaupt nicht verfügbar ist (Array-Wrapper sind keine Option). Vielleicht können wir noch Funktionen hinzufügen?

int ArrayAllocated( const void&  array[] );

Für Strings gibt es schließlich StringBufferLen.

 
Kommentare, die für dieses Thema nicht relevant sind, wurden nach "Bugs, Bugs, Issues" verschoben.
 
Kommentare, die für dieses Thema nicht relevant sind, wurden nach "Bugs, Bugs, Issues" verschoben.
 
string Str = "123.456";

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


Auf diese Weise viel schneller (Release, nicht 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); // Возможна потеря точности при делении
}

Beim Parsen großer Datenmengen wird eine erhebliche Beschleunigung erreicht.

 
fxsaber:


Auf diese Weise viel schneller (Release, nicht Debug)


Beim Parsen umfangreicher Daten wird eine erhebliche Beschleunigung erreicht.

Können Sie den Benchmark-Code zur Verfügung stellen, um dies zu demonstrieren?