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

 

지표의 완전한 생성에 대한 지표를 인터넷에서 기다리지 마십시오.

표시기 를 만들고 제어를 반환하면 모든 환경과 기록이 나중에 준비되고 재계산 코드가 호출됩니다.

 
Renat Fatkhullin :

지표가 완전히 생성될 때까지 인터넷에서 기다리지 마십시오.

표시기를 만들고 제어를 반환하면 모든 환경과 기록이 나중에 준비되고 재계산 코드가 호출됩니다.

감사합니다. 즉, OnInit()에서 돌아와서 데이터를 받을 때마다 4806을 확인해야 합니까?
 
모든 데이터 읽기 위치에서
 

여기에서 표시기에 액세스하고 해당 값은 OnCalculate 내에서 계산됩니다. 무한정 기다릴 수 있으며 재계산이 없습니다. D1 기간 차트에서 실행

 int i_ich= INVALID_HANDLE ;
double ind_buf[];

int OnInit (){
   i_ich= iIchimoku ( Symbol (), PERIOD_H4 , 9 , 26 , 52 );
   if (i_ich== INVALID_HANDLE ){
       Print ( "Невозможно создать индиктор Ишимоку!" );
       return ( INIT_FAILED );
   }
   SetIndexBuffer ( 0 , ind_buf, INDICATOR_DATA );
   ArraySetAsSeries (ind_buf, true );
   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[]){
   double temp[];
   int copied= CopyBuffer (i_ich, 0 , 0 , 1 ,temp);
   if (copied<= 0 ){
       datetime now= TimeLocal ();
       while ( BarsCalculated (i_ich)<= 0 && ! IsStopped ()){  
         Comment ( "Ждем пересчета индикатора Ишимоку... " , int ( TimeLocal ()-now));
      }
       if ( BarsCalculated (i_ich)> 0 ){
         Print ( "Расчитано " , BarsCalculated (i_ich), " баров за " , int ( TimeLocal ()-now), " секунд" );
      }
       Comment ( "" );
   } 

   return (rates_total);
}

Ichimoku의 판독값이 계산되지 않는 이유를 설명하십시오.

 
Ilya Malev :

여기에서 표시기에 액세스하고 해당 값은 OnCalculate 내에서 계산됩니다. 무한정 기다릴 수 있으며 재계산이 없습니다. D1 기간 차트에서 실행

Ichimoku의 판독값이 계산되지 않는 이유를 설명하십시오.

그렇다면:

 //+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots    0
int i_ich= INVALID_HANDLE ;
double ind_buf[];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit ()
  {
   i_ich= iIchimoku ( Symbol (), PERIOD_H4 , 9 , 26 , 52 );
   if (i_ich== INVALID_HANDLE )
     {
       Print ( "Невозможно создать индиктор Ишимоку!" );
       return ( INIT_FAILED );
     }
   SetIndexBuffer ( 0 ,ind_buf, INDICATOR_DATA );
   ArraySetAsSeries (ind_buf, true );
   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[])
  {
   static int count;
   Print (count);
   double temp[];
   datetime now= TimeLocal ();
   int copied= CopyBuffer (i_ich, 0 , 0 , 1 ,temp);
   if (copied> 0 )
       Print ( "Расчитано " , BarsCalculated (i_ich), " баров за " , int ( TimeLocal ()-now), " секунд" );
   count++;
   return (rates_total);
  }
//+------------------------------------------------------------------+
?
 

표시기 코드에서 대기를 반복해서는 안 됩니다. 스크립트와 Expert Advisors에서는 가능하지만 지표에서는 절대 불가능합니다.

즉, 지표에서 다른 사람의 데이터를 계산하고 요청하는 전략은 다음과 같아야 합니다. 데이터 요청이 실패하면 즉시 종료하고 다음 틱에 대한 계산을 연기합니다. 다음 틱/콜에서 우리는 필요한 것을 다시 요청하려고 시도할 것입니다.

 
Karputov Vladimir :

그렇다면:

?
출력 "0"(오늘은 일요일이므로 OnCalculate 가 다시 시작되지 않음)
 
Renat Fatkhullin :

표시기 코드에서 대기를 반복해서는 안 됩니다. 스크립트와 Expert Advisors에서는 가능하지만 지표에서는 절대 불가능합니다.

즉, 지표에서 다른 사람의 데이터를 계산하고 요청하는 전략은 다음과 같아야 합니다. 데이터 요청이 실패하면 즉시 종료하고 다음 틱에 대한 계산을 연기합니다. 다음 틱/콜에서 우리는 필요한 것을 다시 요청하려고 시도할 것입니다.

좋습니다. 하지만 다음 틱을 기다리지 않고 한 번의 실행으로 표시기 판독값 을 계산해야 하는 경우 어떻게 해야 합니까? 예를 들어 주말이나 그냥 저수시라면 분당 틱은 언제 나오나요? OnCalculate 대신 OnTimer를 사용하시겠습니까?
 
Ilya Malev :
출력 "0"(오늘은 일요일이므로 OnCalculate 가 다시 시작되지 않음)
테스터에 테스터에! 그리고 주말에는 차트를 마우스 오른쪽 버튼으로 클릭하고 "새로 고침"해야 합니다.
 

"업데이트"를 클릭하면 모든 것이 계산되었습니다. 마찬가지로, OnCalculate/OnTimer 등의 첫 번째 호출 이전에 인터넷에서 생성된 지표의 데이터를 계산하면 더 편리할 것입니다.

또는 초기화 후 표시기 내부의 주기에서 계산될 때까지 프로그래밍 방식으로 기다릴 수 있습니다.

지표를 계산하려면 차트에서 "새로고침"을 여러 번 눌러야 합니다. 그는 그것을 필요로합니까? 그는 MT5의 몇 가지 장점에도 불구하고 오래된 MT4를 기억하고 계속 사용할 것입니다.