오류, 버그, 질문 - 페이지 1124

 
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
{
   struct ARGB
  {
     uchar blue;
     uchar green;
     uchar red;
     uchar alpha;
  };
  
   struct N
  {
     uint num;
  };
  
  N n={ 100288 };
  ARGB c;
  c=n;         //так получаем предупреждение implicit struct cast       sample.mq5      22      4
  c=(ARGB)n;   //а так всё в порядке
}
두 구조의 크기가 동일하고 손실 없이 서로 복사가 발생하지만 여전히 경고가 표시됩니다.
 
Fleder :
두 구조의 크기가 동일하고 손실 없이 서로 복사가 발생하지만 여전히 경고가 표시됩니다.
매우 훌륭합니다. 명시적 캐스트를 만드는 것은 그렇게 어렵지 않습니다. 그리고 버그가 올라올 때 어디에 무엇을 충당했는지 알아내는 것은 그리 유쾌하지 않습니다.
 
TheXpert :
매우 훌륭합니다. 명시적 캐스트를 만드는 것은 그렇게 어렵지 않습니다. 그리고 버그가 올라올 때 어디에 무엇을 충당했는지 알아내는 것은 그리 유쾌하지 않습니다.
컴파일러의 모토는 "과도하게 하는 것보다 과하게 하는 것이 낫다!"인 것 같습니다.
 

애플리케이션에서 SD로 복사하여 붙여넣기:

RAM에서 시계열을 다시 *.hc 캐시로 언로드하는 기능
오류, MetaTrader 5 MQL, 열림, 시작됨: 2014.04.12 06:04, #995430

터미널의 버전 및 비트 수

910 32비트

문제에 대한 설명

안녕하세요 친애하는 개발자!

MQL5 언어에서 CopyRates , CopyTime , CopyOpen 등과 같은 여러 시스템 기능은 시계열 데이터를 수신하도록 설계되었습니다.

이러한 함수가 호출되면 요청된 시계열이 "차트의 최대 막대" 매개변수 내에서 RAM에 로드됩니다.

그러나 다음과 같은 요인의 조합:

1. 심볼에 의해 충분히 깊은 접근 히스토리 또는 서버에서 완전히 다운로드됨.

2. "차트의 최대 막대" 매개변수는 "무제한"과 같습니다.

3. 가장 작은 시간 프레임 M1의 데이터가 요청됩니다.

RAM 소모가 매우 큽니다.

문제는 실행 중인 MQL5 프로그램의 논리에서(예: 다중 통화 Expert Advisor 또는 지표인 경우)

여러 심볼의 더 낮은 시간 프레임의 데이터에 대한 대체 액세스가 제공될 수 있습니다(예: 단일 검색).

결과적으로 RAM 소비가 기하급수적으로 증가합니다.

Получение данных нужного таймфрейма из промежуточных данных

HCC 형식의 서비스 파일은 요청된 기간에 대한 가격 데이터를 HC 형식으로 표시하기 위한 데이터 소스 역할을 합니다. HC 형식의 데이터는 빠른 액세스를 위해 최대한 준비된 시계열입니다. 그들은 "차트의 최대 막대" 매개변수 값을 초과하지 않는 양으로 차트 또는 mql5 프로그램의 요청에 의해서만 생성되고 hc 확장자를 가진 파일에서 추가 사용을 위해 저장됩니다.

자원을 절약하기 위해 시간 프레임 데이터는 필요할 때만 RAM에 로드되어 저장되며 , 장기간 데이터 액세스가 없으면 RAM에서 언로드되어 파일로 저장됩니다. 각 시간대에 대해 다른 시간대의 기성 데이터 가용성에 관계없이 데이터가 준비됩니다. 데이터의 형성 및 가용성에 대한 규칙은 모든 기간에 대해 동일합니다. 저것들. HCC 형식의 데이터 저장 단위가 분 막대라는 사실에도 불구하고 HCC 형식의 데이터가 있다고 해서 HC 형식의 동일한 볼륨에 있는 M1 기간 데이터의 가용성 및 가용성을 의미하지는 않습니다.

서버에서 새 데이터를 수신하면 모든 시간 프레임 에 대해 사용된 가격 데이터를 HC 형식으로 자동 업데이트 하고 이를 계산을 위한 입력 데이터로 명시적으로 사용하는 모든 지표를 다시 계산합니다.

문서의 위 인용문에서 노란색으로 강조 표시된 프로세스의 시간은 상당히 깁니다. 약 30분(내 관찰에 따르면)입니다.

결과적으로 요청된 모든 시계열이 "RAM"에 "허들"되어 이유가 명확하지 않습니다.

"RAM"이 아직 "고무"가 아니지만 "만족할 수 없는" EA/지표가 점점 더 많은 시계열을 필요로 하는 경우 터미널에는 아무 것도 남아 있지 않습니다.

긴급하게 추가 시계열을 파일(캐시)로 다시 "던지는" 방법을 제외하고. 따라서 이 비상 재설정으로 터미널은 시계열을 다음으로 재설정할 수 있습니다.

"깨진 캐시" 즉 데이터의 "상당한 절반"이 손실됩니다. 그리고 다음에 이 시계열에 액세스할 때 터미널은 정상적인 것으로 가장하여 이 "깨진 캐시"를 로드합니다.

결과적으로 역사에 거대한 "구멍"이있는 터미널 차트에 필요한 시계열이 표시됩니다.

예상 결과

MQL5는 런타임 리소스를 절약하는 경향이 있습니다. 예를 들면 다음과 같습니다.

1. ArrayFree 기능

2. 리소스프리 기능

3. 삭제 연산자

4. "차트의 최대 막대" 매개변수

더 이상 사용되지 않는 시계열로 터미널 자체가 수행하는 작업을 강제하는 MQL5 언어의 기능에 시스템 기능을 추가할 수 있습니까?

예를 들어 이 시계열이 포함된 차트가 열려 있지 않으면 타이밍이 끝날 때?

예를 들어, 함수:

bool  SeriesFlush (
    string             symbol_name ,        // имя символа
    ENUM_TIMEFRAMES    timeframe ,          // период
   );

이렇게 하면 다음이 가능합니다.

1. RAM 오버플로를 두려워하지 마십시오.

2. 터미널이 꺼진 상태에서 *.hc 파일을 수동으로 삭제해야만 제거할 수 있는 "깨진 캐시"의 모양에 대해 걱정하지 마십시오.

3. 운영 체제의 비트 수와 RAM 크기에 얽매이지 마십시오.

4. 소프트웨어 제품을 개발할 때 위에서 설명한 단점을 보완하기 위해 "목발"을 사용하지 마십시오.

 

 
Fleder :

애플리케이션에서 SD로 복사하여 붙여넣기:

RAM에서 *.hc 캐시로 시계열을 다시 언로드하는 기능
글쎄요, 정말 멋진 생각입니다.
 
양의 편향이 있는 지표 데이터를 얻는 방법을 알려주실 수 있습니까? -1 bar의 데이터에 관심이 있으십니까?
 
dentraf :
양의 편향이 있는 지표 데이터를 얻는 방법을 알려주실 수 있습니까? -1 bar의 데이터에 관심이 있으십니까?

이렇게 하려면 관심 표시선에 대한 오프셋 설정을 알아야 합니다. 이것은 iAlligator 기술 지표의 예입니다.

 //--- зададим смещение для каждой линии
   PlotIndexSetInteger ( 0 , PLOT_SHIFT ,jaw_shift);

이것은 정확히 오프셋이며 미래에 대한 지표 계산이 아닙니다.

 

애플리케이션에서 SD로 복사하여 붙여넣기:

표시기에서 IsStopped 시스템 기능의 잘못된 작동
오류, MetaTrader 5 MQL, 열림, 시작됨: 2014.04.12 07:59, #995480

터미널의 버전 및 비트 수

910 32비트

문제에 대한 설명

안녕하세요 친애하는 개발자!

반복 횟수가 많은 루프를 설계할 때 코드 품질을 개선하기 위한 권장 사항 중 하나

시스템을 사용하여 MQL5 프로그램의 강제 종료 사실을 확인하는 것입니다.

함수 bool IsStopped ();

그러나 실습에서 알 수 있듯이 이 검사는 지표에서 작동하지 않습니다(스크립트 및 Expert Advisors에서 작동함).

다음은 문제의 본질을 반영하는 짧은 표시기 코드입니다.

 #property indicator_plots 0
//=====================================================================
// Custom indicator initialization function
//=====================================================================
int OnInit ()
{
   return (INIT_SUCCEEDED);
}
//=====================================================================
// Custom indicator iteration function
//=====================================================================
int OnCalculate ( const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[])
{
   long n= 0 ;
   for ( int i= 0 ;i< 1 e+ 10 && ! IsStopped ();i++) {n++;}
   Print ( "OnCalculate End" );
   return (rates_total);
}

차트에서 이 지표를 제거하려고 하면 "지표 계산" 프로세스가 멈추지 않고,

프로그램 중지 플래그를 확인하기 때문입니다.

작업 관리자에서 terminal.exe 프로세스를 보면 이에 대해 쉽게 알 수 있습니다. 쿼드 코어 프로세서에서

약 25%의 CPU 사용량입니다. 또한 터미널 부하는 종료될 때까지 시간이 지남에 따라 전혀 감소하지 않습니다.

단말기. 그리고 터미널을 끈 후에도 터미널.exe 프로세스는 여전히 디스패처에서 멈춥니다. 그리고 그것은 같은 느낌

운영 체제에서 "중단"으로 언로드됩니다.


예상 결과

이 문제를 해결하세요.

 
barabashkakvn :

이렇게 하려면 관심 표시선에 대한 오프셋 설정을 알아야 합니다. 이것은 iAlligator 기술 지표의 예입니다.

이것은 정확히 오프셋이며 미래에 대한 지표 계산이 아닙니다.

그게 다야, 나는 미래에 계산이 있고 그리기 위해 오프셋을 적용하고 전문가로부터 -1 bar의 값을 계산하는 방법 ???

누군가 필요하면 이 CopyBuffer(Handle_original,0,-2,10,Data_Ind)를 수행할 수 있습니다.

 
dentraf :
그게 다야, 나는 미래에 계산이 있고, 그리기 위해 나는 오프셋을 적용하고, 전문가로부터 -1 bar의 값을 계산하는 방법 ???
막대 "-1"에 대한 따옴표가 존재하지 않습니다. 오프셋은 기존 철근에 대한 계산(예: 철근 번호 2)이며 이 계산된 값은 철근 2에서 오프셋을 뺀 값입니다. 저것들. 오프셋이 5이면 막대 2에서 계산된 값이 막대 "-3"에 그려집니다.