Analogue à iBarShift - page 15

 
Alexey Kozitsyn:
Au fait, à propos de la fonction Bars(). Cela pourrait être la cause de la victoire.
C'est facile à vérifier. Changez toutes les barres en mes iBars. Si le coin disparaît, alors le problème se situe dans cette fonction. Moi aussi, je n'ai pas réussi à trouver la raison du gel de certains de mes indicateurs. Il s'est avéré que c'était ce bug particulier, tout vole maintenant.
 
fxsaber:

Les cotypes peuvent aller pour tous les personnages sauf celui qui nous intéresse.

OK, j'ai regardé le nouveau code source. J'ai vu que les modifications qui ont été discutées n'ont pas été faites. Sortie.

L'utilisation de SYMBOL_TIME n'a de sens que lorsque le symbole demandé n'est pas dans la fenêtre Market Watch. Alors le TimeCurrent ne fera pas son travail. Mais cette variante d'utilisation des barres me semble peu probable. Mais le prix à payer pour obtenir l'heure actuelle via SYMBOL_TIME est beaucoup plus élevé, car SymbolInfoInteger(symbol_name,SYMBOL_TIME) prend presque un ordre de grandeur de plus. Bien sûr, vous pouvez vérifier si le symbole figure dans le rapport de marché et, en fonction du résultat, utiliserTimeCurrent ou SYMBOL_TIME, mais ce n'est pas gratuit. De plus, vous devez toujours surveiller si un nouveau symbole est ajouté ou supprimé du rapport de marché. Il est donc plus facile de prévoir une clause selon laquelle, pour un fonctionnement correct des iBars, il est raisonnable d'avoir le symbole demandé dans le rapport de marché.

À propos de SERIES_LASTBAR_DATE, je pense que vous avez tort.SymbolInfoInteger(symbol_name,SYMBOL_TIME) est un moindre mal.

La fonction SeriesInfoInteger ne provoque pas de pagination de l'historique. Si quelque chose en est la cause, c'est une demande de barreaux, ce qui est logique. Et la source des freins peut être vue dans ce court script, si vous le lancez

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

Généralement un bug très étrange. J'ai vérifié l'effet de l'historique des téléchargements sur celui-ci lorsque j'ai constaté que soudainement aujourd'hui sur le symbole EURUSD il n'apparaissait presque plus.

Il m'a forcé à télécharger tout l'historique. Et le bug est réapparu.

Je suppose que l'historique des téléchargements n'a aucun effet sur ce bug.

Je ne comprends pas pourquoi ce bug circule.

J'ai utilisé ce script pour le tester :

Dossiers :
TestiBars.mq5  11 kb
 
Nikolai Semko:

Je ne comprends pas pourquoi ce bug circule.

Le SD est-il au courant de tout ce sujet ?

 
En général, je pense que le chargement/chargement de données est le point faible du terminal.
 
Alexey Kozitsyn:

Le SD est-il au courant de tout ce sujet ?

Oui, j'y ai déjà écrit le 30.03.2018 - jusqu'ici silence.

Alexey Kozitsyn:
En général, je pense que le chargement/chargement de données est le point faible du terminal.

D'accord, mais c'est aussi l'une des tâches les plus difficiles.

 
Nikolai Semko:

La fonction iBars est assez lourde, mais je recommande tout de même de l'utiliser à la place des Bars normales, jusqu'à ce que MQ corrige le bogue qui la bloque.

L'iBar se bloque alors que logiquement elle devrait retourner 0. En règle générale, il le renvoie pendant plus de 10 secondes. Il n'y a pas de tel bogue dans MQL4.

Dans la majorité des tâches, iBars fonctionnera plus rapidement que les barres normales, car non seulement il évitera le bogue, mais il essaiera de ne pas utiliser les fonctions Bars et SeriesInfoInteger chaque fois que possible, en raison de l'algorithme de sauvegarde des valeurs précédentes.

J'ai testé cette fonction dans le monde entier. Il semble que ce soit une copie intégrale de Bars.

Peut-être peut-on le faire d'une manière plus élégante. Si vous en avez envie, vous êtes les bienvenus. Si vous trouvez des erreurs, nous les corrigerons.

Alors...

L'analogue complet de la fonction iBarsShift aura alors la forme suivante :

Et la variante sans le dernier paramètre, qui est utilisée dans la grande majorité des cas, ressemblera à ceci :

J'utilise votre code iBarsShift+iBars (et d'autres iBarsShift) et j'obtiens 0 de iBarsShift, et une erreur lorsque le graphique TF H1 et le calcul pour H1.

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

ce qui correspond à cette ligne de code

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

Voici le code de l'indicateur dans son ensemble

#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);
  }

PourquoiPrint(Day_Shift) renvoie toujours zéro, alors que la date et l'heure sont correctes ?

Il semble que ce soit un effet du week-end, puisque tout fonctionnait correctement l'autre jour (bien qu'avec une fonction différente, mais cela ne fonctionne pas non plus aujourd'hui).

 
Aleksey Vyazmikin:

J'utilise votre code iBarsShift+iBars (et d'autres iBarsShift) et j'obtiens 0 de iBarsShift, et lorsque le graphique TF H1 et le calcul sur H1 une erreur.

ce qui correspond à cette ligne de code

Voici le code de l'indicateur dans son ensemble

PourquoiPrint(Day_Shift) renvoie toujours zéro, alors que date et date sont correctes ?

Il semble que ce soit un effet du week-end, puisque tout fonctionnait correctement l'autre jour (bien qu'avec une fonction différente, mais elle ne fonctionne pas non plus aujourd'hui).

Je m'excuse d'avoir laissé le code dans la mauvaise forme.

J'ai remarqué l'imprécision à l'époque et je l'ai presque corrigée, mais il y avait encore un petit problème facile à résoudre.
Je viens d'abandonner le code car je suis en train d'étudier et les examens ont commencé et je n'ai tout simplement pas le temps. Le dernier examen a lieu le 24 avril.
Après cela, je vais tout réparer et le poster sur CB.

J'ai déjà commencé à le publier, mais je l'ai mis en attente.


 
Nikolai Semko:

Je m'excuse d'avoir laissé le code dans la mauvaise forme.

J'ai remarqué le travail imprécis à l'époque et j'ai failli le corriger, mais il restait un petit problème facile à régler.
Je viens d'abandonner le code parce que j'étudie maintenant et que la période des examens a commencé et que je n'ai tout simplement pas le temps. Le dernier examen a lieu le 24 avril.
Après cela, je vais tout réparer et le poster sur CB.

J'ai déjà commencé à poster mais je l'ai mis en attente.


J'attendrai les corrections dans la forme finale, merci d'avoir répondu.

Bonne chance pour les examens !

 
Aleksey Vyazmikin:

J'attendrai les corrections dans la forme finale, merci de m'avoir répondu.

Bonne chance avec vos examens !

Merci))
Raison: