Errori, bug, domande - pagina 249

 


alexluek:

Non c'è stata alcuna perdita di comunicazione, un'eccessiva estrazione di zecche, e più grande è il TF più raro.

E il metodo di calcolo dalla data iniziale alla data finale (ho scoperto che ce ne sono 3) senza

Probabilmente succede (ricalcola tutte le barre), ma non è ancora preciso e non so come controllarlo.

ma è solo un'idea - controlliamo...

Forse c'è un altro approccio per evitarlo...


Yedelkin:

Naturalmente c'è un approccio. Se(prev_calculated==0), eseguiamo il calcolo iniziale per tutte le barre. Successivamente, per ogni nuovo tick (se 0 < prev_calculated < rates_total) eseguiamo calcoli come for(int i=prev_calculated-1;i<rates_total;i++) solo per le ultime barre apparse.


Ancora ridisegna. Attuato in questo modo:


int calculated1=BarsCalculated(StdDev1Handle);

...................

se(CopyBuffer(StdDev1Handle,0,0,to_copy,ExtStdDev1Buffer)<to_copy)return(0);

......................

int data1=CopyOpen(Symbol1,0,0,rates_total,Open1Buffer);

.....................

for(int i=rates_total-2; i>=0; i--)
{
if(time[i]>=DateStart)

{


Ridisegna poi non lo fa, ma forse si tratta di correttezza del lavoro del codice

ma non nel terminale (ma almeno non è così caratteristico ora...)

Zecche o non zecche possono comunque ridisegnare.

L'impressione è che non ci sia coerenza (relazione causa-effetto).

L'unica cosa che mi viene in mente è un processore debole o un blocco

L'unica cosa che mi viene in mente è un processore debole o il blocco del terminale (MT5).

 

alexluek:

...................

Ridisegna poi non lo fa, ma è tutta una questione di correttezza del codice

e non nel terminale (almeno non è così caratteristico ora...)

Si prega di inviare una richiesta a Desk con il codice sorgente e lo capiremo.
 

Qualcuno ha lavorato con la seconda versione della funzione ChartGetInteger:

2. Возвращает true или false в зависимости от успешности выполнения функции.
В случае успеха значение свойства помещается в приемную переменную, 
передаваемую по ссылке последним параметром.

bool  ChartGetInteger(
   long    chart_id,        // идентификатор графика
   int     prop_id,         // идентификатор свойства
   int     sub_window,      // номер подокна
   long&   long_var         // сюда примем значение свойства
   );

? Sembra che il valore della proprietà non venga passato alla variabile ricevente. Almeno, questo comportamento si nota quando si usa il costrutto

if(!ChartGetInteger(Chart,CHART_WINDOWS_TOTAL,windows))
La funzione restituisce true, ma la variabile windows contiene il valore ottenuto durante l'inizializzazione di questa variabile. In questo caso, la prima versione della funzione produce un valore corretto. (E un'altra cosa banale: se la variabile di recupero è dichiarata di tipo long, il compilatore genera un avvertimento).
 
Yedelkin:

Qualcuno ha lavorato con la seconda versione della funzione ChartGetInteger:

? Sembra che il valore della proprietà non venga passato alla variabile ricevente. Almeno, questo comportamento si nota quando si usa il costrutto

La funzione restituisce true, ma la variabile windows contiene il valore ottenuto durante l'inizializzazione di questa variabile. In questo caso, la prima versione della funzione produce un valore corretto. (E un'altra cosa banale: se la variabile di recupero è dichiarata di tipo long, il compilatore genera un avvertimento).
Sì, esiste una cosa del genere. Solo che stavo cercando di richiedere il colore dello sfondo. Volevo scrivere a servicedesk, ma l'ho dimenticato.
 
Lizar:
Sì, esiste una cosa del genere. Solo che ho provato a chiedere il colore dello sfondo. Stavo per scrivere a servicedesk, ma l'ho dimenticato.
Ok, lo farò.
 
Yedelkin:

Qualcuno ha lavorato con la seconda versione della funzione ChartGetInteger:

? Sembra che il valore della proprietà non venga passato alla variabile ricevente. Almeno questo comportamento si osserva quando si usa il costrutto

La funzione restituisce true, ma la variabile windows ricevente contiene il valore ottenuto durante l'inizializzazione di questa variabile. In questo caso la prima versione della funzione produce il valore corretto. (E un'altra piccola cosa: se la variabile ricevente è dichiarata con il tipo long, il compilatore genererà un avviso).

Sembra che stiate usando una funzione sbagliata. Questa è la prima variante della funzione (con tre parametri). Non restituisce true (come pensate), ma il valore del parametro

if(!ChartGetInteger(Chart,CHART_WINDOWS_TOTAL,windows))

Non vedo il tuo codice, ma sembra essere corretto:

long Chart=0,windows;
if(!ChartGetInteger(Chart,CHART_WINDOWS_TOTAL,0,windows))
  {
   //--- всё плохо
  }
 
uncleVic:

Sembra che tu stia usando la funzione sbagliata. Questa è la prima versione della funzione (con tre parametri). Non restituisce true (come pensate), ma il valore del parametro

Non vedo il tuo codice, ma sembra essere corretto:

Hmmm..., sì, ho avuto questo esatto bug - ho guardato il mio vecchio codice dove stavo cercando di usare questa funzione.
 
uncleVic:

Sembra che tu stia usando la funzione sbagliata. Questa è la prima versione della funzione (con tre parametri). Non restituisce true (come pensate), ma il valore del parametro

OK. Esaminiamo la questione.

1. La funzione è usata "che", perché lei cita una funzione con lo stesso nome del suo esempio. Può essere solo una questione di quale versione di quella funzione (la prima o la seconda) viene utilizzata.

2. Infatti, formalmente la prima variante della funzione ha tre parametri, mentre la seconda ne ha quattro. Tuttavia, nella descrizione del parametro sub_window, che è presente in entrambe le varianti della chiamata, si dice chiaramente che "La maggior parte delle proprietà non richiede il numero di subwindow". La domanda sorge spontanea: è necessario o no indicare il numero della finestra per una proprietà come CHART_WINDOWS_TOTAL (numero totale di finestre del grafico incluse le sottofinestre dell'indicatore)?

3 È logico supporre che specificare il numero di finestre/sottofinestre del grafico separatamente non sia necessario per ottenere il numero totale di finestre/sottofinestre. Questa conclusione è supportata dall'esempio direttamente dal manuale stesso ( sezione Charts Properties):

   int windows=ChartGetInteger(0,CHART_WINDOWS_TOTAL);
   Print("CHART_WINDOWS_TOTAL = ",windows);

Un approccio simile è descritto nella sezione Chart Operations / ChartWindowOnDropped.

Da questi esempi, si può vedere che la posizione degli autori di Handbook è che non è necessario specificare un numero di sottofinestra separato per ottenere il numero totale di finestre/sottofinestre in un grafico. Naturalmente, gli esempi usano la prima variante della funzione, ma poiché stiamo parlando della stessa proprietà (cioè CHART_WINDOWS_TOTAL), sarebbe logico supporre che la stessa conclusione vale per la seconda variante della funzione. Soprattutto se si tiene conto che il Manuale non contiene alcuna riserva sulla necessità di specificare un numero zero di sottofinestra per la seconda variante della funzione.

4. Il tuo esempio suggerisce che il terzo parametro(sub_window) dovrebbe essere sempre specificato per la seconda variante della funzione, anche se la proprietà stessa non richiede di specificare un numero di subwindow. Cioè, a differenza della prima variante della funzione (che può essere usata sia con due che con tre parametri), la seconda variante della funzione richiede sempre tutti e quattro i parametri. Giusto?

5. Se è corretto, abbiamo stabilito due cose. In primo luogo, la mia versione originale del problema si è rivelata sbagliata. In secondo luogo, la ragione di questa versione errata è che le informazioni del Manuale sono incomplete. Perciò propongo un chiarimento nel manuale: "Non c'è un valore predefinito per la seconda opzione, quindi il numero di sottofinestra deve essere sempre specificato. Per la maggior parte delle proprietà che non richiedono un numero di sottofinestra, è necessario specificare 0 (finestra principale del grafico)". O qualcosa del genere.

Grazie per l'esempio. È breve e va dritto al punto.

 
Yedelkin:
Nella prima variante della funzione intsub_window=0 ha un valore predefinito, quindi può essere omesso; nella seconda variante non c'è questo valore predefinito, quindi deve essere specificato.

 
Yedelkin:

OK. Risolviamo la questione.

1. La funzione usata è "quella", perché lei cita una funzione con lo stesso nome del suo esempio. Può essere solo una questione di quale versione di quella funzione (la prima o la seconda) viene utilizzata.

2. Infatti, formalmente la prima variante della funzione ha tre parametri, mentre la seconda ne ha quattro. Tuttavia, nella descrizione del parametro sub_window, che è presente in entrambe le varianti della chiamata, si dice chiaramente che "La maggior parte delle proprietà non richiede il numero di subwindow". La domanda sorge spontanea: è necessario o no indicare il numero della finestra per una proprietà come CHART_WINDOWS_TOTAL (numero totale di finestre del grafico incluse le sottofinestre dell'indicatore)?

3 È logico supporre che specificare il numero di finestre/sottofinestre del grafico separatamente non sia necessario per ottenere il numero totale di finestre/sottofinestre. Questa conclusione è supportata dall'esempio direttamente dal Manuale di Riferimento stesso (sezione Chart Properties):


1. Considerando il fatto che la funzione è effettivamente sovraccaricata, possiamo sostenere che non lo è (anche se, come potete immaginare, è discutibile);

2. questo è il punto. Se ho capito bene la logica del sovraccarico delle funzioni in MQL5, la prima opzione può essere usata con 2 o 3 parametri, mentre la seconda può essere usata solo con 4 parametri.

Cioè, se una funzione riceve due o tre parametri, MQL5 userà la prima opzione, mentre userà sempre la seconda se ne riceve 4.

Il punto è che il compilatore si confonde nelle sue chiamate se usiamo la seconda variante con un numero di parametro non uguale a 4.

3. C'è una piccola imprecisione nella Referenza (o piuttosto una formulazione leggermente sbagliata). Il senso generale è il seguente - la maggior parte delle proprietà non richiede un numero di finestra, e nella prima opzione per tali proprietà, il numero di finestra può essere omesso(nella seconda opzione deve essere specificato, ma sarà ignorato).

4. Da quanto sopra segue che per questo esempio il compilatore sceglierà la prima variante della funzione.

   int windows=ChartGetInteger(0,CHART_WINDOWS_TOTAL);
   Print("CHART_WINDOWS_TOTAL = ",windows);
Il compilatore farà una tale conclusione sulla base del fatto che il terzo parametro nella prima variante può essere omesso, mentre nella seconda variante deve necessariamente essere presente!!!