Errori, bug, domande - pagina 2099

 
Vladimir Pastushak:
Ragazzi, sono stufo di inserire il mio nome utente e password da www.mql5.com in android in mt5.
Perché continuano a perdere il loro nome utente e la loro password?

Anche a me viene chiesto regolarmente, ma non inserisco il mio nome utente/password, mi limito a premere il pulsante Back e risulta essere loggato.

 
Nikolai Semko:

Perché una funzione molto utile come ChartXYToTimePrice() è così costosa in tempo di esecuzione?

Ho scritto una funzione analoga a XYToTimePrice() e funziona molto più velocemente. Fino a diverse centinaia di volte più veloce.

Ma c'è anche ChartID_in con SubWindow_out nella funzione originale. Fare un analogico completo.

 
fxsaber:

Quindi c'è anche ChartID_in con SubWindow_out nell'originale. Fare un analogico completo.


Aggiungere ChartID_in e SubWindow_out non è affatto difficile. Ma non sto puntando a creare un analogo completo, ho solo creato questa funzione per mostrare la lentezza di ChartXYToTimePrice().

void XYToTimePrice(long chart_id,int x,int y,int& sub_window,datetime &time,double &price,int id)
  {
   static int left_bar; // номер самого левого бара на экране
   static int WidBar;
   static int Wid;
   static int Hei;
   static double y_min;
   static double y_max;
   static int PerSec=PeriodSeconds();
   static bool ChartChange=true;
   if(id==CHARTEVENT_CHART_CHANGE) { ChartChange=true; return; } 
   if(ChartChange) // если было изменение чатра после последнего вычисления
     {
      left_bar=(int)ChartGetInteger(chart_id,CHART_FIRST_VISIBLE_BAR, sub_window);        // номер самого левого бара на экране
      Wid=(int)ChartGetInteger(chart_id,CHART_WIDTH_IN_PIXELS, sub_window);               // ширина экрана в пикселях
      WidBar=(int)ChartGetInteger(chart_id,CHART_WIDTH_IN_BARS, sub_window);              // ширина экрана в барах
      Hei=(int)ChartGetInteger(chart_id,CHART_HEIGHT_IN_PIXELS, sub_window);              // высота экрана в пикселях
      y_min=ChartGetDouble(chart_id,CHART_PRICE_MIN, sub_window);                         // макс. цена на экране
      y_max=ChartGetDouble(chart_id,CHART_PRICE_MAX, sub_window);                         // мин. цена на экране
     }
   if(x>Wid || x<0 || y<0 || y>Hei) return;  // выходим если точка (x,y) за пределами экрана
   price=y_min+(Hei-y)*(y_max-y_min)/Hei;
   int NrBar=left_bar-(int)((double)x/((double)Wid/(double)WidBar)); 
   datetime T[1];
   if(NrBar>=0) CopyTime(NULL,0,NrBar,1,T);
   else { CopyTime(NULL,0,0,1,T); T[0]+=fabs(NrBar)*PerSec;}
   ChartChange=false;
   time=T[0];
  }

Ma è vero, la mia funzione ha bisogno di un ulteriore parametro id evento. Finora, questa funzione funziona più o meno allo stesso modo con lo spessore della candela originale di un pixel, ma è possibile migliorarla, se necessario.

 
Nikolai Semko:

Aggiungere ChartID_in e SubWindow_out non è affatto difficile. Ma non sto puntando a creare un analogo completo, ho solo creato questa funzione per mostrare la lentezza di ChartXYToTimePrice().

Ma è vero, la mia funzione ha bisogno di un ulteriore parametro id evento. E mentre questa funzione funziona più o meno lo stesso con lo spessore della candela originale di un pixel, ma è possibile migliorarla, se necessario.


E ho anche notato una strana caratteristica di ChartXYToTimePrice. Il suo tempo di esecuzione è direttamente proporzionale al numero di barre sul grafico.

Questo indica un algoritmo "strano" per il suo calcolo. Cioè, è una sommatoria ciclica che è piuttosto strana per la soluzione ottimale di un tale problema.

La velocità della funzione XYToTimePrice è la stessa indipendentemente dal numero di barre.

E per essere onesti, la velocità delle funzioni ChartGetInteger e ChartGetDouble è anche chiaramente sopravvalutata e ha caratteristiche molto strane. Per esempio, la funzione

ChartGetDouble(0,CHART_PRICE_MAX);

è 20-100 volte più veloce della funzione

ChartGetDouble(0,CHART_PRICE_MIN);          

se MAX è dopo MIN:

ma se li scambiate, la situazione si inverte.


Cioè sembra logico - la stessa funzione, che viene calcolata ripetutamente, usa dati già calcolati e memorizzati da una chiamata di funzione precedente. Ma mostra solo alcuni calcoli folli e la creazione di un sacco di dati intermedi e forse anche di array per calcolare un semplice valore doppio del prezzo massimo (o minimo) del grafico, che probabilmente si trova già in qualche variabile e deve solo essere preso.

Anche se non escludo che questo effetto si verifichi a causa di alcune peculiarità del profiling e sia di natura fasulla. Ma la lentezza di queste funzioni non è falsa.

 
Nikolai Semko:

può essere raffinato, se necessario.

Probabilmente è ancora valido dire che è corretto confrontare le caratteristiche di velocità delle due funzioni quando i loro risultati coincidono. Per favore, completatelo.

 
Vladimir Pastushak:
Ragazzi, sono stanco di inserire il mio nome utente e la mia password da www.mql5.com su Android in mt5.
Perché perdono costantemente il loro nome utente e la loro password?

Scrivete a servicedesk. Si prega di allegare i registri. Grazie.

 

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

Bug, bug, domande

fxsaber, 2017.10.04 09:13

È stato scritto molte volte su questo. Non corretto per qualche motivo.

Sembra che l'abbiano già sistemato. Non ho più questo problema nella build 1730.
 
Nikolai Semko:

Ho anche notato una strana caratteristica di ChartXYToTimePrice. Il suo tempo di esecuzione è direttamente proporzionale al numero di barre sul grafico.

Questo mostra la "stranezza" del suo algoritmo di calcolo. Cioè, è una sommatoria ciclica che è piuttosto strana per la soluzione ottimale di un tale problema.

La velocità della funzione XYToTimePrice è la stessa indipendentemente dal numero di barre.

E per essere onesti, la velocità delle funzioni ChartGetInteger e ChartGetDouble è anche chiaramente sopravvalutata e ha caratteristiche molto strane. Per esempio, la funzione

è 20-100 volte più veloce della funzione

se MAX è dopo MIN:

ma se li scambiate, la situazione si inverte.


Cioè sembra logico - la stessa funzione, che viene calcolata ripetutamente, usa dati già calcolati e memorizzati da una chiamata di funzione precedente. Ma mostra solo alcuni calcoli folli e la creazione di un sacco di dati intermedi e forse anche di array per calcolare un semplice valore doppio del prezzo massimo (o minimo) del grafico, che probabilmente si trova già in qualche variabile e deve solo essere preso.

Anche se non escludo che questo effetto si verifichi a causa di alcune peculiarità del profiling e sia di natura fasulla. Ma la lentezza di queste funzioni non è falsa.

La lentezza delle funzioni di richiesta di dati grafici risiede nel modo in cui l'informazione viene inviata e ricevuta, non nell'implementazione stessa. L'implementazione di queste funzioni è primitiva e non dipende dal numero di barre sul grafico.

Ma poiché il grafico è un oggetto le cui informazioni sono distribuite tra molte fonti, l'intero controllo è basato su code di messaggi. Finché la richiesta precedente non viene elaborata, la successiva attende.

Ma se avete diverse richieste per lo stesso grafico in una riga, allora queste richieste successive vengono eseguite molto rapidamente. Questo perché nessuno ha avuto il tempo di tagliare tra loro e la prima richiesta.

 
Slava:

Il collo di bottiglia delle funzioni di richiesta di dati grafici sta nel modo in cui l'informazione viene inviata e ricevuta, non nell'implementazione stessa. L'implementazione di queste funzioni è primitiva e non dipende dal numero di barre sul grafico.

Ma poiché il grafico è un oggetto le cui informazioni sono distribuite tra molte fonti, l'intero controllo è basato su code di messaggi. Finché la richiesta precedente non viene elaborata, la successiva è in attesa.

Ma se avete diverse richieste per lo stesso grafico in una riga, allora queste richieste successive vengono eseguite molto rapidamente. Questo perché nessuno ha avuto il tempo di tagliare tra loro e la prima domanda.


Così sia. Ma la realizzazione di questo non rende le cose più facili. Slava, non fraintendere un semplice programmatore. Il mio esempio di un indicatore di prova dei messaggi precedenti mostra chiaramente che il tempo medio di esecuzione di una richiestaChartXYToTimePrice() è di 5000 - 10000 microsecondi (allo spessore di una candela di 1 pixel e la finestra MT standard sullo schermo FullHD). Cosa si può fare in questo tempo?

Bene, per esempio, durante questo tempo si può formare un'immagine nello stesso schermo di 500 cerchi ombreggiati e visualizzarli sullo schermo:

Anche se c'è una coda, ma perché c'è una coda così lunga?
Da un lato della scala c'è una generazione pixel per pixel di 500 cerchi con la loro uscita sullo schermo, e dall'altro lato c'è una semplice interrogazione per due cifre. E pesa lo stesso.
Un semplice programmatore si siede lì, si gratta la testa e non riesce a mettere insieme i puzzle.

 
Nikolai Semko:

Così sia. Ma rendersene conto non rende le cose più facili. Slava, non fraintendere un semplice programmatore. Il mio esempio di un indicatore di prova dai messaggi precedenti mostra chiaramente che il tempo medio di esecuzione della richiestaChartXYToTimePrice() è di 5000 - 10000 microsecondi (con una larghezza di candela di 1 pixel e finestra standard MT su schermo FullHD). Cosa si può fare in questo tempo?

Bene, per esempio, durante questo tempo è possibile formare un'immagine nello stesso schermo di 500 cerchi ombreggiati e visualizzarli sullo schermo:

Anche se c'è una coda, ma perché c'è una coda così lunga?
Da un lato della scala è una formazione pixel per pixel di 500 cerchi e la loro visualizzazione sullo schermo, e dall'altro lato una semplice interrogazione a due cifre. E pesa lo stesso.
Un semplice programmatore si siede e si gratta la testa e non riesce a mettere insieme i puzzle.

Avete percepito la differenza tra comando sincrono e comando asincrono.