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

 
Ilya Malev :

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

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

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

지표의 모든 계산은 OnCalculate()에서만 수행되어야 합니다( SHOULD ).
 
Karputov Vladimir :
지표의 모든 계산은 OnCalculate()에서만 수행되어야 합니다( SHOULD ).
이 경우 Ichimoku 표시기의 판독값에 대해 이야기하고 있습니다. 우리는 현재 OnCalculate에서 사용되는 지표의 판독 값에 대해 이야기하고 있습니다. MT4에서와 같이 OnCalculate를 호출 하기 전에 계산되도록 합니다. 또는 OnCalculate에서 계산을 기다릴 수 있습니다. 그렇지 않으면 사용자가 표시기를 작성하기 위해 새로 고침을 여러 번 클릭해야 합니다. 모든 지표가 1초 안에 전체 이력을 기반으로 구축되는 것은 아니기 때문에 계산하는 데 시간이 더 오래 걸리는 복잡한 지표가 있습니다. 이 모든 시간 동안 사용자는 "업데이트" 버튼을 통해 요리해야 하며 MT4에서는 렌더링을 기다리는 것만 필요했습니다.
 
Ilya Malev :
이 경우 Ichimoku 표시기의 판독값에 대해 이야기하고 있습니다. 우리는 현재 OnCalculate에서 사용되는 지표의 판독 값에 대해 이야기하고 있습니다. MT4에서와 같이 OnCalculate를 호출 하기 전에 계산되도록 합니다.
OnInit()는 지표에 대한 거래 환경을 준비합니다. 그리고 OnCalculate()에서만 이미 지표 데이터를 사용할 수 있습니다.
 
Ilya Malev :
이 경우 Ichimoku 표시기의 판독값에 대해 이야기하고 있습니다. 우리는 현재 OnCalculate에서 사용되는 지표의 판독 값에 대해 이야기하고 있습니다. MT4에서와 같이 OnCalculate를 호출 하기 전에 계산되도록 합니다. 또는 OnCalculate에서 계산을 기다릴 수 있습니다. 그렇지 않으면 사용자가 표시기를 작성하기 위해 새로 고침을 여러 번 클릭해야 합니다. 모든 지표가 1초 안에 전체 이력을 기반으로 구축되는 것은 아니기 때문에 계산하는 데 시간이 더 오래 걸리는 복잡한 지표가 있습니다. 이 모든 시간 동안 사용자는 "업데이트" 버튼을 통해 요리해야 하며 MT4에서는 렌더링을 기다리는 것만 필요했습니다.

때때로 이 문제가 포럼에 나타납니다. 불행히도 OnTimer ()에서 OnCalculate ()를 호출해도 문제가 해결되지 않습니다.

그러나 여전히 시도하십시오. 예제는 이 문서에서 찾을 수 있습니다. MQL5 조리법 - MQL5의 다중 통화 변동성 표시기 개발 .

나중에 쓰세요, 어렵지 않다면 나오든 말든.

 
Karputov Vladimir :
OnInit()는 지표에 대한 거래 환경을 준비합니다. 그리고 OnCalculate()에서만 이미 지표 데이터를 사용할 수 있습니다 .
표시기가 다른 기호 및/또는 TF의 다른 표시기를 사용하는 경우 차트에서 "새로 고침" 버튼을 한 번 이상 누르지 않고(또는 1/여러 틱을 기다린 후) 불가능한 것으로 나타났습니다.
 
Anatoli Kazharski :

때때로 이 문제가 포럼에 나타납니다. 불행히도 OnTimer ()에서 OnCalculate ()를 호출해도 문제가 해결되지 않습니다.

그러나 여전히 시도하십시오. 예제는 이 문서에서 찾을 수 있습니다. MQL5 조리법 - MQL5의 다중 통화 변동성 표시기 개발 .

나중에 쓰세요, 어렵지 않다면 나오든 말든.

링크 주셔서 감사합니다. 노력해서 말씀드리겠습니다.
 
Ilya Malev :
표시기가 다른 기호 및/또는 TF의 다른 표시기를 사용하는 경우 차트에서 "새로 고침" 버튼을 한 번 이상 누르지 않고(또는 1/여러 틱을 기다린 후) 불가능한 것으로 나타났습니다.

그리고 내가 준 코드의 작업을 자세히 살펴보면? 그리고 특히 "전문가"에서? 주말에 터미널을 다시 시작한 후:

 2015.10 . 11 14 : 44 : 01.672 test (USDCAD,M5)         0
2015.10 . 11 14 : 44 : 01.681 test (USDCAD,M5)         1
2015.10 . 11 14 : 44 : 01.682 test (USDCAD,M5)        Расчитано 16518 баров за 0 секунд
2015.10 . 11 14 : 44 : 01.705 test (USDCAD,M5)         2
2015.10 . 11 14 : 44 : 01.705 test (USDCAD,M5)        Расчитано 16518 баров за 0 секунд

OnCaalculate()에 대한 두 번째 호출에서만 계산이 완료되었음을 분명히 알 수 있습니다. 따라서 누구도 검사에 대한 프로그래머의 책임을 덜어주지 않습니다. OncalCulate()에서 CopyBuffer()의 결과를 확인하십시오. 함수가 아무 것도 반환하지 않으면 OnCalculate()의 다음 입력에서 확인해야 합니다.

 
Anatoli Kazharski :

때때로 이 문제가 포럼에 나타납니다. 불행히도 OnTimer ()에서 OnCalculate ()를 호출해도 문제가 해결되지 않습니다.

그러나 여전히 시도하십시오. 예제는 이 문서에서 찾을 수 있습니다. MQL5 조리법 - MQL5의 다중 통화 변동성 표시기 개발 .

나중에 쓰세요, 어렵지 않다면 나오든 말든.

아직 기사를 읽지 않았지만 OnTimer로 수신이 잘 됩니다.

 //+------------------------------------------------------------------+
//|                                                      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 ()
  {
   EventSetTimer ( 1 );
   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 );
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+

void OnTimer (){
   datetime Arr1[];
   double Arr2[];
   long Arr3[];
   int Arr4[];
   OnCalculate ( 0 , 0 , Arr1, Arr2, Arr2, Arr2, Arr2, Arr3, Arr3, Arr4);
}

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= 0 ;
   static datetime now= 0 ;
   if (now== 0 )  now= TimeLocal ();
   if (count>= 0 ){
       Print (count);
       double temp[];
       int copied= CopyBuffer (i_ich, 0 , 0 , 1 ,temp);
       if (copied> 0 ){
         Print ( "Расчитано " , BarsCalculated (i_ich), " баров за " , int ( TimeLocal ()-now), " секунд" );
         EventKillTimer (); // Индикаторы рассчитались, далее работаем только с OnCalculate
         count=- 1 ;
      } else
         count++;
   }
   if (rates_total== 0 )   return ( 0 ); // Если это вызов из OnTimer, то возврат
   
   // ...
   return (rates_total);
}

일반적으로 OnTimer에서 OnCalculate에 대한 호출이 작동하는 곡선으로 표시됨) 시계열에서 올바른 값의 전송을 추가해야 합니다.

 
Ilya Malev :

아직 기사를 읽지 않았지만 OnTimer로 수신이 잘 됩니다.

간단한 지표에서는 아주 정상입니다. 그러나 더 복잡한 것들에서는 어떤 이유로 때때로 멈춥니다. )
 
Ilya Malev :

아직 기사를 읽지 않았지만 OnTimer로 수신이 잘 됩니다.

Styler 사용 - 오류를 감지하는 것이 좋습니다.

   if (count>= 0 )
     {
       Print (count);
       double temp[];
       int copied= CopyBuffer (i_ich, 0 , 0 , 1 ,temp);
       if (copied> 0 )
        {
         Print ( "Расчитано " , BarsCalculated (i_ich), " баров за " , int ( TimeLocal ()-now), " секунд" );
         EventKillTimer (); // Индикаторы рассчитались, далее работаем только с OnCalculate
         count=- 1 ;
        }
       else
         count++;
     }
OnCalculate()를 종료하기 전에 count 변수를 늘려야 합니다. 이 경우 이 변수는 OnCalculate의 모든 항목을 올바르게 계산합니다.
사유: