수직선. - 페이지 4

 

나는 여전히 지표의 복잡성을 이해하고 있으며 질문이 있습니다. OnInit() 에서 표시기 버퍼를 재설정 했지만 표시기가 컴파일될 때 어떤 이유로 버퍼가 재설정되지 않습니다. 논리적으로 컴파일 후 각 버퍼에 대해 하나의 전체 셀 이 있어야 하지만 그림은 많이 있음을 보여줍니다(이전 버퍼 셀이라고 생각합니다). 내 오류는 어디에 있습니까?

 int OnInit ()
  {
//--- indicator buffers mapping
   SetIndexBuffer ( 0 ,ColorHistogram_2Buffer1, INDICATOR_DATA );
   SetIndexBuffer ( 1 ,ColorHistogram_2Buffer2, INDICATOR_DATA );
   SetIndexBuffer ( 2 ,ColorHistogram_2Colors, INDICATOR_COLOR_INDEX );
//--- установим пустое значение
   PlotIndexSetDouble ( 0 , PLOT_EMPTY_VALUE , 0 );

   ArrayInitialize (ColorHistogram_2Buffer1, 0 );
   ArrayInitialize (ColorHistogram_2Buffer2, 0 );
   ArrayInitialize (ColorHistogram_2Colors, EMPTY_VALUE );

   Print ( "-INITALIZATION-" );

   false ;
//---
   return ( INIT_SUCCEEDED );
  }
      if(rates_total-8==i)// || rates_total-5==i || rates_total-2==i)
        {
         ColorHistogram_2Buffer1[i]=high[i];
         ColorHistogram_2Buffer2[i]=low[i];
         ColorHistogram_2Colors[i]=0;
        }


.
 
Nauris Zukas :

나는 여전히 지표의 복잡성을 이해하고 있으며 질문이 있습니다. OnInit() 에서 표시기 버퍼를 재설정 했지만 표시기가 컴파일될 때 어떤 이유로 버퍼가 재설정되지 않습니다. 논리적으로 컴파일 후 각 버퍼에 대해 하나의 전체 셀 이 있어야 하지만 그림은 많이 있음을 보여줍니다(이전 버퍼 셀이라고 생각합니다). 내 실수는 어디에 있습니까?

OnInit 에서 표시기 버퍼의 길이는 0입니다.


그런즉 너희 마음이 원하는 대로 그들에게 행하라 이 모든 것이 그들에게 죽은 찜질과 같으니라

그러나 코드 실행이 OnCalculate로 이동하면 크기가 즉시 Rates_total과 같아집니다.

배열의 모든 셀에는 "쓰레기"가 있습니다. 지표의 이전 계산에서 그대로 남아 있을 수도 있습니다.

 
Alexey Viktorov :

OnInit 에서 표시기 버퍼의 길이는 0입니다.


그런즉 너희 마음이 원하는 대로 그들에게 행하라 이 모든 것이 그들에게 죽은 찜질과 같으니라

그러나 코드 실행이 OnCalculate로 이동하면 크기가 즉시 Rates_total과 같아집니다.

배열의 모든 셀에는 "쓰레기"가 있습니다. 지표의 이전 계산에서 그대로 남아 있을 수도 있습니다.

대단히 감사합니다, 나는 모든 것을 이해했고 모든 것이 잘되었습니다! 다음과 같이 했습니다.

 bool ResetOnInit= false ;
int OnInit ()
  {   
   ResetOnInit= false ;
   return ( INIT_SUCCEEDED );
  }
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[])
  {
   if (!ResetOnInit)
     {
       ArrayInitialize (ColorHistogram_2Buffer1, 0 );
       ArrayInitialize (ColorHistogram_2Buffer2, 0 );
       ArrayInitialize (ColorHistogram_2Colors, EMPTY_VALUE );
      ResetOnInit= true ;
     }
  }
 
Nauris Zukas :

대단히 감사합니다, 나는 모든 것을 이해했고 모든 것이 잘되었습니다! 다음과 같이 했습니다.

변수에 값을 두 번 할당하는 이유는 무엇입니까?

 bool ResetOnInit= false ;
int OnInit ()
  {   
   ResetOnInit= false ;
   return ( INIT_SUCCEEDED );
  }

그리고 질문은 이 모든 것이 왜 필요한가입니다. 결국, 한 주기의 모든 막대를 통과하면 배열의 모든 셀이 어쨌든 무언가로 채워져야 합니다. 표시기가 현재 위치만 표시해야 하는 경우가 아니면 배열은 처음이 아니라 각 막대에서 초기화되어야 합니다 ...

 
Alexey Viktorov :

변수에 값을 두 번 할당하는 이유는 무엇입니까?

OnInit()이 차트의 모든 작업(예: 시간 프레임 변경)을 모방하는지 확신하지 못했습니다. 시간대 변경은 재설정(지금 확인했습니다)하지만 다른 것이 있을 수 있으므로 두 번째 항목을 OnInit()에 넣어 확인합니다. 그러나 당신이하지 않으면 나는 거기에 내기하지 않을 것입니다.
 
Alexey Viktorov :

그리고 질문은 이 모든 것이 왜 필요한가입니다. 결국, 한 주기의 모든 막대를 통과하면 배열의 모든 셀이 어쨌든 무언가로 채워져야 합니다. 표시기가 현재 위치만 표시해야 하는 경우가 아니면 배열은 처음이 아니라 각 막대에서 초기화되어야 합니다 ...

이 예에서는 버퍼를 플러시하는 방법을 이해하고 싶었습니다. 그러나 미래에는(현재 작업 중인 지표에서) 이전 셀을 유지하고 새 셀을 추가해야 합니다. 그것이 바로 제가 작업을 시작한 것입니다. 말하자면, 첫 번째 테스트입니다.

 
Nauris Zukas :
OnInit()이 차트의 모든 작업(예: 시간 프레임 변경)을 모방하는지 확신하지 못했습니다. 시간대 변경은 재설정(지금 확인했습니다)하지만 다른 것이 있을 수 있으므로 두 번째 항목을 OnInit()에 넣어 확인합니다. 그러나 당신이하지 않으면 나는 거기에 내기하지 않을 것입니다.

아.. 네, 차트 주기 를 변경할 때 전역 변수는 초기화되지 않습니다. ???정확히 기억이 안나네요.

그리고 일반적으로 이 추가 bool 변수 없이도 할 수 있습니다.

 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[])
  {
   if (prev_calculated == 0 )
     {
       ArrayInitialize (ColorHistogram_2Buffer1, 0 );
       ArrayInitialize (ColorHistogram_2Buffer2, 0 );
       ArrayInitialize (ColorHistogram_2Colors, EMPTY_VALUE );
     }
  }
 
Alexey Viktorov :

그리고 일반적으로 이 추가 bool 변수 없이도 할 수 있습니다.

네, 맞습니다. 더 좋습니다. 감사합니다.

 

기간이 30분을 초과하면 왜 이렇게 이상한 숫자가 반환되는지 알려주실 수 있습니까?

 Print ( "PERIOD: " , Period ()); 

KP 0 14:33:22.423 Test_DRAW_COLOR_HISTOGRAM2 (EURUSD,M30) 기간: 30

GG 0 14:33:24.402 Test_DRAW_COLOR_HISTOGRAM2 (EURUSD,H1) 기간: 16385

RJ 0 14:33:25.675 테스트_DRAW_COLOR_HISTOGRAM2 (EURUSD,H4) 기간: 16388
 
Nauris Zukas :

기간이 30분을 초과하면 왜 이렇게 이상한 숫자가 반환되는지 알려주실 수 있습니까?

MT5에서 기간 값은 MT4에서와 같이 분 수와 동일하지 않습니다.