CGraphic 테스트 - 질문 및 제안 - 페이지 10

 

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

초보자의 질문 MQL5 MT5 MetaTrader 5

Aleksey Vyazmikin , 2019.02.17 06:56

다시 한번 실험을 반복하기로 결정했습니다. 코드는 다음과 같습니다.

       //--- отключим показ ценового графика
       ChartSetInteger ( 0 , CHART_SHOW , false );
       long chart= ChartID ();

      CGraphic graphic;
         Print ( "0 Тут ошибка " , GetLastError (), " " ,cLng::CodeDescription( GetLastError ()));
         ResetLastError ();
       if ( ObjectFind (chart,name)< 0 )
        {
         Print ( "1 Тут ошибка " , GetLastError (), " " ,cLng::CodeDescription( GetLastError ()));
         ResetLastError ();
         graphic.Create(chart,name, 0 , 0 , 0 ,pix_X,pix_Y); //Создает графический ресурс, привязанный к объекту чарта 
         Print ( "2 Тут ошибка " , GetLastError (), " " ,cLng::CodeDescription( GetLastError ()));
         ResetLastError ();
        }

여기 결과가 있습니다

 2019.02 . 17 08 : 55 : 19.845 Test_4G_CB (Si Splice,H1)       0 Тут ошибка 0 Операция выполнена успешно
2019.02 . 17 08 : 55 : 19.860 Test_4G_CB (Si Splice,H1)       1 Тут ошибка 4202 Графический объект не найден
2019.02 . 17 08 : 55 : 19.860 Test_4G_CB (Si Splice,H1)       2 Тут ошибка 4202 Графический объект не найден
오류의 원인에 대한 아이디어가 있습니까?
라이브러리에 버그가 있다고 들었습니다. 수정될까요?
 
Aleksey Vyazmikin :
라이브러리에 버그가 있다고 들었습니다. 수정될까요?

휴가중인 텔레파시. 그리고 평범한 사람들에게는 다음이 필요합니다.

  1. 문제를 재현하는 최소한의 코드(불필요한 모든 쓰레기를 버리는 코드).
  2. 명확한 설명 - 정확히 무엇이 잘못되었는지(무엇을 얻고자 했는지, 결국 무엇을 얻었는지, 왜 실수라고 생각하는지)
  3. 운영 체제 특성, 터미널 빌드, 거래 서버 이름

 
Aleksey Vyazmikin :
라이브러리에 버그가 있다고 들었습니다. 수정될까요?

어디에서 오류가 있다는 정보를 얻었습니까? 내가 말했듯이 - _LastError 변수에 쓸 수 있는 라이브러리를 잠시 살펴보십시오. 이 경우 코드가 오류와 함께 작동할 필요는 없습니다. 결국 개체에 대한 검색이 있을 수 있으며(없으면 오류 코드 가 변수에 입력됨) 개체가 생성됩니다. 이제 개체가 생성되지 않으면 예 - 오류가 발생하지만 생성되고 모든 것이 제대로 작동합니다. 그러나 확인 후 오류 코드(객체가 생성되기 전에 누락됨)가 변수에 기록되고 코드에서 이를 읽습니다.

 
Vladimir Karputov :

휴가중인 텔레파시. 그리고 일반 사람들에게는 다음이 필요합니다.

  1. 문제를 재현하는 최소한의 코드(불필요한 모든 쓰레기를 버리는 코드).
  2. 명확한 설명 - 정확히 무엇이 잘못되었는지(무엇을 얻고자 했는지, 결국 무엇을 얻었는지, 왜 실수라고 생각하는지)
  3. 운영 체제 특성, 터미널 빌드, 거래 서버 이름

1. 코드

 //+------------------------------------------------------------------+
//|                                              CB_Model_Analiz.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
#include <Graphics\Graphic.mqh>
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
  {
   string name= "Name" ;
   long chart= ChartID ();

   CGraphic graphic;
   Print ( "0 Тут ошибка " , GetLastError ());
   ResetLastError ();
   if ( ObjectFind (chart,name)< 0 )
     {
       Print ( "1 Тут ошибка " , GetLastError ());
       ResetLastError ();
      graphic.Create(chart,name, 0 , 0 , 0 , 100 , 100 ); //Создает графический ресурс, привязанный к объекту чарта 
       Print ( "2 Тут ошибка " , GetLastError ());
       ResetLastError ();
     }
   graphic.Destroy();
  }
//+------------------------------------------------------------------+

2. 로그에서 오류 메시지 를 수신할 것으로 예상되지 않음

 2019.02 . 17 10 : 37 : 46.326 CB_Model_Analiz (Si Splice,H1)   1 Тут ошибка 4202
2019.02 . 17 10 : 37 : 46.326 CB_Model_Analiz (Si Splice,H1)   2 Тут ошибка 4202

3. Windows 7 Home 32비트, 빌드 1940, 테스트 중 서버에 연결되지 않음 - 브로커 열기.

 
Artyom Trishkin :

어디에서 오류가 있다는 정보를 얻었습니까? 내가 말했듯이 - _LastError 변수에 쓸 수 있는 라이브러리를 잠시 살펴보십시오. 이 경우 코드가 오류와 함께 작동할 필요는 없습니다. 결국 개체에 대한 검색이 있을 수 있으며(없으면 오류 코드 가 변수에 입력됨) 개체가 생성됩니다. 이제 개체가 생성되지 않으면 예 - 오류가 발생하지만 생성되고 모든 것이 제대로 작동합니다. 그러나 확인 후 오류 코드(객체가 생성되기 전에 누락됨)가 변수에 기록되고 코드에서 이를 읽습니다.

라이브러리는 실제 오류가 발생했을 때 오류를 발생시키거나 상황을 올바르게 처리하고 오류가 없는 경우 오류를 발생시키지 않아야 합니다. 오류를 확인할 때 클래스에 라이브러리 사용에 대한 설명이 없으면 등록해야 합니다. 어쨌든 사용자가 제품 제조업체의 라이브러리를 편집하는 것은 불합리합니다.

 
Aleksey Vyazmikin :

라이브러리는 실제 오류가 발생했을 때 오류를 발생시키거나 상황을 올바르게 처리하고 오류가 없는 경우 오류를 발생시키지 않아야 합니다. 오류를 확인할 때 클래스에 라이브러리 사용에 대한 설명이 없으면 등록해야 합니다. 어쨌든 사용자가 제품 제조업체의 라이브러리를 편집하는 것은 불합리합니다.

오류가 없습니다. 다시 읽으십시오.

어디에서 오류가 있다는 정보를 얻었습니까? 내가 말했듯이 - _LastError 변수에 쓸 수 있는 라이브러리를 잠시 살펴보십시오. 이 경우 코드가 오류와 함께 작동할 필요는 없습니다. 결국 , 개체에 대한 검색이 있을 수 있습니다(그리고 개체 가 없으면 오류 코드 가 변수에 입력됨 ) 및 개체 생성 . 이제 개체가 생성되지 않으면 예, 이것은 오류이지만 생성되고 모든 것이 제대로 작동합니다. 그러나 확인 후 오류 코드(객체가 생성되기 전에 누락됨)가 변수에 기록되고 코드에서 이를 읽습니다.

따라서 코드를 정기적으로 실행한 후 오류를 읽는 이유를 찾는 것이 중요합니다. _LastError 변수에 있는 0이 아닌 코드의 내용이 오류가 CGraphic 코드뿐만 아니라 CGraphic 코드에도 있어야 함을 의미하지는 않는다는 것을 이해하지 못할 가능성이 큽니다. 이 경우 아마도 이것은 SB의 CGraphic 내부에서 수행된 객체의 존재에 대한 검색의 단순한 결과일 것입니다. 이름으로 개체에 대한 요청이 있었고 반환된 결과는 -1이었고 코드 4202는 _LastError에 맞았습니다. 그런 다음 개체가 생성되고 모든 것이 해결되었으며 호출 프로그램으로 반환되었습니다. 그리고 그 안에 즉시 오류 코드 를 읽고 얻을 수 있습니다. 그러나 오류는 없습니다. SB 내부에서 쿼리 결과를 볼 수 있습니다.

나는 당신이보고하는 것에 대한 가능한 이유를 제안하고 있습니다.

따라서 실제 버그를 찾고 보고하려면 디버거에서 전체 CGraphic 코드를 완전히 살펴보고 논리 및 작동 오류로 이어질 실제 버그를 잡아야 합니다. 오류 코드를 읽으십시오. 이는 분명히 존재한다는 것을 의미합니다.

 
Artyom Trishkin :

오류가 없습니다. 다시 읽으십시오.

따라서 코드를 정기적으로 실행한 후 오류를 읽는 이유를 찾는 것이 중요합니다. _LastError 변수에 있는 0이 아닌 코드의 내용이 오류가 CGraphic 코드뿐만 아니라 CGraphic 코드에도 있어야 함을 의미하지는 않는다는 것을 이해하지 못할 가능성이 큽니다. 이 경우 아마도 이것은 SB의 CGraphic 내부에서 수행된 객체의 존재에 대한 검색의 단순한 결과일 것입니다. 이름으로 개체에 대한 요청이 있었고 반환된 결과는 -1이었고 코드 4202는 _LastError에 맞았습니다. 그런 다음 개체가 생성되고 모든 것이 해결되었으며 호출 프로그램으로 반환되었습니다. 그리고 그 안에 즉시 오류 코드 를 읽고 얻을 수 있습니다. 그러나 오류는 없습니다. SB 내부에서 쿼리 결과를 볼 수 있습니다.

나는 당신이보고하는 것에 대한 가능한 이유를 제안하고 있습니다.

따라서 실제 버그를 찾고 보고하려면 디버거에서 전체 CGraphic 코드를 완전히 살펴보고 논리 및 작동 오류로 이어질 실제 버그를 잡아야 합니다. 오류 코드를 읽으십시오. 이는 분명히 존재한다는 것을 의미합니다.

코드에 오류가 있을 수 있음을 논리적 추론으로 직접 표시하고 오류를 재설정하지 않는 것으로 표현됩니다. 그것은 생성되기 전에 객체가 없었기 때문에 얻은 것입니다.

아니요, 저는 복잡한 코드에서 오류를 찾은 다음 원래 의도된 답변을 얻을 자격이 없습니다.

이 메시지가 사용자 오류인지 아닌지 알려주실 수 있습니까?

2019.02.17 11:08:42.901 Test_4G_CB (Si Splice,H1)       invalid pointer access in 'Test_4G_CB.mq5' (909,7)

이 코드를 가리킴 - D.PointsFill( false );

      CCurve *D=graphicT.CurveAdd(X_04,Y_04, ColorToARGB (DarkOrange, 256 ),CURVE_POINTS,Interval_04); //Создает и добавляет кривую на график
      D.PointsFill( false ); //Устанавливает флаг, указывающий, нужно ли выполнять заливку для точек, определяющих кривую при отрисовке точками. 
      D.PointsType(POINT_VERTICAL_DASH); //Устанавливает флаг, указывающий на тип точек, использующихся при отрисовке кривой точками.
 
Aleksey Vyazmikin :

코드에 오류가 있을 수 있음을 논리적 추론으로 직접 표시하고 오류를 재설정하지 않는 것으로 표현됩니다. 그것은 생성 전에 객체가 없었기 때문에 얻은 것입니다.

아니요, 저는 복잡한 코드에서 오류를 찾은 다음 원래 의도된 답변을 얻을 자격이 없습니다.

이 메시지가 사용자 오류인지 아닌지 알려주실 수 있습니까?

이 코드를 가리킴 - D.PointsFill( false );

나는 그 구절의 의미를 전혀 이해하지 못했다.

이미 모든 것을 자세히 설명한 것 같습니다.

모르겠어. 정보가 충분하지 않습니다.

 
Artyom Trishkin :

나는 그 구절의 의미를 전혀 이해하지 못했다.

이미 모든 것을 자세히 설명한 것 같습니다.

모르겠어. 정보가 충분하지 않습니다.

코드가 오류에 대한 반응을 기반으로 구축된 경우(오류가 발생한 경우 객체 생성), 오류를 수정한 후( 객체 생성 ) 이 오류를 재설정하는 것이 논리적이라는 것을 이해하지 못합니다. 당신의 논리적 추론에 따르면, 라이브러리에서 수행되지 않습니다.

그래서 이 오류에 대처하는 방법에 대한 정보가 없습니다 ...

 
Aleksey Vyazmikin :

코드가 오류에 대한 반응을 기반으로 구축된 경우(오류가 발생한 경우 객체 생성), 오류를 수정한 후( 객체 생성 ) 이 오류를 재설정하는 것이 논리적이라는 것을 이해하지 못합니다. 당신의 논리적 추론에 따르면, 라이브러리에서 수행되지 않습니다.

그래서 이 오류에 대처하는 방법에 대한 정보가 없습니다 ...

오류는 _LastError에 0이 아닌 코드가 있는 것이 아니라 이 함수의 잘못된 실행을 나타내는 함수에 의한 결과의 반환이라는 것을 분명히 이해해야 합니다. 그리고 _LastError에는 함수의 잘못된 실행으로 이어진 오류를 정확하게 표시하는 코드가 포함되어 있습니다. 따라서 함수의 반환 코드를 직접 사용하는 대신 서비스 변수에 저장된 오류 코드의 설명에 논리를 의존하는 것은 매우 의심스럽습니다. 함수가 -1, false 또는 0을 반환한 경우(각 함수에 대해 해당 오류 코드가 도움말에 설명되어 있음) 따라서 - _LastError의 코드가 아니라 함수에서 반환된 결과의 분석만 처리해야 합니다. , 오류를 나타내지 않지만 함수가 결과를 반환하는 이유를 나타내는 데 사용됩니다.

객체 조회 함수는 지정된 이름을 가진 객체가 없는 경우 0보다 작은 값을 반환합니다. 실수인가요? 아니요. 이것은 주어진 이름으로 객체를 생성하기로 결정한 것을 기반으로 하는 일반 함수 응답입니다. 이 경우 _LastError에 포함된 코드는 "요청한 이름을 가진 개체가 존재하지 않습니다"라고 직접 말합니다. 만들 수 있습니다.

일반적으로 나는 당신에게 설명하는 것에 지쳤습니다. 원하는 사람 - 그는 이해할 것입니다.