Projekt des Beraters - Seite 6

 
Alexey Navoykov:

In der zivilisierten Welt werden die Listen durch...

Warum schreiben Sie nicht eine zivilisierte Bibliothek in MQL, und dann reden wir weiter. Wir hören diese Rufe seit Jahren, und wenn man es genau nimmt, fängt man an, regelrecht zu blöken.

MQ hat wirklich einen Fehler mit Referenzen in CObject gemacht. Sie sollten nicht dort sein. Und diese Referenzen werden in sehr spezifischen Containern wie CList verwendet. Aber wo gibt es keine Fehler? Zivilisierte Sprachen, sagen Sie? Lesen Sie Richters Kritik, was er über Object C# denkt und welche Methoden es nicht enthalten sollte. Weil Richter Recht hat, sollten wir uns also weigern, C# zu verwenden? Das ist Unsinn. Also hören Sie auf, hier zu stänkern und gehen Sie endlich in Ihren Verfahrensdschungel.

 
George Merts:

Nun, ja, man kann keine konstanten Objekte in eine Liste aufnehmen.

Allerdings verwende ich ständig CObject-Funktionalität, und keiner der Kritiker bot etwas, das auch nur annähernd mit den Objekten Arrays und Listen der Standardbibliothek vergleichbar ist.

Alle schreien: "So sollte es gemacht werden". Aber wenn man etwas vorschlägt, ist plötzlich nichts mehr da.

Selbst diejenigen Teilnehmer, die tatsächlich andere Softwarelösungen anbieten - also keinen Ersatz für das CObject anbieten - nutzen es häufiger gar nicht, seltener seine Funktionalität, ohne auf die "Implementierung durch eine Stelle" zu achten. Und das bedeutet, dass die Implementierung recht gut ist.

Wenn es schlecht wäre, hätte man schon längst einen Ersatz vorgeschlagen.

Normalerweise wird das native CObject verwendet, wenn alles andere auch auf der Standardbibliothek basiert. Insbesondere diejenigen, die ihren Quellcode aktiv weitergeben, neigen dazu, ihn zu vereinheitlichen, den selbst geschriebenen Code zu reduzieren und die Anzahl ihrer eigenen Bibliotheken zu verringern, um externen Benutzern das Leben zu erleichtern. Aber jeder entscheidet für sich selbst, ob er für sich selbst oder für die Bequemlichkeit der anderen kodiert.

Ich nehme jedoch an, dass viele Leute ihre eigenen Lösungen verwenden (wie ich), sie sehen nur nicht die Notwendigkeit, sie anderen anzubieten. Aber im Allgemeinen denke ich, dass es besser wäre, wenn es einen Standard gäbe, der auf einigen bekannten Bibliotheken, wie MFC, basiert. Deshalb verstehe ich MQ nicht wirklich, warum sie ihr eigenes Rad neu erfinden mussten (außerdem sehr umstritten), anstatt eine fertige Lösung zu portieren. Das Gleiche kann jedoch auch über die MQL-Sprache selbst gesagt werden )))

Aber im Prinzip bin ich nicht gezwungen, CObject abzulehnen, ich habe meine kritische Bemerkung nur als Antwort auf den Satz gemacht, dass jemand CMyCobject benutzen sollte, wenn es ein sehr cooles CObject von MQ gibt :)

 
Vasiliy Sokolov:

Schreiben Sie eine zivilisierte Bibliothek in MQL, und dann reden wir weiter. Du schreist schon seit Jahren, aber wenn es zur Sache geht, fängst du an, regelrecht zu blöken.

Nun, ich habe meine eigenen Bibliotheken. Worüber wollten Sie also sprechen?

Ich habe es mit den Referenzen in CObject MQ wirklich vermasselt. Sie dürfen nicht dort sein. Und diese Referenzen werden in sehr spezifischen Containern wie CList verwendet. Aber wo gibt es keine Fehler? Zivilisierte Sprachen, sagen Sie? Lesen Sie Richters Kritik, was er über Object C# denkt und welche Methoden es nicht enthalten sollte. Weil Richter Recht hat, sollten wir uns also weigern, C# zu verwenden? Das ist Unsinn. Also hören Sie auf, hier zu stänkern und gehen Sie endlich in Ihren Verfahrensdschungel.

Seien Sie nicht arrogant und unhöflich, ich spreche nicht mit Ihnen persönlich.

Zum Thema "mit den Links durcheinandergebracht" - nun ja, komisch, nachdem ich schon alles darüber gemalt habe. Obwohl Sie vorhin buchstäblich über CObject geplappert haben, dass es so toll ist, und dass sogar die Zeiger dort nicht standardmäßig initialisiert werden (zumindest sollten Sie den Quellcode Ihrer Sprache vorher studiert haben). Wie auch immer, ich sehe keinen Sinn darin, Sie hier weiter zu verunglimpfen.

 
George Merts:
Aber ich stimme zu, es ist nicht immer notwendig , OOP zu verwenden.

Sagen wir, ich habe CDataProvider:pulic CDataProviderI Klasse - Datenanbieter, die Expert Advisor mit Zeitreihen, Indikatoren, Terminal und Umgebungsdaten bietet. In einem Expert Advisor kann es viele TS geben - jeder von ihnen würde Zeiger auf Zeitreihen und Indikatoren vom Datenanbieter erhalten (jeder TS müsste keine Zeitreihen erstellen - der Datenanbieter würde Zeiger auf die erforderlichen Zeitreihen bereitstellen, wenn sie bereits existieren, und würde nur Zeitreihen erstellen, die noch nicht erstellt wurden).

Wenn Sie einen Indikator vom Datenanbieter benötigen, füllen Sie die Indikatorbeschreibungsstruktur aus und fordern dann einen Indikator vom Anbieter an, der auf diese Struktur verweist.

Dementsprechend sollte jeder Indikator innerhalb des Datenanbieters in der Lage sein, seine Struktur zu identifizieren (der Datenanbieter "kennt" nur die abstrakte Basisklasse der Struktur) und entsprechend das fertige Indikatorobjekt zu erstellen, das vom Datenanbieter erstellt wird.

Es wäre jedoch unvernünftig, ein solches Projekt nur zu dem Zweck zu starten, eine neue Idee für einen Indikator zu prüfen. Daher wird bei diesen neuen Indikatoren alles "von Hand" gemacht, ohne OOP. Wenn ich jedoch sehe, dass ein Indikator für Expert Advisors nützlich ist, wird er "richtig" geschrieben - mit voller OOP-Unterstützung und Erstellung innerhalb eines Datenanbieters.

Es ist eine großartige Lösung für viele TS, die die gleichen Indikatoren bei ihrer Arbeit verwenden.

Als ich vor etwa 15 Jahren alle Indikatoren im MT4 auf ihre Eignung für den Handel im Reverse-Order-Modus testete, fand ich nur einen, der es erlaubt, täglich Gewinne zu erzielen. Die meisten Indikatoren basieren auf eingebauten Indikatoren, deshalb sind die Handelsergebnisse bei fast allen von ihnen niedrig. Ich denke, die erste Aufgabe eines jeden Händlers ist es, den Markt auf die Vorhersagegenauigkeit oder die Rentabilität eines Musters zu untersuchen.

mit Respekt.

Die Hauptsache ist, dass sie Sie nicht mit der Richtung verwirren können, in die Sie gehen und die Verwirklichung ihrer Ideen sehen. Das Ziel dieses ganzen Zirkus, zu verwirren und in die falsche Richtung zu lenken, weg vom Profit.
 
Alexey Navoykov:

  1. Nun, normalerweise wird das reguläre CObject verwendet, wenn alles andere auch auf einer Standardbibliothek basiert.
  2. Insbesondere diejenigen, die ihren Quellcode aktiv weitergeben, streben in der Regel eine Vereinheitlichung an,
  3. selbst geschriebenen Code zu reduzieren und
  4. die Anzahl ihrer eigenen Bibliotheken zu reduzieren,
  5. um externen Nutzern das Leben zu erleichtern. Aber jeder entscheidet für sich selbst, ob er für sich selbst oder für die Bequemlichkeit der anderen kodiert.

Nun, Sie selbst haben die Frage beantwortet, warum Sie CObject und nicht ein selbstgeschriebenes Fahrrad verwenden sollten. Dies ist notwendig, um das Leben nicht nur für andere, sondern vor allem für sich selbst zu erleichtern, denn die Worte "Vereinheitlichung", "Verringerung des selbst geschriebenen Codes", "Verringerung der Anzahl der eigenen Bibliotheken" - das ist es, was jeder Entwickler anstreben sollte. Dies ist der heilige Gral der Programmierer.

Natürlich ist die Standardbibliothek veraltet. Die Sprache erlaubt jetzt die Verwendung von Generika, und Schnittstellen sind im Kommen. Aber die alte Bibliothek funktioniert, und es ist eine gute Vereinheitlichung, und wie man sagt, ist das Beste der Feind des Guten. Da es weder das Perfekte noch das Beste gibt, muss man das Gute nutzen.

Das mit den Links" - nun ja, das ist schon komisch, nachdem ich schon alles darüber geschrieben habe. Obwohl Sie vorhin buchstäblich auf CObject "geschissen" haben, indem Sie sagten, dass es so großartig ist und dass sogar die Zeiger dort nicht standardmäßig initialisiert werden (Sie sollten zumindest die Quellsprache studieren, um damit zu beginnen). Im Allgemeinen sehe ich keinen Sinn darin, mit Perlen vor Ihnen zu werfen.

Hier wird niemand vor Ihnen kriechen. Glauben Sie mir, das "versteckte" Wissen, das Sie uns allen hier "offenbart" haben, ist vielen schon lange bekannt. Über die Initialisierung von Links will ich gar nicht erst streiten. Sie wissen, dass Sie formal Recht haben, also versuchen Sie, mir dasselbe unter die Nase zu reiben: Lesen Sie die Mathematik, lernen Sie, was NULL ist, usw. usw. Aber Sie müssen mich nicht belehren. Du bist cool. Sie haben alles. Warum werfen Sie dann mit Perlen nach uns? Gehen Sie zu Ihrer Bibliothek. Schauen Sie, ob er 0,5 % schneller wird.

 
Andrey Kisselyov:
Es ist eine wunderbare Lösung für viele Handelssysteme, die die gleichen Indikatoren in ihrem Handel verwenden. Aber sie sind nicht für Tests geeignet, deshalb machen sie es aus der Not heraus.

Vor 15 Jahren testete ich alle Indikatoren im MT4 auf ihre Eignung für den Handel im Reverse-Position-Modus und fand nur einen, der täglich profitabel war.

Nein, man muss nur das Wesen des Indikators richtig erfassen. Ein Indikator ist kein fertiger Gral, sondern nur ein bequemer Ausdruck für einige Besonderheiten der Kursbewegungen. Daher sollten wir sie nicht als "die endgültige Signalquelle", sondern nur als "Signalmerkmal" behandeln und sie als Komplex verwenden. Und in diesem Fall werden für die meisten Tests viele Indikatoren benötigt. Insbesondere die ATR, zum Beispiel, ich denke bereits darüber nach, sie in der Vorlage eines Expert Advisors zu standardisieren, weil ich sie praktisch überall verwende. MA MA sind ebenfalls häufig benötigte Indikatoren. Fraktale, Pinbar-Indikatoren...

 
George Merts:

...

Aber ich stimme zu, dass es bei weitem nicht immer notwendig ist , OOP zu verwenden.

Sagen wir, ich habe eine Klasse CDataProvider:pulic CDataProviderI - ein Datenanbieter, der Experten mit Zeitreihen, Indikatoren, Terminal- und Umgebungsdaten versorgt. In einem Expert Advisor kann es viele TS geben - jeder von ihnen würde Zeiger auf Zeitreihen und Indikatoren vom Datenanbieter erhalten (jeder TS müsste keine Zeitreihen erstellen - der Datenanbieter würde Zeiger auf die erforderlichen Zeitreihen bereitstellen, wenn sie bereits existieren, und würde nur Zeitreihen erstellen, die noch nicht erstellt wurden).

Wenn Sie einen Indikator vom Datenanbieter benötigen, füllen Sie die Struktur für die Indikatorbeschreibung aus und fordern dann einen Indikator vom Anbieter an, der auf diese Struktur verweist.

Dementsprechend sollte jeder Indikator innerhalb des Datenanbieters in der Lage sein, seine Struktur zu identifizieren (der Datenanbieter "kennt" nur die abstrakte Basisklasse der Struktur) und entsprechend das fertige Indikatorobjekt zu erstellen, das vom Datenanbieter erstellt wird.

Aber natürlich ist es nicht sinnvoll, dieses Projekt nur zu dem Zweck zu starten, eine neue Idee für einen Indikator zu überprüfen. Daher wird bei diesen neuen Indikatoren alles "von Hand" gemacht, ohne OOP. Wenn ich jedoch sehe, dass ein Indikator für Expert Advisors nützlich ist, wird er "richtig" geschrieben - mit voller OOP-Unterstützung und Erstellung innerhalb eines Dataproviders.

P.S.

Im Falle von Indikatoren und Datenanbietern sehen wir übrigens den Vorteil der Virtualisierungsvererbung. Wir haben die Basisschnittstelle der Indikatorparameter CIndicatorParametersI; der Nachkomme dieser Schnittstelle sind die tatsächlichen Parameter des erforderlichen Indikators. Bei der Abfrage des Indikators deklarieren wir diese Parameter und übergeben dem Datenanbieter einen Zeiger auf die abstrakte Schnittstelle. So weiß der Datenlieferant selbst nicht einmal, welcher Indikator angefordert wird - er wird in einer Funktion definiert, in der der Indikator entsprechend dem neuen Typ erstellt wird. Und nur dieser Indikator weiß, welche Parameter übergeben wurden, er extrahiert die erforderlichen Parameter aus dem übergebenen Objekt.

Der Trick besteht darin, dass fast überall im Dataprovider eine einfache Basisklasse von Parametern (oder Indikatoren) vorhanden ist - nur die einfachsten und gebräuchlichsten Funktionen der Basisschnittstellen sind für den Dataprovider verfügbar. Dies vereinfacht die Änderung des Codes (wenn sie erforderlich ist) und führt nicht zu der Versuchung, den Code der Indikatoren des Datenanbieters zu "manipulieren". Wenn Sie einen Indikator ändern wollen, kann dies nur innerhalb des Indikators geschehen. Der Datenlieferant ist nur ein Speicher für Indikatoren, er kann höchstens einen neuen Indikator erstellen.

Ich glaube, Sie machen es zu kompliziert. Der Datums-Provider ist MetaTrader selbst. D.h. der Date-Provider wird nicht wirklich benötigt, er braucht nur eine bequeme Schnittstelle für die Arbeit mit Daten. In meiner Libera zum Beispiel müssen Sie nur den Eröffnungskurs des letzten Balkens eingeben:

double open_price = WS.Open[0];

Das WS-Objekt ist immer da, es ist immer zur Hand und funktioniert. Wie sie das macht, bleibt hinter den Kulissen verborgen. Das ist der gesamte Zugang zu den Daten:)

s.o.p. OOP sollte die Komplexität der Nutzung des Systems reduzieren, nicht erhöhen. Wenn Sie zugeben, dass Sie einen Garten für einen einfachen Check bauen müssen , bedeutet das, dass Sie etwas mit Ihrer Architektur beim Anbieter falsch gemacht haben. Das heißt, Sie haben etwas programmiert, das Sie nicht immer benutzen wollen.
 
George Merts:

Nein, man muss nur das Wesen des Indikators richtig erfassen. Ein Indikator ist kein fertiger Gral, sondern nur ein bequemer Ausdruck für einige Besonderheiten der Kursbewegung. Daher sollten wir sie nicht als "die endgültige Signalquelle", sondern nur als "Signalmerkmal" behandeln und sie als Komplex verwenden. Und in diesem Fall werden für die meisten Tests viele Indikatoren benötigt. Insbesondere ATR, zum Beispiel, ich denke bereits darüber nach, es in einem Expert Advisor-Template zu standardisieren, weil ich es praktisch überall verwende. MA MA sind ebenfalls häufig benötigte Indikatoren. Fraktale, Pinbar-Indikatoren...

Ich betrachte den ATP nicht als Indikator, er zeigt die durchschnittliche Volatilität des Marktes über einen bestimmten Zeitraum an, als Einstiegssignal ist er nicht geeignet (er kann als Filter eingesetzt werden, mehr nicht).

Ich meinte damit, dass ich im Modus "immer im Markt" auf der Grundlage des Signals des Umkehrindikators arbeite, und auch das ist 15 Jahre her, jetzt hat sich meine Sicht auf den Markt leicht verändert.

mit Respekt.
 
Vasiliy Sokolov:

Ich glaube, Sie machen es komplizierter, als es sein müsste. Der Datenanbieter ist MetaTrader selbst. Das heißt, Sie brauchen nicht wirklich einen Datumsanbieter, sondern nur eine benutzerfreundliche Schnittstelle für die Arbeit mit Daten. In meiner Libera zum Beispiel müssen Sie nur den Eröffnungskurs des letzten Balkens eingeben:

Das WS-Objekt ist immer da, es ist immer zur Hand und funktioniert. Wie sie das macht, bleibt hinter den Kulissen verborgen. Das ist der gesamte Zugang zu den Daten:)

s.w. OOP sollte die Komplexität der Nutzung des Systems reduzieren, nicht erhöhen. Und wenn Sie selbst zugeben, dass Sie für eine einfache Kontrolle einen Gemüsegarten anlegen müssen , bedeutet das, dass mit Ihrer ISP-Architektur etwas nicht stimmt. Das heißt, Sie haben etwas programmiert, das Sie nicht immer benutzen wollen.

Ihr (nennen wir es "Sie") Eintrag "WS.Open[0];" unterscheidet sich nur wenig von meinem Eintrag "m_tcMainContainer.Open(0)"

Ich vermute, dass es bei der Initialisierung des WS-Objekts einige vorbereitende Maßnahmen geben muss.

In meinem Fall sollten wir die Funktion bool _LoadMainTimeseriesToLocalContainer(uint uiNeedBuffer) aufrufen.

In jedem Teil eines Expert Advisors (im Generator der Inputs, in den Controllern von Trailing und Exit, d.h. in den Objekten, die Handelsaktionen durchführen können) habe ich das Objekt "Timeseries Container" - in der Tat ist es ein Zeiger auf OHLCSTVtVr timeseries mit zusätzlichen Serviceoptionen.

In einem Expert Advisor können viele verschiedene Container mit unterschiedlichen Symbolen und unterschiedlichen Zeitrahmen vorhanden sein. Die Ideologie des Datenanbieters erlaubt es, sie nicht zu duplizieren. Denn in Wirklichkeit sind alle Zeitreihen darin gespeichert, und die Container verweisen einfach auf die benötigten Zeitreihen.

Ich sehe keinen großen Unterschied - so wie ich es verstehe, ist WS (WareStore, wahrscheinlich ?) immer noch mein Datenlieferant. Es ist nur so, dass mein Dataprovider auch den Rest der Daten konzentriert - Indikatoren, Symbole (CSymbolInfo-Objekte), Terminal (CTerminalInfo-Objekt), das auch eine Sammlung von Charts hat. Bei jeder Auffrischung wird die Zeitreihe (je nach Bedarf) aktualisiert - hier ist die Ideologie ähnlich wie bei der Standardbibliothek.

Wenn wir MT4-5 selbst als Datenprovider betrachten und unsere Klasse nur für die Bereitstellung des Zugriffs verwendet wird - dann stellt sich heraus, dass wir gemäß Ihrem Verweis auf den Eröffnungskurs die Funktion CopyOpen() für einen Wert aufrufen müssen - das erscheint mir unangemessen.


Globalen Vollzugriff auf alle Variablen an jeder Stelle des Programms zu gewähren, halte ich auch für extrem unvernünftig, im Gegenteil, ich versuche, an jeder Stelle des Programms nur auf die Strukturen und Daten zuzugreifen, die für diese Aktion benötigt werden. Alles andere muss unzugänglich sein. Die Ideologie des Datenanbieters erlaubt es mir, diesen Zugang zu kontrollieren.

 
Andrey Kisselyov:
Ich halte ihn nicht für einen Indikator, er zeigt die durchschnittliche Volatilität des Marktes über einen bestimmten Zeitraum an, er ist nicht als Einstiegssignal geeignet (er kann als Filter eingesetzt werden, mehr nicht).

Ich meinte damit, dass ich im Modus "immer im Markt" auf der Grundlage des Signals des Umkehrindikators arbeite, und auch das ist 15 Jahre her, jetzt hat sich meine Sicht auf den Markt leicht verändert.

Hochachtungsvoll.

Was meinen Sie mit "ATR gilt nicht als Indikator"?

Und wieso ist es "nicht als Einstiegssignal geeignet"? Und ich bin ein Narr, ich benutze "Volatilitätsaufschlüsselung" Eintrag nur mit diesem Indikator ...?

Ich habe so den Verdacht, dass Sie Ihr eigenes, spezielles Verständnis vom Wesen der Indikatoren haben... Für mich ist ein Indikator ein Objekt, das einen variablen Wert in Abhängigkeit von der Zeit erzeugen kann. Auch ein gewöhnliches Kerzendiagramm des Preises ist ein Indikator. Aber für Sie ist es etwas anderes... Folglich ist unser Verständnis ein anderes.