Merkmale der Sprache mql5, Feinheiten und Techniken - Seite 153

 
Roffild:

In der ArrayReverse Hilfe:

Die FunktionArraySetAsSeries() verschiebt die Elemente des Arrays nicht physisch, sondern kehrt lediglich die Indizierungsrichtung um, um den Zugriff auf die Elemente wie bei einerZeitreihe zu gestalten. Die Funktion ArrayReverse() verschiebt Array-Elemente physisch, so dass das Array "umgekehrt" wird.

Dieser Code beweist jedoch das Gegenteil:

Und warum? Das ist richtig.

Wenn wir es mit einem Array zu tun haben, bei dem die Nummerierung wie bei einer Zeitreihe ist, d. h. der Nullstrich ist das jüngste und das jüngste das früheste Element, wird ein neues Element neben dem jüngsten, d. h. dem frühesten, eingefügt.

Und wenn das Array nicht nummeriert ist, wie bei Zeitreihen, dann ist das Nullelement das früheste und das jüngste Element das jüngste. Wenn also ein neues Element hinzugefügt wird, steht es neben dem letzten.
Und genau das passiert in Ihrem Test.

Wo ist hier der Beweis, den ich nicht verstehe. Wie können wir das beweisen und herausfinden, wo der Anfang des Arrays im Speicher liegt und welcher Inkrementschritt positiv oder negativ ist.
Sie können dies nur durch die Übergabe des Arrays und die Verwendung von Zeigern beweisen.
Aber es ist einfacher, dies zu beweisen, indem man die Zeit misst, die für die Ausführung dieses Vorgangs benötigt wird. Wenn ein Array mit 100 000 000 Elementen sofort "umkippt", ist es klar, dass es kein Umkippen gibt; der Verweis auf den Anfang ändert sich und das Inkrement ändert sein Vorzeichen.
Ich verwende die FunktionArraySetAsSeries() ständig, und ich sehe, dass es absolut frei in der Zeit ist. Sie irren sich also.

Um ehrlich zu sein, verstehe ich nicht, warum wir eine langsameArrayReverse-Funktion benötigen, wenn wir eine schnelleArraySetAsSeries()haben

 
Roffild:

In der ArrayReverse Hilfe:

Die FunktionArraySetAsSeries() verschiebt die Elemente des Arrays nicht physisch, sondern kehrt lediglich die Indizierungsrichtung um, um den Zugriff auf die Elemente wie bei einerZeitreihe zu gestalten. Die Funktion ArrayReverse() verschiebt Array-Elemente physisch, so dass das Array "umgekehrt" wird.

Dieser Code beweist jedoch das Gegenteil:

Sie haben Speicher Neuzuweisung für ein Array mit dem asSeries-Flag, natürlich haben sie das berücksichtigt. So etwas müssen sie dort haben:

template<typename T>
T* ReAllocArray(T* array, size_t size, size_t newSize, bool asSeries) {
    auto _array = (T*)realloc(array, newSize * sizeof(T));
    if (_array == NULL) throw bad_alloc();
    auto _ptr = _array + size;
    auto ptr = _array + newSize;
    if (asSeries){
        while (_ptr != _array) *(--ptr) = *(--_ptr);
        while (ptr != _array) new(--ptr) T;
    }
    else {
        while (_ptr != ptr) new(_ptr++) T;
    }
    return _array;
}
 
Vladimir Simakov:

Sie haben Speicher Neuzuweisung für ein Array mit asSeries Flag, natürlich haben sie das berücksichtigt. So etwas müssen sie dort haben:

Ja, sie müssen das berücksichtigt haben. Dieses Verhalten entspricht jedoch nicht der FunktionCopyRates():

Unabhängig davon, welche Eigenschaft das empfangende Array hat - as_series=true oder as_series=false - werden die Daten so kopiert, dass das zeitlich älteste Element am Anfang des dem Array zugewiesenen physischen Speichers liegt.

Auch zuArrayCopy():

Wenn count<0 oder count>src_size-src_start, wird der gesamte Rest des Arrays kopiert. Arrays werden von links nach rechts kopiert. Bei seriellen Arrays wird die Startposition korrekt überschrieben , wobei das Kopieren von links nach rechts berücksichtigt wird.

Der letzte Satz ist etwas zweideutig.
 

Ich stehe ein wenig unter Schock. Ich habe einen Test in Java geschrieben. Es stellt sich heraus, dass Java fast so schnell ist wie C und damit etwas schneller als MQL5.

Ich weiß nicht, wie sie das machen, es ist ja eine Dolmetschersprache.

Ich frage mich, ob das bei Python auch so ist.

Natürlich heißt das nicht, dass MQL5 schlecht ist. Es ist nur so, dass Java zu cool ist.

Ich muss etwas übersehen haben. Seit wann sind Interpreter so schnell wie Compiler?

Offenbar ist dies nur bei partieller Kompilierung möglich, d.h. Interpreter sind nicht rein.

 
Nikolai Semko:

Ich stehe ein wenig unter Schock. Ich habe einen Test in Java geschrieben. Es stellt sich heraus, dass Java fast so schnell ist wie C und damit etwas schneller als MQL5.

Ich verstehe nicht, wie sie das machen können, es ist ja eine Dolmetschersprache.

Ich frage mich, ob das bei Python auch so ist.

Natürlich heißt das nicht, dass MQL5 schlecht ist. Es ist nur so, dass Java zu cool ist.

Ich muss etwas übersehen haben. Seit wann sind Interpreter so schnell wie Compiler?

Offenbar ist dies nur bei partieller Kompilierung möglich, d.h. Interpreter sind nicht rein.

MQL ist auch ein Interpreter.

 
Nikolai Semko:

Ich stehe ein wenig unter Schock. Ich habe einen Test in Java geschrieben. Es stellt sich heraus, dass Java fast so schnell ist wie C und damit etwas schneller als MQL5.

Ich weiß nicht, wie sie das machen, es ist ja eine Dolmetschersprache.

Ich frage mich, ob das bei Python auch so ist.

Natürlich heißt das nicht, dass MQL5 schlecht ist. Es ist nur so, dass Java zu cool ist.

Ich muss etwas übersehen haben. Seit wann sind Interpreter so schnell wie Compiler?

Offenbar ist dies nur bei partieller Kompilierung möglich, d.h. Interpreter sind nicht rein.

Java wird zwar in Bytecode übersetzt, hat aber eine eigene virtuelle Ausführungsmaschine (JVM).
Die Sprache ist außerdem streng typisiert, im Gegensatz zu anderen Sprachen mit einem Interpreter.
Höchstwahrscheinlich ist die strikte Typisierung und die JVM der Grund für die schnelle Ausführung und Übertragung von Anweisungen an die Hardware.
Die amerikanischen Handelsterminals sind nicht ohne Grund in Java geschrieben. Die CME Group in Chicago bietet offiziell in Java geschriebene Terminals an.
Ein Programmierer sagte mir einmal, dass Java seine Wurzeln in der Telekommunikation hat.
In der Telekommunikation muss man von Anfang an die Geschwindigkeit haben, Daten zu verarbeiten und zu übertragen.
Und Oracle hat eine eigene Community für die Entwicklung dieser Sprache.
Das heißt, die Sprache ist lebendig und wird von der Oracle-Gemeinschaft weiterentwickelt.

Auch die Marke Quik und die Sprache LUA wurden übrigens von den Amerikanern entwickelt.
Aber in den zotteligen 90er Jahren wurde es erfolgreich an die Russische Föderation verkauft.
Damals haben die Amerikaner schon verstanden, dass LUA keine Zukunft hat.
Und sie verkauften sie erfolgreich an die Russische Föderation, wo sich nach dem Zusammenbruch der Sowjetunion gerade ein Devisenmarkt zu bilden begann.

 
Nikolai Semko:

Ich stehe ein wenig unter Schock. Ich habe einen Test in Java geschrieben. Es stellt sich heraus, dass Java fast so schnell ist wie C und damit etwas schneller als MQL5.

Ich verstehe nicht, wie sie das machen, es ist im Grunde eine Dolmetschersprache.

Das Modell ist das gleiche wie in .Net - der Quellcode wird in Bytecode kompiliert, es wird ein Interpreter sein, und wenn Sie den Bytecode auf einem bestimmten PC entpacken, wird der native Code für die virtuelle Umgebung erzeugt, in der er ausgeführt wird, d.h. es wird kompilierter Code sein

https://habr.com/ru/post/107585/


googeln Sie "Java Compiler oder Interpreter" für Java - es wird ähnliche Artikel geben

 
Алексей Тарабанов:

MQL ist auch ein Interpreter.

Rechtfertigung?

 
Nikolai Semko:

Ich stehe ein wenig unter Schock. Ich habe einen Test in Java geschrieben. Es stellt sich heraus, dass Java fast so schnell ist wie C und damit etwas schneller als MQL5.

Ich weiß nicht, wie sie das machen, es ist ja eine Dolmetschersprache.

Ich frage mich, ob das bei Python auch so ist.

Natürlich heißt das nicht, dass MQL5 schlecht ist. Es ist nur so, dass Java zu cool ist.

Ich muss etwas übersehen haben. Seit wann sind Interpreter so schnell wie Compiler?

Offenbar ist dies nur bei partieller Kompilierung möglich, d.h. Interpreter sind nicht rein.

Haben Sie sich jemals gefragt, wie viel Zeit der Startvorgang in Anspruch nimmt, wie viel Arbeitsspeicher verschlungen wird und wie viele Threads die JVM laufen lässt, um Bytes von Code zu kompilieren? Ich habe ein Monster laufen lassen, das Hallo Welt on the fly kompiliert hat, und es endete sowohl mit nativ. Nur hat das Monster C keins. Und über Python.

Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests

MetaTrader 5 Python User Group - Wie man Python in Metatrader verwendet

Vict, 2019.12.07 07:12

Über Python - kürzlich wurde über Ranger (Dateimanager) gesprochen, das in Python geschrieben ist. Ich habe es ein paar Tage lang benutzt und mein Eindruck ist, dass es eine coole Idee mit interessanten Funktionen ist, aber Python ist wirklich langsam (wenn einige komplizierte Aufgaben im Hintergrund ausgeführt werden). Ich weiß nicht, warum die Leute Python so sehr mögen. Ähnliches gilt für C.

Nun gut - kaufen Sie einen Multi-Core-Nummern-Brecher mit einem Wagen voller RAM und sagen Sie mein Java/Sharp/... sind in diesem Test sehr kühl, und über die Gesamtbelastung wollen wir uns nicht auslassen. Sie werden nie zu C aufschließen. Fortschritt, nehmen Sie Tetris aus den 80er Jahren, schreiben Sie es in Sharpe um, und fahren Sie so schnell wie früher, aber mit einer 60-Kern-CPU)).

ZS: Ähnlich wie zwei Threads in Elbrus nur an der Übertragung von x86-Befehlen beteiligt sind. BelAZ beim Transport eines Pakets.

 
Übrigens, was Sharp angeht, sieht es so aus, als ob die kleinen Softwares es möglich machen, direkt in nativen Code zu kompilieren. Ich habe es noch nicht ausprobiert, aber es sollte cool sein.
Grund der Beschwerde: