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

 
komposter:

...

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

Passt eine Sequenz in den Speicher?

Sie können einen Expert Advisor schreiben. Beim Start lädt der Expert Advisor die Sequenz # (Parameter im Eigenschaftsfenster) und handelt mit dieser Sequenz. Optimieren №.

Die Aufgabe ist nicht ganz klar, und es können viele verschiedene Dinge umgesetzt werden.

 
Integer:

Passt eine Sequenz in den Speicher?

Sie können einen Expert Advisor schreiben. Der Expert Advisor lädt die Sequenznummer beim Start (Parameter im Eigenschaftenfenster) und handelt mit dieser Sequenz. Optimieren №.

Die Aufgabe ist nicht ganz klar, während viele verschiedene Dinge phanatisiert werden können.

Bei 20 GB (21 474 836 480 Bytes) und 1 Million Sequenzen ergeben sich im Durchschnitt 21 475 Bytes pro Sequenz (~21 KB). Ich denke, es sollte in den Speicher passen, auch in das Telefon ))

О. Übrigens, was ist mit verteiltem Rechnen? Wir sollten auch in diese Richtung denken...

 
Ich glaube, er hat die Geschichtsdateien von den Signalen.)
 

Nochmals Entschuldigung für die Pause, ich habe mit dem RAM-Drive experimentiert (bisher nicht sehr erfolgreich). Ich antworte allen der Reihe nach.

Candid:

Aber die Sequenzen sind doch unabhängig voneinander, oder? Warum kann ich dann nicht in einer Schleife die Daten einer einzeln geladenen Sequenz auf einmal durchgehen? 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.

Unabhängig. Und wie kommt man in eine Schleife für alle Sequenzen auf einmal, ohne sie in den Speicher zu laden?

Die Anzahl der Schritte kann reduziert werden, wenn man herausfindet, wie man die Sequenzen von der richtigen Stelle aus liest (die letzten X Trades ab dem aktuellen Analysedatum).

Urain:
Passt die gesamte Basis in 10-Jahres-Linien oder nicht? alle Dateien kumulativ

Eine Datei pro Million Sequenzen (der Einfachheit halber schreibe ich jede Datei in 9 Zeilen).

Nun, oder eine Million Dateien, das spielt keine Rolle.

ALXIMIKS:

Habe ich das Folgende richtig verstanden?

1) Eine 20-GB-Datei besteht aus etwa einer Million Sequenzen, die nach Zeit sortiert sind.

2) Die Größe der einzelnen Sequenzen kann variieren und hängt von der Anzahl der in der Sequenz enthaltenen Geschäfte ab

3) Die durchschnittliche Größe einer Sequenz beträgt 20/10^6 = 20 Mb, was können wir also garantieren, um eine Sequenz vollständig herunterzuladen?

4) Der K-Koeffizient hängt nur von den Gewerken innerhalb der gegebenen Sequenz ab

5) Für jede Sequenz müssen wir K (insgesamt 10^6 Stücke) finden und die besten 10 auswählen

  1. Ja
  2. Ja
  3. 20K, können wir garantieren
  4. Ja, ein Lauf verwendet ein Kriterium mit festen Einstellungen. In Zukunft möchte ich aber, dass die nächsten Durchläufe (mit geändertem Kriterium oder anderen Einstellungen) auch schnell gezählt werden.
    Bis ich solche Mengen hatte, lud ich einfach alles in den Speicher und ließ es in einer Schleife laufen, wobei ich alles zählte, was ich brauchte.
  5. Der Wert des Kriteriums wird für jedes Geschäft der Folge berechnet, beginnend mit Geschäft Nr. X (dies ist der für die Berechnung erforderliche Betrag).
    Die beste Sequenz sollte zu jedem Zeitpunkt der Geschichte ausgewählt werden (die beste Sequenz - Sequenz mit dem besten Kriterium zum aktuellen Zeitpunkt, das Kriterium wird anhand der letzten abgeschlossenen Transaktion berechnet.

ALXIMIKS:

A, wenn wir eine weitere Datei mit den Werten der Abstände zwischen den Sequenzen erstellen.

Diese und die nächste Frage habe ich nicht verstanden.

Kandidat:
Übrigens, ja, Sie können Stapel von Sequenzen auf einmal laden.

Es wird nicht gespeichert, Sie brauchen alle.

Stumm:

Ich verstehe das irgendwie nicht.

Hier ist das Kriterium - alle - im Intervall von Datum1 bis Datum2.

Das heißt, sie lautet wie folgt.

Warum nicht die Datei in viele Intervalle von Datum1 bis Datum2 aufteilen? Es wird Arbeitsabläufe geben, die geschlossen werden können, richtig?

Das Intervall "Datum1 - Datum2" umfasst derzeit alle Transaktionen aller Sequenzen.

Und die Idee, sie in mehrere kleinere aufzuteilen, ist durchaus sinnvoll. Stimmt, dann müssten Sie die Informationen jedes Mal von der Festplatte lesen, wenn die Parameter geändert werden... Aber das ist schon etwas.

Kandidat:
Offenbar ist eines der Ergebnisse eines einmaligen Datumsübergangs ein neues Datum.

Ja, aber ich denke, man kann einen Punkt finden, an dem es für keine der Sequenzen ein Angebot gibt, und eine Pause einlegen.

Dann würde es einen Übergang zum nächsten Intervall geben. Ich werde es ausprobieren.

 
ALXIMIKS:

wenn das Problem dieses ist:

eine Reihe gegeben 1 2 3 4 5 6 7 8 9

Die Breite ist vorgegeben, z. B. 4, Sie müssen sich mit dieser Breite entlang der gesamten Zeile bewegen, um einen Wert innerhalb der Breite zu finden (z. B. Minimum):

zuerst muss man in 1 2 3 4 dann 2 3 4 5 dann 3 4 5 6 dann 4 5 6 7 dann .... finden usw.

Wenn X (Anzahl der Geschäfte) festgelegt wäre (4 in Ihrem Beispiel) und es keine anderen Parameter gäbe - ja. Und deshalb - nein.

Vinin:
Ich würde über diese Aufgabe nachdenken

Die Bedingungen sind oben angegeben, willkommen in unseren Reihen ;)

Vermarkter:
Da das Problem eher akademisch ist (klingt wie eine Frage für die Einstellung eines Programmierers) und viele Leute Interesse daran gezeigt haben, warum sollte man es nicht strikter in Bezug auf das Beschreibungsformat der Eingabedaten formulieren, so dass jeder in der Lage wäre, 20 Gigabyte an Testdaten zu erzeugen und seine praktische Lösung einzureichen?

Kein Problem.

Generieren Sie Sequenzen von Zufallsgeschäften (in chronologischer Reihenfolge, auch für 1 Jahr) mit allen Attributen: Datum und Uhrzeit der Eröffnung, Eröffnungskurs, SL, TP, Datum und Uhrzeit der Schließung, Schließungskurs. Nummerieren Sie die Sequenzen von 1 bis zu einer Million.

Die Aufgabe besteht darin, eine neue Serie von aufeinanderfolgenden Geschäften aus allen Geschäften aller Sequenzen (die sich zeitlich nicht überschneiden) zu erstellen und nach einem bestimmten Kriterium auszuwählen.

Das Kriterium ist der durchschnittliche Gewinn der letzten 20 Geschäfte der Sequenz.

Beispielhaftes Ergebnis:

  1. Sequenz #250, Abschluss #53, Kriterium = 51: 2013.01.31 00:00 - 2013.02.12 12:30 (Kriterium wurde für die Abschlüsse #32-52 berechnet, d.h. 53. wurde nicht verwendet)
  2. Folge #1222, Geschäft #28, Kriterium = 75: 2013.02.13 10:00 - 2013.02.13 02:21
  3. Und so geht es weiter bis zum Ende des Jahres.

joo:
Ich nehme also an, dass wir über einen selbstgebauten Tester/Optimierer sprechen?

Ja, so ähnlich.

sergeev:

Nein, da ist etwas anderes.

Ich vermute, dass ein Makler/Anbieter die Datenbank des Geschäfts hat. :)

Wenn nur =)

sergeev:

Ich werde die Aufgabe mit einfacheren Worten wiederholen.

Nein, das ist es nicht. Ich habe ein konkretes Beispiel genannt, das dem eigentlichen Problem so nahe wie möglich kommt.

 
elugovoy:

Typisch für die Datenbank. Ohne Datenaggregation ist dies jedoch nicht möglich. Sie können in einer separaten Tabelle die eindeutigen Attribute einer Sequenz (c-dates), den Durchschnittswert des Gewinns K und der Varianz D eintragen und dann nach den 10 besten Sequenzen suchen, die den von Ihnen benötigten Kriterien nahe kommen. Mit Indizes für diese Felder dauert die Suche nicht so lange (selbst bei einer Million Datensätze). Wenn Sie dann die richtigen 10 Sequenzen gefunden haben, können Sie in den Rohdaten herumstöbern, aber es wird nicht mehr eine Million Suchvorgänge geben, da wir eine Datumsgrenze haben.

Wenn das Kriterium statisch wäre...

Was ist, wenn sich seine Parameter ändern?

elugovoy:

Es ist immer noch ein Rätsel - wonach sollen wir suchen? Was soll das Ergebnis aller Operationen sein? Wenn es darum geht, eine Entscheidung über die Eröffnung oder Schließung eines Auftrags zu treffen, nimmt die Bearbeitung eines solchen Volumens eine ziemlich lange Zeit in Anspruch.

Ja, dann wird es einen Handel geben. Die Neuberechnung ist jedoch nur für die aktuellsten Daten erforderlich, es muss nicht die gesamte Historie neu berechnet werden.

elugovoy:

Es gibt noch einen weiteren Punkt. Da wir über Angebote sprechen, ist es vielleicht sinnvoll, die Angebote für jedes Symbol zu trennen? Und ähnliche Handelsroboter für EURUSD, USDJPY, etc. zu schreiben.

Es ist ein Instrument...

elugovoy:

Mir scheint, dass Sie auf diese Weise nur die Strategie identifizieren können, die für den Handel (oder den Parametersatz des Roboters) einer bestimmten Sequenz verwendet wurde, und in einer bestimmten Marktsituation zu ihr wechseln können.

Ganz genau.

 
Integer:

Passt eine Sequenz in den Speicher?

Sie können einen Expert Advisor schreiben. Beim Start lädt der Expert Advisor die Sequenznummer (Parameter im Eigenschaftsfenster) und handelt mit dieser Sequenz. Nummer optimieren.

Das wird sie.

Aber wir brauchen nicht ein einziges (endgültiges) Ergebnis, sondern zu jedem Zeitpunkt.

Im Grunde könnten wir die Cloud nutzen, indem wir die Sequenznummer und das Datum, bis zu dem gelesen werden soll, als Parameter angeben. Aber es ist kaum schneller als die Neuberechnung einer Datei)

elugovoy:

О. Übrigens, was ist mit verteiltem Rechnen? Wir sollten auch in diese Richtung denken...

Was sollen wir parallel dazu berechnen? Der Wert des Kriteriums für verschiedene Sequenzen?

Aber dafür müssen wir sie in den Speicher laden. Dabei spielt es keine Rolle, ob sie von einem Prozess (Expert Advisor, Terminal) oder von mehreren Prozessen geladen werden. Vielleicht bekommen wir 8 (oder 12, 16, 20) statt 4 GB. Aber man muss das Ergebnis anschließend "kleben".

 
komposter:

Was sollen wir als parallel betrachten? Welche Bedeutung hat das Kriterium für die verschiedenen Sequenzen?

Die Idee ist, alle Geschichten in, sagen wir, 100 Gruppen zu unterteilen und für jede Gruppe die optimale Menge separat zu berechnen.

Dann würden wir für jede Gruppe nur die Geschichten übrig lassen, die in der optimalen Menge der Gruppe enthalten sind, und mit einer kleineren Anzahl von Geschichten zum nächsten Schritt übergehen. Dann wird sie theoretisch 100 Mal parallelisiert.

Und soweit ich mich erinnere, ist alles in Ordnung, die Größe der Gruppe kann angepasst werden.

 
TheXpert:

Die Idee ist, alle Geschichten in, sagen wir, 100 Gruppen zu unterteilen und für jede Gruppe die optimale Menge separat zu berechnen.

Lassen Sie dann für jede Gruppe nur die Geschichten in der optimalen Gruppe stehen und fahren Sie mit dem nächsten Schritt fort, mit weniger Geschichten. Dann wird sie theoretisch 100 Mal parallelisiert.

Und soweit ich mich erinnere, ist alles in Ordnung, die Größe der Gruppe kann angepasst werden.

Wenn Sie 100 von 100 Teilen parallel laden, reicht der Speicher nicht aus =)

Und wenn Sie nacheinander laden (und sich jedes Mal eine beste Variante merken), wo bleibt dann die Parallelität? Und die Datei wird weiterhin jedes Mal gelesen, wenn Sie den Rechner aufrufen.

Ich denke, dass es möglich ist, einen cleveren Mechanismus für das partielle Laden zu erfinden, aber er muss erfunden werden.

Suchen Sie z. B. beim ersten Lesen für jeden Durchgang das letzte Geschäft, das vor dem Startdatum abgeschlossen wurde, gehen Sie zurück und lesen Sie X vorherige Geschäfte, merken Sie sich den Punkt in der Datei, an dem dieses Geschäft endet.

Danach suchen Sie das erste Geschäft in den Ergebnissen und arbeiten dann nur mit frischen Daten: Lesen Sie die Datei vom gewünschten Zeitpunkt bis zum neuen aktuellen Datum und verschieben Sie jedes Mal die Geschäfte im Array (erhalten Sie ein Array fester Größe - X Elemente).

Dies löst das Problem des mehrfachen Lesens (es ist einfach nicht nötig) und des Speichers (nur wenn wir X Millionen Transaktionen unterbringen können).

Ich werde mich in diese Richtung bewegen.

 

Die Umstellung auf Binärdateien brachte übrigens fast keinen Größengewinn.

Das von mir optimierte Textformat war sehr kompakt: Das Datum wurde in einem Durchgang gespeichert (Eröffnung des ersten Handels), und alle anderen (sowohl Eröffnung als auch Schließung) wurden als Offset zum vorherigen Datum gespeichert; SL, TP und PriceClose wurden ebenfalls als Offset zum Eröffnungskurs gespeichert.

Als ich zum Binärformat wechselte, machte diese Optimierung keinen Sinn - die Verschiebung in Sekunden (uint) nimmt genauso viel Platz ein wie das vollständige Datum (ich habe long-a abgelehnt, 2030 Jahre reichen mir), aber ushort ist nicht genug (nur 18 Stunden maximale Verschiebung). Dasselbe gilt für die Preise - ich könnte den Offset nach ushort verschieben, aber dann müsste ich Prüfungen auf Überlauf hinzufügen (wenn z. B. SL = 0), und der Gewinn wäre nur 6 Bytes für alle 3 Preise. Ich habe beschlossen, es nicht zu tun.

Aber ich habe ein paar unnötige Informationen gestrichen, so dass ich 20 % davon habe. Geschätzte Größe der Originaldatei (20 GB) - 7-8 GB, die Konvertierung dauert ein paar Stunden.

Nun, ich habe auch CPU-Zeit gewonnen, die für die Umwandlung der Zeilen verwendet wurde.