사용자 지정 지표를 사용할 때 Expert Advisor의 속도를 높이는 이론(기능 - iCustom) - 페이지 3

 
-Aleks- :
따라서 필요한 지표의 뒤죽박죽이 지표를 별도로 사용하는 것보다 빠르게 작동하므로 견적에 대한 정보를 더 적게 요청하게 될까요?

중요하지 않습니다. 계산이 중복되지 않도록 주의해야 합니다. 두 지표의 예비 계산이 동일한 경우 하나로 결합할 가치가 있습니다. 모든 지표를 하나로 통합하는 것은 가치가 없습니다.

견적 요청에는 문제가 없습니다. 물어보지 않아도 알아서 옵니다.

 

표시기를 다시 계산하기 위해 시간 지연을 사용하려고 했습니다.

 int OnCalculate ( const int rates_total,
                 const int prev_calculated,
                 const int begin,
                 const double &price[])
  {
 static datetime    prevtime;
   datetime per= 15 ; //задержка секунд
   
   if (( TimeCurrent ()-prevtime)<per) 
   {
   return (rates_total); //прошло мало секунд - поэтому выходим
   }
 
//--- main cycle  
....................

prevtime= TimeCurrent ();
return (rates_total);
 }

"OHLSnaM1"에서 테스트할 때는 거의 차이가 없으며 아마도 "모든 틱"에서 테스트하는 것이 더 빠를 것입니다.

 

iCustom 작동 방식에 대한 나의 인상(지난 2개월 동안 변경된 사항이 없는 경우)
iCustom 에서 표시기를 호출 할 때
가능한 히스토리에 대한 모든 버퍼가 계산되고 결과가 캐시로 구동되며 매개변수 및 표시기 이름에 대한 캐시 바인딩도 있습니다.

다음에 두 번째 인덱스 배열에 대해 동일한 표시기 및 동일한 매개변수를 호출하면 결과가 캐시에서 반환됩니다(+ 새 기록 데이터에 대한 수정).
동일한 표시기를 호출하지만 하나 이상의 매개변수를 변경하면 가능한 기록에 대한 모든 버퍼가 완전히 계산되고 하나 이상의 캐시가 저장되지만 새 매개변수에 대한 바인딩이 있습니다.


Expert Advisor에서 표시기에 이러한 매개 변수를 만들면 다운로드 할 기록의 양을 지정할 수 있지만 이러한 호출을 사용하면 기록 크기와 같은 동일한 번호를 지속적으로 보내야합니다.
(첫 번째 iCustom 호출 속도에 영향을 미침)

또한 기록 크기가 있는 예에서와 같이 표시기 자체와 표시기 매개변수를 통해 가능하면 불필요한 버퍼 계산을 제거할 수 있습니다.
(캐시 크기 줄이기 - 계산 속도 증가)

 

정보 주셔서 감사합니다.

5개의 그래프 버퍼가 있는 표시기가 그래픽 버퍼가 아니라 일반 배열을 사용하는 경우 데이터 출력이 내가 제안한 대로 하나의 그래픽 버퍼를 통해 수행되면 최적화 중 EA의 속도가 더 빨라지기 때문에 표시기에 더 적은 메모리가 할당되고 각각 작업 시간이 줄어들 것입니까?

최적화가 수행되고 각 패스 에서 표시기 설정 이 변경되지 않으면 표시기가 다시 계산됩니까?

 
-Aleks- :

정보 주셔서 감사합니다.

5개의 그래프 버퍼가 있는 표시기가 그래픽 버퍼가 아니라 일반 배열을 사용하는 경우 데이터 출력이 내가 제안한 대로 하나의 그래픽 버퍼를 통해 수행되면 최적화 중 EA의 속도가 더 빨라지기 때문에 표시기에 더 적은 메모리가 할당되고 각각 작업 시간이 줄어들 것입니까?

최적화가 수행되고 각 패스 에서 표시기 설정 이 변경되지 않으면 표시기가 다시 계산됩니까?

버퍼 - 데이터를 표시할 때만 편리한 배열입니다.

최적화하는 동안 지표는 매번 다시 계산됩니다.

 
komposter :

버퍼 - 데이터를 표시할 때만 편리한 배열입니다.

나는 그것이 배열이라는 것을 이해하지만 지표를 계산하기 위한 배열은 훨씬 더 작을 수 있습니다. 종종 동적입니다.

예를 들어, 1000개의 막대 기록 에서 사용자 지정 표시기 는 3개의 SMA - 5/8/10을 그립니다.

표준 옵션을 사용하면 거의 3000-10-8-5로 가득 찬 그래픽 버퍼가 생깁니다.

내 방법을 사용하는 경우 다음을 수행합니다.

SMA(5)를 계산하려면 4개의 막대 크기(용어용어 죄송합니다)를 가진 배열이 필요합니다.

SMA(8)를 계산하려면 7개의 막대 크기(용어 죄송합니다)를 가진 배열이 필요합니다.

SMA(10)를 계산하려면 9개의 막대 크기(용어 죄송합니다)를 가진 배열이 필요합니다.

1000개의 막대로 구성된 그래픽 배열은 결과적으로 배열을 덮어쓰므로 1000 + 4 + 7 + 9 메모리를 차지해야 합니다.

내가 어디에서 잘못 되었습니까?

 
-Aleks- :

정보 주셔서 감사합니다.

5개의 그래프 버퍼가 있는 표시기가 그래픽 버퍼가 아니라 일반 배열을 사용하는 경우 데이터 출력이 내가 제안한 대로 하나의 그래픽 버퍼를 통해 수행되면 최적화 중 EA의 속도가 더 빨라지기 때문에 표시기에 더 적은 메모리가 할당되고 각각 작업 시간이 줄어들 것입니까?

최적화가 수행되고 각 패스 에서 표시기 설정 이 변경되지 않으면 표시기가 다시 계산됩니까?

imhenko, 표시기가 다시 호출될 때 메모리 세그먼트(오버레이)로 다시 로드되지 않는다는 것을 이해하는 것이 더 중요합니다. 이에 비하면 나머지는 모두 씨앗이다.
 
-Aleks- :

나는 그것이 배열이라는 것을 이해하지만 지표를 계산하기 위한 배열은 훨씬 더 작을 수 있습니다. 종종 동적입니다.

예를 들어, 1000개의 막대 기록 에서 사용자 지정 표시기 는 3개의 SMA - 5/8/10을 그립니다.

표준 옵션을 사용하면 거의 3000-10-8-5로 가득 찬 그래픽 버퍼가 생깁니다.

내 방법을 사용하는 경우 다음을 수행합니다.

SMA(5)를 계산하려면 4개의 막대 크기(용어 죄송합니다)를 가진 배열이 필요합니다.

SMA(8)를 계산하려면 7개의 막대 크기(용어 죄송합니다)를 가진 배열이 필요합니다.

SMA(10)를 계산하려면 9개 막대의 크기(용어 죄송합니다)를 가진 배열이 필요합니다.

1000개의 막대로 구성된 그래픽 배열은 결과적으로 배열을 덮어쓰므로 1000 + 4 + 7 + 9 메모리를 차지해야 합니다.

내가 어디에서 잘못 되었습니까?

한 막대에 값이 필요한 경우 버퍼는 실제로 필요하지 않습니다. 지표처럼 ;)

그리고 각 막대의 표시기 값이 필요한 경우 모든 것을 계산한 다음 새 막대만 계산하는 것이 더 경제적인 경우가 많습니다.
그리고 모든 알고리즘이 SMA만큼 간단한 것은 아니며 단순히 "5개의 막대에 대해" 계산할 수 없습니다. 적어도 지그재그로 봐.

무엇보다 가장 혼란스러운 것은 받은 답변을 실무에 적용하려고 하지 않는다는 점입니다. 실용적인 작업은 없고 이론적인 즐거움만 있는 것 같습니다.
그렇다면 내가 왜 여기에 참여하는지 이해하지 못합니다.

 

그런데 MT4는 기록의 일부만 계산하는 탁월한 작업을 수행하며 사이클이 마지막 1000개 막대를 통과하는 경우 전체 버퍼에 대한 메모리를 차지하지 않습니다("창에서"가 50000일지라도).

그러나 MT5에서는 마지막 100개만 계산하더라도 메모리가 모든 50,000개 막대에 할당되는 이 문제에 봉착했습니다.

 
komposter :

한 막대에 값이 필요한 경우 버퍼는 실제로 필요하지 않습니다. 지표처럼 ;)

왜 같은 바에서? 지표의 가치를 계산하기 위해 시간의 역사를 통해 모든 지표를 알 필요가 거의 없다는 사실에 관한 것입니다. 그래서 버퍼(배열)는 계산에만 사용하지만 3 MA의 계산 결과는 하나의 그래픽 버퍼에 저장한다고 쓴 이유입니다.

지그재그와 관련하여 - 이것은 이제 나에게 골칫거리입니다 - 많은 답변이 필요하지만 별도의 주제를 열겠습니다.

퇴비통 :

무엇보다 가장 혼란스러운 것은 받은 답변을 실무에 적용하려고 하지 않는다는 점입니다. 실용적인 작업은 없고 이론적인 즐거움만 있는 것 같습니다.

그렇다면 내가 왜 여기에 참여하는지 이해하지 못합니다.

사실은 나 자신이 프로그래밍하지 않는다는 것입니다. 연구는 이러한 과제를 컴파일하는 데 도움이 될 것입니다. 우리는 현재 EA 엔진의 구성 요소가 될 지표를 개발 중입니다. 버퍼가 많기 때문에 지표를 코드에 통합하는 것이 아니라 다른 방법으로 EA의 작업 속도를 높이는 방법을 생각하고 있습니다.

그리고 누군가가 실제로 그러한 알고리즘을 시도하는 것이 흥미로울 수 있기를 희망했습니다. 작업 속도를 비교하기 위해 ...


퇴비통 :

그런데 MT4는 기록의 일부만 계산하는 탁월한 작업을 수행하며 사이클이 마지막 1000개 막대를 통과하는 경우 전체 버퍼에 대한 메모리를 차지하지 않습니다("창에서"가 50000일지라도).

그러나 MT5에서는 마지막 100개만 계산하더라도 메모리가 모든 50,000개 막대에 할당되는 이 문제에 봉착했습니다.

5명의 안타까운 사실이지만, 개발자들은 이에 대한 성스러운 의미를 설명하지 않고 있다?