Errori, bug, domande - pagina 589

 
Ashes:

Bisogna guardare fuori dalla scatola (c)

Non vedo alcuna controindicazione all'esecuzione di una corsa separata nel cloud (tranne il prezzo).

Un'esecuzione standalone nel cloud sarà più lenta in molti casi che sul core locale.
 
joo:
Un'esecuzione individuale nel cloud sarà più lenta in molti casi che sul core locale.
Soprahttps://www.mql5.com/ru/forum/1111/page598#comment_125691 è uno scenario. Notate la parola CAN. La limitazione sembra inverosimile.
 

È sorto un problema.

Nel codice dell'indicatore in OnCalculate() c'è questa linea (o piuttosto diverse linee simili):

ArrayInitialize(FractalsBuffer,EMPTY_VALUE);
Il FractalsBuffer non è un buffer di calcolo ausiliario, ma il buffer principale responsabile direttamente delle costruzioni grafiche, quindi deve necessariamente essere collegato:
SetIndexBuffer(0,FractalsBuffer,INDICATOR_DATA);

che è stato fatto. Ma la funzione bind ha qualche effetto diretto, che a volte agisce come effetto collaterale (in modo negativo). Attraverso CopyBuffer(ind_handle,0,0,amount,FractalsBuffer) il buffer viene riempito non per tutta la lunghezza della storia del timeframe, ma solo parzialmente, dal suo piccolo segmento, dall'importo. Ma ArraySize(FractalsBuffer) ci convince chiaramente che la dimensione del buffer (cioè la memoria fisica occupata) corrisponderà al numero di barre di tutta la storia, cioè alla fine sarà usata al massimo, inclusa la parte inefficiente. Naturalmente, se volete lavorare con i valori del buffer più tardi nel ciclo, non dovete cercare attraverso l'intero buffer - potete semplicemente specificare i limiti necessari e lavorare entro questi limiti. Ma in primo luogo, non annulla l'orribile allocazione della memoria, e in secondo luogo, l'inevitabile funzione nel codice ArrayInitialize non permette di inizializzare parzialmente il buffer con il valore necessario bisogna spendere tempo e wattaggio per una reinizializzazione completa. Questo rende l'indicatore notevolmente più lento. E terzo, una citazione dalla descrizione della funzione ArrayResize: "Edovreste tenere a mente che . è impossibile ridimensionare gli array dinamici che sono assegnati come buffer di indicatori dalla funzione SetIndexBuffer()."Se rifiutiamoSetIndexBuffer afavore della manipolazione manuale della dimensione del buffer usando ArrayResize, il grafico dell'indicatore stesso collasserà.

Per favore, suggerisci una ricetta per il recupero. O considerare questo come un'applicazione per risolvere questo problema nella lingua stessa.
 
x100intraday:

È un po' incasinato...

1. ha senso inizializzare il buffer una volta, all'inizio if(prev_calculated==0)

2. Potete impostare da quale barra i dati saranno disegnati, in questo modo: PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,rates_total-amount-1);

3. Tutti i valori nel buffer all'interno della quantità dovrebbero essere assegnati esplicitamente, una volta in tutta la storia, e poi solo i nuovi valori saranno assegnati, quindi non hanno bisogno di essere inizializzati.

4. Nelle impostazioni del terminale diminuisci il numero di barre nella finestra :)

 
Swan:

È un po' incasinato...

1. ha senso inizializzare il buffer una volta, all'inizio if(prev_calculated==0)

2. Potete impostare da quale barra i dati saranno disegnati, in questo modo: PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,rates_total-amount-1);

3. Tutti i valori nel buffer all'interno della quantità dovrebbero essere assegnati esplicitamente, una volta in tutta la storia, poi solo i nuovi valori saranno assegnati, e quindi non ci sarà bisogno di inizializzazione.

4. Nelle impostazioni del terminale diminuisci il numero di barre nella finestra :)

1. Davvero: a livello di idea - ha senso farlo solo una volta, ma in pratica non è così semplice, tutto è davvero in esecuzione. Ho appena copiato dall'indicatore standard: C:\Program Files\MetaTrader 5\MQL5\Indicators\Examples\Fractals.mq5. Come cancellare il buffer prima di nuovi calcoli in un modo diverso e più efficace - non lo so.

2. Non ho ancora studiato questa possibilità, ma sembra che non disegni l'indicatore in una zona non necessaria, ma non limita la dimensione del buffer dell'indicatore. Inoltre, sono molto più disposto a lavorare con un buffer che è riempito strettamente con dati utili, senza alcun margine libero, altrimenti dovrò introdurre dei limiti (di cui ho parlato nel post precedente), e non si adatta all'algoritmo ortodosso: su quattro buffer tre saranno scansionati in un ciclo con gli stessi limiti, e per un buffer dovrò prendere tempo e fare un ciclo di curva separato con limiti diversi, che difficilmente potrò infilare. Anche se sì, si può anche strisciare con le stampelle...

3. Cosa intende per esplicitamente? Non garantisco per non assegnare esplicitamente a tutti. Può darsi che mi stia appropriando esplicitamente. Spiegare? Per quanto riguarda il caricamento di soli valori nuovi - naturalmente lo uso, qui si chiama algoritmo parsimonioso.

4. Questa idea è stata rifiutata prima di scrivere il post precedente, perché l'indicatore ha bisogno di alcune ultime (nuove) barre della storia, mentre per me personalmente (aspetto visivo) ho bisogno di tutte o quasi tutte le barre. Il mio interesse umano per le barre della storia è più ampio dell'interesse di un indicatore tecnico in esse. Voglio guardare le barre e disegnare l'indicatore in un grafico. Un capriccio? Un bisogno ordinario.

 
x100intraday:

1. Infatti: a livello di idea - ha senso farlo solo una volta, ma in pratica non è così semplice, tutto è davvero in esecuzione. Ho appena copiato dall'indicatore standard: C:\Program Files\MetaTrader 5\MQL5\Indicators\Examples\Fractals.mq5. Come cancellare il buffer prima di nuovi calcoli in un modo diverso e più efficace - non lo so.

   if(prev_calculated<7)// if(prev_calculated==0)// if(prev_calculated<1)// вопщем одинаково)
      //Initialize только при первом запуске. нуу или при случае какогнить ахтунга)
      {
      limit=2;//цикл начинается со второго элемента индикаторного массива
      //--- clean up arrays//в принципе здесь не очистка массива, 
                        //а значения EMPTY_VALUE  присваивается 0 и 1 элементу массивов, мм.. и на последних трёх барах)
                        //остальные определяются далее в цикле..
      ArrayInitialize(ExtUpperBuffer,EMPTY_VALUE);
      ArrayInitialize(ExtLowerBuffer,EMPTY_VALUE);
      }
   else limit=rates_total-5;//иначе - в цикле пересчитываются только два последних значения

//зы: при появлении нового бара - новый элемент массива вроде как не определен, насколько мне известно не гарантируется, что он будет  ==EMPTY_VALUE
2. Non ho ancora studiato questa possibilità, ma sembra che non disegni l'indicatore in una zona non necessaria, ma non limita la dimensione del buffer dell'indicatore. Inoltre, sono molto più disposto a lavorare con un buffer che è pieno di dati utili fino ai limiti, senza alcun margine libero, altrimenti dovrei introdurre dei limiti (di cui ho parlato nel post precedente), e non si adatta all'algoritmo ortodosso: su quattro buffer tre saranno scansionati in un ciclo con gli stessi limiti, e per un buffer dovrò cambiare idea e fare un ciclo di curva separato con limiti diversi, che difficilmente posso comprimere. Anche se sì, si può strisciare anche con le stampelle...

Beh, sì, dovrebbe.

La dimensione del buffer dell'indicatore è definita solo dal numero di barre.

In un modo o nell'altro, qualche misura dovrà essere fissata... Perché fare un loop curvo con confini diversi, quando puoi farne uno dritto con gli stessi confini)

In altre parole, dovreste specificare la dimensione del ciclo, non la dimensione dell'array... Altrimenti, l'indicatore sarà basato su stampelle


3) Cosa intende per "esplicitamente"? Non posso assolutamente garantire che non lo assegni esplicitamente. Può darsi che io lo faccia esplicitamente. Spiegare? Per quanto riguarda il caricamento di soli valori nuovi - naturalmente lo uso, qui si chiama algoritmo parsimonioso.
      //---- Upper Fractal
      if(High[i]>High[i+1] && High[i]>High[i+2] && High[i]>=High[i-1] && High[i]>=High[i-2])
         ExtUpperBuffer[i]=High[i];//условие выполняется - присваиваем значение
      else ExtUpperBuffer[i]=EMPTY_VALUE;//не выполняется - таки тоже присваиваем значение)
//нет зависимости от Initialize, всем элементам в цикле явно присваивается значение.

Riguardo all'algoritmo parsimonioso - non sono sicuro che lo usi.

L'indicatore è calcolato una volta per tutte le barre - cioè può essere un po' lento quando viene lanciato su uno storico agromatico.

Successivamente vengono ricalcolati un paio di valori - tutto dovrebbe funzionare :)

 
Cmu4:

Qual è il bug degli indicatori? Vanno e vengono. E solo quelli in una finestra separata!!!

Ecco uno screenshot di quando gli indicatori sono scomparsi. Ogni tanto scompaiono e poi appaiono... arbitrariamente. C'è anche un video...

Attenzione, gli indicatori di base stanno scomparendo!!! Significa che il bug è significativo. C'è lo stesso problema con gli indicatori personalizzati.

Signori sviluppatori, correggete questo bug, per favore, non è bello in qualche modo...

Purtroppo lo screenshot non si vede.

Quale server? Quale server di accesso? Quale data/ora? La storia era impaginata in quel momento?

Sta succedendo di nuovo adesso? Puoi allegare i log del terminale per questa data?

 

Cari sviluppatori, ho trovato uno spiacevole errore (difetto) nel compilatore MQL5.

Se usate un costrutto condizionale della seguente forma

se (Condizione) ;

{ operatore_1

......

Operatore_N }

Non vengono generati errori o avvertimenti durante la compilazione del codice.

Ma poiché c'è un " ; " (con o senza spazi) subito dopo la condizione, {operatore_1...operatore_N} sarà eseguito sempre.

MQL4 mostra un avvertimento. Voglio che anche MQL5 mostri un errore o un avvertimento! (Ho perso mezza giornata cercando di capire cosa c'è di sbagliato nel mio codice)

Grazie per il vostro feedback!

 
Fia:

Cari sviluppatori, ho trovato uno spiacevole errore (difetto) nel compilatore MQL5.

Se usate un costrutto condizionale della seguente forma

se (Condizione) ;

{ operatore_1

......

Operatore_N }

Non vengono generati errori o avvertimenti durante la compilazione del codice.

Ma poiché c'è un " ; " (con o senza spazi) subito dopo la condizione, {operatore_1...operatore_N} sarà eseguito sempre.

MQL4 mostra un avvertimento. Voglio che anche MQL5 mostri un errore o un avvertimento! (Ho perso mezza giornata cercando di capire cosa c'è di sbagliato nel mio codice)

Grazie per il vostro feedback!


Tutto è valido in questo caso. è un operatore vuoto.

Penseremo al tuo suggerimento (emettere un vorning), ma non è la massima priorità al momento.

Документация по MQL5: Основы языка / Операторы / Оператор-выражение
Документация по MQL5: Основы языка / Операторы / Оператор-выражение
  • www.mql5.com
Основы языка / Операторы / Оператор-выражение - Документация по MQL5
 
alexvd:

In questo caso tutto è valido. è un operatore vuoto.

Penseremo al tuo suggerimento (emissione di vorning), ma non è la massima priorità al momento.

Spero che non si dimentichi di farlo in MQL4, come è stato logicamente fatto in MQL4.


Potreste consigliarci di considerare due ordini pendenti (prezzo, tipo e volume della loro esecuzione sono gli stessi)?

Quando il prezzo viene raggiunto, entrambi gli eventi saranno attivati, e come funzionerà l'evento OnTrade() in questo caso?

In particolare, gli ordini pendenti che sono stati eseguiti andranno nella storia in un evento OnTrade() o ci saranno due chiamate? (i miei registri mostrano una chiamata per qualche motivo)

Grazie per la vostra risposta!

Motivazione: