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

 
Karputov Vladimir :
잘못된 프로그래밍 스타일의 모든 경우를 버그로 쓸 수는 없습니다.

이게 무슨 뜬금없는 출석이야?! 나는 명백한 버그를 지적하고 있지만 "스타일"에 대한 국수에 대해 이야기하고 있습니다.

나는 달에 걸어가는 것처럼 A100과 고기까지. 그들은 내가 이해하지 못하더라도 버그를 보여줍니다. 그러나 나는 내 "스타일"로 등반하지 않습니다.

 
fxsaber :
작동하지 않습니다.

전체 코드는 다음과 같습니다.

 //+------------------------------------------------------------------+
//|                                                      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)
   if (prev_calculated!= 0 )
     {
      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 : 34 : 03.318 2 (SBRF- 12.16 ,M1)       OnCalculate
2016.09 . 23 12 : 34 : 03.318 2 (SBRF- 12.16 ,M1)       BufferCopy[ 0 ] = 265.0
2016.09 . 23 12 : 34 : 03.319 2 (SBRF- 12.16 ,M1)       Buffer[rates_total- 1 ] = 18992.0
2016.09 . 23 12 : 34 : 03.319 2 (SBRF- 12.16 ,M1)       
2016.09 . 23 12 : 34 : 03.502 2 (SBRF- 12.16 ,M1)       OnCalculate
2016.09 . 23 12 : 34 : 03.502 2 (SBRF- 12.16 ,M1)       BufferCopy[ 0 ] = 265.0
2016.09 . 23 12 : 34 : 03.502 2 (SBRF- 12.16 ,M1)       Buffer[rates_total- 1 ] = 12498.0
2016.09 . 23 12 : 34 : 03.502 2 (SBRF- 12.16 ,M1)       
... экономия бумаги :)
2016.09 . 23 12 : 34 : 31.804 2 (SBRF- 12.16 ,M1)       
2016.09 . 23 12 : 34 : 33.159 2 (SBRF- 12.16 ,M1)       OnCalculate
2016.09 . 23 12 : 34 : 33.159 2 (SBRF- 12.16 ,M1)       BufferCopy[ 0 ] = 614.0
2016.09 . 23 12 : 34 : 33.159 2 (SBRF- 12.16 ,M1)       Buffer[rates_total- 1 ] = 5343.0
2016.09 . 23 12 : 34 : 33.159 2 (SBRF- 12.16 ,M1)       
2016.09 . 23 12 : 34 : 36.870 2 (SBRF- 12.16 ,M1)       OnCalculate
2016.09 . 23 12 : 34 : 36.870 2 (SBRF- 12.16 ,M1)       BufferCopy[ 0 ] = 614.0
2016.09 . 23 12 : 34 : 36.870 2 (SBRF- 12.16 ,M1)       Buffer[rates_total- 1 ] = 17815.0
2016.09 . 23 12 : 34 : 36.870 2 (SBRF- 12.16 ,M1)       
2016.09 . 23 12 : 34 : 38.445 2 (SBRF- 12.16 ,M1)       # 1 OnDeinit
2016.09 . 23 12 : 34 : 38.445 2 (SBRF- 12.16 ,M1)       # 2 OnDeinit
2016.09 . 23 12 : 34 : 38.445 2 (SBRF- 12.16 ,M1)       # 3 OnDeinit
2016.09 . 23 12 : 34 : 38.445 2 (SBRF- 12.16 ,M1)       # 4 OnDeinit
파일:
2.mq5  3 kb
 
Karputov Vladimir :

전체 코드는 다음과 같습니다.

및 인쇄물:

그것은 나를 위해 작동하지 않습니다 - 심지어 OnDeinit에 도달하지도 않습니다.

그리고 내 로그에서 숫자가 일치하지만 당신은 일치하지 않습니다. 내 로그

PP       0        12 : 41 : 08.169     Test3 (RTS- 12.16 ,H1)     OnCalculate
FE       0        12 : 41 : 08.169     Test3 (RTS- 12.16 ,H1)    BufferCopy[ 0 ] = 13573.0
IQ       0        12 : 41 : 08.169     Test3 (RTS- 12.16 ,H1)    Buffer[rates_total- 1 ] = 13573.0
CF       0        12 : 41 : 08.169     Test3 (RTS- 12.16 ,H1)    
JO       0        12 : 41 : 08.169     Test3 (RTS- 12.16 ,H1)     OnCalculate
QI       0        12 : 41 : 08.169     Test3 (RTS- 12.16 ,H1)    BufferCopy[ 0 ] = 25434.0
NM       0        12 : 41 : 08.169     Test3 (RTS- 12.16 ,H1)    Buffer[rates_total- 1 ] = 25434.0
MJ       0        12 : 41 : 08.169     Test3 (RTS- 12.16 ,H1)    
DJ       0        12 : 41 : 08.187     Test3 (RTS- 12.16 ,H1)     OnCalculate
QO       0        12 : 41 : 08.187     Test3 (RTS- 12.16 ,H1)    BufferCopy[ 0 ] = 9469.0
HK       0        12 : 41 : 08.187     Test3 (RTS- 12.16 ,H1)    Buffer[rates_total- 1 ] = 9469.0
CM       0        12 : 41 : 08.187     Test3 (RTS- 12.16 ,H1)    
JF       0        12 : 41 : 08.187     Test3 (RTS- 12.16 ,H1)     OnCalculate
OS       0        12 : 41 : 08.187     Test3 (RTS- 12.16 ,H1)    BufferCopy[ 0 ] = 1887.0
NG       0        12 : 41 : 08.187     Test3 (RTS- 12.16 ,H1)    Buffer[rates_total- 1 ] = 1887.0
내 터미널에서 실행 중인 단일 표시기와 어드바이저가 없습니다.
 
fxsaber :

그것은 나를 위해 작동하지 않습니다 - 심지어 OnDeinit에 도달하지도 않습니다.

그리고 주목하세요. 내 기록에는 숫자가 같지만 당신의 기록에는 그렇지 않습니다. 내 로그

내 터미널에서 실행 중인 단일 표시기와 어드바이저가 없습니다.

이 구성이 있습니다.

 2016.09 . 23 12 : 25 : 34.874 Terminal        MetaTrader 5 x64 build 1430 started (MetaQuotes Software Corp.)
2016.09 . 23 12 : 25 : 34.876 Terminal        Windows 10 Pro (x64 based PC), IE 11.00 , UAC, Intel Core i3- 3120 M  @ 2.50 GHz, RAM: 2446 / 8077 Mb, HDD: 40118 / 233310 Mb, GMT+ 02 : 00
2016.09 . 23 12 : 25 : 34.876 Terminal        C:\Users\KVN\AppData\Roaming\MetaQuotes\Terminal\D0E8209F77C8CF37AD8BF550E51FF075

(터미널 재기동 후 "Log" 탭, 처음 세 줄)

 
Karputov Vladimir :

이 구성이 있습니다.

(터미널 재기동 후 "Log" 탭, 처음 세 줄)

 2016.09 . 23 12 : 42 : 22.405 Terminal        C:\Program Files\BCS Broker MetaTrader 5 Terminal
2016.09 . 23 12 : 42 : 22.405 Terminal        Windows 7 Ultimate (x64 based PC), IE 09.00 , Intel Core i7- 2700 K  @ 3.50 GHz, RAM: 8098 / 16301 Mb, HDD: 6387 / 30000 Mb, GMT+ 02 : 00
2016.09 . 23 12 : 42 : 22.405 Terminal        BCS Broker MetaTrader 5 Terminal x64 build 1430 started (BCS Broker)
 
fxsaber :

모호한. x32 시스템에서:

 2016.09 . 23 13 : 23 : 55.052 Terminal        C:\Users\barab\AppData\Roaming\MetaQuotes\Terminal\D0E8209F77C8CF37AD8BF550E51FF075
2016.09 . 23 13 : 23 : 55.052 Terminal        Windows 10 Home (X86 based PC), IE 11.00 , UAC, Intel Atom  Z3740 @ 1.33 GHz, RAM: 607 / 1931 Mb, HDD: 20500 / 49784 Mb, GMT+ 02 : 00
2016.09 . 23 13 : 23 : 55.049 Terminal        MetaTrader 5 build 1430 started (MetaQuotes Software Corp.)


작동하지 않습니다.

 
Andrey Barinov :
"떨어져" 있지만 호출하려고 하면 컴파일 오류가 발생 합니다.

그래서 그럴 필요가 없고, 앞으로 좀 더 편하게 살 수 있도록 많은 일을 하려고 해요.

나는 내 문제를 극복하여 부모에서 모든 것이 보호되고 상속은 보호 된 추가 재정의하에 있습니다.

 
Karputov Vladimir :

모호한. x32 시스템에서:


작동하지 않습니다.

너무 자주 하는 것이 지겹긴 해도 신청서를 작성했습니다.
 
fxsaber :

표시기의 차트에서 핸들을 찾는 방법은 무엇입니까? ChartIndicatorName을 통해 적합하지 않기 때문에 짧은 이름을 반환합니다. 그리고 동일한 이름으로 다른 입력 매개변수를 가진 동일한 표시기가 이미 실행 중일 수 있습니다.

지표가 차트와 계산에서 스스로를 제거할 수 있도록 하려면 이것이 필요합니다.

이미 이 문제를 다루셨을 수도 있지만 만일을 대비하여 명확히 하겠습니다. 표시기 핸들은 실제로 그것을 생성한 프로그램 내부의 표시기 설명에 대한 주소(예: Expert Advisor, 표시기, 스크립트)이며, 이것이 일종의 "숫자"라고 가정할 수 있습니다. 따라서 이 "숫자"는 표시기를 생성한 프로그램(해당 핸들을 수신함) 외부에서 의미가 없습니다. 그리고 ChartIndicatorGet() 함수 를 호출하는 프로그램조차도 일부 전역 표시기 핸들을 수신하지 않고 이 표시기에 대한 설명만 생성하고 주소 지정을 위해 이 설명의 "숫자"를 할당합니다. 전체 터미널 내에서 고유한 전역 표시기 핸들이 없습니다.

짧은 이름의 사용은 예제에서 볼 수 있습니다. 다음과 같이 가능합니다.

   string short_name= "unknown ma" ;
   switch (InpMAMethod)
     {
       case MODE_EMA :  short_name= "EMA" ;   break ;
       case MODE_LWMA : short_name= "LWMA" ; break ;
       case MODE_SMA :  short_name= "SMA" ;   break ;
       case MODE_SMMA : short_name= "SMMA" ; break ;
     }
   IndicatorSetString ( INDICATOR_SHORTNAME ,short_name+ "(" + string (InpMAPeriod)+ ")" );

" 다른 입력 매개변수가 있는 동일한 표시기가 이미 실행 중 "이라는 문제가 해결되었습니다 .

어떤 지표가 작동하는지 시각적으로 더 명확합니다.


 
Anton :

이미 이 문제를 다루셨을 수도 있지만 만일을 대비하여 명확히 하겠습니다. 표시기 핸들은 실제로 그것을 생성한 프로그램 내부의 표시기 설명에 대한 주소(예: Expert Advisor, 표시기, 스크립트)이며, 이것이 일종의 "숫자"라고 가정할 수 있습니다. 따라서 이 "숫자"는 표시기를 생성한 프로그램(해당 핸들을 수신함) 외부에서 의미가 없습니다. 그리고 ChartIndicatorGet() 함수 를 호출하는 프로그램조차도 일부 전역 표시기 핸들을 수신하지 않고 이 표시기에 대한 설명만 생성하고 주소 지정을 위해 이 설명의 "숫자"를 할당합니다. 전체 터미널 내에서 고유한 전역 표시기 핸들이 없습니다.

짧은 이름의 사용은 예제에서 볼 수 있습니다. 다음과 같이 가능합니다.

" 다른 입력 매개변수가 있는 동일한 표시기가 이미 실행 중 "이라는 문제가 해결되었습니다 .

어떤 지표가 작동하는지 시각적으로 더 명확합니다.

고마워, stringo는 이것을 얼마 전에 나에게 설명했다. 핸들이 "나"에 속하는지 확인하는 몇 가지 방법을 찾았습니다.

  1. 인디케이터 버퍼의 극한값을 변경하여 해당 CopyBuffer 값과 비교합니다. 일치하면 "나"입니다. 이 아이디어에서 제거 할 수없는 지표가 얻어졌습니다.
  2. ShortName을 변경하고 ChartIndicatorName과 비교합니다.