ChartNavigate durante l'inizializzazione - pagina 6

 
Alexey Viktorov:

Ho in questo post:https://www.mql5.com/ru/forum/260815/page4#comment_7890492 dettagliato le condizioni in cui il problema può essere riprodotto. Questo è stato in grado di riprodurre in base alle vostre dichiarazioni. Quello che ho scritto qui

Cioè, una leggera modifica delle condizioni portava a una riproduzione costante del problema.

In qualche modo non hai notato questo

 
Alexey Viktorov:

P./S.: Stampare invece di Comment nel tuo codice non solo sarebbe una procedura più gentile. I risultati della stampa in OnInit() sono più facili da confrontare, copiare e allegare qui

 
Alexey Viktorov:

Ho suggerito l'aggiornamento non nella speranza che tutto vada a posto, ma che le costruzioni siano le stesse.

Igor, stai facendo esperimenti sulla versione completa dell'indicatore o su quella sperimentale?

Sia lì che lì. Ma non posso ancora dire con certezza qual è il problema: se è un bug o no. Ho bisogno di trovare condizioni sufficientemente riproducibili.

 
Alexey Viktorov:

Come fare?

Secondo la descrizione nel primo post del thread, è un indicatore, si blocca su un grafico aperto - significa che la storia è già caricata. Giusto? Appendere l'indicatore, chiudere il terminale, avviare il terminale, --- dove può andare la storia? Se c'era già...

In secondo luogo, ho aperto il simbolo EURMXN. Senza guardare nel terminale, puoi dire cos'è? )))

È facile:

  1. Un template con l'indicatore è salvato come default.tpl.
  2. Si apre il simbolo del grafico, che non è mai stato aperto prima.
Di conseguenza, si avvia prima l'indicatore e poi si caricano i dati. Ho l'intero gruppo di eventi in un unico pacchetto.

 
Ihor Herasko:

Sia lì che lì. Ma non posso ancora dire con certezza se si tratta di un bug o meno. Dobbiamo trovare condizioni sufficientemente riproducibili.

La sua formulazione è un po' infelice. Quello che ho citato è di condizioni riproducibili.

Un'altra cosa è che sì, probabilmente quello che ho descritto nei blocchi I e II non è un bug, ma peculiarità del caricamento dei dati quando il terminale viene riavviato .

E nel 1870th build c'erano differenze di riproduzione rispetto a quello che ho ottenuto nel 1861th.

Le combinazioni di messaggi (successo ed errore 4111) sono cambiate un po'. Per esempio, se prima c'era una tale riproduzione stabile:

test 2018 06 26 (GBPUSD,M5)     Alert: Успешно
test 2018 06 26 (GBPUSD,H1)     Alert: Ошибка №4111

Ora, con lo stesso codice, i messaggi di errore sembrano essere più pronunciati:

test 2018 06 26 (EURNZD,M5)     Alert: Ошибка №4111
test 2018 06 26 (EURNZD,H1)     Alert: Ошибка №4111

test 2018 06 26 (EURNZD,M5)     Alert: Ошибка №4111
test 2018 06 26 (EURNZD,H1)     Alert: Ошибка №4111

test 2018 06 26 (EURNZD,M5)     Alert: Ошибка №4111
test 2018 06 26 (EURNZD,H1)     Alert: Ошибка №4111

test 2018 06 26 (EURNZD,M5)     Alert: Успешно
test 2018 06 26 (EURNZD,H1)     Alert: Ошибка №4111


E il blocco IIIdi quel mio post non è più riproducibile nel 1870.

Né poteva riprodurre negli anni 1870 ciò che è descritto qui:https://www.mql5.com/ru/forum/260815/page5#comment_7901728 Last - forse dipende in qualche modo dal sistema operativo (come ipotesi). Cioè, questo codice di Vladimir funziona bene per me, senza problemi

 
Ihor Herasko:

Mi sono imbattuto in un problema con la funzione ChartNavigate. Faccio qualcosa di sbagliato o c'è davvero un problema con la funzione. Scrivete se l'avete usato abbastanza spesso.

Quindi, il nocciolo del problema: ChartNavigate non sposta il grafico Quando si avvia il terminale Se chiamate questa funzione in OnInit(). Soprattutto diverse volte ho letto la documentazione. Non c'è scritto da nessuna parte che la funzione non può essere chiamata all'inizializzazione.

Codice indicatore per la riproduzione:

Passi per giocare:

  1. Disattiva l'autoplay del grafico.
  2. Attacca l'indicatore al grafico. ChartNavigate si attiva spostando il grafico nella posizione desiderata.
  3. Scaricare il terminale.
  4. Caricare il terminale. ChartNavigate non funzionerà visualizzando il grafico senza un offset.
OK, se la funzione desse un errore. Ma non è così. Tutte le chiamate hanno successo, ma è quando il terminale viene ricaricato che il grafico non viene spostato.

Prova le tre varianti dell'indicatore e vedi il risultato di ciascuna

1. ChartNavigate alla fine degli altri comandi grafici

//+------------------------------------------------------------------+
//|                              TryToSetChartSettings_Indicator.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"
#property indicator_chart_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {


//--- отключим автопрокрутку
   ChartSetInteger(0,CHART_AUTOSCROLL,false);
//--- установим отступ правого края графика
   ChartSetInteger(0,CHART_SHIFT,true);
//--- отобразим в виде свечей
   ChartSetInteger(0,CHART_MODE,CHART_CANDLES);
//--- установить режим отображения тиковых объемов
   ChartSetInteger(0,CHART_SHOW_VOLUMES,CHART_VOLUME_TICK); 
//--- Прокрутим от правого края графика на 1000 баров влево
   ChartNavigate(0,CHART_END,-1000);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
//---

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

2. ChartNavigate one - nessun altro comando al grafico

//+------------------------------------------------------------------+
//|                              TryToSetChartSettings_Indicator.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"
#property indicator_chart_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
/*
//--- отключим автопрокрутку
   ChartSetInteger(0,CHART_AUTOSCROLL,false);
//--- установим отступ правого края графика
   ChartSetInteger(0,CHART_SHIFT,true);
//--- отобразим в виде свечей
   ChartSetInteger(0,CHART_MODE,CHART_CANDLES);
//--- установить режим отображения тиковых объемов
   ChartSetInteger(0,CHART_SHOW_VOLUMES,CHART_VOLUME_TICK); 
*/
//--- Прокрутим от правого края графика на 1000 баров влево
   ChartNavigate(0,CHART_END,-1000);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
//---

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+


3. ChartNavigate prima di altri comandi del grafico

//+------------------------------------------------------------------+
//|                              TryToSetChartSettings_Indicator.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"
#property indicator_chart_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {

//--- Прокрутим от правого края графика на 1000 баров влево
   ChartNavigate(0,CHART_END,-1000);
//--- отключим автопрокрутку
   ChartSetInteger(0,CHART_AUTOSCROLL,false);
//--- установим отступ правого края графика
   ChartSetInteger(0,CHART_SHIFT,true);
//--- отобразим в виде свечей
   ChartSetInteger(0,CHART_MODE,CHART_CANDLES);
//--- установить режим отображения тиковых объемов
   ChartSetInteger(0,CHART_SHOW_VOLUMES,CHART_VOLUME_TICK); 

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
//---

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Rashid Umarov:

E provare tre varianti dell'indicatore, vedere il risultato di ciascuna

1. ChartNavigate alla fine degli altri comandi del grafico

  1. Allegato al grafico M1 con l'autoscorrimento abilitato. L'autoscorrimento è disattivato, il grafico si è spostato di 1000 barre a sinistra.
  2. Ricaricato il terminale senza scollegare l'indicatore dal grafico. Il grafico mostra la candela attuale, senza spostamento di 1000 barre a sinistra. L'autoscorrimento rimane non disponibile.
  3. Ho ripetuto il passo 2 7 volte di seguito. 3 volte su di loro la transizione a sinistra di 1000 candele è completa, 4 volte - la transizione non è completa.
Quando non ho perfezionato il comando "Waiting for refresh" appare. Quindi, si può concludere che il terminale fa scorrere forzatamente il grafico alle ultime quotazioni quando carica la storia. E poiché avviene dopo OnInit(), otteniamo un risultato inaspettato.

2. ChartNavigate da solo - nessun altro comando al grafico

  1. Dato che l'auto-scrolling non è automaticamente disattivato in questa versione, l'ho disattivato manualmente e ho collegato l'indicatore. Il grafico si è spostato di 1000 barre a sinistra.
  2. Riavvia il terminale senza scollegare l'indicatore dal grafico.
  3. In 2 casi su 7 è stato eseguito lo scorrimento. E in uno di essi è successo in tre fasi: visualizzazione della storia attesa, visualizzazione della candela corrente e visualizzazione della storia attesa. Sembra che OnInit() sia stato eseguito due volte: una volta prima che la storia sia stata caricata e la seconda volta - dopo.

3. ChartNavigate prima di altri comandi del grafico.

  1. Ho abilitato lo scorrimento automatico e ho allegato l'indicatore. Il grafico ha sobbalzato ed è tornato alla candela corrente. Come previsto, l'autoscorrimento è disattivato dopo il comando di spostamento di 1000 barre.
  2. Riavvio del terminale senza scollegare l'indicatore dal grafico (il grafico visualizza la candela corrente).
  3. In tutti e 7 i casi il grafico ha visualizzato la candela corrente, lo scorrimento non ha nemmeno lampeggiato.
Se riavviamo il terminale senza indicatori sul grafico con lo scorrimento automatico disattivato e la visualizzazione da qualche parte nelle profondità della storia, allora ad ogni riavvio otteniamo la visualizzazione del luogo in cui il terminale è stato spento. Si scopre che da qualche parte durante l'esecuzione dei comandi di navigazione c'è uno spostamento alla candela corrente.
 
Ihor Herasko:

  1. Allegato al grafico M1 con autoscorrimento attivato. Lo scorrimento automatico è stato disattivato, il grafico si è spostato di 1000 barre a sinistra.
  2. Ricaricato il terminale senza scollegare l'indicatore dal grafico. Il grafico mostra la candela attuale, senza spostamento di 1000 barre a sinistra. L'autoscorrimento rimane non disponibile.
  3. Ho ripetuto il passo 2 7 volte di seguito. 3 volte su di loro la transizione a sinistra di 1000 candele è completa, 4 volte - la transizione non è completa.
Quando non ho perfezionato il comando "Waiting for refresh" appare. Quindi, si può concludere che il terminale fa scorrere forzatamente il grafico alle ultime quotazioni quando carica la storia. E poiché avviene dopo OnInit(), otteniamo un risultato inaspettato.

Dimentico sempre che il tuo messaggio/suggerimento viene letto al contrario. È come in una vecchia barzelletta:

1917, ottobre. Una signora, la nipote di
il Decembrista, è seduta nella sua casa sulla Nevsky. Sentendo un rumore in strada, chiede al suo custode di scoprire cosa
sta succedendo.
- Signorina, la rivoluzione è lì! - Il custode ritorna.
-Oh, che meraviglia! - Mio nonno sognava una rivoluzione!
Vai a scoprire cosa vogliono i rivoluzionari, mio caro amico!
- Non vogliono uomini ricchi, signora", dice il custode al suo ritorno.
- Strano", dice la signora pensierosa, "ma mio nonno voleva che non ci fossero poveri!

Pensavo che avresti cambiato le proprietà dell'orario prima di riavviare il terminale.
 
Rashid Umarov:

Dimentico sempre che il tuo messaggio/suggerimento sarà letto al contrario.

Cosa vuoi dire? Hai scritto che devi testare il funzionamento dei tre indicatori. Dato che l'argomento riguarda il ricaricare il terminale e poi usare ChartNavigate, queste sono le prove che sono state fatte.

Pensavo che avresti cambiato le proprietà del grafico prima di riavviare il terminale.

Perché, se il problema è che ChartNavigate non funziona sempre all'avvio del terminale? Questo è esattamente il punto.

 
Ihor Herasko:

il problema è esattamente che ChartNavigate non si attiva sempre all'avvio del terminale? Questo è il punto.

E anche quando cambio il mio profilo. Inoltre, se ChartNavigate( chart_id, CHART_BEGIN, shift ) ottiene per esempio CHART_FIRST_VISIBLE_BAR, allora il risultato sarà come se ChartNavigate avesse funzionato. Se l'Expert Advisor viene rimosso, allora la prossima volta che si avvia l'Expert Advisor (questo o un altro), il risultato di ottenere CHART_FIRST_VISIBLE_BAR in questo grafico sarà come CHARTNavigate failed.

Il risultato: operazione ChartNavigate estremamente incoerente già in combinazione con CHART_FIRST_VISIBLE_BAR