Ich brauche Hilfe! Ich kann das Problem nicht lösen, ich stoße an die Grenzen der Hardware - Seite 11

 
elugovoy:

Yurichik, ich meinte, ohne irgendwelche Fummeleien bei der Dateiverarbeitung, Komprimierung usw. Reines Arbeiten mit SQL und Roboter-/Indikatorlogik. Ich habe mit vielen Datenbanken gearbeitet, das einzige Problem war, MQL und SQL zusammenzubringen)). Ich habe eine gut aussehende Lösung ohne Arrays und Strukturen erstellt.

Im Allgemeinen ziehe ich es vor, das Rad nicht neu zu erfinden und Probleme mit den besten Mitteln zu lösen.

Schenja, ja, ich habe dich...

Das ist genau das, was ich bevorzuge.

... insbesondere wenn ein professionelles Werkzeug zur Verfügung steht... besser gut zu integrieren ...

 

Was für eine Diskussion! Ich danke Ihnen allen für Ihre Teilnahme!

Ich werde allen gemeinsam antworten und versuchen, nichts (und niemanden) zu übersehen.

1. Перейти на x64

Es dauerte eine Weile, bis ich merkte, dass ich die Terminalversion nicht angegeben hatte. Ich arbeite mit 4, und ich werde diesen EA noch nicht auf 5 migrieren. MT4 ist leider nur 32-Bit.

Die Aufhebung der 4-GB-Speicherbegrenzung unter 32-Bit-Windows 8 / 8.1 wird nicht helfen, mein System ist ohnehin x64.

2. In Stücke schneiden / in Teilen lesen / kleine Blöcke laden

Das wird unter den Bedingungen der Aufgabe nicht funktionieren.

Ich werde versuchen, im Folgenden mehr Details zu geben, vielleicht hilft es, das Problem besser zu verstehen.

3. Mehr Speicher kaufen / einen leistungsfähigen Server oder eine Cloud mieten / alles auf SSD umstellen

Ich werde natürlich weitere 16 GB Arbeitsspeicher in die verfügbaren Steckplätze einsetzen, aber das ist nicht die Lösung.

Dieses Volumen ist nicht die Grenze, und eine Kapazitätserweiterung wird nur einen speziellen Fall des Problems lösen.

Meiner Meinung nach sollte man nur dann darauf zurückgreifen, wenn man sicher ist, dass es sich um eine 100%ige algorithmische Auspressung handelt.

4. Daten komprimieren

Das ist es, was ich jetzt tue.

Der Text-Cache (20 GB) wurde um den Faktor 2 komprimiert und wird wahrscheinlich noch weiter komprimiert werden.
Das Problem der Speichergröße wird dadurch nicht gelöst, aber es kommt einigen anderen Lösungen (RAM-Disk) näher.

Ich werde sie auch ins Binärformat konvertieren, das wird das Lesen beschleunigen und die Lautstärke reduzieren.


Es ist nicht klar,wie die Assistenten vonhttp://www.nanex.net/historical.html die Datenkomprimieren. Ihre Datenstrukturen sind ziemlich redundant.

5. Komprimieren/Kodieren der Daten und Dekomprimieren/Entkomprimieren des gewünschten Chunks vor der Verwendung

Wird als Option akzeptiert.

Aber irgendetwas sagt mir, dass es auch sehr lange dauern wird (hier werden wir vom Prozessor ausgebremst).

6. Übergabe der Berechnung an ein externes Programm(Matlab/R/etc).

Ich möchte das nicht, dafür gibt es viele Gründe.

Es sei denn, es handelt sich um eine gut in die MT-Umgebung integrierte Lösung. Aber das würde immer noch Zeit erfordern, um die Software/Umgebung zu erlernen und/oder die Lösung bei einem Drittentwickler zu bestellen. In der Entwicklungsphase (in der ich mich befinde) ist das umständlich und kostspielig.

Wie auch immer, ich versuche, vorerst im Sandkasten zu bleiben, mit all seinen Vor- und Nachteilen.


7. Indexdatei erstellen und mit Indizes arbeiten

Ich weiß nicht, wie das helfen soll.

Sie müssen immer noch wiederholt Daten aus der Hauptdatei abrufen (sie ständig neu einlesen).


8. Verwenden Sie eine Datenbank

Das ist eine sehr verlockende Option:

  • Skalierbarkeit und Portabilität (Sie können einen Server mieten oder einfach einen benachbarten PC anschließen);
  • Automatisierung und guter Workflow vieler Prozesse, die sonst manuell auf einer Kiste erledigt werden müssen;
  • und andere Vorteile.

Aber es gibt auch einige Nachteile:

  • Relativ neue Umgebung für mich (habe noch nicht viel gearbeitet, nur einfache Abfragen);
  • Die Komplexität der Installation auf einem einzelnen Client-Rechner (Standalone-Version);
  • Wahrscheinlich etwas anderes.
Wie auch immer, wenn andere Optionen nicht funktionieren, werde ich wahrscheinlich zu dieser zurückkehren.


9. Neue und unklare Begriffe verstehen und testen

Dies ist nur eine Notiz an mich selbst für die Zukunft und / oder eine Bitte um mehr Informationen an die Autoren ;)

Unbekannt: Dateizuordnung,Hash-basierte Lösungen, B-Bäume.


10. Verschieben des Terminals mit allen Caches auf eine virtuelle RAM-Disk

Bislang ist dies die vielversprechendste Option (im Hinblick auf das Kosten-Nutzen-Verhältnis).

RAM-Disk von SoftPerfect installiert, werde ich die Cache-Komprimierung beenden, den Rechner auf permanentes Dateilesen umschreiben und die Leistung überprüfen.

11. Die Aufgabe richtig angehen =)

Ein sehr guter Rat, vor allem wenn man bedenkt, wie wenig Input-Informationen vorhanden sind.

Wie versprochen, werde ich versuchen, mehr Details zu geben.

Es gibt viele ähnliche Sequenzen von Geschäften, jede Sequenz ist nach Zeit sortiert.

Die Geschäfte in den verschiedenen Sequenzen sind unterschiedlich und zeitlich ungleich verteilt (und in jeder Sequenz auf andere Weise). Die Anzahl der Geschäfte ist unterschiedlich. Sie liegen aber alle im Intervall von Datum1 bis Datum2.

Die Aufgabe besteht darin, sich von D1 nach D2 mit einem Schritt von M Minuten zu bewegen (oder besser - genau nach den Punkten, in denen alle Sequenzen gehandelt werden), eine Sequenz zu finden, die nach dem Kriterium K besser ist als andere (eine separate Aufgabe - nicht nur die beste Sequenz zu finden, sondern die gesamte Menge nach dem Kriterium zu sortieren und die Top 10 auszugeben - aber das ist eine optionale, noch nicht erforderliche Aufgabe).

Das Kriterium K wird auf der Grundlage von X vorangegangenen Geschäften der entsprechenden Sequenz berechnet, wobei fast alle Informationen über jedes von X Geschäften in die Berechnungen einfließen (der Gewinn allein reicht beispielsweise nicht aus).


Das Kriterium (K), die Anzahl der Geschäfte (X) und andere Parameter, die die Ergebnisse beeinflussen, werden vom Benutzer geändert. Das heißt, sie können nicht in den Algorithmus "geschrieben" werden.

Etwa so.

Wir können die Datei so umstrukturieren, dass sie für alle Berufe und alle Sequenzen linear ist.

Aber wie kann dies geschehen, ohne dass alle Informationen im Speicher abgelegt werden? Und wie kann ich dann das Kriterium neu berechnen, wenn die Abschlüsse einer Sequenz in der ganzen Datei "verschmiert" sind?

Jetzt ist die Aufgabe hoffentlich klar.

Nochmals herzlichen Dank für Ihre Teilnahme, Diskussionen, Fragen, Links und konkreten Antworten:

TheXpert,Urain,sergeev,elugovoy,anonymous,meat,ALXIMIKS,IvanIvanov,Integer,C-4,marketeer,barabashkakvn,Silent,GT788,papaklass,grizzly_v,artemiusgreat,YuraZ,Candid,Contender undserver

Ich danke Ihnen!

 
komposter:

Was für eine Diskussion! Ich danke Ihnen allen für Ihre Teilnahme!

....

Eine sehr verlockende Option, wenn man bedenkt:

  • Skalierbarkeit und Portabilität (Sie können einen Server mieten oder einfach einen benachbarten PC anschließen);
  • Automatisierung und guter Arbeitsablauf vieler Prozesse, die sonst manuell erledigt werden müssen;
  • und andere Vorteile.

Aber es gibt auch einige Nachteile:

  • Relativ neue Umgebung für mich (habe noch nicht viel gearbeitet, nur einfache Abfragen);
  • Die Komplexität der Installation auf einem einzelnen Client-Rechner (Standalone-Version);
  • Wahrscheinlich etwas anderes.
Wenn andere Optionen nicht funktionieren, werde ich wahrscheinlich auf diese zurückgreifen.


Wenn wir in Richtung SQL gehen


  • Für mich ist das eine relativ neue Umgebung (ich habe mich noch nicht eingehend damit befasst, sondern nur einfache Abfragen durchgeführt);

Das kann die Lernkurve ganz schön in die Länge ziehen.

Wenn Sie diese Variante wählen, ist es besser, die gesamte Geschäftslogik mit gespeicherten Prozeduren zu erstellen

Der Expert Advisor hat nur noch zwei Funktionen - eine Anfrage an den Server senden und ein fertiges Ergebnis erhalten

alle Berechnungen auf dem Server

  • Die Komplexität der Installation auf einem einzelnen Client-Rechner (Standalone-Version);

In der Tat kann das Netz viele Beschreibungen, wie man SQL-Server setzen zu finden

( z.B. ORACL, SYBASE + CENTOS ) ORACL, SYBASE, MS SQL+WINDOWS separater Rechner

ORACL ist etwas schwieriger zu erlernen - weniger Experten, weniger Literatur.

MS SQL - vielleicht die größte Menge an Informationen und mehr Literatur im Internet.

es wird keine Schwierigkeiten geben - es gibt viele Beschreibungen im Internet und weitere Bücher im Shop.

MSSQL 2012 ist von den Parametern her sehr nah an ORACL dran - schon 2014.

SQL + LINUX wird in der Regel für Produktionszwecke gewählt, und wenn Sie sich mit LINUX nicht auskennen, ist es besser, WINDOWS zu verwenden.

 

komposter:

Es gibt viele ähnliche Sequenzen von Geschäften, jede Sequenz ist nach Zeit sortiert.

Die Vorgänge in den verschiedenen Sequenzen sind unterschiedlich und zeitlich ungleichmäßig (und in jeder Sequenz anders) verteilt. Die Anzahl der Geschäfte ist unterschiedlich. Sie liegen aber alle im Intervall von Datum1 bis Datum2.

Die Aufgabe besteht darin, sich von D1 nach D2 mit einem Schritt von M Minuten zu bewegen (oder besser - genau nach den Punkten, in denen alle Sequenzen gehandelt werden), eine Sequenz zu finden, die nach dem Kriterium K besser ist als andere (eine separate Aufgabe - nicht nur die beste Sequenz zu finden, sondern die gesamte Menge nach dem Kriterium zu sortieren und die Top 10 auszugeben - aber das ist eine optionale, noch nicht erforderliche Aufgabe).

Das Kriterium K wird auf der Grundlage von X vorangegangenen Geschäften der entsprechenden Sequenz berechnet, wobei fast alle Informationen über jedes von X Geschäften in die Berechnungen einfließen (der Gewinn allein reicht beispielsweise nicht aus).


Das Kriterium (K), die Anzahl der Geschäfte (X) und andere Parameter, die die Ergebnisse beeinflussen, werden vom Benutzer geändert. Das heißt, sie können nicht in den Algorithmus "geschrieben" werden.

Etwa so.

Wir können die Datei so umstrukturieren, dass sie für alle Berufe und alle Sequenzen linear ist.

Aber wie kann dies geschehen, ohne dass alle Informationen im Speicher abgelegt werden? Und wie kann ich dann das Kriterium neu berechnen, wenn die Abschlüsse einer Sequenz in der ganzen Datei "verschmiert" sind?

Ich hoffe, die Aufgabe ist jetzt klar.

Traditionell werde ich am Morgen langsamer :).

Passt eine Sequenz in den Speicher oder gibt es bereits ein Problem damit?

Wenn ersteres der Fall ist, wann erfolgt ein mehrfaches Lesen von der Festplatte, wenn der Benutzer Kriterien und Parameter ändert?

Wenn ja, erfolgt die Änderung durch einen Algorithmus oder manuell aus subjektiven Gründen?

 
Candid:

Traditionell werde ich am Morgen langsamer :).

Passt eine Sequenz in den Speicher oder gibt es damit bereits ein Problem?

Wenn ersteres der Fall ist, wann kommt es zu mehreren Lesevorgängen von der Festplatte, wenn der Benutzer Kriterien und Parameter ändert?

Wenn ja, erfolgt die Änderung durch einen Algorithmus oder manuell aus subjektiven Gründen?

Eine Million Sequenzen.

Und dann wird in jedem von ihnen ein Punkt mit dem richtigen Datum gefunden und der bisherige Verlauf analysiert.

Und die beste der Sequenzen wird ausgewählt.

Und es geht weiter zum nächsten Punkt in der "Geschichte".

 
Ich denke, wenn man die Endnutzer nicht mit der Installation eines DBMS belästigen will, dann gibt es eine Möglichkeit, mehrere (ein Dutzend) typische K-Kriterien zu synthetisieren (nennen Sie sie z.B. konservatives Handeln, aggressives Handeln usw.) und sie tatsächlich in den Algorithmus einzubauen, einmal für alle Sequenzen die Veränderung des ausgewählten Indikators in der Zeit zu berechnen und dann mit eindimensionalen Vektoren zu arbeiten.
 
marketeer:
Ich denke, wenn Sie die Endnutzer nicht mit der Installation eines DBMS belästigen wollen, können Sie mehrere (ein Dutzend) typische K-Kriterien synthetisieren (nennen Sie sie z. B. konservatives Handeln, aggressives Handeln usw.) und sie tatsächlich im Algorithmus speichern, einmal für alle Sequenzen die Veränderung des ausgewählten Indikators in der Zeit berechnen und dann mit eindimensionalen Vektoren arbeiten.

Nehmen wir an, es gibt nur 2 Kriterien.

Es gibt jedoch mehrere Parameter, mit denen das Kriterium festgelegt wird, und jeder kann einen anderen Wert annehmen.

Selbst wenn wir sehr grob mehrere Werte für jeden Parameter nehmen, erhalten wir keinen eindimensionalen Vektor, sondern ein drei- oder vierdimensionales Feld.

Dann ist sicher nicht genug Speicher vorhanden =)

 
komposter:

Eine Million Sequenzen.

Und dann wird in jedem von ihnen ein Punkt mit dem richtigen Datum gefunden und der bisherige Verlauf analysiert.

Und die beste der Sequenzen wird ausgewählt.

Und es geht weiter zum nächsten Punkt in der "Geschichte".

Die gesamte Sequenz wird in den Speicher geladen. Dann "findet es den Punkt mit dem gewünschten Datum und analysiert den bisherigen Verlauf". Der Kriteriumwert wird mit dem besten erreichten Wert verglichen. Am besten, man merkt sich das Kriterium und was man über die beste Reihenfolge wissen muss. Dann wird die nächste Sequenz anstelle der bearbeiteten geladen. Und so weiter eine Million Mal.

Die Datei wird sequentiell und nur einmal gelesen.

Was ist los?

 
Candid:

Die gesamte Sequenz wird in den Speicher geladen. Es findet dann "den Punkt mit dem richtigen Datum und analysiert die Vorgeschichte". Der Kriteriumwert wird mit dem besten erreichten Wert verglichen. Am besten, man merkt sich das Kriterium und was man über die beste Reihenfolge wissen muss. Dann wird die nächste Sequenz anstelle der bearbeiteten geladen. Und so weiter eine Million Mal.

Die Datei wird sequentiell und nur einmal gelesen.

Was ist los?

Das ist richtig.

Dann wird das "richtige Datum" um den Zeitpunkt des Geschäftsabschlusses der ausgewählten Sequenz verschoben und der Algorithmus wiederholt sich.

Und so weiter noch eine Million Mal =)

 
komposter:

Das geht so.

Dann wird das "richtige Datum" um den Schlusspunkt des Handels aus der gewählten Sequenz verschoben und der Algorithmus wird wiederholt.

Und so weiter noch eine Million Mal =)

Aber die Sequenzen sind doch unabhängig voneinander, oder? Warum können wir dann nicht einen Zyklus von Daten mit jeweils einer geladenen Sequenz machen? Hier könnte sich übrigens eine Gelegenheit bieten, einen effizienten Rekursionsalgorithmus zu verwenden, aber das ist Glückssache. Die Größe von einer Million auf eine Million wird beibehalten, und die Datei wird einmal gelesen.

Ein Problem, bei dem die Anzahl der Schritte bei der nächsten Iteration gleich bleibt (d. h. der Suchbereich wird bei fortschreitender Berechnung nicht kleiner), sieht natürlich nicht sehr robust aus. Aber das ist natürlich subjektiv.