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

 
Alexey Viktorov :

표시기 버퍼 배열을 예로 들어 보겠습니다. 표시기를 초기화할 때 버퍼의 길이는 0입니다. 0으로 초기화하려면 무엇이 있습니까? 다음 인덱스를 추가할 때 강제로 재설정한 다음 일부 값으로 채웁니다 ??? EMPTY_VALUE로 0으로 채우거나 채우는 것은 무엇입니까? 그리고 0이 아닌 EMPTY_VALUE가 아닌 PLOT_EMPTY_VALUE를 할당해야 하거나 하나는 강제로 지정되지만 다른 하나는 필요하면 ... 누가 뭐라고 해도 시간 낭비임이 드러납니다...

그리고 사용자 정의 배열... 배열은 0이 아닌 데이터에 대해 선언되고 EMPTY_VALUE. 그래서 강제로 무언가를 초기화하는 목적은 무엇입니까?

따라서 대부분의 경우 성능에 영향을 미치는 것으로 나타났습니다.

삶과 인연이 없는 것 같습니다. 나에게 표시기 버퍼는 항상 막대 수와 동일한 길이를 갖습니다. 그리고 MT5에서 초기화를 거부하면 화면에 쓰레기가 표시됩니다. 명시적 초기화가 필요하다는 것이 밝혀졌습니다. 그리고 코어(MT4에서와 같이)에서 MQL 프로그래머로 단순히 이동한 이유는 명확하지 않습니다. 초기화를 수행하지 않고 속도를 높이는 동시에 가비지 디스플레이를 표시하지 않는 것이 가능하다는 실제 주장은 본 적이 없습니다.

나는 사용자 정의 동적 배열에 대해 아무 말도 하지 않습니다. 실제로 규칙이 있습니다. 할당한 사람이 적절한 청소를 담당합니다. ArrayInitialize는 많은 경우에 유용합니다. 이것은 속도의 문제가 아니라 프로그램의 정확성의 문제입니다. 우선 순위: 빠르고/또는 정확합니다. 일반적으로 정확성 및 데이터 준비를 위한 일부 검사에는 추가 시간 비용(최소한이지만)이 필요하지만 이것이 없으면 기적이 없습니다.

 
Stanislav Korotky :

나는 사용자 정의 동적 배열에 대해 아무 말도 하지 않습니다. 실제로 규칙이 있습니다. 할당한 사람이 적절한 청소를 담당합니다.

어레이를 화나게 할 필요는 없습니다.

 #property strict

void OnStart ()
{
   uchar Array[];
  
   const int Size = ArrayResize (Array, 10000 );
  
   bool Res = false ;
  
   for ( int i = 0 ; (i < Size) && (!Res); i++)
    Res = Array[i];
    
   Print (Res);
}

MT4에서는 쓰레기가 없으면 모든 것이 0이기 때문에 항상 false를 반환합니다. MT5에서 - 사실입니다.

따라서 MT4 테스터의 동일한 코드는 실행 간에 항상 동일한 결과를 표시합니다. MT5 테스터에는 없습니다.

 
fxsaber :

MT4에서는 쓰레기가 없으면 모든 것이 0이기 때문에 항상 false를 반환합니다. MT5에서 - 사실입니다.

MT4 가 배열을 0으로 채우는 테스트입니까? 그런 다음 ArrayResize가 예약과 함께 세 번째 매개변수를 사용하는 경우 예약 내의 후속 재할당은 아무 것도 초기화하지 않는다는 점을 명심해야 합니다. 쓰레기가있을 것입니다. 이 토론을 촉발한 최적화 예제에서처럼 나중에 실수로 놀라지 않도록 명시적 초기화를 수행하는 것이 좋습니다.

초기화로 인한 속도 저하가 걱정되는 사람들을 위해 일반적으로 효율성을 훨씬 더 높일 수 있는 다른 장소와 트릭이 많이 있다고 생각합니다.

 
Stanislav Korotky :

MT4 가 배열을 0으로 채우는 테스트입니까? 그런 다음 ArrayResize가 예약과 함께 세 번째 매개변수를 사용하는 경우 예약 내의 후속 재할당은 아무 것도 초기화하지 않는다는 점을 명심해야 합니다. 쓰레기가있을 것입니다.

쓰레기는 없을 것입니다.

이 토론을 촉발한 최적화 예제에서처럼 나중에 실수로 놀라지 않도록 명시적 초기화를 수행하는 것이 좋습니다.

저장되지 않습니다

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

오류, 버그, 질문

fxsaber , 2017.09.12 11:18

내가 완벽하게 작성했더라도(실수 없이 - 그렇지 않은 경우), 누군가의 라이브러리(가끔은 소스 코드 없이 - 시장에서)를 가져와 올바르게 작성되기를 바라면서 사용할 때 상황은 정상입니다. 그리고 그 후에 나 자신이 테스터에서 다양한 결과에 부딪힐 것이라는 사실을 보장하는 것은 없습니다. 그리고 진정한 이유를 찾는 것은 매우 어려울 것입니다. 수정이 불가능한 경우가 있습니다.

목표는 실행 간에 결과를 재현할 수 있도록 하는 것입니다. 오류가 있더라도 동일합니다.

 
fxsaber :

쓰레기는 없을 것입니다.



그러면 문서를 수정해야 합니까?

ArrayInitialize (array, init_val) 표현식으로 배열을 초기화한다고 해서 이 배열에 할당된 예비 요소가 동일한 값으로 초기화되는 것은 아닙니다. 현재 예약 내에서 ArrayResize() 함수에 의해 배열 배열 의 크기가 계속 증가하면 요소가 배열 끝에 추가되며, 그 값은 정의되지 않고 대부분 init_val 같지 않습니다. .

 
Stanislav Korotky :

그러면 문서를 수정해야 합니까?

ArrayInitialize (array, init_val) 표현식으로 배열을 초기화한다고 해서 이 배열에 할당된 예비 요소가 동일한 값으로 초기화되는 것은 아닙니다. 현재 예약 내에서 ArrayResize() 함수에 의해 배열 배열 의 크기가 계속 증가하면 요소가 배열 끝에 추가되며, 그 값은 정의되지 않고 대부분 init_val 같지 않습니다. .

아니요. MT4 문서에는 그런 내용이 없기 때문입니다.


그것은 일종의 매트에 있다고 생각하면 끔찍합니다. 라이브러리(Include\Math - 7Mb 소스 )가 한두 곳에서 초기화되지 않았습니다! 그리고 MT5 테스터에서는 다른 단일 실행을 제공하고 MT4에서는 동일한 실행을 제공하는 이 오류를 어떻게 파헤칠 수 있습니까?

 
Stanislav Korotky :

삶에 지장이 없는 것 같습니다. 나를 위해 표시기 버퍼는 항상 막대 수와 동일한 길이를 갖습니다. 그리고 MT5에서 초기화를 거부하면 화면에 쓰레기가 표시됩니다. 명시적 초기화가 필요하다는 것이 밝혀졌습니다. 그리고 코어(MT4에서와 같이)에서 MQL 프로그래머로 단순히 이동한 이유는 명확하지 않습니다. 초기화를 수행하지 않고 속도를 높이는 동시에 가비지 디스플레이를 표시하지 않는 것이 가능하다는 실제 주장은 본 적이 없습니다.

나는 사용자 정의 동적 배열에 대해 아무 말도 하지 않습니다. 실제로 규칙이 있습니다. 할당한 사람이 적절한 청소를 담당합니다. ArrayInitialize는 많은 경우에 유용합니다. 이것은 속도의 문제가 아니라 프로그램의 정확성의 문제입니다. 우선 순위: 빠르고/또는 정확합니다. 일반적으로 정확성 및 데이터 준비를 위한 일부 검사에는 추가 시간 비용(최소한이지만)이 필요하지만 이것이 없으면 기적이 없습니다.

당신은 문구에주의를 기울이지 않았습니다

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

오류, 버그, 질문

알렉세이 빅토 로프 , 2017.09.12 10:50

표시기 버퍼 배열을 예로 들어 보겠습니다. 표시기를 초기화할 때 버퍼의 길이는 0입니다. 0으로 초기화하려면 무엇이 있습니까? 다음 인덱스를 추가할 때 강제로 재설정한 다음 일부 값으로 채웁니다 ??? EMPTY_VALUE로 0으로 채우거나 채우는 것은 무엇입니까? 그리고 0이 아닌 EMPTY_VALUE가 아닌 PLOT_EMPTY_VALUE를 할당해야 하거나 하나는 강제로 지정되지만 다른 하나는 필요하면 ... 누가 뭐라고 해도 시간 낭비임이 드러납니다...

그리고 사용자 정의 배열... 배열은 0이 아닌 데이터에 대해 선언되고 EMPTY_VALUE. 그래서 강제로 무언가를 초기화하는 목적은 무엇입니까?

따라서 대부분의 경우 성능에 영향을 미치는 것으로 나타났습니다.



그리고 OnCalculate에서 이미 수행하는 것은 의미가 없습니다. 배열을 무언가로 초기화한 다음 수식의 일부 값으로 채우는 이유는 무엇입니까? 각각 막대와 배열 셀을 추가할 때 무언가로 채우고 즉시 수식의 값이나 빈 값을 채우는 요점이 무엇입니까?

 
Alexey Viktorov :

그리고 OnCalculate에서 이미 수행하는 것은 의미가 없습니다. 배열을 무언가로 초기화한 다음 수식의 일부 값으로 채우는 이유는 무엇입니까? 각각 막대와 배열 셀을 추가할 때 무언가로 채우고 즉시 수식의 값이나 빈 값을 채우는 요점이 무엇입니까?

배열 요소만 초기화됩니다. 그리고 의미는 동일합니다. 코드에 오류가 있더라도(종종 자체 오류가 아님) 실행 간 결과의 ID입니다. 매트가 있는 예. 위에서 인용한 성경.

쓰레기는 악입니다.

 
fxsaber :

아니요, MT4 문서에는 그런 것이 없기 때문입니다.

나는 그 때 어디서 그것을 얻었습니까? 우리는 여기에 간다.

ArrayInitialize - Операции с массивами - Справочник MQL4
ArrayInitialize - Операции с массивами - Справочник MQL4
  • docs.mql4.com
ArrayInitialize - Операции с массивами - Справочник MQL4
 
Stanislav Korotky :

나는 그 때 어디서 그것을 얻었습니까? 우리는 여기에 간다.

따라서 ArrayResize가 아니라 ArrayInitialize에 대한 것입니다. ArrayResize는 MT4에서 null 패딩을 보장합니다.


관심을 끌기 위해 MT5에 대한 모든 소스와 ArrayInitialize를 얼마나 자주 사용하는지 살펴보았습니다. 단위 시간. 모든 동적 어레이의 퍼센트 미만인 것 같습니다. 그리고 제가 사용한 곳에서는 구체적으로 0으로 점수를 매겨야 했기 때문에 for 대신 더 짧은 표기법을 사용했습니다.