기고글 토론 "인디케이터의 경제적 계산 원칙"

 

새로운 기고글 인디케이터의 경제적 계산 원칙 가 게재되었습니다:

사용자 및 기술 인디케이터에 대한 호출은 자동 거래 시스템의 프로그램 코드에서 매우 적은 공간을 차지합니다. 종종 단순히 몇 줄의 코드 일뿐입니다. 그러나 가장 많은 시간을 사용하는 몇 줄의 코드로 Expert Advisor를 테스트하는 데 소비해야 하는 경우가 종종 있습니다. 따라서 인디케이터 내 데이터 계산과 관련된 모든 것은 언뜻 보기 보다 훨씬 더 철저히 고려되어야 합니다. 이 글은 이것에 대해 정확하게 이야기 할 것입니다.

이제 Expert Advisor의 코드에서 인디케이터 값의 복사 함수에 대한 합리적인 호출의 세부 사항이 명확해졌으므로 Expert Advisors에서 IsNewBar () 함수를 적용하여 얻을 수 있는 이점을 테스트 할 수 있습니다.

따라서 전략 테스터에서 테스트 할 수 있는 두 가지 Expert Advisors 옵션이 있는데, 첫 번째 옵션은 AMA_Test.ex5입니다. 각 틱에서 인디케이터 버퍼의 데이터를 복사합니다.

그림 9 Expert Advisor AMA_Test에 합격한 결과

두 번째 - IsNewBar_AMA_Test.mq5는 바의 변경 중에만 데이터를 복사합니다.

그림 10 Expert Advisor의 테스트에 합격한 결과 IsNewBar_AMA_Test

네! 테스트 결과는 다소 실망스럽습니다. 각 틱마다 IsNewBar () 함수를 호출하는 것이 사용자 배열의 세 셀에 데이터를 복사하는 것보다 훨씬 더 비쌉니다! 

여기에서 중요하지만 눈에 띄지 않는 인디케이터의 또 다른 부분에 주의를 기울이고 싶습니다. 사실 OnInit () 함수에서 인디케이터의 핸들을 얻으면 OnTick () 함수 내에서 이 인디케이터의 데이터를 복사하는지 여부에 관계없이 아직 계산되지 않은 현재 바에 대한 계산, 틱마다 계속 수행됩니다.

작성자: Nikolay Kositsin

 

기사 작성해 주셔서 감사합니다.

질문이 하나 있습니다. 지표 계산을 최적화하기 위해 지표의 첫 번째 형태를 사용하면 시작이 있습니다. 그러나 그것을 사용할 수 없다면 (올바른 계산을 위해 open[], high[], low[], close[] ...) 어떻게해야합니까? 두 번째 형식에는 시작이 없습니다.

 
Prival:

기사 작성해 주셔서 감사합니다.

질문이 하나 있습니다. 지표 계산을 최적화하기 위해 첫 번째 형태의 지표를 사용하면 시작이 있습니다. 그러나 그것을 사용할 수 없다면 (올바른 계산을 위해 open[], high[], low[], close[] ...) 어떻게해야합니까? 두 번째 형식에는 시작이 없습니다.

입력 매개 변수는 항상 가격 특성이며 모든 요소에 있으며 시작에서만 채워진 "임의의"배열을 사용하지 않기 때문에 거기에는 필요하지 않습니다.
 

모든 것이 고려되지는 않지만 일반적으로 여전히 흥미 롭습니다 =)

특히 기술 지표 호출의 최적화와 같은 것은 고려되지 않습니다.

이 주제는 상당히 관련이 있다고 생각합니다.

 

보다 정확하게는 기술 지표를 더 잘 초기화하는 방법

일반적으로 데이터 확인 기능이 구현됩니다.

그러나 초기화의 예는 정확히 고려되지 않았습니다.

도움말에서 알려진 한

Нельзя обратиться к данным индикатора сразу после его создания, так как на расчет значений индикатора требуется некоторое время, и поэтому создавать хэндлы индикаторов лучше всего в OnInit(). Функция iCustom() создает соответствующий пользовательский индикатор и при успешном создании возвращает его хэндл. Пользовательские индикаторы могут содержать до 512 индикаторных буферов, содержимое которых также можно получать при помощи функции CopyBuffer(), используя полученный хэндл.

이 기능을 우회하는 가장 좋은 방법....

 

저도 항상 같은 생각이 들어요.

   if (Handle == INVALID_HANDLE)  Print("SMA 표시기 핸들을 가져오는 데 실패했습니다.");

이 조건이 작동하면 어떻게해야합니까? 챔피언십이라고 가정 해 봅시다.... 초기화가 더 이상 실행되지 않습니다.

 
Prival:

저도 같은 궁금증을 계속 가지고 있었습니다.

이 조건이 작동하면 어떻게해야합니까? 챔피언십이라고 가정 해 봅시다.... 초기화가 더 이상 실행되지 않습니다.

네! 문서화되지 않은 사실입니다. 저도 몰랐어요! 꼭 조사해봐야겠어요! 하지만 저에게는 더 쉽습니다. 모든 칠면조를 Expert Advisor 자체에 포장하고 그게 다입니다. 그러면 Expert Advisor가 마라톤 거리에서 단거리 선수처럼 달리고 어디에서도 비틀 거리지 않습니다!

 
Prival:

나는 항상 같은 것을 궁금해합니다.

이 조건이 작동하면 어떻게 해야 하나요? 챔피언십이라고 가정하면 초기화가 더 이상 실행되지 않습니다.

우선 오류 코드를 가져와서 로그에 출력하세요. 그리고 온틱() 또는 온계산()에서 다시 접근을 시도합니다. 인디케이터 핸들을 가져오는 데 실패하면 해당 인디케이터가 없거나 메모리가 부족할 가능성이 높습니다. 이 경우 전문가 어드바이저는 거래할 권한이 없습니다.
Документация по MQL5: Стандартные константы, перечисления и структуры / Коды ошибок и предупреждений
Документация по MQL5: Стандартные константы, перечисления и структуры / Коды ошибок и предупреждений
  • www.mql5.com
Стандартные константы, перечисления и структуры / Коды ошибок и предупреждений - Документация по MQL5
 
Rosh:
우선 오류 코드를 가져와 로그에 출력합니다. 그리고 온틱() 또는 온계산()에서 다시 접근을 시도해 보세요. 인디케이터 핸들을 얻지 못하면 해당 인디케이터가 없거나 메모리가 부족할 가능성이 높습니다. 이 경우 전문가 고문은 거래할 권한이 없습니다.

자, 여기 있습니다! 우리가 직접 할 수 있습니다! 이러한 상황에서 OnInit() 함수에서 마이너스 1을 반환하여 핸들이 나타날 때까지 OnInit()을 다시 호출하는 식으로 할 수 있습니다! 하지만 이제 컴퓨터에 과도한 스트레스를 주지 않는다면 핸들을 얻지 못할 이유가 없다는 것이 분명해졌습니다. 하지만 빌드를 업데이트할 때 이 문제를 본 적이 있는데, 인디케이터를 다시 컴파일하면 해결할 수 있습니다!

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 
마이너스 1은 반환될 수 있지만 EA/지표에 좋은 징조는 아닙니다.
 
다행히 단말기 결함으로 인한 표시기 생성 오류는 거의 발생하지 않습니다.