Saturday 21 October 2017

Haskell Handelssystem


So machten diese Aufgabe bei Uni und ich habe ein ernstes Verlangen, die Aufgabe in Haskell zu tun. Es ist eine Simulation eines Aktienhandels-Motor. Die Situation ist, dass wir Daten kommen aus einer CSV und wir wollen jeden Datensatz zu analysieren und verarbeiten sie in einer bestimmten Weise abhängig von der Marktphase zugewiesen. Begründung für die Verwendung von haskell, ist, dass ich die Trading-Engine als schwere funktionale System. Ich habe haskell Erfahrung vor, aber nur geringe Erfahrung, nie etwas dieses groß. Wir wollten einen Thread ausführen, der die csvs in eine Warteschlange von unbearbeiteten Aufträgen importieren und dann das Hauptprogramm auf diese Warteschlange zur Verarbeitung jeder Bestellung zugreifen möchte. Allerdings wie könnte ich dies erreichen Ich weiß, in C Ich würde nur die Klasse, so konnte es die CSVParser-Klasse, die die unbearbeitete Warteschlange halten würde. Dies bedeutet auch, dass der Import-Thread kontinuierlich durch alle Marktphasen laufen würde oder bis der Import der csv-Datei abgeschlossen war. Jede Anleitung, wie dies zu erreichen wäre großartig (nicht auf der Suche nach einem vollständig typisierten Skript, nur was die Dinge in haskell Ich brauche, um zu betrachten) fragte, als nicht eine echte Frage von Ritch Melton. Dflemstr. Flexo 9830. Michael Petrotta. Graviton Mar 30 12 at 1:45 Es ist schwer zu sagen, was hier gefragt wird. Diese Frage ist zweideutig, vage, unvollständig, übermäßig breit oder rhetorisch und kann in ihrer jetzigen Form nicht vernünftig beantwortet werden. Um diese Frage zu klären, damit sie wieder geöffnet werden kann, besuchen Sie die Hilfe. Wenn diese Frage umformuliert werden kann, um die Regeln in der Hilfe zu passen. Bearbeiten Sie bitte die Frage. Dieses ist das Beispiel, das mich überzeugte, Haskell zu erlernen (und Junge bin ich froh, dass ich tat). OK, es ist ein kurzes, lesbares Programm. In diesem Sinne ist es besser als ein C-Programm. Aber wie ist dies so anders als (sagen) ein Python-Programm mit einer sehr ähnlichen Struktur Die Antwort ist faul Auswertung. In den meisten Sprachen (auch einige funktionale) würde ein Programm wie das oben beschriebene dazu führen, dass die gesamte Datei in den Speicher geladen und dann wieder unter einem neuen Namen geschrieben wird. Haskell ist faul. Es doesnt berechnen Dinge, bis es braucht, und durch Erweiterung nicht berechnen Dinge, die es nie braucht. Zum Beispiel, wenn Sie die writeFile Zeile zu entfernen waren, würde Haskell nicht die Mühe, lesen Sie etwas aus der Datei in den ersten Platz. Wie es ist, erkennt Haskell, dass das writeFile von der readFile abhängt. Und somit in der Lage ist, diesen Datenpfad zu optimieren. Während die Ergebnisse compilerabhängig sind, wird das, was in der Regel beim Ausführen des obigen Programms geschieht, folgendermaßen aussehen: das Programm liest einen Block (etwa 8 KB) der ersten Datei, schreibt es dann in die zweite Datei und liest dann einen anderen Block aus dem ersten Datei und schreibt sie in die zweite Datei, und so weiter. (Versuchen Sie, strace auf es), die viel wie sieht, was die effiziente C-Implementierung einer Datei kopieren würde. So kann Haskell schreiben Sie kompakte, lesbare Programme - oft ohne viel Leistung zu opfern. Eine andere Sache muss ich hinzufügen, dass Haskell macht es schwierig, Buggy-Programme zu schreiben. Die erstaunliche Art System, Mangel an Nebenwirkungen, und natürlich die Kompaktheit der Haskell-Code reduziert Bugs aus mindestens drei Gründen: Besser Programm-Design. Reduzierte Komplexität führt zu weniger Logikfehlern. Kompakter Code. Weniger Zeilen für Fehler vorhanden. Kompilieren Sie Fehler. Viele Bugs nur arent gültig Haskell. Haskell ist nicht für jedermann. Aber jeder sollte es versuchen. Es ist erstaunlich, dass diese Antwort hat 116 upvotes noch what39s in es ist einfach falsch. Dieses Programm wird die gesamte Datei lesen, es sei denn, Sie verwenden faulen Bytestrings (die Sie mit Data. Bytestring. Lazy. readFile tun können), die nichts mit Haskell zu tun haben, eine faulen (non-strict) Sprache zu tun. Monaden sind Sequenzierung - das bedeutet grob quotall die Nebenwirkungen sind erfolgt, wenn Sie die resultquot nehmen. Wie für die quotlazy Bytestringquot Magie: das ist gefährlich, und Sie können es mit ähnlichen oder einfacheren Syntax in den meisten anderen Sprachen tun. Ndash Jo So Okt 12 16 am 23:06 JoSo, ich glaube, Sie haben recht, und was wir sehen in strace ist eine Compiler-Optimierung. Dennoch ist die Tatsache, dass Haskell solche Optimierungen erlaubt, ziemlich beeindruckend. Ndash Artelius Sie fragen die falsche Frage. Haskell ist nicht eine Sprache, wo Sie gehen auf ein paar coole Beispiele und gehen aha sehen, ich sehe jetzt, das ist, was es gut macht Sein mehr wie, wir haben alle diese anderen Programmiersprachen, und theyre alle mehr oder weniger ähnlich und dann theres Haskell, die völlig anders und verrückt in einer Weise, die total awesome ist, sobald man sich an die Verrücktheit gewöhnen. Aber das Problem ist, es dauert eine ganze Weile, um die Unannehmlichkeit zu akklimatisieren. Dinge, die Haskell von fast jeder anderen gerade-semi-Mainstream-Sprache unterscheiden: Lazy Evaluation Keine Nebenwirkungen (alles ist rein, IOetc passiert über Monaden) Unglaublich ausdrucksstarkes statisches System sowie einige andere Aspekte, die sich von vielen Mainstream-Sprachen unterscheiden ( Aber von einigen geteilt): funktionaler wichtiger Whitespace-Typ abgeleitet Wie einige andere Plakate beantwortet haben, bedeutet die Kombination all dieser Features, dass Sie über die Programmierung auf eine ganz andere Art und Weise denken. Und so seine schwer zu kommen mit einem Beispiel (oder eine Reihe von Beispielen), die adäquat kommuniziert dies Joe-Mainstream-Programmierer. Sein eine Erfahrungssache. (Um eine Analogie zu machen, kann ich Ihnen Fotos von meiner 1970-Reise nach China zeigen, aber nachdem Sie die Fotos gesehen haben, wissen Sie immer noch nicht, wie es war, während dieser Zeit gelebt zu haben. Ähnlich kann ich Ihnen einen Haskell Quicksort zeigen, Aber Sie immer noch nicht wissen, was es bedeutet, ein Haskeller zu sein.) Ich finde es interessanter, dass Hoare39s ursprüngliche Quicksort-Algorithmus wurde bastardized in dieser Out-of-Place-Liste-basierte Form anscheinend so, dass nutzlos ineffiziente Implementierungen könnte geschrieben werden quotelegantlyquot in Haskell. Wenn Sie versuchen, eine echte (in-Place) Quicksort in Haskell, you39ll finden Sie es ist hässlich wie die Hölle. Wenn Sie versuchen, eine konkurrierend-performante generische Quicksort in Haskell zu schreiben, finden Sie es unmöglich, aufgrund langjähriger Bugs in Garbage Collector GHC39s. Hagelschnellsort als gutes Beispiel für Haskell Bettler Glaube, IMHO. Ndash Eines finde ich sehr cool im Umgang mit Algorithmen oder mathematischen Problemen ist Haskells inhärente faulen Auswertung der Berechnungen, was nur aufgrund seiner strengen funktionalen Natur möglich ist. Zum Beispiel, wenn Sie alle Primzahlen berechnen möchten, könnten Sie verwenden und das Ergebnis ist tatsächlich eine unendliche Liste. Aber Haskell wird es links von rechts auswerten, so lange, wie Sie nicht versuchen, etwas zu tun, die die gesamte Liste erfordert, können Sie es noch verwenden, ohne dass das Programm in Unendlichkeit stecken, wie z. B.: die Summen aller Primzahlen weniger als 100. Das ist aus mehreren Gründen schön. Zuerst muss ich nur eine Primfunktion schreiben, die alle Primzahlen erzeugt und dann Im ziemlich viel bereit, mit Primzahlen zu arbeiten. In einer objektorientierten Programmiersprache bräuchte ich eine Möglichkeit, der Funktion zu sagen, wie viele Primzahlen es vor der Rückkehr berechnen soll, oder das unendliche Listenverhalten mit einem Objekt zu emulieren. Eine andere Sache ist, dass im Allgemeinen, Sie am Ende schreiben Code, der drückt, was Sie wollen, zu berechnen und nicht in welcher Reihenfolge, um Dinge zu bewerten - stattdessen der Compiler, die für Sie. Dies ist nicht nur nützlich für unendliche Listen, in der Tat wird es verwendet, ohne dass Sie es wissen die ganze Zeit, wenn es keine Notwendigkeit, mehr als notwendig zu bewerten. Dies ist mit dem Rendite-Return-Verhalten von C (einer objektorientierten Sprache) nicht ganz richtig, Sie können auch unendliche Listen deklarieren, die bei Bedarf ausgewertet werden. Ndash Jeff Yates Apr 22 09 at 5:43 Guter Punkt. Sie sind richtig und ich sollte nicht sagen, was kann und kann nicht in anderen Sprachen so kategorisch getan werden. Ich denke, mein Beispiel war fehlerhaft, aber ich denke immer noch, dass Sie etwas von Haskell39s Weise der faulen Auswertung gewinnen: it39s wirklich dort durch Rückstellung und ohne irgendeine Bemühung vom Programmierer. Und dies, glaube ich, liegt an seiner funktionalen Natur und dem Fehlen von Nebenwirkungen. Ndash waxwing July 22, 2012 at 7:28 Während es sicherlich wahr ist, dass starke Typ-Systeme in der Regel müssen Sie sich an ihnen (that39s, was macht ihre Stärke nützlich), es ist auch der Fall, dass viele (die meisten) In der Tat, haben eine Art von 39ecape Hatch39, wie in der Link (nehmen Obj. magic in O39Caml als Beispiel, obwohl I39ve nie verwendet es außer als Hack) in der Praxis, aber für viele Arten von Programmen man nie braucht so ein Gerät. Ndash Zach Snow Apr 22 09 at 6:08 Die Frage, ob das Einstellen von Variablen ist wünschenswert, je nachdem, wie viel Schmerz es ist, die alternative Konstrukte vs verwenden, wie viel Schmerz durch die Verwendung von Variablen verursacht wird. Das heißt nicht, das gesamte Argument zu entlassen, sondern vielmehr darauf hinzuweisen, daß die Annahme der Quotvariablen ein höchst wünschenswertes Konstrukt ist, da ein Axiom nicht die Grundlage eines begrifflichen Arguments ist. Es passiert einfach so, wie die meisten Menschen lernen, wie man programmiert. Ndash gtd Apr 22 09 um 7: 31Tybee ist eine Asset Trading-Bibliothek, die stochastische nichtlineare Optimierung Techniken verwendet. Sein Entwurf und Gebrauch ist unten ausführlich. Es ist vor allem konzipiert und implementiert es als Gedankenexperiment. Ich glaube nicht, dass dieser Algorithmus oder diese Software erfolgreich oder profitabel mit einem Asset. Es ist auf eigene Gefahr zu verwenden (siehe LIZENZ). Es steht in Haskell. Warum heißt es Tybee Tybee ist eine Insel vor der Küste von Georgien. Wenn Sie dorthin gehen, stellen Sie sicher, dass Sie die Crab Shack. Es ist toll. Immer noch daran. Tybee verwendet eine einfache Idee. In Anbetracht einer Aktivitätshistorie können wir einen Modifikator für den aktuellen Durchschnittspreis X ermitteln, den wir kaufen werden, wenn der Ask-Kurs Cur X erreicht. Sobald der Bid-Kurs Cur Y (Y gt X) oder Cur Z (Z lt X ) (Ein Stoploss oder Boden). Die Optimierungszielfunktion simuliert dieses Handelsverhalten mit einem gegebenen Satz von Eingängen (X, Y, Z) unter Verwendung historischer Anlagenpreisdaten. Die Optimierungsfunktion steht zur Diskussion, ist aber derzeit als SPSA (Implementation) vorgesehen. Sie können über cabal (oder cabal-dev) installieren. Die Quelle erhalten Sie erhalten die tybee Quelle. Einrichten einer Sandbox. Das erste Mal durch, müssen Sie herunterladen und installieren eine Tonne von Abhängigkeiten, so hängen drin. Der Befehl cabal-dev ist nur ein Sandboxing-Wrapper um den Befehl cabal. Die - j-Flag oben sagt cabal, alle Ihre CPUs verwenden, so dass auch die ursprüngliche Build sollte nicht mehr als ein paar Minuten. Hinweis . Für den Entwicklungsmodus verwenden Sie --flagsdeveloper. Entwicklungsmodus ermöglicht es Ihnen, Tests von ghci leicht ausführen, um einige gute ole TDD. Sobald Sie den Code erstellt haben, können Sie die gesamte Test-Suite in wenigen Sekunden ausführen. Wir verwenden die direkte ausführbare anstatt cabal-dev-Tests, weil es nicht durch Optionen sehr gut passieren. Die RTS-N oben sagt, GHCs Laufzeitsystem für alle verfügbaren Kerne verwenden. Wenn Sie erkunden möchten, akzeptiert das Testprogramm (distbuildtestestests) eine Option --help. Versuch es. Tests von GHCI Sie können alle Tests von ghci ausführen. Startet die REPL. Oder Sie können einen einzelnen Test laufen lassen

No comments:

Post a Comment