Errores, fallos, preguntas - página 54

 

Estaría bien que nos pusieras a todos un ejemplo de indicador que funcione bien en el gráfico y en el probador.

He cambiado mi versión, ahora los valores del indicador en el gráfico coinciden con el historial pero los valores en el probador no.

¿Qué he hecho mal?

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   2
//--- plot Label1
#property indicator_label1  "I1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  Red
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot Label2
#property indicator_label2  "I2"
#property indicator_type2   DRAW_LINE
#property indicator_color2  Green
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//--- indicator buffers
double         I1Buffer[];
double         I2Buffer[];
int OnInit()
  {
   SetIndexBuffer(0,I1Buffer,INDICATOR_DATA);
   SetIndexBuffer(1,I2Buffer,INDICATOR_DATA);
   return(0);
  }
int OnCalculate (const int rates_total,      // размер входных таймсерий
                 const int prev_calculated,  // обработано баров на предыдущем вызове
                 const datetime& time[],     // Time
                 const double& open[],       // Open
                 const double& high[],       // High
                 const double& low[],        // Low
                 const double& close[],      // Close
                 const long& tick_volume[],  // Tick Volume
                 const long& volume[],       // Real Volume
                 const int& spread[])        // Spread
  {
   string Symbol_1="EURUSD",Symbol_2="GBPUSD";
   if(rates_total<1) return(0);
   double Arr1[],Arr2[];
   int end,rez0,rez1,rez_0,rez_1;
   datetime ld1[],ld2[];
   end=MathMin((int)SeriesInfoInteger(Symbol_1,0,SERIES_BARS_COUNT)-1,(int)SeriesInfoInteger(Symbol_2,0,SERIES_BARS_COUNT)-1);
   end=MathMin(end,rates_total-prev_calculated+1);
   rez0=CopyClose(Symbol_1,PERIOD_CURRENT, 0,end, Arr1);
   rez_0=CopyTime(Symbol_1,PERIOD_CURRENT, 0,end, ld1);
   if(rez0==-1){Print("Ошибка копирования ",Symbol_1," ",GetLastError()); return(0);}
   if(rez0!=rez_0){Print("Не сходятся цены с временем",Symbol_1," ",GetLastError()); return(0);}
   rez1=CopyClose(Symbol_2,PERIOD_CURRENT, 0,end, Arr2);
   rez_1=CopyTime(Symbol_2,PERIOD_CURRENT, 0,end, ld2);
   if(rez1==-1){Print("Ошибка копирования ",Symbol_2," ",GetLastError()); return(0);}
   if(rez1!=rez_1){Print("Не сходятся цены с временем",Symbol_2," ",GetLastError()); return(0);}
   if(rez1!=rez0){Print("Ошибка Синхронизации"); return(0);}
  
   ArraySetAsSeries(Arr1,true);
   ArraySetAsSeries(Arr2,true);
   ArraySetAsSeries(ld1,true);
   ArraySetAsSeries(ld2,true);
    
   int li=rates_total-1;
   I1Buffer[li]=Arr1[0]+0.26;
   I2Buffer[li]=Arr2[0];
   li--;
  
   int shift1=0,shift2=0;  
   for(int i=1;i<end-MathMax(shift2,shift1);i++)
     {      
      if(time[li]==ld1[i+shift1])I1Buffer[li]=Arr1[i+shift1]+0.26;
      else if(time[li]>ld1[i+shift1]&&i!=0){shift1--;I1Buffer[li]=I1Buffer[li+1];}
      else if(time[li]<ld1[i+shift1]&&i!=0){shift1++;I1Buffer[li]=I1Buffer[li+1];}
            
      if(time[li]==ld2[i+shift2])I2Buffer[li]=Arr2[i+shift2];
      else if(time[li]>ld2[i+shift2]&&i!=0){shift2--;I2Buffer[li]=I2Buffer[li+1];}
      else if(time[li]<ld2[i+shift2]&&i!=0){shift2++;I2Buffer[li]=I2Buffer[li+1];}
      li--;
     }
   return(rates_total);
  }
//+------------------------------------------------------------------+

Y el Asesor Experto

int Handle;
int bars,i;
void OnInit()
  {
   Handle=iCustom(NULL,0,"proverka");
  }

void OnTick()
  {
   double   buf1[],buf2[];
   datetime time[];
//---
   if(bars==Bars(_Symbol,_Period))return;
   bars=Bars(_Symbol,_Period);
   CopyTime(_Symbol,_Period,0,2,time);
   if(CopyBuffer(Handle,0,0,2,buf1)<0 || CopyBuffer(Handle,1,0,2,buf2)<0) Print("Ошибка копирования значений индикаторных буферов ",GetLastError(),"!!");
   if(i>100)return;
   i++;
   Print("Время "+TimeToString(time[1],TIME_DATE|TIME_MINUTES),"   буф1-",buf1[1],"   буф2-",buf2[1]);
   return;
  }
Archivos adjuntos:
proverka.mq5  4 kb
prover__1.mq5  1 kb
 

Así que vuelvo a las andadas)

Si obtiene los valores del indicador a través del comprobador, serán diferentes de los valores del indicador y de los datos históricos.

Para comprobar esto, vamos a ejecutar prover.mq5 desde el 01.07.2010 en el EURUSD para el período M1, observar el registro y ver los precios reales.

 

Hola, no puedo entender la función SymbolInfoSessionTrade(), o más bien los dos últimos parámetros: inicio de sesión y fin de sesión. Puedo leer en la ayuda:


Permite obtener la hora de inicio y la hora de finalización de la sesión de negociación especificada para un símbolo y un día de la semana determinados.

Resulta que para averiguar la hora de inicio y fin de una sesión de negociación, debería conocer ya la hora de inicio y fin de la sesión de negociación (en segundos), lo cual no es coherente.

Документация по MQL5: Получение рыночной информации / SymbolInfoSessionQuote
Документация по MQL5: Получение рыночной информации / SymbolInfoSessionQuote
  • www.mql5.com
Получение рыночной информации / SymbolInfoSessionQuote - Документация по MQL5
 
kirill190982:

Hola, no consigo entender la función SymbolInfoSessionTrade(), más concretamente los dos últimos parámetros: inicio y fin de sesión. He leído en la ayuda:

En estos parámetros, la funciónSymbolInfoSessionTrade( ) pasa variables que registrarán la hora de inicio y de finalización.

void OnTick()
  {
   datetime ld_start, ld_end;
   SymbolInfoSessionTrade(
   _Symbol,    // имя символа
   MONDAY,      // день недели
   0,           // Порядковый номер сессии
   ld_start,    // время начала сессии
   ld_end       // время окончания сессии
   );
   
   Print(ld_start," - ",ld_end);
  }

Por cierto, hay un error en la ayuda:

uintsession_index,// nombre del símbolo

 
ddd06:

En estos parámetros de la funciónSymbolInfoSessionTrade( ) se pasan variables en las que se escribirán las horas de inicio y fin.

Gracias, lo tengo.
 

He simplificado la obtención de un error.

Este es un Asesor Experto que copia matrices de precios CLOSE

int bars,i;
void OnTick()
  {
   if(bars==Bars(_Symbol,_Period))return;
   bars=Bars(_Symbol,_Period);
   if(i>100)return;
   i++;  
   datetime time[];  
   double Arr1[],Arr2[];
   CopyTime(_Symbol,_Period,0,2,time);
   CopyClose("EURUSD",PERIOD_CURRENT, 0, 2, Arr1);
   CopyClose("GBPUSD",PERIOD_CURRENT, 0, 2, Arr2);
   Print("Время "+TimeToString(time[1],TIME_DATE|TIME_MINUTES),"  mas1(EURUSD)-",Arr1[1],"   mas2(GBPUSD)-",Arr2[1]);
   return;
  }

Ejecutamos prover.mq5 desde el 01.07.2010 en el EURUSD para el periodo M1, observamos el registro y vemos los precios reales

De vez en cuando vemos valores incorrectos

Además, hasta la 01.00 el precio del GBPUSD se congela en 1.49393, después comienza a correr.

Llevo un mes sufriendo y no puedo probar mi Expert Advisor multidivisa

 
ddd06:

He simplificado la obtención de un error.

Este es un Asesor Experto que copia matrices de precios CLOSE

Ejecutamos prover.mq5 desde el 01.07.2010 en el EURUSD para el periodo M1, observamos el registro y vemos los precios reales

Y de vez en cuando vemos valores incorrectos

Además, hasta la 01.00 el precio del GBPUSD se congela en 1.49393, después comienza a correr.

Llevo un mes sufriendo esto y no puedo probar mi Expert Advisor multidivisa

Está trabajando con los valores actuales en una barra sin terminar.

Prueba esto

Print("Время "+TimeToString(time[0],TIME_DATE|TIME_MINUTES),"  mas1(EURUSD)-",Arr1[0],"   mas2(GBPUSD)-",Arr2[0]);

O bien establecer las series temporales de las matrices.

 
stringo:

Está trabajando con los valores actuales en una barra sin terminar.

Pruébalo así

O establecer las series temporales de las matrices.

Continúa
int bars,i;
void OnTick()
  {
   if(bars==Bars(_Symbol,_Period))return;
   bars=Bars(_Symbol,_Period);
   if(i>100)return;
   i++;  
   datetime time[];  
   double Arr1[],Arr2[];
   CopyTime(_Symbol,_Period,0,2,time);
   CopyClose("EURUSD",PERIOD_CURRENT, 0, 2, Arr1);
   CopyClose("GBPUSD",PERIOD_CURRENT, 0, 2, Arr2);
   Print("Время "+TimeToString(time[0],TIME_DATE|TIME_MINUTES),"  mas1(EURUSD)-",Arr1[0],"   mas2(GBPUSD)-",Arr2[0]);
   return;
  }

Y te niegas obstinadamente a responder por qué las comillas están al principio.

En el EURUSD parece que ha empezado a coincidir)

 

Si ese es el caso, entonces debes mantener 2 matrices de tiempo. Algunas veces se copia del EURUSD, otras del GBPUSD

 
stringo:

Si ese es el caso, entonces debes mantener 2 matrices de tiempo. Algunos tiempos deben copiarse del EURUSD, otros del GBPUSD

Bueno.

int bars,i;
void OnTick()
  {
   if(bars==Bars(_Symbol,_Period))return;
   bars=Bars(_Symbol,_Period);
   if(i>100)return;
   i++;  
   datetime time1[],time2[];  
   double Arr1[],Arr2[];
   CopyTime("EURUSD",_Period,0,2,time1);
   CopyTime("GBPUSD",_Period,0,2,time2);
   CopyClose("EURUSD",PERIOD_CURRENT, 0, 2, Arr1);
   CopyClose("GBPUSD",PERIOD_CURRENT, 0, 2, Arr2);
   Print("Время EURUSD"+TimeToString(time1[0],TIME_DATE|TIME_MINUTES), "  Время GBPUSD"+TimeToString(time2[0],TIME_DATE|TIME_MINUTES),"    mas1(EURUSD)-",Arr1[0],"   mas2(GBPUSD)-",Arr2[0]);
   return;
  }

No creo que deba ser así, ¿y tú?