Errori, bug, domande - pagina 1124

 
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
  struct ARGB
  {
    uchar blue;
    uchar green;
    uchar red;
    uchar alpha;
  };
  
  struct N
  {
    uint num;
  };
  
  N n={100288};
  ARGB c;
  c=n;         //так получаем предупреждение implicit struct cast       sample.mq5      22      4
  c=(ARGB)n;   //а так всё в порядке
}
Anche se entrambe le strutture sono della stessa dimensione e si copiano l'una nell'altra senza perdita, riceviamo comunque un avviso.
 
Fleder:
Anche se entrambe le strutture sono della stessa dimensione e si copiano l'una nell'altra senza perdita, riceviamo comunque un avviso.
Bene, è fantastico. Non è così difficile fare un cast esplicito. Ma non è così piacevole cercare di capire cosa è stato assegnato quando si verificano dei bug.
 
TheXpert:
Quindi è fantastico. Non è così difficile fare una casta evidente. E capire dove assegnare cosa quando i bug iniziano a insinuarsi non è molto piacevole.
Sembra il motto del compilatore: "Meglio prevenire che curare!".
 

Copia dall'applicazione a SR:

Capacità di auto-scaricare le serie temporali dalla RAM alla cache *.hc
Errori, MetaTrader 5 MQL, Aperto, Iniziato: 2014.04.12 06:04, #995430

Versione del terminale e bit

910 32 bit

Descrizione del problema

Ciao, cari sviluppatori!

In MQL5 un certo numero di funzioni di sistema comeCopyRates,CopyTime,CopyOpen, ecc. sono destinate a ricevere dati di serie temporali.

Quando chiamate una qualsiasi di queste funzioni, la serie temporale richiesta viene caricata nella RAM all'interno del parametro "Max bars in chart".

Tuttavia, la combinazione di fattori come:

1. Storia sufficientemente profonda disponibile sul simbolo o completamente caricata dal server.

2. Il parametro "Max bars in chart" è "Unlimited".

3. Vengono richiesti i dati del più piccolo lasso di tempo M1.

Si sta consumando una quantità molto grande di memoria.

Il problema è aggravato dal fatto che la logica del programma che esegue MQL5 (per esempio, se è un Expert Advisor multivaluta o un indicatore)

può essere stabilito per l'accesso alternato ai dati dei tempi di basso livello di diversi simboli (per esempio, ricerca singola).

Di conseguenza, il consumo di RAM aumenta di molte volte.

Получение данных нужного таймфрейма из промежуточных данных

I file di servizio nel formato HCC svolgono il ruolo di fonte di dati per costruire i dati sui prezzi secondo i tempi richiesti nel formato HC. I dati nel formato HC sono serie temporali preparate al massimo per un accesso rapido. Vengono creati solo su richiesta di un grafico o di un programma mql5 nel volume che non supera il parametro "Max bars in charts", e vengono salvati per un uso successivo in file con estensione hc.

Per risparmiare risorse, i dati sul timeframe sono caricati e immagazzinati nella RAM solo quando necessario.In caso di lunga assenza di richieste i dati sono scaricati dalla RAM salvandoli in un file. I dati per ogni periodo sono preparati indipendentemente dai dati pronti per altri periodi. Le regole per la preparazione e la disponibilità dei dati sono le stesse per tutti i tempi. Cioè, nonostante il fatto che l'unità di memorizzazione dei dati nel formato HCC sia la barra dei minuti, la disponibilità dei dati nel formato HCC non significa la disponibilità e l'accessibilità dei dati in formato HC per il periodo M1 nello stesso volume.

La ricezione di nuovi dati dal server provoca l'aggiornamento automatico dei dati di prezzo usati in formato HC per tutti i tempi e il ricalcolo di tutti gli indicatori, che li usano esplicitamente come dati di input per il calcolo.

Il tempo del processo evidenziato in giallo nella citazione citata della documentazione è abbastanza grande: circa mezz'ora (dalle mie osservazioni).

Di conseguenza, tutte le serie temporali richieste sono "sedute" nella "RAM" senza alcuna ragione.

Se la "RAM" non è "gomma E il "vorace" Expert Advisor/indicatore richiede sempre più serie temporali, il terminale non ha altro da fare

tranne che per un urgente "scarico" delle serie temporali in eccesso nel file (cache). Così, in questo reset di emergenza, il terminale può resettare la serie temporale a

una "cache rotta", cioè perderà "una buona metà" dei dati. E la prossima volta che si accede a questa serie temporale, il terminale carica questa "cache rotta" come una normale.

Di conseguenza, il grafico del terminale visualizza la serie temporale necessaria con un enorme buco nella storia.

Risultato atteso

Il linguaggio MQL5 tende a risparmiare risorse dell'ambiente di esecuzione. Un esempio di questo è il seguente:

1. la funzioneArrayFree

2. funzioneresourceFree

3.eliminare l'operatore

4. Parametro"Barre massime nei grafici

È possibile aggiungere una funzione di sistema alla funzionalità del linguaggio MQL5 che forzi il terminale ad eseguire operazioni con la serie temporale non più utilizzata?

Se non c'è un grafico aperto con questa serie temporale, alla fine del tempo?

Per esempio, una funzione:

bool SeriesFlush(
   string           symbol_name,       // имя символа
   ENUM_TIMEFRAMES  timeframe,         // период
   );

Questo permetterebbe:

1. non preoccuparsi dell'overflow della RAM.

2. non preoccupatevi delle "cache rotte" di cui potete liberarvi solo cancellando manualmente i file *.hc quando il terminale è spento.

3. Non dovete dipendere dalla modalità bit del vostro sistema operativo e dalla dimensione della RAM.

4. Quando si sviluppa un prodotto software, non usare "stampelle" che cercano di aggirare gli svantaggi descritti sopra.

 
Fleder:

Copia dall'applicazione a SR:

Possibilità di auto-scaricare le serie temporali dalla RAM alla cache *.hc
Perché, è una grande idea.
 
Potete dirmi come ottenere dati da un indicatore che ha un bias positivo? Sono interessato ai dati su -1 barra?
 
dentraf:
Potete dirmi come ottenere i dati dell'indicatore con un offset positivo? Sono interessato ai dati sulla barra -1?

Per fare questo è necessario conoscere le impostazioni di offset per la linea dell'indicatore di interesse. Questo è un esempio dell'indicatore tecnicoiAlligator

//--- зададим смещение для каждой линии
   PlotIndexSetInteger(0,PLOT_SHIFT,jaw_shift);

Si tratta di una compensazione, non di un calcolo indicatore per il futuro.

 

Copia dall'applicazione alla SD:

Funzionamento errato della funzione di sistema IsStopped negli indicatori
Errori, MetaTrader 5 MQL, Aperto, Iniziato: 2014.04.12 07:59, #995480

Versione del terminale e modalità di bit

910 32 bit

Descrizione del problema

Ciao, cari sviluppatori!

Una delle raccomandazioni per migliorare la qualità del codice quando si progettano cicli con un gran numero di iterazioni

è incorporare la verifica di un arresto forzato di un programma MQL5 utilizzando il sistema

Funzione di sistemaIsStopped();

Tuttavia, in pratica, questo controllo non funziona negli indicatori (lo fa negli script e negli Expert Advisors)

Ecco il codice breve dell'indicatore che mostra l'essenza del problema:

#property  indicator_plots 0
//=====================================================================
// Custom indicator initialization function
//=====================================================================
int OnInit()
{
  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[])
{
  long n=0;
  for(int i=0;i<1 e+10 && !IsStopped();i++) {n++;}
  Print("OnCalculate End");
  return(rates_total);
}

Se provate a rimuovere questo indicatore dal grafico, il processo di "calcolo dell'indicatore" non si ferma in quanto tale,

anche se dovrebbe, a causa del controllo del flag di arresto del programma.

Puoi scoprirlo facilmente monitorando il processo terminal.exe in Task Manager. Su un processore quad core

è circa il 25% del carico della CPU. Inoltre, il carico terminale non diminuisce affatto nel tempo fino a quando il

spegnimento del terminale. E anche dopo lo spegnimento del terminale il processo terminal.exe si blocca ancora nel manager. E mi sembra che sia così,

che viene scaricato dal sistema operativo come "sospeso".


Risultato atteso

Per favore, risolvete questo problema.

 
barabashkakvn:

Per fare questo è necessario conoscere le impostazioni di offset per la linea dell'indicatore di interesse. Questo è un esempio dell'indicatore tecnicoiAlligator

Questa è una compensazione, non il calcolo dell'indicatore per il futuro.

Ho un calcolo del futuro, ma uso un offset per renderlo, come faccio a calcolare -1 barra dall'Expert Advisor?

Se qualcuno ne ha bisogno, usa CopyBuffer(Handle_original,0,-2,10,Data_Ind )

 
dentraf:
Esattamente, ho un calcolo nel futuro, ma per disegnare un offset, come faccio a leggere -1 barra dall'Expert Advisor?
Non c'è una citazione per -1 bar. L'offset è: il calcolo per una barra che esiste (per esempio la barra numero 2) e poi questo valore calcolato è tracciato sulla barra 2 meno l'offset. Cioè, se l'offset è 5, il valore calcolato sulla barra 2 è disegnato sulla barra "-3".