Analog zu iBarShift - Seite 15

 
Alexey Kozitsyn:
Übrigens, zur Funktion Bars(). Das könnte die Ursache für den Durchbruch sein.
Dies ist leicht zu überprüfen. Ändern Sie alle Balken in meine iBars. Wenn der Keil verschwindet, dann liegt das Problem in dieser Funktion. Auch ich konnte den Grund für das Einfrieren einiger meiner Indikatoren nicht herausfinden. Es stellte sich heraus, dass es sich um diesen speziellen Fehler handelte, und jetzt fliegt alles.
 
fxsaber:

Cotypes können für alle Charaktere gelten, außer für den, der von Interesse ist.

OK, ich habe mir den neuen Quellcode angesehen. Ich habe gesehen, dass die besprochenen Änderungen noch nicht vorgenommen worden sind. Ausstieg.

Die Verwendung von SYMBOL_TIME ist nur dann sinnvoll, wenn sich das gewünschte Symbol nicht im Market Watch-Fenster befindet. Dann wird TimeCurrent seine Aufgabe nicht erfüllen. Diese Variante der Verwendung von Balken erscheint mir jedoch unwahrscheinlich. Der Preis für die Ermittlung der aktuellen Zeit über SYMBOL_TIME ist jedoch viel höher, da SymbolInfoInteger(symbol_name,SYMBOL_TIME) fast eine Größenordnung länger braucht. Natürlich können Sie prüfen, ob das Symbol im Marktbericht enthalten ist, und je nach ErgebnisTimeCurrent oder SYMBOL_TIME verwenden, aber das ist nicht kostenlos, außerdem müssen Sie immer überwachen, ob ein neues Symbol hinzugefügt oder aus dem Marktbericht gelöscht wird. Daher ist es einfacher, eine Klausel zu machen, dass es für die korrekte Arbeit von iBars sinnvoll ist, das gewünschte Symbol im Marktbericht zu haben.

Was SERIES_LASTBAR_DATE betrifft, so denke ich, dass Sie falsch liegen.SymbolInfoInteger(symbol_name,SYMBOL_TIME) ist das kleinere Übel.

Die Funktion SeriesInfoInteger verursacht kein Paging der Historie. Wenn es einen Grund dafür gibt, dann ist es die Anforderung von Bars, was logisch ist. Und die Quelle der Bremsen ist in diesem kurzen Skript zu sehen, wenn Sie es ausführen

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

Im Allgemeinen ein sehr seltsamer Fehler. Ich überprüfte die Auswirkungen der Download-Historie, als ich feststellte, dass das EURUSD-Symbol heute plötzlich fast nicht mehr auftauchte.

Ich war gezwungen, den gesamten Verlauf herunterzuladen. Und der Fehler tauchte wieder auf.

Ich vermute, dass der Download-Verlauf keinen Einfluss auf diesen Fehler hat.

Ich verstehe nicht, warum dieser Fehler im Umlauf ist.

Verwenden Sie dieses Skript, um es zu testen:

Dateien:
TestiBars.mq5  11 kb
 
Nikolai Semko:

Ich verstehe nicht, warum dieser Fehler im Umlauf ist.

Ist der SD über diese ganze Thematik informiert?

 
Generell halte ich das Laden von Daten für den Schwachpunkt des Terminals.
 
Alexey Kozitsyn:

Ist der SD über diese ganze Thematik informiert?

Ja, schrieb dort bereits am 30.03.2018 - bisher Schweigen.

Alexey Kozitsyn:
Generell halte ich das Laden von Daten für den Schwachpunkt des Terminals.

Stimmt, aber es ist auch eine der schwierigsten Aufgaben.

 
Nikolai Semko:

Die iBars-Funktion ist recht umständlich, aber ich empfehle sie trotzdem anstelle der regulären Bars zu verwenden, bis MQ den Hänger in der Funktion behoben hat.

Der iBar bleibt hängen, obwohl er logischerweise 0 zurückgeben sollte. In der Regel wird sie für mehr als 10 Sekunden zurückgegeben. In MQL4 gibt es keinen solchen Fehler.

Bei den meisten Aufgaben wird iBars schneller arbeiten als die regulären Bars, da es nicht nur den Fehler vermeidet, sondern auch versucht, die Bars- und SeriesInfoInteger-Funktionen wegen des Algorithmus zum Speichern früherer Werte möglichst nicht zu verwenden.

Ich habe diese Funktion auf und ab getestet. Es scheint eine vollständige Kopie von Bars zu sein.

Vielleicht lässt sich das auf elegantere Weise bewerkstelligen. Wenn Sie einen Wunsch haben, sind Sie willkommen. Wenn Sie Fehler finden, werden wir sie beheben.

Also...

Dann hat die vollständige Analogie der Funktion iBarsShift die folgende Form:

Und die Variante ohne den letzten Parameter, die in den allermeisten Fällen verwendet wird, sieht wie folgt aus:

Ich benutze Ihren Code iBarsShift+iBars (und andere iBarsShift) und erhalten 0 von iBarsShift, und ein Fehler, wenn TF-Chart H1 und die Berechnung auf H1

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

was der folgenden Codezeile entspricht

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

Hier ist der Code des Indikators als Ganzes

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

Warum liefertPrint(Day_Shift) immer Null, während Datum und Uhrzeit korrekt sind?

Es scheint sich um einen Wochenend-Effekt zu handeln, da am anderen Tag alles korrekt funktionierte (wenn auch mit einer anderen Funktion, aber auch heute funktioniert es nicht).

 
Aleksey Vyazmikin:

Ich benutze Ihren Code iBarsShift+iBars (und andere iBarsShift) und erhalten 0 von iBarsShift, und wenn TF Chart H1 und Berechnung auf H1 ein Fehler

was der folgenden Codezeile entspricht

Hier der Code des Indikators als Ganzes

Warum liefertPrint(Day_Shift) immer Null, während Datum und Uhrzeit korrekt sind?

Es scheint sich um einen Wochenend-Effekt zu handeln, da am anderen Tag alles korrekt funktionierte (wenn auch mit einer anderen Funktion, aber auch heute funktioniert es nicht).

Ich entschuldige mich dafür, dass ich den Code in der falschen Form hinterlassen habe.

Ich habe die Ungenauigkeit damals bemerkt und sie fast behoben, aber es gab noch ein kleines, leicht zu behebendes Problem.
Ich habe den Code gerade aufgegeben, weil ich jetzt studiere und die Prüfungen begonnen haben und ich einfach keine Zeit habe. Die letzte Prüfung findet am 24. April statt.
Danach werde ich alles in Ordnung bringen und es auf CB veröffentlichen.

Ich habe bereits mit der Veröffentlichung begonnen, sie aber auf Eis gelegt.


 
Nikolai Semko:

Ich entschuldige mich dafür, dass ich den Code in der falschen Form hinterlassen habe.

Ich habe die ungenaue Arbeit damals bemerkt und sie fast behoben, aber es gab noch ein kleines, leicht zu behebendes Problem.
Ich habe den Code gerade aufgegeben, weil ich jetzt lerne und die Prüfungszeit begonnen hat und ich einfach keine Zeit habe. Die letzte Prüfung findet am 24. April statt.
Danach werde ich alles in Ordnung bringen und es auf CB veröffentlichen.

Ich habe bereits mit der Veröffentlichung begonnen, sie aber auf Eis gelegt.


Ich werde die Korrekturen in der endgültigen Form abwarten, danke für die Antwort.

Viel Glück bei den Prüfungen!

 
Aleksey Vyazmikin:

Ich werde die Korrekturen in der endgültigen Form abwarten, danke für Ihre Antwort.

Viel Glück bei Ihren Prüfungen!

Danke))