Fehler bei der Größenänderung von Arrays in Beta-Build 530 - Seite 6

 
ubzen:
***Ps: (Ich will das nicht vergessen). Sicherlich mögen es die meisten von uns nicht, nicht zu wissen, was in den Codes steht, die wir verwenden. Oder wir verausgaben uns bei dem Versuch, die Codes von jemand anderem zu verstehen, sonst würden wir sie wahrscheinlich nicht verwenden. Die meisten der nativen Funktionen (z.B. OrderSend()) in mql4 sind jedoch aus unserer Sicht Objekte. Wir sehen ihre Codes nicht, aber wir akzeptieren sie. Ich glaube, dass diese Akzeptanz von Bibliotheken anderer Leute etwas ist, das ein professioneller_oop_Programmierer, der an großen Projekten arbeitet, akzeptieren und darauf aufbauen muss. Ansonsten muss man das Rad neu erschaffen.
Ja, wenn man es so ausdrückt, erfinden wir alle in mql4 das Rad immer wieder neu.
 
ubzen:

Ich glaube, du beschreibst einen Programmablauf. Ich glaube nicht, dass das die große Idee hinter OOP ist. (imo) OOP versucht, die folgenden Probleme zu lösen. Ich bin ein OOP-Noob, aber ich bilde mir mein Weltbild darüber.

1) Sind Ihre Funktionen unabhängig von globalen Variablen? Mit anderen Worten, sind Ihre Funktionen eigenständige Objekte? Verkapselung

2) Versteckt Ihre Funktion Details wie lokale_Variablennamen? Vereinfacht sie das Volumen des Codes auf dem Bildschirm? Abstraktion

3) Hat die Funktion die Möglichkeit, Duplikate von sich selbst für Änderungen zu erstellen? Wie die Möglichkeit, eigene Datentypen zu erstellen? Vererbung.

4) Hat sie die Fähigkeit, sich während des Betriebs zu ändern? Beispiel: Kann die Funktion sowohl integer_array als auch double_arrays verarbeiten? Polymorphismus.

Die Art und Weise, wie OOP bei der Erstellung von ea helfen kann, ist vergleichbar mit der Art und Weise, wie ein ea_builder einem Nicht-Programmierer hilft, einen Expert_Advisor zu erstellen. Man schnappt sich einfach seine bevorzugte Order_Accounting_Function -> Data_Function -> Event Tracking Function -> Volume Defining Function -> Trading Criteria Defining Function -> Trade Functions -> Error Processing Function. Und bumm, schon haben Sie einen Expert_Advisor. Alle Ihre Handelskriterien definierenden Funktionen, die Sie im Laufe der Jahre entwickelt haben, können einfach ein- oder ausgetauscht werden.

Wenn Sie z.B. meinen Expert_Advisor ändern wollten, müssten Sie untersuchen, wo meine globalen Variablen verwendet werden und welche andere Funktion davon abhängt (z.B. Ihr Status oder Ihre Status-Arrays). OOP macht es so einfach wie Accounting(Option_3); Display(Option_1); Caption(Option_5); TradingSys(Option_7); VolumeSize(Option2); OrderType(Option_2) und das ist der gesamte Experte.

Das macht es für andere einfacher, Ihre Bibliotheken zu verwenden, und was für andere funktioniert, funktioniert in der Regel auch für Sie selbst in der Zukunft. Denken Sie einfach an eigenständige Objekte am Fließband :)

Danke, dass Sie das so prägnant beschrieben haben, ubzen. Ich habe das schon mal nachgeschlagen, und normalerweise wird das alles in einem so langatmigen Roman abgehandelt, dass ich es nie richtig verstanden habe.
 
SDC: Danke, dass Sie das so kurz und bündig beschrieben haben, ubzen. Ich habe das schon einmal nachgeschlagen, und in der Regel wird das Ganze in einem so langatmigen Roman abgehandelt, dass ich den Sinn nie wirklich verstanden habe.
Gern geschehen.
 
RaptorUK: Es gibt einen Unterschied... Ich habe keine andere Wahl, als OrderSend() zu verwenden, wenn ich eine Bestellung aufgeben will... Ich habe die Wahl, eine fremde Bibliothek zu verwenden oder nicht ... selbst wenn die Quelle respektiert wird, versuche ich sie zu verstehen, bevor ich versuche, sie zu verwenden, so werden einige Fehler gefunden und behoben: https://www.mql5.com/en/forum/133792/page3 "Und meine Korrektur für RaptorUKs Kommentar:"
Hier gibt es keine Argumente. OOP löst weder das Problem von Fehlern in Codes noch zwingt es Sie, die Bibliothek eines anderen zu verwenden.
 
RaptorUK:
Ich habe ein wenig mit MQL5 herumprobiert und musste in dem von mir geschriebenen Code keine OOP verwenden

Klassen und OOP sind in MQL5 eher ein optionales Zusatzmodul. Das Plattform-Framework verwendet sie nicht selbst. Man könnte zum Beispiel erwarten, dass die Plattform so etwas wie eine Orders-Sammlung hat, die eine Liste von Order-Objekten enthält, so dass man Code wie den folgenden schreiben kann:

for (int i = 0; i < Orders.length; i++) {
  Order O = Orders.getByIndex(i);
  if (O.symbol == "EURUSD" && O.magicNumber = 12345) {
  }
}

Aber das ist nicht der Fall. Stattdessen ist die Art und Weise, wie Sie dies tun, im Grunde identisch zwischen MQL4 und MQL5:

for (int i = 0; i < OrdersTotal(); i++) {
  if (OrderGetTicket(i)) {
    if (OrderGetString(ORDER_SYMBOL) == "EURUSD" && OrderGetInteger(ORDER_MAGIC) == 12345) {
    }
  }
}

(Sie könnten auch erwarten, dass jeder EA, den Sie schreiben, eine Klasse ist, die von einer ExpertAdvisor-Klasse abgeleitet ist, die Dinge wie virtuelle OnTick- und OnInit-Funktionen in ihrer Deklaration hat. Aber auch das ist nicht der Fall. Das MQL5-Framework bleibt grundsätzlich nicht OOP, aber mit der Option für Sie, OOP selbst für alle Aufgaben zu verwenden, bei denen es nützlich ist).

Infolgedessen können Sie weiterhin MQL4-Code auf MQL5 über eine Reihe von Hilfsfunktionen wie string OrderSymbol() {return OrderGetString(ORDER_SYMBOL);} verwenden. Der einzige Bereich, in dem dies nicht funktioniert, ist der Zugriff auf Zeitreihen, da dieser in MQL5 ganz anders organisiert ist. Eine Funktion wie iOpenMQL4() in https://www.mql5.com/en/articles/81 funktioniert zwar, ist aber schrecklich langsam und ineffizient bei wiederholter Verwendung.

 

(Falls es noch jemanden interessiert, der Fehlerbericht, der den Anstoß zu diesem Thread gab, gilt auch noch für Build 535. Das gilt auch für https://forum.mql4.com/56885/page20#861740, obwohl es so aussieht, als ob MetaQuotes einen gescheiterten Versuch unternommen hat, diesen Fehler zu beheben).

 
Entschuldigung für die späte Antwort, aber manchmal muss ich schlafen und arbeiten

Ich stimme mit RaptorUK überein, die Dokumentation auf mql5.com über OOP ist zumindest unvollkommen. Aber leider kenne ich keine gute Referenz über OOP. Alles, was ich gelesen habe, ist entweder zu abstrakt oder zu grundlegend, mit Birne und Apfel als Beispiel für Objekte und Obst als Klasse.

OOP-Programmierung ist nur sinnvoll, wenn Sie ein großes Projekt haben. Ein großes Projekt ist nicht unbedingt 1 EA, Ihr Projekt kann sein, eine Reihe von EA mit Indikator, etc. zu bauen... Dann ist es gut, Code wiederverwenden, und OOP ist vor allem über Code-Wiederverwendung, es hilft Ihnen, eine Struktur zu bauen, die leicht in anderen Programm wiederverwendet werden kann. Leider habe ich jetzt nicht die Zeit, mich damit näher zu befassen. Aber ich habe vor, einige Artikel darüber zu schreiben.

Ein Beispiel für ein großes Projekt ist der von Metaquotes entwickelte MQL5 Wizard. Mit ihm können Sie innerhalb von 5 Minuten einen EA mit einigen Benutzereingaben erstellen. Er basiert auf der mql5 Standard Libray, die alle notwendigen Elemente für die Erstellung eines EA bereitstellt. Derselbe Assistent kann wahrscheinlich auch auf prozedurale Weise erstellt werden, aber das wäre meiner Meinung nach viel schwieriger. Und dann müssen Sie diesen Code pflegen. Aber diese Standardlibray ist schwer zu verstehen, da sie nicht gut dokumentiert und beschrieben ist. Ich habe ein Thema erstellt , um alles zu zentralisieren, was es zu diesem Thema gibt (mql5 wizard nicht oop).

 
ubzen:

Ich glaube, du beschreibst einen Programmablauf. Ich glaube nicht, dass das die große Idee hinter OOP ist. (imo) OOP versucht, die folgenden Probleme zu lösen. Ich bin ein OOP-Noob, aber ich bilde mir mein Weltbild darüber.

1) Sind Ihre Funktionen unabhängig von globalen Variablen? Mit anderen Worten, sind Ihre Funktionen eigenständige Objekte? Verkapselung

2) Versteckt Ihre Funktion Details wie lokale_Variablennamen? Vereinfacht sie das Volumen des Codes auf dem Bildschirm? Abstraktion

3) Hat die Funktion die Möglichkeit, Duplikate von sich selbst zu erstellen, um Änderungen vorzunehmen? Wie die Möglichkeit, eigene Datentypen zu erstellen? Vererbung.

4) Hat sie die Fähigkeit, sich während des Betriebs zu ändern? Beispiel: Kann die Funktion sowohl integer_array als auch double_arrays verarbeiten? Polymorphismus.

Die Art und Weise, wie OOP bei der Erstellung von ea helfen kann, ist vergleichbar mit der Art und Weise, wie ein ea_builder einem Nicht-Programmierer hilft, einen Expert_Advisor zu erstellen. Man schnappt sich einfach seine bevorzugte Order_Accounting_Function -> Data_Function -> Event Tracking Function -> Volume Defining Function -> Trading Criteria Defining Function -> Trade Functions -> Error Processing Function. Und bumm, schon haben Sie einen Expert_Advisor. Alle Ihre Handelskriterien definierenden Funktionen, die Sie im Laufe der Jahre entwickelt haben, können einfach ein- oder ausgetauscht werden.

Wenn Sie z.B. meinen Expert_Advisor ändern wollten, müssten Sie untersuchen, wo meine globalen Variablen verwendet werden und welche andere Funktion davon abhängt (z.B. in Ihren Status- oder Status-Arrays). OOP macht es so einfach wie Accounting(Option_3); Display(Option_1); Caption(Option_5); TradingSys(Option_7); VolumeSize(Option2); OrderType(Option_2) und das ist der gesamte Experte.

Das macht es für andere einfacher, Ihre Bibliotheken zu verwenden, und was für andere funktioniert, funktioniert in der Regel auch für Sie selbst in der Zukunft. Denken Sie einfach an eigenständige Objekte am Fließband :)

Es ist ein guter Überblick, außer für Polymorphismus. Bei der Frage "Kann die Funktion sowohl integer_array als auch double_arrays verarbeiten" geht es nicht um Polymorphismus, sondern um Funktionsüberladung. Man kann in mql5 auch Operatorüberladung haben (fälschlicherweise als Operationsüberladung übersetzt). OOP und Polymorphismus ist mehr als das. Ich habe keine Zeit, das näher zu erläutern (vor allem nicht auf Englisch), daher empfehle ich Ihnen, die mql5-Einführung in Polymorphismus zu lesen.
 
cyclops993:

Klassen und OOP sind in MQL5 eher eine optionale Ergänzung. Das Plattform-Framework verwendet sie nicht selbst. Man könnte zum Beispiel erwarten, dass die Plattform so etwas wie eine Orders-Sammlung hat, die eine Liste von Order-Objekten enthält, so dass man Code wie den folgenden schreiben kann:

Aber das ist nicht der Fall. Stattdessen ist die Art und Weise, wie Sie dies tun, im Grunde identisch zwischen MQL4 und MQL5:

(Sie könnten auch erwarten, dass jeder EA, den Sie schreiben, eine Klasse ist, die von einer ExpertAdvisor-Klasse abgeleitet ist, die Dinge wie virtuelle OnTick- und OnInit-Funktionen in ihrer Deklaration hat. Aber auch das ist nicht der Fall. Das MQL5-Framework bleibt grundsätzlich nicht OOP, aber mit der Option, dass Sie selbst OOP für alle Aufgaben verwenden können, bei denen es nützlich ist).

Infolgedessen können Sie weiterhin MQL4-Code auf MQL5 über eine Reihe von Hilfsfunktionen wie string OrderSymbol() {return OrderGetString(ORDER_SYMBOL);} verwenden. Der einzige Bereich, in dem dies nicht funktioniert, ist der Zugriff auf Zeitreihen, da dieser in MQL5 ganz anders organisiert ist. Eine Funktion wie iOpenMQL4() in https://www.mql5.com/en/articles/81 funktioniert zwar, ist aber bei wiederholter Verwendung schrecklich langsam und ineffizient.

Zustimmen. Ich würde hinzufügen, dass mql5 mehr Funktionen auf "niedriger" Ebene bietet als mql4. Zum Beispiel eine Menge Leute beschweren sich über iBarShift() nicht in mql5 vorhanden. Aber mql5 bietet detailliertere Funktionen, so dass Sie Ihre eigenen iBarShift() bauen können und bietet auch oop, so dass Sie es leicht in jedem Projekt wiederverwenden können (natürlich ist oop nicht zwingend erforderlich, um es wiederzuverwenden). Nicht sicher, ob meine Erklärung klar ist, wie mein Englisch ist noch etwas rudimentär.
 
Ovo:

OOP ist derzeit recht weit verbreitet und wird mehr echte Programmierer für die MQL begeistern. Aber der Editor, der wie ein Notizblock aussieht, wird die meisten von ihnen abschrecken, da bin ich mir sicher.

Haben Sie den mql5-Metaeditor (oder den neuen mql4-Editor, der derselbe ist) ausprobiert? Es gibt eine Menge Verbesserungen.
Grund der Beschwerde: