Errores, fallos, preguntas - página 1390

 

No espere en el init del indicador para crear completamente el indicador.

Cree el indicador y el control de retorno y todo el entorno y la historia se prepararán más tarde y se llamará a su código de recálculo.

 
Renat Fatkhullin:

No espere en el initia para la creación completa del indicador.

Cree el indicador y el control de retorno y todo el entorno y la historia se preparará más tarde y se llamará a su código de recálculo.

Gracias, es decir, ¿la comprobación del 4806 debe hacerse cada vez que se reciban datos ya después del retorno de OnInit()?
 
En cada punto de lectura de datos
 

Aquí se llama al indicador y se calculan sus valores dentro de OnCalculate. Puede esperar indefinidamente, no se produce ningún recálculo. Para ejecutar en el gráfico de períodos 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);
}

Por favor, explique por qué no se calcula la lectura de Ishimoku.

 
Ilya Malev:

Aquí se llama al indicador y se calculan sus valores dentro de OnCalculate. Puede esperar indefinidamente, no se produce ningún recálculo. Para ejecutar en el gráfico de períodos D1

Por favor, explique por qué no se calcula la lectura de Ishimoku.

¿Qué te parece esto?

//+------------------------------------------------------------------+
//|                                                      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);
  }
//+------------------------------------------------------------------+
?
 

Nunca se debe hacer un bucle de expectativa en el código del indicador. En los scripts y Asesores Expertos sí se puede, pero en los indicadores no se puede en absoluto.

La estrategia para los cálculos y solicitudes de datos externos en los indicadores debe ser la siguiente: si la solicitud de datos no tuvo éxito, entonces salimos inmediatamente, posponiendo los cálculos para el siguiente tick. En el siguiente tick/llamada, volveremos a intentar solicitar los datos necesarios.

 
Karputov Vladimir:

Y si es así:

?
Sale "0" (como es domingo, no hay reinicio de OnCalculate )
 
Renat Fatkhullin:

Nunca se debe hacer un bucle de expectativa en el código del indicador. En los scripts y en los Asesores Expertos se puede, pero en los indicadores no se puede en absoluto.

La estrategia para los cálculos y solicitudes de datos ajenos en los indicadores debe ser la siguiente: si la solicitud de datos no tuvo éxito, entonces salimos inmediatamente, posponiendo los cálculos para el siguiente tick. En el siguiente tick/llamada, volveremos a intentar solicitar los datos necesarios.

De acuerdo, pero ¿qué pasa si las lecturas del indicador deben calcularse durante una ejecución, sin esperar al siguiente tick? Por ejemplo, si hay un fin de semana o simplemente un periodo de baja liquidez, cuando el tick está fuera de un minuto? ¿Utilizar OnTimer en lugar de OnCalculate?
 
Ilya Malev:
La salida es "0" (ya que es domingo, no se ejecuta de nuevo OnCalculate )
¡En el probador, en el probador! Y el fin de semana hay que hacer clic con el botón derecho del ratón en el gráfico y "Actualizar".
 

Después de pulsar "actualizar" se calcula todo. Sería más conveniente que los datos del indicador, creados en el inite, se calcularan antes de la primera llamada de OnCalculate/OnTimer, etc.

Sería útil tener la posibilidad de esperar su cálculo después de la inicialización en el bucle dentro del indicador.

Para calcular el indicador, el usuario debe pulsar varias veces "refrescar" en el gráfico. Lo necesita. Recordará la vieja MT4 y se quedará en ella, a pesar de algunas ventajas de MT5.