Errori, bug, domande - pagina 3148

 
Roman #:

Questo perché IndBuff non è assegnato a rates_total + 1
E ArrayResize non è applicabile ad esso.
Hanno rotto il per costruire. Dobbiamo usare if-arses ora?

for(int i=limit - 1;....

almeno...

 
Roman #:

Questo perché l'IndBuff non è assegnato a rates_total + 1
e ArrayResize non è applicabile ad esso.


Qui è dove hai bisogno del meno 1 :))
La stampa mostra che le dimensioni sono OK.
Usare la logica:
Se limite = 0, allora è un nuovo tick.
Se limite = 1, significa una nuova barra (l'ultimo elemento del buffer rates_total è -1 e avete rates_total - da qui l'overflow)
Se il limite > 1, allora è meglio ricalcolare l'intero indicatore
 
Maxim Kuznetsov #:

for(int i=limit - 1;....

come minimo...

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.

 
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.

Tutto è come prima.
Colpa tua.
Suggerimento - imparate a usare il debugger e non dovrete fare la correzione di bozze, vedrete tutti i vostri difetti in una volta sola.
 
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.

Non ho notato alcun cambiamento nel calcolo degli indicatori. Come avete visto sopra, Nikolay ha giustamente spiegato cosa significano i valori limite calcolati come rates_total-prev_calculated.

E funziona da anni - dal quarto terminale.

 
Nikolai Semko #:
Qui è dove hai bisogno del meno uno :))
La stampa mostra che le dimensioni sono OK.
Usare la logica:
Se limite = 0, allora un nuovo tick
Se limite = 1, significa una nuova barra (l'ultimo elemento del buffer rates_total è -1, e avete rates_total, quindi l'overflow)
Se il limite > 1, allora è meglio ricalcolare l'intero indicatore

Nikolay conosco le costruzioni se e per uno,
ma ho sempre lavorato con per, mi sono appena abituato, è più conveniente.
Ma ho notato alcune cose strane con per molto tempo e ho rimandato cercando di capire.
Prima funzionava bene

per i>=0 ticks
per i>0 barre

E non c'era bisogno di se.

 
Roman #:



Passo 1: Creare un modello usando 'MQL5 Wizard':

//+------------------------------------------------------------------+
//|                                                       Simple.mq5 |
//|                              Copyright © 2022, Vladimir Karputov |
//|                      https://www.mql5.com/en/users/barabashkakvn |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2022, Vladimir Karputov"
#property link      "https://www.mql5.com/en/users/barabashkakvn"
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Close
#property indicator_label1  "Close"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input int      Input1=9;
//--- indicator buffers
double         CloseBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,CloseBuffer,INDICATOR_DATA);
   
//---
   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[])
  {
//---
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+


Passo 2: scrivete correttamente 'limit' e USATE l'array close - NON la chiamata iClose!!!

//+------------------------------------------------------------------+
//|                                                       Simple.mq5 |
//|                              Copyright © 2022, Vladimir Karputov |
//|                      https://www.mql5.com/en/users/barabashkakvn |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2022, Vladimir Karputov"
#property link      "https://www.mql5.com/en/users/barabashkakvn"
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Close
#property indicator_label1  "Close"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input int      Input1=9;
//--- indicator buffers
double         CloseBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,CloseBuffer,INDICATOR_DATA);
//---
   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[])
  {
//---
   int limit=prev_calculated-1;
   if(prev_calculated==0)
      limit=0;
   for(int i=limit; i<rates_total; i++)
     {
      CloseBuffer[i]=close[i];
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+


Risultato:

E non ci sono errori.

File:
Simple.mq5  5 kb
 
Vladimir Karputov #:

Passo 1: Creare un modello usando 'MQL5 Wizard':


Passo 2: scrivete correttamente 'limit' e USATE l'array close - NON la chiamata iClose!!!


Risultato:

e non ci sono errori.

Grazie per l'esempio diretto i++ naturalmente.
Ma il fatto che io abbia un ciclo inverso, non l'hai notato.
E se iClose è citato come esempio, deve essere usato per mostrare che l'indice i sarà usato successivamente in altre funzioni.

 
Roman #:

Nikolai conosco le costruzioni di se e per uno,

altrimenti se

Nikolai Semko #:
Usare la logica:
Se limite = 0, allora un nuovo tick
Se limite = 1, significa una nuova barra (l'ultimo elemento del buffer rates_total è -1, e avete rates_total, quindi l'overflow)
Se il limite > 1, allora è meglio ricalcolare l'intero indicatore

Qui è dove
è sbagliato - meglio usare
se limit != 1

Quindi l'intera logica è più o meno quella che è:

limit = rates_total - prev_calculated;
if (limit == 0) {..} // новый тик
else if ( limit == 1) {..} // новый бар
else {..} // полный пересчет всего индикатора
Capisco che alcune persone saranno indignate e diranno perché dovrei ricalcolare tutto se limit == 2,
ma quando limit non è uguale a 1 e non è uguale a 0, significa che questa è la prima inizializzazione dell'indicatore o qualcosa è andato storto (per esempio, fallimento della connessione o del server)
Inoltre, molte volte ho incontrato situazioni in cui prev_calculated era superiore a rates_total. Probabilmente, è stato qualche problema tecnico prima ed è stato risolto ora, ma da allora uso questo design come precauzione di sicurezza.
 
Nikolai Semko #:

se limite != 1

Che differenza fa? Può diventare meno di zero?
Motivazione: