Análogo a iBarShift - página 15

 
Alexey Kozitsyn:
Por cierto, sobre la función Bars(). Podría ser la causa de la victoria.
Esto es fácil de comprobar. Cambiar todas las barras a mis iBars. Si la cuña desaparece, entonces el problema está en esa función. Yo también no he podido averiguar la razón por la que algunos de mis indicadores se congelan. Resultó ser este bicho en particular, todo está volando ahora.
 
fxsaber:

Los cotopos pueden ir para todos los personajes menos para el de interés.

Vale, he mirado el nuevo código fuente. Vi que no se hicieron las ediciones que se discutieron. Salir.

Sólo tiene sentido utilizar SYMBOL_TIME cuando el símbolo solicitado no está en la ventana de Market Watch. Entonces TimeCurrent no hará su trabajo. Pero esta variante de usar Bares me parece poco probable. Pero el precio de obtener la hora actual a través de SYMBOL_TIME es mucho mayor porque SymbolInfoInteger(symbol_name,SYMBOL_TIME) tarda casi un orden de magnitud más. Por supuesto, se puede comprobar si el símbolo está en el informe de mercado y dependiendo del resultado utilizarTimeCurrent o SYMBOL_TIME, pero no es gratis, además siempre hay que controlar si se añade o se elimina un nuevo símbolo del informe de mercado. Por lo tanto, es más fácil hacer una cláusula que para el correcto funcionamiento de iBars es razonable tener el símbolo solicitado en el informe de mercado.

Sobre SERIES_LASTBAR_DATE creo que te equivocas.SymbolInfoInteger(symbol_name,SYMBOL_TIME) es el mal menor.

La función SeriesInfoInteger no provoca ninguna paginación del historial. Si hay algo que lo provoca es una petición de Bares, lo cual es lógico. Y la fuente de los frenos se puede ver en este corto script, si lo ejecutas

void OnStart()
  {
   Print("1");
   Print(Bars(_Symbol,PERIOD_W1,D'2020.01.01 00:00',UINT_MAX));
   Print("2");
  }
 

En general, es un fallo muy extraño. He comprobado el efecto del historial de descargas en él cuando he encontrado que de repente hoy en el símbolo EURUSD casi no aparece.

Me obligó a descargar todo el historial. Y el bicho volvió a aparecer.

Supongo que el historial de descargas no tiene efecto en este fallo.

No entiendo por qué este error está flotando por ahí.

Utilicé este script para probarlo:

Archivos adjuntos:
TestiBars.mq5  11 kb
 
Nikolai Semko:

No entiendo por qué este error está flotando por ahí.

¿Está la SD al tanto de todo este tema?

 
En general, creo que la carga de datos es el punto débil del terminal.
 
Alexey Kozitsyn:

¿Está la SD al tanto de todo este tema?

Sí, ya escribí allí el 30.03.2018 - hasta ahora silencio.

Alexey Kozitsyn:
En general, creo que la carga de datos es el punto débil del terminal.

De acuerdo, pero también es una de las tareas más difíciles.

 
Nikolai Semko:

La función iBars es bastante engorrosa, pero sigo recomendando su uso en lugar de las Barras normales, hasta que MQ solucione el error de cuelgue que tiene.

El iBar se cuelga cuando lógicamente debería devolver 0. Por regla general, lo devuelve durante más de 10 segundos. En MQL4 no existe este error.

En la mayoría de las tareas, iBars funcionará más rápido que el Bars normal, ya que no sólo evitará el error, sino que intentará no utilizar las funciones Bars y SeriesInfoInteger siempre que sea posible debido al algoritmo de guardado de valores anteriores.

He probado esta función a fondo. Parece ser una copia completa de Bares.

Quizás se pueda hacer de una manera más elegante. Si tienes ganas, eres bienvenido. Si encuentra errores, los corregiremos.

Así que...

Entonces el análogo completo de la función iBarsShift tendrá la siguiente forma:

Y la variante sin el último parámetro, que se utiliza en la gran mayoría de los casos, tendrá este aspecto:

Utilizo su código iBarsShift+iBars (y otros iBarsShift) y obtengo 0 de iBarsShift, y un error cuando el gráfico TF H1 y el cálculo para H1

2018.04.21 14:38:01.059 SVA_LinearRegression_test (Si Splice,H1)        zero divide in 'SVA_LinearRegression_test.mq5' (176,44)

que corresponde a esta línea de código

   if(timeframe<PERIOD_W1) TimeCur-=TimeCur% PerSec;

Este es el código del indicador en su conjunto

#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_plots   3

//--- plot Label1
#property indicator_label1  "LR_line"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrGold
#property indicator_style1  STYLE_DOT
#property indicator_width1  1
//--- plot Label2
#property indicator_label2  "Sup_line"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrAquamarine
#property indicator_style2  STYLE_DOT
#property indicator_width2  1
//--- plot Label3
#property indicator_label3  "Res_line"
#property indicator_type3   DRAW_LINE
#property indicator_color3  clrOrangeRed
#property indicator_style3  STYLE_DOT
#property indicator_width3  1


//--- input parameters
input ENUM_TIMEFRAMES TF=PERIOD_D1;
input int Bar=3;
input bool UseClose = true;


//--- indicator buffers
double LR_line_Ind[];
double Sup_line_Ind[];
double Res_line_Ind[];

//---
int limit,start;

//Список переменных:
static datetime TimeN=0;
int  barsToCount=0;

int InpChannelPeriod=1000;
double OpenI[];
double HighI[];
double LowI[];
double CloseI[];
double arr[];

double Calc_LR_line=0.0;
double Calc_Sup_line=0.0;
double Calc_Res_line=0.0;


//////////////////////////////////////////////////////////////////////

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,LR_line_Ind,INDICATOR_DATA);
   SetIndexBuffer(1,Sup_line_Ind,INDICATOR_DATA);
   SetIndexBuffer(2,Res_line_Ind,INDICATOR_DATA);   
//--- set accuracy
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
//--- set first bar from what index will be drawn
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,InpChannelPeriod);
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,InpChannelPeriod);
   PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,InpChannelPeriod);   
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                         |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{


}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
   ArraySetAsSeries(LR_line_Ind,true); 
   ArraySetAsSeries(Sup_line_Ind,true); 
   ArraySetAsSeries(Res_line_Ind,true); 
   ArraySetAsSeries(time,true); 

//--- check for rates
   if(rates_total<InpChannelPeriod) return(0);
//--- preliminary calculations
   if(prev_calculated==0) limit=InpChannelPeriod;
   else limit=prev_calculated;
//--- the main loop of calculations
   for(int C=limit;C<rates_total && !IsStopped();C++)
     {
       LRegrf(C);
       LR_line_Ind[C]=Calc_LR_line;
       Sup_line_Ind[C]=Calc_Sup_line;
       Res_line_Ind[C]=Calc_Res_line;    
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
  
//+------------------------------------------------------------------+
double LRegrf(int index)
{
int Day_Shift=iBarShift(_Symbol,TF,iTime(_Symbol,PERIOD_CURRENT,index),false);

Print(iTime(_Symbol,PERIOD_CURRENT,index));
Print(Day_Shift);

return (0);
}
//-------------------------------------------------------------------
//==MQL4toMQL5
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
datetime iTime(string symbol,ENUM_TIMEFRAMES tf,int index)
  {
   if(index < 0) return(-1);
//   ENUM_TIMEFRAMES timeframe=TFMigrate(tf);
   //ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT;
   datetime Arr[];
   if(CopyTime(symbol,tf,index,1,Arr)>0)
      return(Arr[0]);
   else return(-1);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int iBarShift(const string Symb,const ENUM_TIMEFRAMES TimeFrame,datetime time,bool exact=false)
  {
   int Res=iBars(Symb,TimeFrame,time+1,UINT_MAX);
   if(exact) if((TimeFrame!=PERIOD_MN1 || time>TimeCurrent()) && Res==iBars(Symb,TimeFrame,time-PeriodSeconds(TimeFrame)+1,UINT_MAX)) return(-1);
   return(Res);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int iBars(string symbol_name,ENUM_TIMEFRAMES  timeframe,datetime start_time,datetime stop_time)
  {
   static string LastSymb=NULL;
   static ENUM_TIMEFRAMES LastTimeFrame=0;
   static datetime LastTime=0;
   static datetime LastTime0=0;
   static int PerSec=0;
   static int PreBars=0;
   static datetime LastBAR=0;
   static datetime LastTimeCur=0;
   datetime TimeCur;
   if(stop_time<start_time) {TimeCur=stop_time; stop_time=start_time; start_time=TimeCur; }
   TimeCur=TimeCurrent();
   if(LastTimeFrame!=timeframe) if(timeframe==PERIOD_MN1) PerSec=2419200; else PerSec=::PeriodSeconds(timeframe);
   if(timeframe<PERIOD_W1) TimeCur-=TimeCur%PerSec;
   if(start_time>TimeCur) {LastSymb=NULL; return(0);}
   if(LastTimeFrame!=timeframe || LastSymb!=symbol_name || ((TimeCur-LastBAR)>0 && TimeCur!=LastTimeCur))
      LastBAR=(datetime)SeriesInfoInteger(symbol_name,timeframe,SERIES_LASTBAR_DATE);

   LastTimeCur=TimeCur;
   if(PerSec==0) return(0);
   if(start_time>LastBAR)
     {LastTimeFrame=timeframe; LastSymb=symbol_name; return(0);}

   datetime tS,tF=0;
   bool check=true;
   if(timeframe<PERIOD_W1) tS=start_time-(start_time-1)%PerSec-1;
   else if(timeframe==PERIOD_W1) tS=start_time-(start_time-259201)%PerSec-1;
   else
     {
      PerSec=2678400;
      MqlDateTime dt;
      TimeToStruct(start_time-1,dt);
      tS=dt.year*12+dt.mon;
     }
   if(stop_time<=LastBAR)
     {
      if(timeframe<PERIOD_W1) tF=stop_time-(stop_time)%PerSec;
      else if(timeframe==PERIOD_W1) tF=stop_time-(stop_time-259200)%PerSec;
      else
        {
         MqlDateTime dt0;
         TimeToStruct(stop_time,dt0);
         tF=dt0.year*12+dt0.mon;
        }
      if(tS==tF) {PreBars=0; check=false;}
     }
   if((LastTimeFrame!=timeframe || LastSymb!=symbol_name || tS!=LastTime || tF!=LastTime0) && check)
      PreBars=Bars(symbol_name,timeframe,start_time,stop_time);
   LastTime=tS; LastTime0=(datetime)tF;
   LastTimeFrame=timeframe;
   LastSymb=symbol_name;
   return(PreBars);
  }

¿Por quéPrint(Day_Shift) siempre devuelve cero, mientras que la fecha y la hora son correctas?

Parece ser un efecto del fin de semana, ya que el otro día todo funcionaba correctamente (aunque con una función diferente, pero hoy tampoco funciona).

 
Aleksey Vyazmikin:

Utilizo su código iBarsShift+iBars (y otros iBarsShift) y obtengo 0 de iBarsShift , y cuando el gráfico TF H1 y el cálculo en H1 un error

que corresponde a esta línea de código

Este es el código del indicador en su conjunto

¿Por quéPrint(Day_Shift) siempre devuelve cero, mientras que la fecha y la hora son correctas?

Parece ser un efecto del fin de semana, ya que el otro día todo funcionaba correctamente (aunque con una función diferente, pero hoy tampoco funciona).

Pido disculpas por haber dejado el código en la forma incorrecta.

Ya entonces me di cuenta de la inexactitud y estuve a punto de arreglarlo, pero seguía habiendo un pequeño problema fácilmente solucionable.
Acabo de abandonar el código debido a que estoy estudiando ahora y los exámenes han comenzado y simplemente no tengo tiempo. El último examen es el 24 de abril.
Después de eso arreglaré todo y lo publicaré en CB.

Ya he empezado a publicarlo, pero lo he dejado en suspenso.


 
Nikolai Semko:

Pido disculpas por haber dejado el código en la forma incorrecta.

Me di cuenta de la inexactitud del trabajo en aquel entonces y casi lo arreglé, pero todavía había un pequeño problema fácilmente solucionable.
Acabo de abandonar el código porque ahora estoy estudiando y ha empezado la época de exámenes y no tengo tiempo. El último examen es el 24 de abril.
Después de eso arreglaré todo y lo publicaré en CB.

Ya he empezado a publicar pero lo he dejado en suspenso.


Esperaré las correcciones en la forma final, gracias por responder.

¡Buena suerte con los exámenes!

 
Aleksey Vyazmikin:

Esperaré las correcciones en la forma final, gracias por responder.

Buena suerte con los exámenes.

Gracias))