Errori, bug, domande - pagina 1391

 
Ilya Malev:

Dopo aver premuto "aggiorna" tutto viene calcolato. Sarebbe più comodo se i dati dell'indicatore, creati nell'inite, fossero calcolati prima della prima chiamata di OnCalculate/OnTimer ecc.

Sarebbe utile avere la possibilità di aspettare il loro calcolo dopo l'inizializzazione nel ciclo all'interno dell'indicatore.

Per calcolare l'indicatore, l'utente deve premere più volte "refresh" sul grafico. Ne ha bisogno. Ricorderà il buon vecchio MT4 e rimarrà con esso, nonostante alcuni vantaggi di MT5.

Qualsiasi calcolo negli indicatori DEVE essere fatto solo in OnCalculate().
 
Karputov Vladimir:
Qualsiasi calcolo negli indicatori DEVE essere fatto solo in OnCalculate().
Sto parlando delle letture dell'indicatore Ishimoku in questo caso. Sto parlando di letture di indicatori che sono usati in quello corrente, cioè in OnCalculate. Quindi sono calcolati prima della chiamata di OnCalculate, come era in MT4. Oppure sarebbe possibile aspettare il loro calcolo in OnCalculate. Altrimenti gli utenti dovranno premere più volte Update per costruire un indicatore. Poiché non tutti gli indicatori sono costruiti sull'intera storia in 1 secondo, ci sono indicatori complessi che richiedono più tempo per il calcolo. Per tutto questo tempo l'utente dovrà aspettare il pulsante "Refresh", mentre in MT4 si deve solo aspettare che venga disegnato.
 
Ilya Malev:
Sto parlando delle letture dell'indicatore Ishimoku in questo caso. Sto parlando di letture di indicatori che sono usati in quello corrente, cioè OnCalculate. Quindi sono calcolati prima che OnCalculate sia chiamato, come era in MT4.
In OnInit() viene eseguita la preparazione dell'ambiente di trading per l'indicatore. E solo in OnCalculate() potete usare i dati dell'indicatore.
 
Ilya Malev:
Sto parlando delle letture dell'indicatore Ishimoku in questo caso. Sto parlando di letture di indicatori che sono usati in corrente, cioè in OnCalculate. Quindi sono calcolati prima della chiamata di OnCalculate, come era in MT4. Oppure sarebbe possibile aspettare il loro calcolo in OnCalculate. Altrimenti gli utenti dovranno premere più volte Update per costruire un indicatore. Poiché non tutti gli indicatori sono costruiti sull'intera storia in 1 secondo, ci sono indicatori complessi che richiedono più tempo per il calcolo. Per tutto questo tempo l'utente dovrà aspettare il pulsante "Refresh", mentre in MT4 si deve solo aspettare che venga disegnato.

Questo problema si presenta di tanto in tanto sul forum. Sfortunatamente, chiamare OnCalculate() in OnTimer() non risolve il problema.

Ma si può provare. Un esempio può essere trovato in questo articolo: MQL5 Recipes - Sviluppo di un indicatore di volatilità multivaluta in MQL5.

Dopo potrete scrivere se ha funzionato o no.

 
Karputov Vladimir:
OnInit() prepara l'ambiente di trading per l'indicatore. E solo in OnCalculate() potete usare i dati dell'indicatore.
Si scopre che non è possibile, senza premere il pulsante "Aggiorna" sul grafico una o più volte (o aspettare 1/numero di tick), se l'indicatore utilizza altri indicatori di altri simboli e/o tf.
 
Anatoli Kazharski:

Questo problema si presenta di tanto in tanto sul forum. Sfortunatamente, chiamare OnCalculate() in OnTimer() non risolve il problema.

Ma si può provare. Un esempio può essere trovato in questo articolo: MQL5 Recipes - Sviluppo di un indicatore di volatilità multivaluta in MQL5.

In seguito scrivete se ha funzionato o no, se non è troppo disturbo.

Grazie per il link. Lo proverò e vi farò sapere.
 
Ilya Malev:
Si scopre che non è possibile, senza premere il pulsante "Update" sul grafico una o più volte (o aspettare 1 o qualche tick), se l'indicatore utilizza altri indicatori di altri simboli e/o tf.

E se guardate più da vicino il funzionamento del codice che ho dato? E in particolare agli Esperti? Dopo aver riavviato il terminale nel fine settimana:

2015.10.11 14:44:01.672 test (USDCAD,M5)        0
2015.10.11 14:44:01.681 test (USDCAD,M5)        1
2015.10.11 14:44:01.682 test (USDCAD,M5)        Расчитано 16518 баров за 0 секунд
2015.10.11 14:44:01.705 test (USDCAD,M5)        2
2015.10.11 14:44:01.705 test (USDCAD,M5)        Расчитано 16518 баров за 0 секунд

È perfettamente visibile che il calcolo è andato a buon fine solo sulla seconda chiamata a OnCaalculate(). Quindi nessuno rimuove la responsabilità del programmatore per i controlli: controllare il risultato di CopyBuffer() in OncalCulate() - se la funzione non ha restituito nulla, deve essere controllato al prossimo input in OnCalculate().

 
Anatoli Kazharski:

Questo problema si presenta di tanto in tanto sul forum. Sfortunatamente, chiamare OnCalculate() in OnTimer() non risolve il problema.

Ma si può provare. Un esempio può essere trovato in questo articolo: MQL5 Recipes - Sviluppo di un indicatore di volatilità multivaluta in MQL5.

Per favore, scrivete più tardi, se non è troppo difficile, se ha funzionato o no.

Non ho ancora letto l'articolo, ma funziona bene con OnTimer

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   0
int i_ich=INVALID_HANDLE;
double ind_buf[];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   EventSetTimer(1);
   i_ich=iIchimoku(Symbol(),PERIOD_H4,9,26,52);
   if(i_ich==INVALID_HANDLE)
     {
      Print("Невозможно создать индиктор Ишимоку!");
      return(INIT_FAILED);
     }
   SetIndexBuffer(0,ind_buf,INDICATOR_DATA);
   ArraySetAsSeries(ind_buf,true);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+

void OnTimer(){
   datetime Arr1[];
   double Arr2[];
   long Arr3[];
   int Arr4[];
   OnCalculate(0, 0, Arr1, Arr2, Arr2, Arr2, Arr2, Arr3, Arr3, Arr4);
}

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[])
  {
   static int count=0;
   static datetime now=0;
   if(now==0)  now=TimeLocal();
   if(count>=0){
      Print(count);
      double temp[];
      int copied=CopyBuffer(i_ich,0,0,1,temp);
      if(copied>0){
         Print("Расчитано ",BarsCalculated(i_ich)," баров за ",int(TimeLocal()-now)," секунд");
         EventKillTimer(); // Индикаторы рассчитались, далее работаем только с OnCalculate
         count=-1;
      }else
         count++;
   }
   if(rates_total==0)   return(0); // Если это вызов из OnTimer, то возврат
   
   // ...
   return(rates_total);
}

Ho una strana immagine che mostra che chiamando OnCalculate da OnTimer funziona) ho bisogno di aggiungere valori corretti nelle serie temporali

 
Ilya Malev:

Non ho ancora letto l'articolo, ma la ricezione con OnTimer funziona bene

Negli indicatori semplici funziona bene. Ma in quelli più complessi, per qualche motivo, a volte si attacca. )
 
Ilya Malev:

Non ho ancora letto l'articolo, ma la ricezione con OnTimer funziona bene

Usa lo Styler - è meglio per identificare gli errori.

   if(count>=0)
     {
      Print(count);
      double temp[];
      int copied=CopyBuffer(i_ich,0,0,1,temp);
      if(copied>0)
        {
         Print("Расчитано ",BarsCalculated(i_ich)," баров за ",int(TimeLocal()-now)," секунд");
         EventKillTimer(); // Индикаторы рассчитались, далее работаем только с OnCalculate
         count=-1;
        }
      else
         count++;
     }
Aumentare la variabile di conteggio prima di uscire da OnCalculate() - in questo caso questa variabile conterà correttamente tutte le corse in OnCalculate.