Bibliotheken: Fast iBarShift und Bars für MT5 - Seite 2

 
Alexey Navoykov:

Wenn es aber um große Berechnungen geht, ist iBarShift dort ungeeignet, weil wir mit Arrays arbeiten. iBarShift und andere ähnliche Funktionen sind eigentlich für seltene Aufrufe gedacht.Es ist irrational, sie in einer Schleife aufzurufen. Wir holen uns einfach das Array in CopyTime und finden schnell alles. Deshalb ist das Testbeispiel in der Praxis wenig hilfreich, es sei denn, der Programmierer ist ein Dummie ) und ich glaube nicht, dass es sich lohnt, sich für Dummies die Mühe zu machen ).

Ich halte es für logischer, die Funktion in eine Klasse zu packen. Dann müssen Sie nicht bei jedem Aufruf das Symbol/die Periode prüfen, sondern haben für jede Zeitreihe ein eigenes Objekt.

Ich streite nicht. Es ist nur so, dass diese Funktionen erstellt wurden, als es noch kein eingebautes iBarShift gab und Bars fehlerhaft war.

Ich persönlich brauche diese Funktionen, um das Programm und die Charts mit der Maus zu steuern. Ich erstelle auch synthetische TFs mit logarithmischer Skala und da sind diese Funktionen sehr nützlich. Sie sind notwendig, um das Problem der Mustererkennung zu lösen und beschleunigen die Berechnungen erheblich. Eine solche synthetische TF enthält die gesamte Historie eines Symbols und umfasst nur 3000 Balken.

 

Ich bin enttäuscht von den Funktionen Bars und iBarShift. MQ schafft es nicht, sie auf Vordermann zu bringen. Sie heilen eine Sache und verkrüppeln eine andere.

Mir ist klar geworden, dass es sich um rudimentäre Funktionen handelt, die man besser vergessen sollte wie einen schrecklichen Traum.

Sie sollen für Studenten und Konservative bleiben.

Ich denke, es ist sinnvoll, die Suche nach der Taktnummer nach Zeit durch die übliche Suche im time[]-Array zu verwenden.

Das kann man zum Beispiel mit Hilfe einer solchen Funktion machen:

int wBarShift(datetime t,datetime &arr[],ENUM_TIMEFRAMES tf)
  {
   int size=ArraySize(arr);
   int PerSec=PeriodSeconds(tf);
   int cur,start=0;
   int fin=size-1;
   if(t<arr[0] || t>=arr[fin]) return(0);
   if(t>=arr[fin] && t<(arr[fin]+PerSec)) return(fin);
   while(true)
     {
      cur=(start+fin)/2;
      if(t<arr[cur]) {if(t>=arr[cur-1]) return(size-cur);    fin=cur;}
      else           {if(t< arr[cur+1]) return(size-cur-1);start=cur;}
      if((arr[fin]-arr[start])==((fin-start)*PerSec) && tf!=PERIOD_MN1)
         return(size-1-start-int(int(t-arr[start])/PerSec));
     }
  }

Ja, man braucht ein Array. Aber ich persönlich habe es immer zur Hand und es wird bei jedem Tick aktualisiert. Deshalb brauche ich es nicht einmal zu bilden.

Und diese Funktion ist zehnmal schneller als das Original iBarShift.

Ein Beispiel für die Suche nach der Taktnummer nach Zeit in einem Array mit 100 000 Elementen mit der Methode der halben Division:

2018.06.22 03:29:35.533 wBarShift (EURUSD,M1)   Время выполнения wBarShift = 26   наносекунд, контрольная сумма = 5407361
2018.06.22 03:29:35.536 wBarShift (EURUSD,M1)   Время выполнения iBarShift = 3368 наносекунд, контрольная сумма = 5407361
2018.06.22 03:29:36.283 wBarShift (EURUSD,M1)   Время выполнения wBarShift = 26   наносекунд, контрольная сумма = 5305162
2018.06.22 03:29:36.286 wBarShift (EURUSD,M1)   Время выполнения iBarShift = 3318 наносекунд, контрольная сумма = 5305162
2018.06.22 03:29:37.033 wBarShift (EURUSD,M1)   Время выполнения wBarShift = 28   наносекунд, контрольная сумма = 5341596
2018.06.22 03:29:37.036 wBarShift (EURUSD,M1)   Время выполнения iBarShift = 3323 наносекунд, контрольная сумма = 5341596
2018.06.22 03:29:37.667 wBarShift (EURUSD,M1)   Время выполнения wBarShift = 30   наносекунд, контрольная сумма = 5367340
2018.06.22 03:29:37.671 wBarShift (EURUSD,M1)   Время выполнения iBarShift = 3819 наносекунд, контрольная сумма = 5367340
Dateien:
wBarShift.mq5  5 kb
 
Wow, anscheinend gibt die Umstellung auf eingebaute Funktionen wirklich einen Abzug auf die Zeit der EA-Arbeit im Tester...
 

Beheben. Wenn Sie über den bestehenden Verlauf hinausgehen, wird die falsche Position angezeigt:

void OnStart()
  {
   datetime tm=StringToTime("2000.01.01");
   int pos=fBarShift(Symbol(),Period(),tm);
   double open[];
   Print(CopyOpen(Symbol(),Period(),pos,1,open));
   ArrayPrint(open);
  }

Ergebnis:

2020.03.13 13:35:50.729 test2 (EURUSD,M1)       -1
Die Funktion fBarShift() gibt in diesem Fall die Gesamtzahl der Takte zurück, was keine korrekte Position ist.
 
Nach dem Code zu urteilen, gibt es keine Suche nach dem erforderlichen Balken, er wird berechnet. Und wenn die Geschichte ist gebrochen?
 
Aliaksandr Hryshyn:

Beheben. Wenn Sie über den bestehenden Verlauf hinausgehen, wird die falsche Position angezeigt:

Ergebnis:

2020.03.13 13:35:50.729 test2 (EURUSD,M1)       -1
Die Funktion fBarShift() gibt in diesem Fall die Gesamtzahl der Takte zurück, was keine korrekte Position ist.


Ich verstehe es nicht, es gibt -1, wie es sein sollte.

 
Aliaksandr Hryshyn:
Nach dem Code zu urteilen, gibt es keine Suche nach dem erforderlichen Balken, er wird berechnet. Und wenn der Verlauf unterbrochen ist?

Was meinen Sie mit den Worten "nach dem Code zu urteilen"?

Bilden Sie sich das nur ein oder haben Sie es gründlich studiert?

Es ist schon lange her, aber soweit ich mich erinnere, wurde nur dann eine Berechnung durchgeführt, wenn sie angemessen war, d. h. wenn der Verlauf zu 100 % intakt ist und keine Löcher aufweist. Dies lässt sich leicht überprüfen, indem man die Zeitdifferenz zwischen den Balken kontrolliert. Der Preis dafür ist ein Geschwindigkeitsgewinn. Überprüfen Sie es, wenn Sie mir nicht glauben.

Jetzt ist dieser Code schneller als der Standard-iBarShift, aber nicht signifikant (20-50%, früher war er 10 mal schneller). MQ hat den Code bereits korrigiert. Wir können also sagen, dass dieser Code nicht mehr so relevant ist.

 
Nikolai Semko:


Ich verstehe das nicht, es wird -1 zurückgegeben, wie es sein sollte.

Dies ist der Rückgabewert der Funktion CopyOpen()

Print(CopyOpen(Symbol(),Period(),pos,1,open));

Und der vierte Parameter fehlt hier:

int pos=fBarShift(Symbol(),Period(),tm);
 
Nikolai Semko:

Was meinen Sie mit "nach dem Code urteilen"?

Ist das nur Ihre Fantasie oder haben Sie den Code gründlich studiert?

Es ist schon lange her, aber soweit ich mich erinnere, gab es nur dann eine Berechnung, wenn sie angemessen war, d. h. wenn die Geschichte zu 100 % ungebrochen ist und keine Löcher aufweist. Dies lässt sich leicht überprüfen, indem man den Zeitunterschied zwischen den Balken kontrolliert. Der Preis dafür ist ein Geschwindigkeitsgewinn. Überprüfen Sie es, wenn Sie mir nicht glauben.

Jetzt ist dieser Code schneller als der Standard-iBarShift, aber nicht wesentlich (20-50%, früher war er 10 mal schneller). MQ hat den Code bereits korrigiert. Wir können also sagen, dass dieser Code nicht mehr so relevant ist.

Ich habe den Code von der ersten Seite verwendet. Es gibt keine Zyklen, also nur Berechnung (ohne dumme Varianten). Ich sage nicht, dass es falsch ist, alles ist richtig, bis auf eine Ausnahme.

 
Aliaksandr Hryshyn:

Ich habe den Code von der ersten Seite verwendet. Es gibt keine Schleifen, also nur Berechnung (ohne dumme Varianten). Ich sage nicht, dass es falsch ist, alles ist richtig, bis auf eine Ausnahme.

Man braucht dort keine Schleifen, weil die Standardfunktion Bars() verwendet wird, und das Wesen des Algorithmus besteht darin, seine Verwendung durch Berechnungen mit gespeicherten Daten früherer Funktionsaufrufe in statischen Variablen zu minimieren.

Ich habe einen Fehler behoben (in der Funktion fBarShift wurde - in + geändert). Es stellte sich heraus, dass er in meinem Code behoben war, aber ich muss vergessen haben, ihn zu posten. Aktualisiert. Version 1.04.

Der Zweck dieses Codes war es, den Fehler in der Bars()-Funktion zu bekämpfen. Die Erhöhung der Geschwindigkeit war ein "Nebeneffekt". Jetzt ist dieser Fehler verschwunden und die Geschwindigkeit wurde erheblich verbessert. Es gibt also keinen Sinn mehr für diese Bibliothek.