Errores, fallos, preguntas - página 1343

 
StrategyTester:

Hola.

Pregunta sobre MT5 y su Tester.

Tengo un Asesor Experto multidivisa escrito por mí mismo, que llama a un indicador multidivisa escrito por mí mismo que calcula algunos ratios entre dos pares de divisas. Durante las pruebas y la depuración encontré un problema: en el Terminal en algún momento la línea "A" es más alta que la línea "B", mientras que en el Probador de Estrategias en el mismo momento y con la misma configuración del indicador con la visualización activada, la línea "A" es más baja que la línea "B". Y en general: la apariencia de las líneas de los indicadores en el Terminal es fundamentalmente diferente a la del Probador de Estrategias. Pregunta: ¿Es un fallo del MT5 Tester o un error en el código?


Permítanme aclarar: estoy viendo un rediseño del indicador.

 
Karputov Vladimir:
Siempre el indicador se dibuja como está en el terminal. Tal vez en el probador que necesita para probar varios modos (todas las garrapatas, los precios matemáticos y así sucesivamente).
He probado "Todos los ticks", "OHLC en M1", "Sólo precios de apertura". El resultado es el mismo: el indicador se vuelve a dibujar. La opción"Cálculos matemáticos" no está activa, no está disponible.
 
StrategyTester:
Probé con "Todos los ticks", "OHLC en M1", "Sólo precios de apertura". El resultado es el mismo: el indicador se redibuja. La opción"Cálculos matemáticos" no está activa, no está disponible.
En ese caso, por favor, facilítame el código.
 

Pregunta a los desarrolladores: ¿Bajo qué condiciones se considera que el historial del símbolo no está sincronizado, es decir, que SeriesInfoInteger(símbolo, periodo, SERIES_SYNCHRONIZED) devuelve false?

La cuestión es que de vez en cuando me encuentro con una situación en la que se devuelven valores falsos para un determinado símbolo en todos los plazos, a pesar de que existe un historial para este símbolo (las barras y otras funciones devuelven valores distintos de cero). ¿Cuál puede ser la razón?

 

También existe este problema. Al leer el historial de varios símbolos / plazos en el indicador a través de CopyTime, CopyClose, etc. el indicador a menudo parpadea.Esto no es el resultado de la renderización (no hay un recálculo de las barras), sino que simplemente toda la imagen desaparece durante una fracción de segundo, y luego vuelve a aparecer. Y a veces no durante fracciones, sino durante segundos enteros. Normalmente se observa durante el desplazamiento del gráfico. Si la serie temporal solicitada es pequeña, el problema no se produce.

Me gustaría que los desarrolladores comentaran qué relación puede tener esto.

 
Karputov Vladimir:
En ese caso, facilite el código.

Adjunto una ilustración de las diferencias en el terminal y el probador y el código del indicador.

//+------------------------------------------------------------------+
//|                                             Indicator1_6test.mq5 |
//+------------------------------------------------------------------+
#property copyright ""
#property link      ""
#property version   "1.6"
#property indicator_separate_window
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots 2
#property  indicator_color1 SkyBlue
#property  indicator_color2 Yellow
#property  indicator_type1 DRAW_LINE
#property  indicator_type2 DRAW_LINE
//---
enum TT{_close=0,_open=1,_high=2,_low=3};
//---
input string activ1="GBPUSD",activ2="EURUSD";
input TT PriceType=_close;
input int Len=100;
//---
double ratio[],avr[];string NN[]={"rr1","rr2","aa1","aa2"};
//---
void setv(int i,double v){ObjectSetDouble(0,NN[i],OBJPROP_PRICE,v);}
//---
int OnInit()
{
   SetIndexBuffer(0,ratio);
   PlotIndexSetString(0,PLOT_LABEL,"Ratio");
   SetIndexBuffer(1,avr);
   PlotIndexSetString(1,PLOT_LABEL,"Avr");
   ArraySetAsSeries(ratio,1);
   ArraySetAsSeries(avr,1);
   for(int i=0;i<4;i++)ObjectCreate(0,NN[i],22,0,0,0);
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[])
{
int limit=0;double zz[4];

  if(prev_calculated==0){limit=MathMin(Bars(activ1,0),Bars(activ2,0));limit--;}
  else limit=rates_total-prev_calculated;
  if(limit==0)limit=1;
  double Price1[],Price2[]; ArraySetAsSeries(Price1,1); ArraySetAsSeries(Price2,1);
  getV(Price1,Price2,limit);
  for(int i=0;i<limit;i++){if(Price1[i]>0&&Price2[i]>0)ratio[i]=Price1[i]/Price2[i];else ratio[i]=ratio[i+1];}
  
  double sred=0,sum=0; 
  for(int i=0;i<limit;i++)
      {
      sred=0;
      avr[i]=SimpleMA(i,Len,ratio);
      
      for(int j=i;j<i+Len;j++)
        {
        if(j>=ArraySize(ratio))break;
      if(ratio[j]==0||ratio[j]==EMPTY_VALUE){sred=0;break;}
      sred=1;
        }
      }
      
  if(prev_calculated!=0)for(int i=0;i<10;i++)if(ratio[i]==0)ratio[i]=ratio[i+1];
  
zz[0]=ratio[1];zz[1]=ratio[2]; zz[2]=avr[1];zz[3]=avr[2];
for(int i=0;i<4;i++)setv(i,zz[i]);
return(rates_total);
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void getV(double&Price1[],double&Price2[],int limit)
{
if(PriceType==_close){CopyClose(activ1,PERIOD_CURRENT,0,limit,Price1);CopyClose(activ2,PERIOD_CURRENT,0,limit,Price2);}
if(PriceType==_open){CopyOpen(activ1,PERIOD_CURRENT,0,limit,Price1);CopyOpen(activ2,PERIOD_CURRENT,0,limit,Price2);}
if(PriceType==_high){CopyHigh(activ1,PERIOD_CURRENT,0,limit,Price1);CopyHigh(activ2,PERIOD_CURRENT,0,limit,Price2);}
if(PriceType==_low){CopyLow(activ1,PERIOD_CURRENT,0,limit,Price1);CopyLow(activ2,PERIOD_CURRENT,0,limit,Price2);}
}
//---
double SimpleMA(const int position,const int period,const double &price[])
  {
//---
   double result=0.0;
//--- check position
      //--- calculate value
      if(position+period+1>ArraySize(price))return(0);
      for(int i=0; i<period; i++) result+=price[position+i];
      result/=period;
   return(result);
  }
//---
 

En general, con las funciones

Copy

tienen otros problemas,

Me encontré con el hecho de que cuando se llama a esta función puede "congelar" el EA, escribí un programa usando un gran número de símbolos e hice cálculos en el historial de literalmente los últimos 3 días en cada símbolo,

Solía tener momentos en los que todo se colgaba durante unos minutos, apenas me di cuenta de que era la función Copiar. La función manejaba con seguridad 150-200 símbolos, luego se colgaba, se colgaba en diferentes símbolos ...

El tiempo de suspensión variaba entre 5 segundos y 2-3 minutos...

 
Las funciones de copia en los EAs son sincrónicas y esperan la paginación de los datos si no están disponibles.
 
StrategyTester:

Adjunto una ilustración de las diferencias en el terminal y el probador y el código del indicador.

Hay un error en la función:

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void getV(double&Price1[],double&Price2[],int limit)
  {
   if(PriceType==_close)
     {
      CopyClose(activ1,PERIOD_CURRENT,0,limit,Price1);
      CopyClose(activ2,PERIOD_CURRENT,0,limit,Price2);
     }
   if(PriceType==_open)
     {
      CopyOpen(activ1,PERIOD_CURRENT,0,limit,Price1);
      CopyOpen(activ2,PERIOD_CURRENT,0,limit,Price2);
     }
   if(PriceType==_high)
     {
      CopyHigh(activ1,PERIOD_CURRENT,0,limit,Price1);
      CopyHigh(activ2,PERIOD_CURRENT,0,limit,Price2);
     }
   if(PriceType==_low)
     {
      CopyLow(activ1,PERIOD_CURRENT,0,limit,Price1);
      CopyLow(activ2,PERIOD_CURRENT,0,limit,Price2);
     }
  }

Está intentando copiar los datos de otro símbolo de forma precipitada. No deberías hacer esto. Primero hay que descargar, preparar y comprobar los datos... Esta es la descripción:Organización del acceso a los datos

 
Karputov Vladimir:

Hay un error en la función:

Estás tratando de copiar los datos de otro personaje de forma apresurada. Esta no es la manera de hacerlo. Primero hay que cargar los datos, prepararlos, asegurarse... Esta es la descripción:Organizar el acceso a los datos

Gracias por el consejo. Voy a echar un vistazo.
Razón de la queja: