Test CGraphic - domande e suggerimenti - pagina 10

 

Forum sul trading, sistemi di trading automatico e test di strategia

FAQ da principianti MQL5 MT5 MetaTrader 5

Aleksey Vyazmikin, 2019.02.17 06:56

Ho deciso di ripetere l'esperimento di nuovo, ecco il codice

      //--- отключим показ ценового графика
      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();
        }

Ed ecco il risultato

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 Графический объект не найден
Qualche idea su cosa abbia causato l'errore?
Sono stato informato che l'errore è nella libreria - sarà risolto?
 
Aleksey Vyazmikin:
Sono stato informato che c'è un errore nella biblioteca - sarà corretto?

I telepati sono in vacanza. E per la gente comune abbiamo bisogno:

  1. codice minimo (da cui è stata eliminata tutta la spazzatura inutile) che riproduce il problema.
  2. una chiara descrizione di ciò che è sbagliato (cosa vuoi ottenere, cosa ottieni e perché pensi che sia un bug)
  3. specifiche del sistema operativo, build del terminale, nome del server commerciale

 
Aleksey Vyazmikin:
Sono stato informato che c'è un errore nella biblioteca - sarà corretto?

Dove vi è stato detto che c'era un errore? Te l'ho detto - cerca il punto della libreria in cui può essere scritto nella variabile _LastError. Non è detto che il codice con l'errore abbia funzionato. Perché potrebbe cercare un oggetto (e se è assente, il codice di errore sarà scritto nella variabile) e crearlo. Ma se l'oggetto non viene creato, è un errore, ma verrà creato e tutto si risolverà. Ma dopo il controllo, il codice di errore (l'oggetto era assente prima della creazione) sarà scritto in una variabile, che poi leggerete nel vostro codice.

 
Vladimir Karputov:

I telepati sono in vacanza. Quello che serve alla gente comune è:

  1. codice minimo (da cui è stata eliminata tutta la spazzatura inutile) che riproduce il problema.
  2. una chiara descrizione di ciò che è sbagliato (cosa volevi ottenere, cosa hai ottenuto alla fine e perché pensi che sia un errore)
  3. specifiche del sistema operativo, build del terminale, nome del server commerciale

1. Codice

//+------------------------------------------------------------------+
//|                                              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. Nessuna aspettativa di messaggi di errore nel log

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 bit, build 1940, non collegato al server durante i test - broker Discovery.

 
Artyom Trishkin:

Dove le è stato detto che c'è un errore? Te l'ho detto - cerca un frammento nella libreria dove può essere scritto nella variabile _LastError. Non è detto che il codice con l'errore abbia funzionato. Perché potrebbe cercare un oggetto (e se è assente, il codice di errore sarà scritto nella variabile) e crearlo. Ma se l'oggetto non viene creato, è un errore, ma verrà creato e tutto si risolverà. Ma dopo il controllo, il codice di errore (l'oggetto era assente prima della creazione) sarà scritto in una variabile, che poi leggerete nel vostro codice.

La libreria deve produrre un errore quando c'è un errore reale, o gestire correttamente la situazione e non produrre un errore quando non c'è. Se il mio uso della libreria non è descritto nella classe durante il controllo degli errori, dovreste specificarlo. In ogni caso, è irragionevole che l'utente possa modificare le librerie del produttore del prodotto.

 
Aleksey Vyazmikin:

La libreria deve produrre un errore quando c'è un errore reale, o gestire correttamente la situazione e non produrre un errore quando non c'è. Se il mio uso della libreria non è descritto nella classe durante il controllo degli errori, dovreste specificarlo. In ogni caso, è irragionevole che l'utente possa modificare le librerie del produttore del prodotto.

Non c'è nessun errore, rileggilo:

Dove le è stato detto che c'era un errore? Te l'ho detto - cerca un frammento nella libreria dove può essere scritto nella variabile _LastError. Non è detto che il codice con l'errore abbia funzionato. Perché potrebbe cercare un oggetto (e se è assente, il codice di errore sarà scritto nella variabile) e crearlo. Ma se l'oggetto non viene creato, è un errore, ma verrà creato e tutto si risolverà. Ma dopo aver controllato il codice di errore (l'oggetto era assente prima della creazione) sarà scritto in una variabile che poi leggerete nel vostro codice.

Quindi è solo vostro interesse sapere perché leggete l'errore dopo la normale esecuzione del codice. Quello che molto probabilmente non capite è che avere un codice diverso da zero nella variabile _LastError non significa necessariamente che c'è un errore nel codice di CGraphic e non solo in esso. In questo caso, potrebbe essere un semplice risultato della ricerca dell'esistenza di un oggetto, che è stato eseguito all'interno del CGraphic in SB. C'è stata una richiesta per un oggetto per nome, il risultato ha restituito -1 e il codice 4202 è stato scritto in _LastError. Poi l'oggetto è stato creato, tutto ha funzionato ed è stato restituito al programma chiamante. E lì si legge immediatamente il codice di errore e lo si ottiene. Ma non c'è nessun errore - si vede il risultato delle query all'interno del SB.

Sto solo suggerendo una possibile ragione per quello che state riportando.

Quindi, se volete davvero trovare un vero errore e segnalarlo, dovete passare attraverso l'intero codice CGraphic nel debugger e catturare il vero errore che causerà fallimenti logici e di prestazioni, piuttosto che affermare semplicemente che avete letto il codice di errore e quindi - è sicuramente lì.

 
Artyom Trishkin:

Non c'è nessun errore, rileggilo:

Quindi - è solo tuo interesse sapere perché stai leggendo l'errore dopo la normale esecuzione del codice. Probabilmente non capite che il contenuto della variabile _LastError, che non è zero, non significa necessariamente che c'è un errore nel codice CGraphic, e non solo in esso. In questo caso, potrebbe essere un semplice risultato della ricerca dell'esistenza di un oggetto, che è stato eseguito all'interno del CGraphic in SB. C'è stata una richiesta per un oggetto per nome, il risultato ha restituito -1 e il codice 4202 è stato scritto in _LastError. Poi l'oggetto è stato creato, tutto ha funzionato ed è stato restituito al programma chiamante. E lì si legge immediatamente il codice di errore e lo si ottiene. Ma non c'è nessun errore - si vede il risultato delle query all'interno del SB.

Sto solo suggerendo una possibile ragione per quello che stai riportando.

Quindi, se volete davvero trovare il vero errore e segnalarlo, allora dovete passare attraverso l'intero codice CGraphic nel debugger e catturare il vero errore che causerà il fallimento della logica e dell'operazione, piuttosto che affermare semplicemente che avete letto il codice di errore e quindi - è sicuramente lì.

Tu stesso hai detto nel tuo ragionamento logico che potrebbe esserci un errore nel codice, e si esprime nel non resettare l'errore. che è stato ricevuto per mancanza di un oggetto prima della sua creazione.

No, non ho la competenza per cercare un errore in un codice complesso e poi ottenere una risposta che è stato inteso in quel modo.

Potete dirmi se questo messaggio è un errore dell'utente o no?

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

Il codice che punta a questo è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:

Voi stessi avete indicato nel vostro ragionamento logico che ci può essere un errore nel codice, ed è espresso dal non resettare l'errore. che è stato ricevuto a causa dell'assenza dell'oggetto prima della sua creazione.

No, non ho la competenza per cercare un errore in un codice complesso e poi ottenere una risposta che è stato inteso in quel modo.

Potete dirmi se questo messaggio è un errore dell'utente o no?

Punta a questo codice -D.PointsFill(false);

Non capisco affatto il significato della frase.

Mi sembra di avervi già descritto tutto in dettaglio.

Non lo so. Non ci sono molte informazioni.

 
Artyom Trishkin:

Non capisco affatto il significato della frase.

Mi sembra che vi ho già spiegato tutto in dettaglio.

Non lo so. Non ci sono molte informazioni.

Non capisci che se il tuo codice è costruito per reagire a un errore (creiamo un oggetto in caso di errore), allora dopo aver corretto l'errore(creando un oggetto) è logico resettare questo errore, cosa che secondo il tuo ragionamento logico non viene fatta nella libreria.

Anche qui non ho informazioni su come reagire a questo errore...

 
Aleksey Vyazmikin:

Non capisci che se il codice è costruito sulla risposta all'errore (in caso di errore si crea un oggetto), allora dopo la correzione dell'errore(creazione dell'oggetto), è logico resettare questo errore, cosa che secondo il tuo ragionamento logico non viene fatta nella libreria.

Qui non ho informazioni su come reagire a questo errore...

Dovete sapere bene che non è il codice in _LastError che non è uguale a zero ad essere un errore, ma il risultato restituito dalla funzione che indica un'esecuzione errata di questa funzione. E _LastError contiene codice che punta esattamente a quell'errore che fa eseguire la funzione per errore. Quindi è dubbio che si possa usare la descrizione del codice di errore memorizzato nella variabile di servizio invece di usare direttamente il codice di ritorno della funzione. Se la funzione ha restituito -1 o falso o 0 (per ogni funzione il suo codice di errore è descritto nell'aiuto), bene - solo l'analisi del risultato restituito dalla funzione dovrebbe essere gestita da voi, non il codice in _LastError, che non indica l'errore, ma è usato per indicare la causa del ritorno di qualche risultato restituito dalla funzione.

La funzione di ricerca degli oggetti restituisce un valore inferiore a zero nel caso in cui un oggetto con il nome dato non esista. È un errore? No. Questa è una risposta regolare della funzione, in base alla quale si prende una decisione sulla creazione di un oggetto con il nome dato. Il codice contenuto in _LastError dice esplicitamente che "Un oggetto con il nome richiesto non esiste" - potete crearlo.

Beh, sono stanco di spiegartelo. Chi vuole, capirà.