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

배열("내부") 은 배열이 할당된 요소 수 아래에 할당된 저장합니다.

예비 작업 논리(조건부 코드):
 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 :


이 옵션이 훨씬 빠름(디버그가 아닌 릴리스)


체적 데이터를 구문 분석할 때 상당한 가속이 얻어 집니다.

이를 입증하기 위해 벤치마크 코드를 제공할 수 있습니까?