Analog zu iBarShift - Seite 4

 
Nikolai Semko:

Meiner Meinung nach ist die Verwendung der FunktionSeriesInfoInteger überflüssig, da sie nicht frei ist.

War:

Wurde:

Ein Geschwindigkeitsgewinn von etwa dem 1,5-fachen.

2% Gewinn. Anmerkung.

funktioniert nicht korrekt mit PERIOD_W1 und PERIOD_MN1, weil es vom 1. Januar 1970 an gezählt wird und es Donnerstag und nicht Montag ist. Und jeder Monat hat eine andere Anzahl von Sekunden.

Dies muss in die PeriodSeconds-Dokumentation aufgenommen werden.

 
Aleksey Vyazmikin:

Ich habe es nicht überprüft - weil ich sicher wissen muss, ob der Code in einer bestimmten Situation funktioniert oder nicht, denn es ist nicht korrekt, jemand anderem die Schuld zu geben, wenn man selbst einen Fehler gemacht hat.

Ich spreche von Situationen wie dieser: Nehmen wir an, ein Tag hat 14 Stunden (oder weniger, wenn es nicht stündlich Kurse gibt), ich habe ein M1-Diagramm und muss die Verschiebung eines Balkens auf M15 für den Vortag kennen. Funktioniert also alles korrekt, wenn ich 45 Minuten in einer Stunde oder 14 Stunden an einem Tag oder andere Zeit- bzw. Schaltabweichungen erhalte?

Ich persönlich halte es für angemessen, ein solches Merkmal zu verwenden:

int iBarShift(const string Symb,const ENUM_TIMEFRAMES TimeFrame,datetime time)
  {
   static int Res=-1;
   static string LastSymb=NULL;
   static ENUM_TIMEFRAMES LastTimeFrame=0;
   static datetime LastTime=0;

   if((time!=LastTime) || (Symb!=LastSymb) || (TimeFrame!=LastTimeFrame))
     {
      Res=::Bars(Symb,TimeFrame,time,UINT_MAX)-1; 
      if(Res<0) Res=0;

      LastTime = time;
      LastSymb = Symb;
      LastTimeFrame=TimeFrame;
     }
   return(Res);
  }

Aber es sollte beachtet werden, dass es kein volles Analogon der MQL4iBarShift Funktion ist, zumindest aufgrund der Tatsache, dass es keinenExact Parameter hat

Ansonsten ist sie identisch.

Ich füge ein einfaches MQL4-Skript ein, das die vollständige Identität der Standardfunktion mit dieser zeigt.

Wenn die Werte der StandardfunktioniBarShift und meiner Funktion nicht gleich sind, wird Print. Bei mir wurde nichts gedruckt.

//+------------------------------------------------------------------+
//|                                                    iBarShift.mq4 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   datetime t=TimeCurrent()+1000;
   const ENUM_TIMEFRAMES tf[9]={PERIOD_M1,PERIOD_M5,PERIOD_M15,PERIOD_M30,PERIOD_H1,PERIOD_H4,PERIOD_D1,PERIOD_W1,PERIOD_MN1};
   while(!IsStopped())
     {
      for(int i=0; i<9;i++)
        {
         int i1=iBarShift(NULL,tf[i],t);
         int i2=iBarShift2(NULL,tf[i],t);
         if(i1!=i2) Print(EnumToString(tf[i]),"   ",TimeToString(t),"   ",i1,"   ",i2);
        }
      t-=10;
      Comment(TimeToString(t));
     }

  }
//+------------------------------------------------------------------+
int iBarShift2(const string Symb,const ENUM_TIMEFRAMES TimeFrame,datetime time)
  {
   static int Res=-1;
   static string LastSymb=NULL;
   static ENUM_TIMEFRAMES LastTimeFrame=0;
   static datetime LastTime=0;

   if((time!=LastTime) || (Symb!=LastSymb) || (TimeFrame!=LastTimeFrame))
     {
      Res=::Bars(Symb,TimeFrame,time,UINT_MAX)-1;
      if(Res<0) Res=0;

      LastTime = time;
      LastSymb = Symb;
      LastTimeFrame=TimeFrame;
     }
   return(Res);
  }
//+------------------------------------------------------------------+
 
fxsaber:

2% Gewinnquote. Anmerkung.

Was, wirklich?

Ich war zu faul, GetMicrosecondCount() einzusetzen, also habe ich mich auf die Profilerstellung verlassen.

 
Nikolai Semko:

Wirklich?

Ich war zu faul, GetMicrosecondCount() zu setzen, also habe ich mich auf die Profilerstellung verlassen.

Beim Profiling geht es um etwas anderes. 2 % ist der maximale Gewinn, den Sie erzielen können.

250 Millionen Aufrufe im Tester auf meinem Rechner ergeben eine Einsparung von 1 Sekunde.

Ihre Option ist auf jeden Fall die beste! Aber ich kann mir nicht einmal vorstellen, warum man im MT5 mit Balken arbeiten muss.

 
fxsaber:

Aber ich habe keine Ahnung, warum ich im MT5 mit Balken arbeiten muss.

Ich benutze sie, wenn ich die Maus steuere. Zum Beispiel hier.

 
Nikolai Semko:

Ich verwende dies bei der Steuerung der Maus. Hier zum Beispiel.

Ja, das ist es, was ich nicht verstehe.

 
fxsaber:

Ja, das ist es, was ich nicht verstehe.

Und ich verstehe das Missverständnis nicht ))

Ich habe zum Beispiel einen Kanal, zu dessen Merkmalen die Startzeit (linker Rand) gehört. Und ich muss diesen Kanal auf verschiedenen TFs aufbauen. Was bleibt mir also anderes übrig, als die Taktnummer in einer neuen TF zu suchen?

Ich habe eine Menge anderer Dinge.

Wenn ich zum Beispiel alle TFs zu einer einzigen mit einer logarithmischen Skala zusammenfasse. Das ist ein sehr cooles Thema. Auch hier kann man auf die iBarShift-Analogie nicht verzichten

 
Nikolai Semko:

Ich persönlich halte es für sinnvoll, eine solche Funktion zu verwenden:

Es ist jedoch anzumerken, dass es sich nicht um ein vollständiges Analogon der Standard-MQL4-FunktioniBarShift handelt, zumindest weil es den ParameterExact nicht hat

Ansonsten ist sie identisch.

Ich füge ein einfaches MQL4-Skript ein, das die vollständige Identität der Standardfunktion mit dieser zeigt.

Wenn die Werte der StandardfunktioniBarShift und meiner Funktion nicht gleich sind, wird Print. Ich habe nichts gedruckt.

Nein, das ist nicht der Fall wegen Comment().

Wenn man ihn entfernt, gibt es eine Abweichung von 1, aber ich glaube nicht, dass es ein Fehler ist, weil der neue Balken in zwei Algorithmen mit einer Verschiebung um einen halben Balken definiert ist. Meine Version der neuen Balkenerkennung erscheint mir logischer als die Standardversion.

 
Nikolai Semko:

Und ich verstehe das Missverständnis nicht ))

Ich verstehe nicht, warum man Balken verwenden sollte. CopyRates usw.

 

Warum ist das Skript so langsam?

2018.03.30 09:21:05.208 BS (Si Splice,H4) 1 Start=15 Stop=3 Day_Shift=0 index=0

2018.03.30 09:21:05.208 BS (Si Splice,H4) 1 Start=2018.03.26 00:00 Stop=2018.03.29 00:00 Day_Shift=2018.03.29 20:00 index=0

2018.03.30 09:21:20.209 BS (Si Splice,H4) 2 Start=15 Stop=3 Day_Shift=0 index=0

2018.03.30 09:21:20.209 BS (Si Splice,H4) 2 Start=2018.03.26 00:00 Stop=2018.03.29 00:00 Day_Shift=2018.03.29 20:00 index=0

2018.03.30 09:20:49.300 Scripts script BS (Si Splice,H4) loaded successfully

2018.03.30 09:21:20.209 Scripts script BS (Si Splice,H4) removed

//+------------------------------------------------------------------+
//|                                                    iBarShift.mq4 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property script_show_inputs

input ENUM_TIMEFRAMES TF=PERIOD_D1;
input int Bar=3;
input int calcN=1;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   for(int index=0;index<calcN;index++)
     {
      int Day_Shift=iBarShift(_Symbol,TF,iTime(_Symbol,PERIOD_CURRENT,index),false);
      int Start=iBarShift(_Symbol,PERIOD_CURRENT,iTime(_Symbol,TF,Bar+Day_Shift),false);
      int Stop=iBarShift(_Symbol,PERIOD_CURRENT,iTime(_Symbol,TF,Day_Shift),false);

      if(index<3)Print("1 Start=",Start," Stop=",Stop," Day_Shift=",Day_Shift," index=",index);

      if(index<3)Print("1 Start=",TimeToString(iTime(_Symbol,TF,Bar+Day_Shift),TIME_DATE|TIME_MINUTES),
         " Stop=",TimeToString(iTime(_Symbol,TF,Day_Shift),TIME_DATE|TIME_MINUTES),
         " Day_Shift=",TimeToString(iTime(_Symbol,PERIOD_CURRENT,index),TIME_DATE|TIME_MINUTES)," index=",index);
     }



   for(int index=0;index<calcN;index++)
     {
      int Day_Shift=iBarShift2(_Symbol,TF,iTime(_Symbol,PERIOD_CURRENT,index),false);
      int Start=iBarShift2(_Symbol,PERIOD_CURRENT,iTime(_Symbol,TF,Bar+Day_Shift),false);
      int Stop=iBarShift2(_Symbol,PERIOD_CURRENT,iTime(_Symbol,TF,Day_Shift),false);

      if(index<3)Print("2 Start=",Start," Stop=",Stop," Day_Shift=",Day_Shift," index=",index);

      if(index<3)Print("2 Start=",TimeToString(iTime(_Symbol,TF,Bar+Day_Shift),TIME_DATE|TIME_MINUTES),
         " Stop=",TimeToString(iTime(_Symbol,TF,Day_Shift),TIME_DATE|TIME_MINUTES),
         " Day_Shift=",TimeToString(iTime(_Symbol,PERIOD_CURRENT,index),TIME_DATE|TIME_MINUTES)," index=",index);
     }
   return;

  }
//+------------------------------------------------------------------+ 
//| Получим iBarShift для заданного номера бара                      | 
//+------------------------------------------------------------------+  
int iBarShift2(const string Symb,const ENUM_TIMEFRAMES TimeFrame,datetime time,bool exact=false)
  {
   static int Res=-1;
   static string LastSymb=NULL;
   static ENUM_TIMEFRAMES LastTimeFrame=0;
   static datetime LastTime=0;

   if((time!=LastTime) || (Symb!=LastSymb) || (TimeFrame!=LastTimeFrame))
     {
      Res=::Bars(Symb,TimeFrame,time,UINT_MAX)-1;
      if(Res<0) Res=0;

      LastTime = time;
      LastSymb = Symb;
      LastTimeFrame=TimeFrame;
     }
   return(Res);
  }
//+------------------------------------------------------------------+ 
//| Получим iBarShift для заданного номера бара                      | 
//+------------------------------------------------------------------+   
int iBarShift(const string Symb,const ENUM_TIMEFRAMES TimeFrame,datetime time,bool exact=false)
  {
   static int Res=-1;
   static string LastSymb=NULL;
   static ENUM_TIMEFRAMES LastTimeFrame=0;
   static datetime LastTime=0;

   if((time!=LastTime) || (Symb!=LastSymb) || (TimeFrame!=LastTimeFrame))
     {
      Res=::Bars(Symb,TimeFrame,time,UINT_MAX)-1;
      if(Res<0) Res=0;

      LastTime = time;
      LastSymb = Symb;
      LastTimeFrame=TimeFrame;
     }
   return(Res);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
datetime iTime(string symbol,ENUM_TIMEFRAMES tf,int index)
  {
   if(index < 0) return(-1);
   datetime Arr[];
   if(CopyTime(symbol,tf,index,1,Arr)>0)
      return(Arr[0]);
   else return(-1);
  }
//+------------------------------------------------------------------+
Grund der Beschwerde: