Errori, bug, domande - pagina 595

 
-Alexey-:
Prova a trasferire in C - l'errore si troverà da solo. E in generale - con tali progetti è l'unico modo di scrivere, se non volete problemi in futuro. Purtroppo, io stesso l'ho capito troppo tardi e ora lo riscrivo :).
Probabilmente studierò C++ nel prossimo futuro. Negli ultimi sei mesi la mia testa è già piena: MQL4, MQL5, HTML, CSS, XML. E ora sto studiando anche JavaScript. Non ho ancora abbastanza spazio e tempo per il C++, anche se lo voglio davvero)).
 

Abbiamo un indicatore che gira su TF M15, nel codice l'indicatore richiede la serie temporale MqlRates da TF M1.

L'indicatore non parte subito perché i dati M1 non sono pronti e non è possibile caricarli durante la prima corsa.

Come risultato abbiamo un falso passaggio e l'indicatore non accede più ai dati, pensando che siano già calcolati e non ci sia bisogno di ricalcolarli.

Ora sto eseguendo l'indicatore in due modi:

  1. Avvio l'indicatore su M15, cancello l'indicatore e lo avvio di nuovo (funziona).
  2. Prima di eseguire l'indicatore su M15 apro un grafico su M1, eseguo l'indicatore su M15 (tutto funziona la prima volta).

Da qui la domanda: come automatizzare il corretto controllo e caricamento dei dati richiesti per un altro TF?

 
Urain:

Da qui la domanda: come automatizzare il controllo e il caricamento dei dati richiesti dall'altro TF?

In una situazione simile, controllo il processo di inizializzazione in OnCalculate. Se c'è un errore durante l'inizializzazione, allora restituisco prev_calculated=0, e così via finché tutto è contato correttamente.
 
Lizar:
In una situazione simile, controllo il processo di inizializzazione in OnCalculate. Se c'è un errore durante l'inizializzazione, allora restituisco prev_calculated=0 e continuo a farlo finché tutto è calcolato correttamente.

L'idea è buona, anche se nulla può essere assegnato a prev_calculated, la variabile è dichiarata come const, ma capisco che si può avere un'altra variabile simile.

C'è ancora una domanda: se non ci sono dati, cosa devo fare?

Capisco che la richiesta di dati in sé non porta a scaricare o caricare dal database locale, e questo è esattamente il problema.

 
Urain:

L'idea è buona, anche se non puoi assegnare nulla a prev_calculated, la variabile è dichiarata come const, ma ti ho capito, puoi avere un'altra variabile simile.

Non si tratta dell'assegnazione, ma del numero restituito da OnCalculated. Se i vostri dati non sono pronti, restituirete 0 da OnCalculated.
Guardate gli esempi di BarsCalculated. Ecco come dovreste controllare.

Rimane una domanda: se non ci sono dati, cosa si deve fare?

Se non ci sono dati e non appare, allora non c'è molto da fare.
Se volete, potete aspettare e calcolare i buffer con il timer.
 
sergeev:

Se i vostri dati non sono pronti, restituirete 0 da OnCalculated.
Guardate gli esempi di BarsCalculated.

Se non li avete e non appaiono, allora non c'è molto da fare.
Se volete, potete chiamare i buffer di attesa e di calcolo con un timer.

Non aiuta, solo scaricando l'indicatore e riavviandolo, in questo caso i dati sono già lì per qualche motivo.

Oppure, in alternativa, aprire un grafico con l'M1 TF richiesto, poi i dati sul grafico M15 adiacente su richiesta M1 sono pronti immediatamente.

 
Urain:

Non aiuta, solo scaricando l'indicatore e riavviandolo, in questo caso i dati sono già lì per qualche motivo.

O in alternativa, apri un grafico con il TF richiesto, poi i dati sul grafico adiacente sono subito pronti.

Oggi ho passato mezza giornata con gli indici. C'erano multicurrency/multitime.

Il problema della mancata visualizzazione è che c'è un tentativo di prendere un valore da una barra che semplicemente non esiste in questo TF.

Quindi dovete controllare prima di prendere una barra - SeriesInfoInteger.
Non c'è bisogno di scaricare. Non scaricherai comunque la parte di calcolo (ho appena sollevato l'argomento su questo oggi).
 
sergeev:

Ho lavorato con gli indici per mezza giornata oggi. C'erano multicurrency/multitime.

Il problema della non visualizzazione è che cerca di prendere il valore da una barra che semplicemente non esiste in questo TF.

Quindi dovete controllare prima di prendere una barra - SeriesInfoInteger.

Non c'è bisogno di scaricare. Non puoi comunque scaricare la parte di calcolo (ho appena sollevato un argomento su questo oggi).

Mimeo, ho un controllore, trovo la prima data su TF M1 e il calcolo delle barre M15 parte da questa data. TF è impostato come PERIOD_M1

   timestart=(datetime)SeriesInfoInteger(_Symbol,TF,SERIES_FIRSTDATE);
   for(int i=prev>0?prev-1:0;i<rates_total-1;i++)
     {
      if(time[i]>timestart)
        {
         ... расчёт
        }
     }
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Периоды графиков
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Периоды графиков
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы графиков / Периоды графиков - Документация по MQL5
 
Urain:

1. l'idea è buona, anche se nulla può essere assegnato a prev_calculated, la variabile è dichiarata come const, ma capisco che puoi avere un'altra variabile simile.

2. rimane una domanda, e se non ci sono dati, cosa dobbiamo fare?

3. Capisco che la richiesta di dati in sé non fa sì che i dati vengano scaricati o caricati dal database locale, e questo è esattamente il problema.

  1. Intendevo daOnCalculate restituire 0, quindi prev_calculated=0;
  2. Ho impostato un contatore di reinizializzazione. All'overflow, scarico l'indicatore.
  3. Non ho avuto problemi con SoruXXX. Se c'è una storia locale, tutto contava dalla seconda o terza volta, se non dalla prima. Al campionato, la "spia" usata dall'Expert Advisor conta solo sulla storia di un minuto, funziona su H1. E così via 9 coppie. Se non c'è nessuna storia locale, il punto 2 funzionerà. Ma, per quanto mi ricordo, la storia è stata scaricata dal server.
 
Urain:

Capisco che la richiesta di dati in sé non causa il download o il caricamento di dati dal database locale, e questo è esattamente il problema.

Dall'aiuto di CopyXXXX:

Quando si richiedono dati da un Expert Advisor o da uno script, inizierà a scaricare dal server, se il terminale non ha questi dati localmente, o inizierà a costruire le serie temporali richieste, se i dati possono essere costruiti dallo storico locale, ma non sono ancora pronti. La funzione restituisce la quantità di dati che sarà pronta quando il timeout scade, ma la storia continuerà ad essere scaricata e la prossima richiesta simile restituirà più dati.

Stiamo parlando solo di Expert Advisors e script. Questo non si applica agli indicatori?