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;
}
 
阿列克谢-维亚兹米 金。

当然,我打开了源代码,当然。虽然我没有说明我需要的是MT5的全部,但我想找一个想法...

你能告诉我,在函数GetBarSize()中,哪一行解决了这个问题(隐藏的想法)?

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

我觉得自己像个傻瓜,你说的"<<"是什么意思?而这与图表的比例 有什么关系呢?

 
阿列克谢-维亚兹米 金。

我觉得自己像个傻瓜,"<<"是什么意思?

这是一个向左移动 的位数。一个1(用二进制表示为0000 0001)将被移到左边,其次数与ChartGetInteger返回的值相同。基本上,它是2的幂。

其结果将是每1条的像素数。

 
伊霍尔-赫拉斯科

这是一个向左移动 的位数。1(用二进制表示为0000 0001)将被移到左边,其次数与ChartGetInteger返回的值相同。基本上,它是2的幂。

其结果将是每1条的像素数。

谢谢你的澄清,我将尝试实施它!

fxsaber:

谢谢你!

 

Rosh,非常感谢你的帮助,让我们找到了它。

关于交易、自动交易系统和策略测试的论坛

虫子,虫子,问题

伊利亚斯, 2016.08.24 11:08

数组("internal")存储了该数组 被分配到多少个元素

与分配的工作逻辑(条件代码)。
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);
  }

太糟糕了,它根本就不能用(数组包装器不是一个选项)。也许我们仍然可以增加功能?

int ArrayAllocated( const void&  array[] );

毕竟有StringBufferLen用于字符串。

 
与本主题无关的评论已被移至"错误、错误、问题"。
 
与本主题无关的评论已被移至"错误、错误、问题"。
 
string Str = "123.456";

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


这样做要快得多(发布,而不是调试)。

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:


这样做要快得多(发布,而不是调试)。


在解析大量的数据时,可以获得显著的速度提升

你能提供基准代码来证明这一点吗?