Errori, bug, domande - pagina 3151

 
Artyom Trishkin #:

C'è sempre stato un controllo: if(limit>1) limit=rates_total-1. Questo è per i casi in cui non c'è i+qualcosa nel calcolo. Se c'è, allora questi "quanti-qualcosa" devono essere inclusi nel costrutto: limit=rates_total-1-qualcosa-qualcosa.

Senza di essa, ci sarebbe sempre un superamento dell'array. Perché rates_total non è altro che Bars(). Corrispondentemente, se ci sono 5000 barre e ci rivolgiamo all'indice 5000, cadremo fuori dai limiti dell'array (il calcolo delle barre inizia da zero).

Nel tuo esempio, il calcolo del limite è sbagliato:

Dovrebbe essere così:

E dopo di ciò controlla se c'è un limite>1

E se il limite è maggiore di uno, allora limite = rates_total-1

Grazie Artem! E scusa per il trambusto.
Giusto, dovrebbe esserci un controllo, l'ho solo dimenticato.
Ho ancora un commento nel codice
//Controlla e calcola il numero di barre calcolate.
A quanto pare, il copia-incolla ha causato il mio malinteso.
Tutto funziona come dovrebbe con il controllo. Grazie.

 
Roman #:

Grazie Artem!
Giusto, dovrebbe esserci un controllo, che avevo dimenticato.
Tutto funziona correttamente con il controllo. Grazie.

Non c'è di che. Correggere il calcolo. Non è corretto - l'ho sottolineato sopra.

int limit = rates_total-1-prev_calculated;

-1 non dovrebbe essere qui.

Se rates_total è 5000, e le barre calcolate nella precedente chiamata di OnCalculate() sono anche 5000 (prev_calculated), allora il limite sarà uguale a -1. Di conseguenza, il ciclo non sarà eseguito affatto.

Se volete selezionare come leggere l'indicatore (per tick sulla barra zero o solo all'apertura di una nuova barra), allora inserite una variabile, specificando come farlo:

int end = (ogni tick ? WRONG_VALUE : 0);

il ciclo sarà il seguente: for(int i=limit; i>end; i--) { //... }

e il calcolo dei limiti sarà corretto, e il ciclo sarà come volete voi.

 

Codice corretto.

i>=0 per ogni tick

i>0 per la nuova barra

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate (const int rates_total,       
                 const int prev_calculated,   
                 const int begin,             
                 const double& price[])      
{
   ArraySetAsSeries(price, true);
   ArraySetAsSeries(IndBuff, true);
   
   //-------------------------------------------------------------------------
   //Расчёт и проверка количества просчитываемых баров
   int limit = rates_total-prev_calculated;
   
   if(limit>1) 
      limit = rates_total-1;
   

   //-------------------------------------------------------------------------
   //Расчёт индикатора
   for(int i=limit; i>=0; i--)
   {

      IndBuff[i] = price[i]; 

   }
   

   return(rates_total);
}
 
Nikolai Semko #:
Oppure

Non hai nemmeno chiesto cosa fare... I telepati sono tornati dalle vacanze? ;)

 
Roman #:

Codice corretto.

i>=0 per ogni tick

i>0 per una nuova barra

ArraySetAsSeries(IndBuff, true);

Questo è meglio spostato in OnInit()

 
Artyom Trishkin #:

Non hai nemmeno chiesto cosa fare... I telepati sono tornati dalle vacanze? ;)

:)
Artem, non c'è bisogno di essere un telepate per vedere che l'uomo si è registrato pochi minuti fa e la prima cosa che ha visto è stata "Bugs, bugs, questions"
Chiaramente, sta chiedendo se può avere dei soldi gratis, e di non fare troppi problemi...

 
Nikolai Semko #:

:)
Artem, non c'è bisogno di essere un telepate per vedere che l'uomo si è registrato pochi minuti fa e la prima cosa che ha visto è stata "Errori, bug, domande"
Chiaramente, sta chiedendo se può ottenere dei soldi gratis, e di non sforzarsi troppo...

Forse ha deciso di fare qualche soldo in più su Bentley investendo in un tutor? :)

 
Artyom Trishkin #:

Forse ha deciso di fare un po' di soldi per la sua Bentley investendo in un tutor, con un duro lavoro come programmatore. :)

Non credo, Artem.
Se avesse avuto il potenziale di un programmatore, non avrebbe permesso l'ambiguità e l'incertezza.
:)
 
Roman #:

Sai qual è la cosa più fastidiosa? Che qualsiasi comportamento viene tradito in silenzio, senza preavviso.
E poi la gente si fa male. Sono stufo di questo metatrader.

Il design di un ciclo di indicatori è solo preso in prestito dai vecchi tempi con il metodo del copia-incolla (e l'autocompletamento storto) senza pensare.

tutto è semplice con l'interfaccia attuale:

for(int bar=prev_calculated>0?prev_calculates-1:0 ; bar<rates_total; bar++) {

   int i=rates_total-1; // i используем если обращения как ArraySetSeries(x,true), иначе bar

   ....

}

return rates_total;

il push con prev_calculated-1 in questo caso è necessario se è necessario ricalcolare l'ultima barra ad ogni chiamata.

 
Maxim Kuznetsov #:

È solo che il design del ciclo dell'indicatore è preso dai vecchi tempi del copia-incolla (e dell'autocompletamento storto) senza pensare.

tutto è semplice con l'interfaccia attuale:

for(int bar=prev_calculated>0?prev_calculates-1:0 ; bar<rates_total; bar++) {

   int i=rates_total-1; // i используем если обращения как ArraySetSeries(x,true), иначе bar

   ....

}

return rates_total;

l'affollamento con prev_calculated-1 in questo caso è necessario se è necessario ricalcolare l'ultima barra ad ogni chiamata.

Sì, mi sono un po' eccitato con la mia dichiarazione.
Proprio quando qualcosa funzionava e ora non più, iniziano i tic nervosi ))
E cominci a ricontrollare tutto e incolpare senza motivo il crash, dimenticando qualche particolarità che non ricordi ovviamente.
E la colpa è del copia-incolla. Credo che molti l'abbiano affrontato.

Voglio suggerire agli sviluppatori di creare modelli personalizzati per gli indicatori e gli EA.
Potranno selezionarli nella procedura guidata.

m

Alcuni editor C/C++ hanno questa caratteristica.
È molto comodo aggiungere i modelli di base, con i quali si lavora principalmente, e poi li si carica nella procedura guidata.
I modelli MQL standard non sono affatto uguali.
Ovviamente, possiamo dire che possiamo scrivere modelli e poi copiarli.
E di nuovo torniamo all'insidiosa parola "copia". E il fatto di poterlo automatizzare e facilitare la vita del programmatore non viene preso in considerazione.