prev_calculated - 페이지 3

 
Alexey Viktorov :

엉뚱한 질문에 답하는 놀라운 능력...

이제 다음과 같은 경우 어떻게 되는지 설명하세요.

1. 다시 계산된 100개의 막대, 0에서 99까지의 버퍼에 입력(방향을 시계열로 간주) 값 1.03

2. 갑자기 히스토리가 로드되고 prev_calculated가 0이 됨

표시기는 어느 막대에서 값 1.03을 표시합니까???

  1. 시계열에서와 같이 인덱싱을 고려하려면 표시기 버퍼의 OnInit()에서 AS_SERIES 플래그를 설정해야 합니다. 그래서 "가장 오른쪽 막대" 개념으로 작업하는 것을 선호하므로 아무도 잘못 알려주지 않습니다. .
  2. 답은 다음과 같습니다.
       if (prev_calculated== 0 )
         {
           //--- инициализация элементов индикаторного буфера при первом запуске или при подкачке истории
           for ( int i= 0 ;i<rates_total;i++)
             ExtBuffer[i]= 1.01 ;
           return (rates_total);
         }
    "prev_calculated==0"으로 표시기 버퍼의 모든 요소는 절대적으로 "1.01" 값으로 다시 초기화되고 "return(rates_total);"에 의해 즉시 종료됩니다. 즉, 표시기 버퍼에 "1.03"의 이전 값에 대한 자취가 없습니다.
 
Alexey Viktorov :

표시기의 첫 번째 시작 부분에서 쓰레기를 제거하는 방법을 더 잘 설명 하십시오.

오리는 간단합니다. prev_calculated는 잊어버리고 '측면에 구멍' 없이 자신만의 복제본을 만드세요. 예에서 fxsaber 와 같이 이전에 계산된 막대의 기록을 유지해야 하는 경우
fxsaber :
목발은 절대 아닙니다. 그게 내가 하는 일이다 .
간단한 플래그가 먼저 실행/이미 먼저 실행되지 않는 것으로 충분하면 prev_calculated를 정적 bool b_First_Run으로 바꿉니다. 또는 버퍼 초기화를 OnInint로 이동할 수 있습니다.
 
Karputov Vladimir :
  1. 시계열에서와 같이 인덱싱을 고려하려면 표시기 버퍼의 OnInit()에서 AS_SERIES 플래그를 설정해야 합니다. 그래서 "가장 오른쪽 막대" 개념으로 작업하는 것을 선호하므로 아무도 잘못 알려주지 않습니다. .
  2. 답은 다음과 같습니다.
       if (prev_calculated== 0 )
         {
           //--- инициализация элементов индикаторного буфера при первом запуске или при подкачке истории
           for ( int i= 0 ;i<rates_total;i++)
             ExtBuffer[i]= 1.01 ;
           return (rates_total);
         }
    "prev_calculated==0"으로 표시기 버퍼의 모든 요소는 절대적으로 "1.01" 값으로 다시 초기화되고 "return(rates_total);"에 의해 즉시 종료됩니다. 즉, 표시기 버퍼에 "1.03"의 이전 값에 대한 자취가 없습니다.

그래서 이것은 고쳐야 할 문제입니다. 나는 쓰레기가 필요하지 않지만(필요하지 않은 것이 아니라 디스플레이를 방해함) 이전 지표 계산을 저장해야 합니다. 표시기가 처음 실행될 때 가비지가 버퍼에 들어가고 히스토리를 로드할 때 버퍼에 있던 모든 것이 저장되어야 합니다. 가급적이면 파일에 쓰지 않고 GV에 쓰지 않는 것이 좋습니다.


추가:

1분마다 실시간으로 드로다운을 평가하도록 설계되었습니다. 어드바이저는 1주일 동안 쉬지 않고 일하고, 주간 표시 대신 지표 없이도 볼 수 있는 마지막 값만 보게 됩니다...

 
Alexander Puzanov :
간단한 플래그가 먼저 실행/먼저 실행되지 않는 것으로 충분하면 prev_calculated를 정적 bool b_First_Run으로 바꿉니다. 또는 버퍼 초기화를 OnInint로 이동할 수 있습니다.
아니요, 목표는 그렇게 원시적이지 않습니다.
 
fxsaber :
아니요, 목표는 그렇게 원시적이지 않습니다.
여기 당신이 없습니다 - 이것은 당신을 위한 제안이 아닙니다, Alexey Viktorov , 내가 이해하는 바와 같이, 당신은 이것만 필요합니다 - 첫 번째 시작에서 버퍼를 재설정하고 스왑으로 버퍼를 만지지 마십시오
 
Alexey Viktorov :

그래서 이것은 고쳐야 할 문제입니다. 나는 쓰레기가 필요하지 않지만(필요하지 않은 것이 아니라 디스플레이를 방해함) 이전 지표 계산을 저장해야 합니다. 표시기가 처음 실행될 때 가비지가 버퍼에 들어가고 히스토리를 로드할 때 버퍼에 저장된 모든 것이 저장되어야 합니다. 가급적이면 파일에 쓰지 않고 GV에 기록하지 않는 것이 좋습니다.


추가:

1분마다 실시간으로 드로다운을 추정하도록 설계되었습니다. 어드바이저는 1주일 동안 쉬지 않고 일하고, 주간 표시 대신 지표 없이도 볼 수 있는 마지막 값만 보게 됩니다...

영형! 이제 더 명확해졌습니다. 저녁까지 답변드리겠습니다.
 
Alexander Puzanov :
여기 당신이 없습니다 - 이것은 당신을 위한 제안이 아닙니다, Alexey Viktorov , 내가 이해하는 대로 당신은 이것만 필요합니다 - 첫 번째 시작에서 버퍼를 재설정하고 스왑으로 버퍼를 만지지 마십시오
물론 OnInit()에서 버퍼를 초기화하는 것으로 시작했지만 뭔가 잘못되었습니다. 무엇을했는지 기억이 나지 않고 Prev_calculated == 0으로 OnCalculate에서 초기화를 꺼냈습니다.
 

OnInit()에서 버퍼 배열을 초기화 하면 어떻게 되는지 다시 확인했습니다.

차트에서 지표를 제거 하고 새로운 설정을 해도 전부는 아니지만 일부 버퍼에서는 이전 값이 유지됩니다. 이전의 값과 정확히 일치하지는 않지만 이러한 값 중 하나는 여러 막대로 확장됩니다.

 
Karputov Vladimir :
영형! 이제 더 명확해졌습니다. 저녁까지 답변드리겠습니다.
답변이 늦어서 죄송합니다. 주어진 기간 동안 계산된 값을 저장하는 유일한 방법은 파일에 저장하는 것입니다. 이 경우 파일에서 읽을 때 데이터가 막대에 배치되도록 동기화를 처리해야 합니다. 가장 논리적인 것은 막대 여는 시간 에 의한 동기화이지만 여기에 뉘앙스가 있을 수 있습니다. 예를 들어 막대 여는 시간(파일에 저장)은 2016.09.05입니다. 25:02 , 그리고 이제 시간이 2016.09.05인 차트에 막대가 있습니다. 25:01.
 
Karputov Vladimir :
답변이 늦어서 죄송합니다. 주어진 기간 동안 계산된 값을 저장하는 유일한 방법은 파일에 저장하는 것입니다. 이 경우 파일에서 읽을 때 데이터가 막대에 배치되도록 동기화를 처리해야 합니다. 가장 논리적인 것은 막대 여는 시간 에 의한 동기화이지만 여기에 뉘앙스가 있을 수 있습니다. 예를 들어 막대 여는 시간(파일에 저장)은 2016.09.05입니다. 25:02 , 그리고 이제 시간이 2016.09.05인 차트에 막대가 있습니다. 25:01.

아니면 표시기 버퍼 초기화 문제에 대해 개발자의 주의를 끄는 것이 더 나을까요? MT4에는 왜 그런 문제가 없나요? 어쩌면 다시 완전한 이해가 아니겠습니까? 문제는 SOME의 차트에서 표시기를 제거한 후 버퍼를 강제로 초기화하더라도 모든 버퍼에 가비지가 포함되어 있지 않고 아무 것도 제거할 수 없다는 것입니다...

개인적으로 나는 목발을 반대하는 것이 아니라 이 목발이 너무 어렵지 않고 긍정적인 효과가 있는 경우에만 가능합니다. 그러나 후속 읽기와 함께 파일에 쓰는 것은 서투른 버팀목입니다.