Errori, bug, domande - pagina 1390

 

Non aspettate nell'init dell'indicatore per creare completamente l'indicatore.

Create l'indicatore e il controllo di ritorno e tutto l'ambiente e la storia saranno preparati più tardi e il vostro codice di ricalcolo sarà chiamato.

 
Renat Fatkhullin:

Non aspettate nell'initia la creazione completa dell'indicatore.

Create l'indicatore e il controllo di ritorno e tutto l'ambiente e la storia saranno preparati più tardi e il vostro codice di ricalcolo sarà chiamato.

Grazie, cioè il controllo per 4806 dovrebbe essere fatto ogni volta che i dati vengono ricevuti già dopo il ritorno da OnInit()?
 
Ad ogni punto di lettura dei dati
 

Qui è dove l'indicatore è chiamato e i suoi valori sono calcolati all'interno di OnCalculate. Si può aspettare indefinitamente, nessun ricalcolo ha luogo. Per eseguire sul grafico del periodo D1

int i_ich=INVALID_HANDLE;
double ind_buf[];

int OnInit(){
   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);
}


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[]){
   double temp[];
   int copied=CopyBuffer(i_ich,0,0,1,temp);
   if(copied<=0){
      datetime now=TimeLocal();
      while(BarsCalculated(i_ich)<=0 && !IsStopped()){  
         Comment("Ждем пересчета индикатора Ишимоку... ",int(TimeLocal()-now));
      }
      if(BarsCalculated(i_ich)>0){
         Print("Расчитано ", BarsCalculated(i_ich), " баров за ",int(TimeLocal()-now)," секунд");
      }
      Comment("");
   } 

   return(rates_total);
}

Per favore, spiega perché la lettura dell'Ishimoku non viene calcolata.

 
Ilya Malev:

Qui è dove l'indicatore è chiamato e i suoi valori sono calcolati all'interno di OnCalculate. Si può aspettare indefinitamente, nessun ricalcolo ha luogo. Per eseguire sul grafico del periodo D1

Per favore, spiega perché la lettura dell'Ishimoku non viene calcolata.

Che ne dite di questo:

//+------------------------------------------------------------------+
//|                                                      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()
  {
   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);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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;
   Print(count);
   double temp[];
   datetime now=TimeLocal();
   int copied=CopyBuffer(i_ich,0,0,1,temp);
   if(copied>0)
      Print("Расчитано ",BarsCalculated(i_ich)," баров за ",int(TimeLocal()-now)," секунд");
   count++;
   return(rates_total);
  }
//+------------------------------------------------------------------+
?
 

Non dovreste mai mettere in loop l'aspettativa nel codice dell'indicatore. Negli script e negli Expert Advisor si può, ma negli indicatori assolutamente no.

La strategia per i calcoli e le richieste di dati esterni negli indicatori dovrebbe essere la seguente: se la richiesta di dati non ha avuto successo, allora si esce immediatamente, rimandando i calcoli al prossimo tick. Nel prossimo tick/call, proveremo di nuovo a richiedere i dati necessari.

 
Karputov Vladimir:

E se è così:

?
Esce "0" (poiché è domenica, non c'è un riavvio di OnCalculate )
 
Renat Fatkhullin:

Non dovreste mai mettere in loop l'aspettativa nel codice dell'indicatore. Negli script e negli Expert Advisor si può, ma negli indicatori assolutamente no.

La strategia per i calcoli e le richieste di dati esterni negli indicatori dovrebbe essere la seguente: se la richiesta di dati non ha avuto successo, allora si esce immediatamente, rimandando i calcoli al prossimo tick. Nel prossimo tick/call, proveremo di nuovo a richiedere i dati necessari.

Ok, ma se le letture dell'indicatore dovessero essere calcolate durante una corsa, senza aspettare il tick successivo? Per esempio, se c'è un fine settimana o solo un periodo di bassa liquidità, quando il tick è fuori di un minuto? Usare OnTimer invece di OnCalculate?
 
Ilya Malev:
Esce "0" (poiché è domenica, nessuna riesecuzione di OnCalculate )
Nel tester, nel tester! E nel fine settimana devi cliccare con il tasto destro del mouse sul grafico e "Aggiorna".
 

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. Si ricorderà del buon vecchio MT4 e rimarrà su di esso, nonostante alcuni vantaggi di MT5.