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

 
Karputov Vladimir :
인쇄(MQLInfoString(MQL_PROGRAM_NAME)); 표시기의 짧은 이름을 반환합니다. 짧은 이름을 지정하지 않으면 전체 이름이 반환됩니다.
고맙습니다.
 
Vladimir Pastushak :

고맙습니다.

Aleksey, 당신의 예가 작동하지 않습니다. 모두 동일하게 부모 메소드가 떨어지지 않아야하는 상속인에게 빠져 있습니다.


이러면 안되는데 코드를 올려주실 수 있나요?

부모 공용에서 보호되었던 데이터 protected-inheritance 때 보호 됩니다 .

	          
 
  1. 우리는 손으로 NAKER 차트에 표시기를 설치합니다.
     #property indicator_separate_window
    #property indicator_buffers 1
    #property indicator_plots    1
    
    double Buffer[];
    
    int handle = INVALID_HANDLE ;
    
    void OnInit ()
    {
      :: SetIndexBuffer ( 0 , Buffer, INDICATOR_DATA );
      
      handle = ChartIndicatorGet ( 0 , 1 , ChartIndicatorName ( 0 , 1 , 0 ));  
    }
    
    #define TOSTRING(A) #A + " = " + ( string )A + "\n"
    
    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 (handle != INVALID_HANDLE )
      {
        Buffer[rates_total - 1 ] = MathRand ();
        
         double BufferCopy[];
        
         if ( CopyBuffer (handle, 0 , 0 , 1 , BufferCopy) > 0 )
           Print (TOSTRING(BufferCopy[ 0 ]) + TOSTRING(Buffer[rates_total - 1 ]));
      }
      
       return (rates_total);
    }
  2. 차트에서 지표를 손으로 제거합니다.
  3. 로그에서 표시기가 계속 실행되는 것을 볼 수 있습니다. 터미널에서 모든 차트를 닫을 수 있지만 여전히 실행됩니다. 그리고 그것은 물론 도움이되지 않습니다
     void OnDeinit ( const int Reason )
    {
       if (handle != INVALID_HANDLE )  
         IndicatorRelease (handle);
      
       return ;
    }
  4. 터미널을 다시 시작하면 표시기의 진행이 중지됩니다.
  5. 이것은 유휴 상태에서 얼마나 많은 지표를 수행 할 수 있으며 우리는 그것에 대한 소문이나 정신이 없습니다! 통제가 전혀 없습니다.
 
fxsaber :
  1. 우리는 손으로 NAKER 차트에 표시기를 설치합니다.
  2. 차트에서 지표를 손으로 제거합니다.
  3. 로그에서 표시기가 계속 실행되는 것을 볼 수 있습니다. 터미널에서 모든 차트를 닫을 수 있지만 여전히 실행됩니다.
  4. 터미널을 다시 시작하면 표시기의 진행이 중지됩니다.
  5. 이런 식으로 얼마나 많은 지표를 헛되이 실행할 수 있는지, 우리는 그것에 대한 소문이나 정신이 없습니다! 통제가 전혀 없습니다.

#define 및 ::를 사용 하여 코드를 읽고 볼 수 없습니다.

 

일반적으로 허용되는 MQL5 스타일로 코드를 다시 작성하십시오.

 
fxsaber :
  1. 우리는 손으로 NAKER 차트에 표시기를 설치합니다.
  2. 차트에서 지표를 손으로 제거합니다.
  3. 로그에서 표시기가 계속 실행되는 것을 볼 수 있습니다. 터미널에서 모든 차트를 닫을 수 있지만 여전히 실행됩니다.
  4. 터미널을 다시 시작하면 표시기 실행이 중지됩니다.
  5. 이것은 유휴 상태에서 얼마나 많은 지표를 수행 할 수 있으며 우리는 그것에 대한 소문이나 정신이 없습니다! 통제가 전혀 없습니다.
_StopFlag 플래그 검사를 추가해도 도움이 되지 않습니까?
 
Karputov Vladimir :

#define 및 ::를 사용 하여 코드를 읽고 볼 수 없습니다.

 

일반적으로 허용되는 MQL5 스타일로 코드를 다시 작성하십시오.

이것이 MQL5의 스타일입니다. #define과 ::가 무엇인지 알아보세요.
 
Alexey Kozitsyn :
_StopFlag 플래그 확인을 추가해도 도움이 되지 않습니까?
그리고 그것을 추가할 위치와 최소한 이론적으로 도움이 되는 방법. 이것은 터미널 버그입니다. 그리고 심각한 버그. 나는 운이 좋았기 때문에 표시기가 작동하고 있음을 로그에서 볼 수 있습니다. 그리고 로그에 대한 출력이 없는 그러한 표시기가 터미널에 얼마나 많이 있는지, 그리고 그것에 대해 전혀 알지 못합니다. 그러나 주제가 제기되었지만 왜 내 CPU가 빈 터미널에 그렇게 로드되어 있습니까?
 
fxsaber :
이것이 MQL5의 스타일입니다. #define과 ::가 무엇인지 알아보세요.
나는 그것에 대해 말하는 것이 아니다. "::"는 귀하의 예에서 전혀 필요하지 않습니다. 아마도 이것이 귀하의 습관이지만 전혀 필요하지 않습니다. 그리고 #defane 없이 코드는 정상적으로 작성됩니다. 다시 작성해 보세요. 코드가 깨끗해질 것입니다. 아마도 무언가가 즉시 표시될 것입니다.
 
Karputov Vladimir :
나는 그것에 대해 말하는 것이 아니다. "::"는 귀하의 예에서 전혀 필요하지 않습니다. 아마도 이것이 귀하의 습관이지만 전혀 필요하지 않습니다. 그리고 #defane 없이 코드는 정상적으로 작성됩니다. 다시 작성해 보세요. 코드가 깨끗해질 것입니다. 아마도 무언가가 즉시 표시될 것입니다.

한 곳에 "::"만 있었습니다. 그리고 처음부터 코드를 작성하지 않습니다. 원칙적으로 나는 내 코드에서 무언가를 꺼냅니다. 여기:: 하나는 복사-붙여넣기를 통해 길을 웜. 나는 그것에주의를 기울이지 않을 것이지만 당신에게 더 쉽기 때문에 그것을 제거했습니다.

그러나 #define을 제거하려면 기본적으로 그렇지 않습니다. 코드의 99%는 그것 없이 작성될 수 있습니다. 이것은 제거할 이유가 되지 않습니다.

그리고 #define 없이는 불가능할 때 1%(조건부)가 있습니다!

 
fxsaber :

나는 한 곳에 "::"만 있었다. 그리고 처음부터 코드를 작성하지 않습니다. 원칙적으로 나는 내 코드에서 무언가를 꺼냅니다. 여기:: 하나가 복사-붙여넣기를 통해 길을 갉아먹었습니다. 나는 그것에주의를 기울이지 않을 것이지만 당신에게 더 쉽기 때문에 그것을 제거했습니다.

그러나 #define 제거 - 근본적으로 아닙니다. 코드의 99%는 그것 없이 작성될 수 있습니다. 이것은 제거할 이유가 되지 않습니다.

그리고 #define 없이는 불가능할 때 1%(조건부)가 있습니다!

버퍼 복사를 거부하는 경우:

 //+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots    1

double Buffer[];

int handle= INVALID_HANDLE ;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnInit ()
  {
   SetIndexBuffer ( 0 ,Buffer, INDICATOR_DATA );

   handle= ChartIndicatorGet ( 0 , 1 , ChartIndicatorName ( 0 , 1 , 0 ));
  }

#define TOSTRING(A) #A + " = " + ( string )A + "\n"
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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 (handle!= INVALID_HANDLE )
     {
      Buffer[rates_total- 1 ]= MathRand ();

       double BufferCopy[];
       Print ( __FUNCTION__ );
       //if(CopyBuffer(handle,0,0,1,BufferCopy)>0)
       //   Print(TOSTRING(BufferCopy[0])+TOSTRING(Buffer[rates_total-1]));
     }

   return (rates_total);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit ( const int Reason)
  {
   Print ( "#1 OnDeinit" );
   if (handle!= INVALID_HANDLE )
     {
       Print ( "#2 OnDeinit" );
       IndicatorRelease (handle);
       Print ( "#3 OnDeinit" );
     }
   Print ( "#4 OnDeinit" );
   return ;
  }
//+------------------------------------------------------------------+

그런 다음 표시기가 성공적으로 작업을 완료합니다.

 2016.09 . 23 12 : 11 : 12.655 2 (SBRF- 12.16 ,M1)       OnCalculate
2016.09 . 23 12 : 11 : 12.737 2 (SBRF- 12.16 ,M1)       OnCalculate
2016.09 . 23 12 : 11 : 12.737 2 (SBRF- 12.16 ,M1)       OnCalculate
2016.09 . 23 12 : 11 : 12.737 2 (SBRF- 12.16 ,M1)       OnCalculate
2016.09 . 23 12 : 11 : 12.747 2 (SBRF- 12.16 ,M1)       OnCalculate
2016.09 . 23 12 : 11 : 13.406 2 (SBRF- 12.16 ,M1)       OnCalculate
2016.09 . 23 12 : 11 : 13.406 2 (SBRF- 12.16 ,M1)       OnCalculate
2016.09 . 23 12 : 11 : 13.406 2 (SBRF- 12.16 ,M1)       OnCalculate
2016.09 . 23 12 : 11 : 14.794 2 (SBRF- 12.16 ,M1)       OnCalculate
2016.09 . 23 12 : 11 : 15.747 2 (SBRF- 12.16 ,M1)       OnCalculate
2016.09 . 23 12 : 11 : 16.936 2 (SBRF- 12.16 ,M1)       OnCalculate
2016.09 . 23 12 : 11 : 19.339 2 (SBRF- 12.16 ,M1)       # 1 OnDeinit
2016.09 . 23 12 : 11 : 19.339 2 (SBRF- 12.16 ,M1)       # 2 OnDeinit
2016.09 . 23 12 : 11 : 19.339 2 (SBRF- 12.16 ,M1)       # 3 OnDeinit
2016.09 . 23 12 : 11 : 19.339 2 (SBRF- 12.16 ,M1)       # 4 OnDeinit