ChartNavigate durante l'inizializzazione - pagina 2

 
Ihor Herasko:

E se non ci sono zecche, fine settimana? Poi si dovrà collegare un timer.

E c'è solo una domanda da risolvere: come determinare se ChartNavigate è stato eseguito con successo? Il fatto che restituisca true, è solo "per i tic", non aiuta nel lavoro reale.

Ho bisogno di controllare il codice che ho esposto sopra nel mio Expert Advisor...

 
Vladimir Karputov:

Devo controllare il codice che ho postato sopra nell'EA...

Cosa c'entra l'EA?

 
Ihor Herasko:

Che cosa ha a che fare questo con l'assessore?

Dovremmo controllare...

//+------------------------------------------------------------------+
//|                                                  Test EA.mq5.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//--- input parameters
input bool redraw=true;
input ENUM_CHART_POSITION position=CHART_BEGIN;
//---
long count=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   count=0;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   count++;
//Comment(count);
   if(count==9 || count==19)
     {
      ResetLastError();
      if(position==CHART_BEGIN)
        {
         if(ChartNavigate(ChartID(),CHART_BEGIN,100))
            Print("Успешно. redraw ",redraw,". position ",EnumToString(position));
         else
            Print("Ошибка №",GetLastError(),". redraw ",redraw,". position ",EnumToString(position));
        }
      if(position==CHART_END)
        {
         if(ChartNavigate(ChartID(),CHART_END,-100))
            Print("Успешно. redraw ",redraw,". position ",EnumToString(position));
         else
            Print("Ошибка №",GetLastError(),". redraw ",redraw,". position ",EnumToString(position));
        }
      if(redraw)
         ChartRedraw();
     }
//--- получим номер самого первого видимого на графике бара (нумерация как в таймсерии) 
   long first_bar=ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR,0);
//--- добавим символ переноса строки 
   string comm="\r\n";
//--- дополним коментарий 
   comm=comm+"Первый бар на графике имеет номер "+IntegerToString(first_bar)+"\r\n";
//--- выведем комментарий 
   Comment(comm);
  }
//+------------------------------------------------------------------+
File:
Test_EA.mq5  6 kb
 

Vladimir Karputov:

Questo è l'indicatore - in particolare ho messo un ritardo di nove tick, due tipi di movimento grafico e un flag di ridisegno forzato (on/off)

Non sei un principiante. Perché sei fuorviante? Perché ignorate quello che ha detto Renat Fatkhullin?

Nel tuo codice (come qui, quindi qui) è costretto a ridisegnare il grafico su ogni tick creando commenti su ogni tick.


Cioè, indipendentemente dal fatto che il flag nei parametri di ingresso sia abilitato o disabilitato.


E l'inclusione della tua bandiera nei parametri di input, in questo caso, causa solo un ulteriore ridisegno tramiteChartRedraw().

Cioè, invece di essere utile, crea un carico supplementare su quelli già esistenti creando commenti

P./S.:

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

Errori, bug, domande

Renat Fatkhullin, 2017.12.05 02:51

...

In MT5, la funzione Comment causa esplicitamente il ridisegno del grafico...

La differenza è proprio questa.


Se in MT4 dopo aver chiamato Comment si mette ChartRedraw() forzatamente, il comportamento non è ancora lo stesso che in MT5. ChartRedraw() in Metatrader 4 ignora il valore del commento e decide da solo se aggiornare o meno il grafico dall'ultimo frame. Naturalmente, in assenza di centinaia di quotazioni al secondo che causerebbero una disabilitazione dei dati del grafico, ChartRedraw decide "perché disegnare un grafico invariato" e salta il disegno del frame.

Anche Metatrader 5 ha lo stesso sistema, ma ci sono molti più casi in cui viene data priorità all'estrazione incondizionata.

I terminali sono applicazioni grafiche e possono fornire centinaia di fotogrammi al secondo e funzionare in modalità di visualizzazione magra per il bene delle prestazioni.


Da qui ulteriori conclusioni quando si eseguono i benchmark:

  • non si dovrebbe considerare una chiamata ChartRedraw come un vero e proprio disegno del grafico

  • dovete sempre conoscere e provare le affermazioni "perché un grafico sarà ridisegnato" e "sto invalidando il quadro interno del mercato in modo che il terminale decida di ridisegnare il grafico".

  • non si dovrebbero fare conclusioni multiple in MT5 durante i benchmark, si dovrebbe sempre pensare a come si sta influenzando il rendering

  • MT5 ha un sistema più corretto di cambiare gli oggetti sul grafico ed è necessario capire chiaramente le conseguenze dei comandi di lettura/scrittura.
    si raccomanda di non mischiare i comandi di lettura/scrittura e di fare la lettura di massa e la scrittura di massa separatamente.

  • Il frequente ridisegno dei grafici nei benchmark porta a una forte dipendenza dei risultati dalla scheda grafica.
    infatti, alcuni test possono finire per testare la scheda grafica piuttosto che gli algoritmi o le funzioni. il test su un computer portatile e un computer desktop può mostrare più volte risultati diversi semplicemente a causa di una scheda grafica 3-5 volte più lenta

Questi errori sono fatti continuamente da tutti.


 

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

ChartNavigate durante l'inizializzazione

Vladimir Karputov, 2018.06.25 18:52

Devo controllare...

...
void OnTick()
  {
//---
   count++;
//Comment(count);
   if(count==9 || count==19)
     {
      ResetLastError();
      if(position==CHART_BEGIN)
        {
         if(ChartNavigate(ChartID(),CHART_BEGIN,100))
            Print("Успешно. redraw ",redraw,". position ",EnumToString(position));
         else
            Print("Ошибка №",GetLastError(),". redraw ",redraw,". position ",EnumToString(position));
        }
      if(position==CHART_END)
        {
         if(ChartNavigate(ChartID(),CHART_END,-100))
            Print("Успешно. redraw ",redraw,". position ",EnumToString(position));
         else
            Print("Ошибка №",GetLastError(),". redraw ",redraw,". position ",EnumToString(position));
        }
      if(redraw)
         ChartRedraw();
     }
//--- получим номер самого первого видимого на графике бара (нумерация как в таймсерии) 
   long first_bar=ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR,0);
//--- добавим символ переноса строки 
   string comm="\r\n";
//--- дополним коментарий 
   comm=comm+"Первый бар на графике имеет номер "+IntegerToString(first_bar)+"\r\n";
//--- выведем комментарий 
   Comment(comm);
  }
//+------------------------------------------------------------------+

P./S.: Oltre al tuo secondo codice: prima di aggiornare l'inserimento del testo e la pubblicazione tramite lo stesso commento, controlla se i dati sono cambiati. In caso contrario, è meglio rimandare l'aggiornamento del testo e la pubblicazione.

Cioè, in questo caso è se il numero della prima barra sul grafico è cambiato

 
Vladimir Karputov:

Dovrò controllare...

Mmm. Non so bene di cosa si tratti. Ok, allora. L'ho installato. L'ho controllato nelle modalità CHART_BEGIN e CHART_END e funziona come pubblicizzato. Dopo il riavvio, è tutto a posto.

O sei arrivato al punto in cui hai bisogno di usare una stampella - controlla il numero della prima barra sul grafico dopo ChartNavigate e, se non è quello giusto, esegui ChartNavigate di nuovo.

Sì, l'uscita, certo, ci ho pensato anch'io. Ma è stancante ricordarsi costantemente di queste schede del terminale. Dopo tutto, è abbastanza possibile che sia un bug.

 
Dina Paches:

P./S.: Oltre al tuo secondo codice: prima di aggiornare una voce di testo e la pubblicazione tramite lo stesso commento, controlla se i dati sono cambiati. In caso contrario, è meglio rimandare l'aggiornamento del testo e la pubblicazione.

Cioè, in questo caso è se il numero della prima barra del grafico è cambiato

Grazie per le informazioni, naturalmente, ma qui non stiamo parlando di prestazioni. Il problema che stiamo discutendo è su un piano leggermente diverso, sono solo codici di prova per verificare se il problema si è manifestato ))

 
Ihor Herasko:

Grazie, naturalmente, per le informazioni, ma qui non stiamo parlando di prestazioni. Il problema che stiamo discutendo è su un piano leggermente diverso, sono solo codici di prova per verificare se il problema appare ))

Non c'è di che. Ma vedi anche l'altro mio post di cui quello che hai citato è un poscritto.

P./S.: Non svalutare, per favore. Non eseguirò tali codici sul mio, sapendo cosa comporta. La mia attrezzatura non è di proprietà del governo

 
Ihor Herasko:

Mmm. Non so bene di cosa si tratti. Ok, allora. Installato. Controllato in modalità CHART_BEGIN e CHART_END. Tutto funziona come pubblicizzato. Dopo il riavvio, è tutto a posto.

O sei arrivato al punto in cui hai bisogno di usare una stampella - controlla il numero della prima barra sul grafico dopo ChartNavigate e, se non è quello giusto, esegui ChartNavigate di nuovo.

Sì, l'uscita, certo, ci ho pensato anch'io. Ma è stancante ricordarsi costantemente di queste schede del terminale. Dopo tutto, è abbastanza possibile che sia un bug.

Una volta avevo una navigazione funzionante. Ora devo controllare di proposito.


Aggiunto: non prestare attenzione al commento :)

 
Vladimir Karputov:

La mia navigazione funzionava. Ora devo controllare di proposito.


Aggiunto: Ignora il commento :)

Perché? Ho scritto/segnalato delle sciocchezze?