Caractéristiques du langage mql5, subtilités et techniques - page 83

 
fxsaber:

Relisez ma réponse. Ouvrez le code source court, comprenez-le et... Profit !

Bien sûr, j'ai ouvert le code source, bien sûr. Bien que je n'aie pas indiqué que j'avais besoin de tout cela pour MT5, mais je cherche une idée...

Pouvez-vous me dire, quelle ligne résout ce problème (idée cachée) - dans la fonctionGetBarSize()?

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

Bien sûr, j'ai ouvert le code source, bien sûr. Bien que je n'aie pas précisé que j'avais besoin de tout cela pour MT5, mais je cherche une idée...

Pouvez-vous me dire, quelle ligne résout ce problème (idée cachée) - dans la fonctionGetBarSize()?

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

Je me sens comme un idiot, que signifie "<<" ? Et qu'est-ce que cela a à voir avec l'échelle du graphique?

 
Aleksey Vyazmikin:

Je me sens comme un idiot, que signifie "<<" ?

Il s'agit d'un décalage bit à bit vers la gauche. Un 1 (en représentation binaire 0000 0001) sera décalé vers la gauche autant de fois que la valeur renvoyée par ChartGetInteger. En gros, c'est une puissance de 2.

Le résultat sera le nombre de pixels par 1 barre.

 
Ihor Herasko:

Il s'agit d'un décalage bit à bit vers la gauche. 1 (en représentation binaire 0000 0001) sera décalé vers la gauche autant de fois que la valeur renvoyée par ChartGetInteger. En gros, c'est une puissance de 2.

Le résultat sera le nombre de pixels par 1 barre.

Merci pour cette précision, je vais essayer de la mettre en œuvre !

fxsaber:

Merci !

 

Rosh, merci beaucoup pour votre aide à le trouver !

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégie

Bugs, bugs, questions

Ilyas, 2016.08.24 11:08

Le tableau ("inside") enregistre le nombre d'éléments alloués au tableau.

La logique de travail avec les attributions (code conditionnel) :
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);
  }

Dommage qu'il ne soit pas disponible du tout (les wrappers de tableaux ne sont pas une option). Peut-être pourrions-nous encore ajouter des fonctionnalités ?

int ArrayAllocated( const void&  array[] );

Il existe StringBufferLen pour les chaînes de caractères, après tout.

 
Les commentaires non pertinents pour ce sujet ont été déplacés vers "Bugs, bugs, problèmes".
 
Les commentaires non pertinents pour ce sujet ont été déplacés vers "Bugs, bugs, problèmes".
 
string Str = "123.456";

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


Beaucoup plus rapide de cette façon (Release, pas 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); // Возможна потеря точности при делении
}

Lors de l'analyse de grandes quantités de données, une accélération significative est obtenue.

 
fxsaber:


Beaucoup plus rapide de cette façon (Release, pas Debug)


Lors de l'analyse de données volumineuses, une accélération significative est obtenue.

Pouvez-vous fournir le code de référence pour le démontrer ?

Raison: