Dies ist ein Python-Wrapper für TA-LIB basierend auf Cython anstelle von SWIG. Von der Homepage: TA-Lib ist weit verbreitet von Handelssoftwareentwicklern, die eine technische Analyse der Finanzmarktdaten durchführen müssen. Enthält 150 Indikatoren wie ADX, MACD, RSI, Stochastik, Bollinger Bands etc. Candlestick Mustererkennung Open-Source-API für CC, Java, Perl, Python und 100 Managed Die ursprünglichen Python-Bindungen verwenden SWIG, die leider schwer zu installieren und zu arent sind So effizient wie sie sein könnten. Deshalb nutzt dieses Projekt Cython und Numpy, um effizient und sauber an TA-Lib zu binden - die Ergebnisse 2-4 mal schneller als die SWIG-Schnittstelle zu produzieren. Installieren Sie TA-Lib oder lesen Sie die Docs Ähnlich wie bei TA-Lib bietet die Funktionsschnittstelle einen leichten Wrapper der exponierten TA-Lib-Indikatoren. Jede Funktion gibt ein Ausgabe-Array zurück und hat Standardwerte für ihre Parameter, sofern nicht als Keyword-Argumente angegeben. Typischerweise haben diese Funktionen eine erste Rückblickperiode (eine erforderliche Anzahl von Beobachtungen, bevor ein Ausgang erzeugt wird), die auf NaN gesetzt ist. Alle folgenden Beispiele verwenden die Funktion API: Berechnen Sie einen einfachen gleitenden Durchschnitt der engen Preise: Berechnen von Bollinger-Bands mit dreifach exponentiellem gleitenden Durchschnitt: Berechnung der Dynamik der engen Preise mit einem Zeitraum von 5: Abstract API Quick Start Wenn youre Bereits vertraut mit der Funktion API, sollten Sie sich wie zu Hause mit der abstrakten API fühlen. Jede Funktion nimmt dieselbe Eingabe ein, die als Wörterbuch von Numpy Arrays übergeben wird: Funktionen können entweder direkt importiert oder mit dem Namen instanziiert werden: Von dort aus ist das Aufrufen von Funktionen grundsätzlich das gleiche wie die Funktion API: Erfahren Sie hier über die erweiterte Nutzung von TA-Lib . Unterstützte Indikatoren Wir können alle TA-Funktionen, die von TA-Lib unterstützt werden, entweder als Liste oder als Dikt nach Gruppen sortiert (zB Overlap Studies, Momentum Indicators, etc.): FunktionsgruppenKapitel 2: Datentypen und Referenzierung Programmiersprachen und Anwendungen benötigen Daten. Wir definieren Anwendungen für die Arbeit mit Daten, und wir müssen Container, die verwendet werden können, um es zu halten. In diesem Kapitel geht es darum, Container zu definieren und mit Applikationsdaten zu arbeiten. Ob die Daten, die wir verwenden, von einem Keyboard-Eintrag kommen oder wenn wir mit einer Datenbank arbeiten, muss es eine Möglichkeit geben, sie vorübergehend in unseren Programmen zu speichern, damit sie manipuliert und verwendet werden können. Sobald wir mit den Daten fertig sind, können diese temporären Container zerstört werden, um Platz für neue Konstrukte zu schaffen. Beginnen Sie mit einem Blick auf die verschiedenen Datentypen, die von der Python-Sprache angeboten werden, und dann folgen wir, indem wir darüber nachdenken, wie wir diese Daten verwenden können, sobald sie gesammelt und gespeichert wurden. Wir werden die verschiedenen Arten von Strukturen vergleichen und kontrastieren, die wir in unserem Arsenal haben, und geben Sie einige Beispiele dafür, welche Strukturen für die Arbeit mit verschiedenen Arten von Daten verwendet werden sollen. Es gibt eine Vielzahl von Aufgaben, die durch die Verwendung von Listen, Wörterbüchern und Tupeln erreicht werden können und wir werden versuchen, viele von ihnen zu decken. Sobald Sie lernen, wie Sie diese Strukturen definieren und verwenden, dann sprechen Sie ein wenig darüber, was mit ihnen passiert, sobald sie nicht mehr von unserer Anwendung benötigt werden. Beginnen wir unsere Reise in die Erkundung von Datentypen und Strukturen innerhalb der Programmiersprache Python. Das sind Fähigkeiten, die du in jedem praktischen Jython-Programm verwenden wirst. Python-Datentypen Wie wir diskutiert haben, besteht die Notwendigkeit, Daten in Programmen zu speichern und zu manipulieren. Um dies zu tun, müssen wir auch die Möglichkeit haben, Container zu erstellen, die verwendet werden, um diese Daten zu halten, damit das Programm es verwenden kann. Die Sprache muss wissen, wie man Daten verarbeitet, sobald sie gespeichert ist, und wir können das tun, indem wir den Datenträger unseren Behältern in Java zuordnen. Allerdings ist es in Python nicht erforderlich, dies zu tun, weil der Dolmetscher in der Lage ist zu bestimmen, welche Art von Daten wir dynamisch speichern. Tabelle 2-1 listet jeden Datentyp auf und gibt eine kurze Beschreibung der Merkmale, die jeden von ihnen definieren. Tabelle 2-1. Python Datentypen Listen, Wörterbücher, Sets und Tupel Listen, Wörterbücher, Sets und Tupel alle bieten ähnliche Funktionalität und Usability, aber sie haben jeweils ihre eigene Nische in der Sprache. Gehen Sie durch einige Beispiele von jedem, da sie alle eine wichtige Rolle unter bestimmten Umständen spielen. Im Gegensatz zu Strings sind alle in diesem Abschnitt besprochenen Container (außer Tupel) veränderliche Objekte, so dass sie manipuliert werden können, nachdem sie erstellt wurden. Weil diese Container so wichtig sind, gehen wir am Ende dieses Kapitels durch eine Übung, die Ihnen die Chance gibt, sie selbst auszuprobieren. Vielleicht ist eines der am meisten verwendeten Konstrukte innerhalb der Python-Programmiersprache die Liste. Die meisten anderen Programmiersprachen bieten ähnliche Container für die Speicherung und Manipulation von Daten innerhalb einer Anwendung. Die Python-Liste bietet einen Vorteil gegenüber jenen ähnlichen Konstrukten, die in statisch typisierten Sprachen verfügbar sind. Die dynamischen Tendenzen der Python-Sprache helfen dem Listenkonstrukt, das große Merkmal zu nutzen, um die Möglichkeit zu haben, Werte verschiedener Typen zu enthalten. Dies bedeutet, dass eine Liste verwendet werden kann, um einen beliebigen Python-Datentyp zu speichern, und diese Typen können in einer einzigen Liste gemischt werden. In anderen Sprachen wird diese Art von Konstrukt oft als ein typisiertes Objekt definiert, das das Konstrukt mit nur einem Datentyp verriegelt. Die Erstellung und Verwendung von Python-Listen ist genauso wie der Rest der Sprache. Sehr einfach und einfach zu bedienen. Durch einfaches Zuordnen eines Satzes von leeren eckigen Klammern zu einer Variablen wird eine leere Liste erstellt. Wir können auch die eingebaute list () - Funktion verwenden, um eine Liste zu erstellen. Die Liste kann konstruiert und modifiziert werden, wenn die Anwendung läuft, sie werden nicht mit einer statischen Länge deklariert. Sie sind einfach durch die Verwendung von Schleifen zu durchqueren, und Indizes können auch für Positionsplatzierung oder Entfernung von bestimmten Gegenständen in der Liste verwendet werden. Nun fangen Sie an, indem Sie einige Beispiele für die Definition von Listen, und dann durch jede der verschiedenen Möglichkeiten, die die Python-Sprache bietet uns für die Arbeit mit Listen. Listing 2-7. Definieren von Listen Wie bereits erwähnt, können wir, um die Werte aus einer Liste zu erhalten, Indizes verwenden. Ähnlich wie das Array in der Java-Sprache, mit der Listindex-Notation können wir auf ein Element zugreifen. Wenn wir einen Bereich oder einen Satz von Werten aus einer Liste erhalten möchten, können wir einen Startindex und einen Endindex angeben. Diese Technik ist auch als schneiden bekannt. Was mehr ist, können wir auch einen Satz von Werten aus der Liste zusammen mit einem Schrittmuster zurückgeben, indem wir auch einen Schrittindex bereitstellen. Ein Schlüssel zum Erinnern ist, dass beim Zugriff auf eine Liste über Indizierung das erste Element in der Liste im 0-Index enthalten ist. Beachten Sie, dass beim Auflösen einer Liste immer eine neue Liste zurückgegeben wird. Eine Möglichkeit, eine flache Kopie einer Liste zu erstellen, ist die Verwendung von Slice Notation ohne Angabe einer oberen oder unteren Schranke. Die untere Grenze ist standardmäßig auf Null gesetzt, und die obere Grenze ist standardmäßig auf die Länge der Liste eingestellt. Beachten Sie, dass eine flache Kopie ein neues zusammengesetztes Objekt (Liste oder ein anderes Objekt mit Objekten) konstruiert und dann Referenzen in die ursprünglichen Objekte einfügt. Eine tiefe Kopie konstruiert ein neues zusammengesetztes Objekt und fügt dann Kopien in sie ein, basierend auf den im Original gefundenen Objekten. Listing 2-8. Zugriff auf eine Liste Das Ändern einer Liste ist sehr ähnlich, Sie können den Index verwenden, um Elemente aus einer bestimmten Position einzufügen oder zu entfernen. Es gibt auch viele andere Möglichkeiten, dass Sie Elemente aus der Liste einfügen oder entfernen können. Python bietet jede dieser verschiedenen Optionen, da sie unterschiedliche Funktionalität für Ihren Betrieb bieten. Sie können die Append () - Methode verwenden, um ein Element am Ende einer Liste hinzuzufügen. Mit der Methode extend () können Sie eine Kopie einer ganzen Liste oder Sequenz zum Ende einer Liste hinzufügen. Schließlich erlaubt die Methode insert (), ein Element oder eine andere Liste in eine bestimmte Position einer vorhandenen Liste zu platzieren, indem sie Positionsindizes verwendet. Wenn eine andere Liste in eine vorhandene Liste eingefügt wird, dann ist sie nicht mit der ursprünglichen Liste kombiniert, sondern sie handelt als separates Element in der ursprünglichen Liste. Sie finden Beispiele für jede Methode unten. Ähnlich haben wir viele Optionen zum Entfernen von Elementen aus einer Liste. Die del-Anweisung, wie in Kapitel 1 erläutert, kann verwendet werden, um eine ganze Liste oder Werte aus einer Liste mit der Indexnotation zu entfernen oder zu löschen. Sie können auch die Methode pop () oder remove () verwenden, um einzelne Werte aus einer Liste zu entfernen. Die Pop () - Methode entfernt einen einzelnen Wert aus dem Ende der Liste, und es wird auch diesen Wert zur gleichen Zeit zurückgeben. Wenn ein Index für die Funktion pop () bereitgestellt wird, wird der Wert an diesem Index entfernt und zurückgegeben. Die Methode remove () kann verwendet werden, um einen bestimmten Wert in der Liste zu finden und zu entfernen. Mit anderen Worten, remove () löscht das erste passende Element aus der Liste. Wenn mehr als ein Wert in der Liste mit dem Wert übereinstimmt, der in die Funktion remove () übergeben wird, wird der erste entfernt. Eine weitere Anmerkung über die Funktion remove () ist, dass der Wert nicht zurückgegeben wird. Werfen wir einen Blick auf diese Beispiele für die Änderung einer Liste. Listing 2-10. Ändern einer Liste Nun, da wir wissen, wie man Elemente aus einer Liste hinzufügen und entfernen kann, ist es Zeit zu lernen, wie man die Daten in ihnen manipuliert. Python bietet eine Reihe von verschiedenen Methoden, die verwendet werden können, um uns bei der Verwaltung unserer Listen zu helfen. Siehe Tabelle 2-4 für eine Liste dieser Funktionen und was sie tun können. Tabelle 2-4. Python-Listenmethoden Schauen wir uns einige Beispiele an, wie diese Funktionen auf Listen verwendet werden können. Listing 2-11. Verwenden von Listenfunktionen Traversieren und Suchen von Listen Umgehen in einer Liste ist ganz einfach. Sobald eine Liste bevölkert ist, wollen wir oft mal durchqueren und einige Aktionen gegen jedes darin enthaltene Element ausführen. Sie können jedes der Python-Looping-Konstrukte verwenden, um durch jedes Element innerhalb einer Liste zu durchlaufen. Während es viele Möglichkeiten gibt, funktioniert die for-Schleife besonders gut. Dies ist wegen der einfachen Syntax, die die Python for loop verwendet. Dieser Abschnitt zeigt Ihnen, wie Sie eine Liste mit jedem der verschiedenen Python-Looping-Konstrukte durchqueren können. Sie werden sehen, dass jeder von ihnen Vor-und Nachteile hat. Lass uns zuerst die Syntax ansehen, die verwendet wird, um eine Liste mit einer for-Schleife zu durchlaufen. Dies ist bei weitem eine der einfachsten Modi des Durchgangs jedes der Werte in einer Liste enthalten. Die for-Schleife durchläuft die Liste jeweils ein Element, so dass der Entwickler eine Aktion auf jedem Element ausführen kann, wenn dies gewünscht wird. Listing 2-12. Traversing einer Liste mit einem for-Loop Wie Sie aus diesem einfachen Beispiel sehen können, ist es ganz einfach, durch eine Liste zu gehen und mit jedem Element einzeln zu arbeiten. Die for-Schleifen-Syntax erfordert eine Variable, der jedem Element in der Liste für jeden Pass der Schleife zugewiesen wird. Es ist auch möglich, das Schneiden mit der Verwendung der for-Schleife zu kombinieren. In diesem Fall, verwenden Sie einfach ein Listen-Slice, um die genauen Elemente abzurufen, die wir sehen möchten. Zum Beispiel werfen Sie einen Blick auf den folgenden Code, der durch die ersten 5 Elemente in unserer Liste durchquert. Wie Sie sehen können, ist dies ganz einfach, indem Sie einfach die integrierten Funktionen nutzen, die Python bietet. List Verständnisse Wie wir im vorigen Abschnitt gesehen haben, können wir eine Kopie einer Liste mit dem Slicing erstellen. Eine weitere mächtigere Art, dies zu tun, ist über das Listenverständnis. Es gibt einige erweiterte Funktionen für Listen, die helfen können, um ein Entwickler Leben einfacher zu machen. Ein solches Merkmal ist als Listenverständnis bekannt. Während dieses Konzept zunächst erschreckend sein kann, bietet es eine gute Alternative, viele separate Listen manuell zu erstellen. List Verständnisse nehmen eine gegebene Liste, und dann iterate durch sie und wenden Sie einen gegebenen Ausdruck gegen jedes der Objekte in der Liste. Listing 2-14. Einfache Listenverständnis Wie Sie sehen können, erlaubt dies, dass man schnell eine Liste aufnimmt und sie über die Verwendung des mitgelieferten Ausdrucks ändert. Natürlich, wie bei vielen anderen Python-Methoden, gibt das Listenverständnis eine geänderte Kopie der Liste zurück. Das Listenverständnis erzeugt eine neue Liste und die Originalliste bleibt unberührt. Werfen wir einen Blick auf die Syntax für ein Listenverständnis. Sie bestehen grundsätzlich aus einem Ausdruck irgendeiner Art, gefolgt von einer for-Anweisung und dann optional mehr für oder if-Anweisungen. Die grundlegende Funktionalität eines Listenverständnisses ist, über die Elemente einer Liste zu iterieren und dann einen Ausdruck gegen jeden der Listenmitglieder anzuwenden. Syntaktisch liest ein Listenverständnis wie folgt: Iterieren Sie durch eine Liste und führen Sie optional einen Ausdruck auf jedem Element aus, dann geben Sie entweder eine neue Liste mit den resultierenden Elementen zurück oder werten jedes Element mit einer optionalen Klausel aus. Listing 2-15. Mit einem If-Klausel in einem List-Verständnis Lets einen Blick auf einige weitere Beispiele. Sobald du Listenverfassungen in der Tat gesehen hast, bist du sicher, sie zu verstehen und zu sehen, wie nützlich sie sein können. Listing 2-16. Python List Verständnis List Verständnisse können Code viel prägnanter machen und erlaubt es, Ausdrücke oder Funktionen anzuwenden, um Elemente ganz einfach aufzulisten. Lass uns einen kurzen Blick auf ein Beispiel in Java geschrieben für die Durchführung der gleichen Art von Arbeit wie ein Listen-Verständnis. Es ist klar zu sehen, dass Listenverständnisse viel prägnanter sind. Listing 2-17. Java-Code, um eine Liste der Altersgruppen zu nehmen und ein Jahr zu jedem Alter hinzuzufügen Tupel sind ähnlich wie Listen aber sie sind unveränderlich. Sobald ein Tupel definiert wurde, kann es nicht geändert werden. Sie enthalten Indizes genau wie Listen, aber wieder können sie nicht einmal geändert werden. Daher kann der Index in einem Tupel verwendet werden, um einen bestimmten Wert abzurufen und nicht zuzuordnen oder zu modifizieren. Während Tupel ähnlich wie Listen erscheinen können, sind sie ganz anders darin, dass Tupel in der Regel heterogene Elemente enthalten, während Listen oftmals Elemente enthalten, die in irgendeiner Weise verwandt sind. Zum Beispiel ist ein allgemeiner Anwendungsfall für Tupel, Parameter an eine Funktion, eine Methode und so weiter zu übergeben. Da Tupel Mitglied des Sequenztyps sind, können sie denselben Satz von Methoden verwenden, die für alle Sequenztypen verfügbar sind. Listing 2-18. Beispiele für Tupel Wie bereits erwähnt, können Tupel sehr nützlich sein, um auf Funktionen, Methoden, Klassen und so weiter zu übergeben. Oft ist es schön, ein unveränderliches Objekt für die Übergabe von mehreren Werten zu haben. Ein solcher Fall würde ein Tupel verwenden, um Koordinaten in einem geographischen Informationssystem oder einer anderen Anwendung der Art zu übergeben. Sie sind auch nett in Situationen zu verwenden, in denen ein unveränderliches Objekt gerechtfertigt ist. Weil sie unveränderlich sind, wächst ihre Größe nicht, sobald sie definiert wurden, so dass Tupel auch eine wichtige Rolle spielen können, wenn die Speicherzuteilung ein Anliegen ist. Wörterbücher Ein Python-Wörterbuch ist ein Schlüsselwert-Speicher-Container. Ein Wörterbuch ist ganz anders als eine typische Liste in Python, da es keinen automatisch besetzten Index für jedes gegebene Element innerhalb des Wörterbuchs gibt. Wenn du eine Liste benutzt, brauchst du dir keine Sorgen um die Zuordnung eines Index zu jedem Wert, der darin platziert ist. Ein Wörterbuch erlaubt dem Entwickler, jedem Element, das in das Konstrukt eingefügt wird, einen Index oder Schlüssel zuzuordnen. Daher benötigt jeder Eintrag in ein Wörterbuch zwei Werte, den Schlüssel und das Element. Die Schönheit des Wörterbuchs ist, dass es dem Entwickler erlaubt, den Datentyp des Schlüsselwertes zu wählen. Wenn man also einen String oder ein anderes Hash-Objekt wie einen int - oder float-Wert als Schlüssel verwenden möchte, dann ist es durchaus möglich. Wörterbücher haben auch eine Vielzahl von Methoden und Operationen, die auf sie angewendet werden können, um sie leichter zu bearbeiten. Tabelle 2-5 listet Wörterbuchmethoden und Funktionen auf. Listing 2-19. Grundlegende Wörterbuch Beispiele Tabelle 2-5. Wörterbuch Methoden und Funktionen Der Bereich ist eine spezielle Funktion, die es erlaubt, zwischen einer Reihe von Zahlen zu iterieren oder eine bestimmte Anzahl von Zahlen aufzulisten. Es ist besonders hilfreich für die Durchführung mathematischer Iterationen, aber es kann auch für einfache Iterationen verwendet werden. Das Format für die Verwendung der Bereichsfunktion beinhaltet eine optionale Startnummer, eine Endnummer und eine optionale Schrittnummer. Wenn angegeben, gibt die Startnummer den Bereich an, in dem sie beginnen sollen, während die Endnummer angibt, wo der Bereich enden soll. Der Startindex ist inklusive, während der Endindex nicht vorhanden ist. Die optionale Schrittnummer teilt dem Bereich mit, wie viele Zahlen zwischen jeder in der Bereichsausgabe enthaltenen Nummer platziert werden sollen. Die Schrittnummer wird der vorherigen Nummer hinzugefügt und wenn diese Zahl den Endpunkt überschreitet, stoppt der Bereich. Bereichsauflistung 2-24. Verwenden der Bereichsfunktion Eine der häufigsten Verwendungen für diese Funktion ist in einer for-Schleife. Das folgende Beispiel zeigt ein paar Möglichkeiten, die Bereichsfunktion innerhalb eines for-Loop-Kontextes zu verwenden. Listing 2-25. Verwenden der Range-Funktion innerhalb eines For-Loops Wie Sie sehen können, kann ein Bereich verwendet werden, um durch fast jede beliebige Zahl zu iterieren. Sei es nach oben oder unten, positiv oder negativ im Schritt. Ranges sind auch ein guter Weg, um eine Liste der Zahlen zu erstellen. Um dies zu tun, einfach einen Bereich auf Liste (), wie im folgenden Beispiel gezeigt. Listing 2-26 Erstellen Sie eine Liste aus einer Reihe Wie Sie sehen können, sind nicht nur Bereiche nützlich für iterative Zwecke, aber sie sind auch eine gute Möglichkeit, numerische Listen zu erstellen. Jython-spezifische Sammlungen Es gibt eine Reihe von Jython-spezifischen Sammlungsobjekten, die zur Verwendung verfügbar sind. Die meisten dieser Sammlungsobjekte werden verwendet, um Daten in Java-Klassen und so weiter zu übergeben, aber sie fügen zusätzliche Funktionalität in die Jython-Implementierung hinzu, die Python-Newcomern unterstützen wird, die aus der Java-Welt kommen. Trotzdem können viele dieser zusätzlichen Sammlungsobjekte unter bestimmten Situationen sehr nützlich sein. In der Jython 2.2-Version wurde die Java-Sammlung integriert. Dies ermöglicht eine bidirektionale Interaktion zwischen Jython - und Java-Auflistungstypen. Zum Beispiel kann eine Java ArrayList in Jython importiert und dann verwendet werden, als ob es Teil der Sprache wäre. Vor 2.2 konnten Java-Sammlungsobjekte als Jython-Objekt fungieren, aber Jython-Objekte konnten nicht als Java-Objekte fungieren. Zum Beispiel ist es möglich, eine Java ArrayList in Jython zu verwenden und Methoden wie add (), remove () und get () zu verwenden. Sie sehen im Beispiel unten, dass mit der add () - Methode einer ArrayList ein Element zur Liste hinzufügen und einen Booleschen zurückgeben wird, um den Erfolg oder Misserfolg der Addition zu bedeuten. Die Methode remove () wirkt ähnlich, außer dass es ein Element entfernt, anstatt es hinzuzufügen. Listing 2-27. Beispiel für die Verwendung von Java Oriented Collection in Jython Vor der Integration von Java-Sammlungen hatte Jython auch das Jarray-Objekt implementiert, das grundsätzlich den Aufbau eines Java-Arrays in Jython ermöglicht. Um mit einem Jarray zu arbeiten, definieren Sie einfach einen Sequenztyp in Jython und übergeben ihn an das Jarray-Objekt zusammen mit dem in der Sequenz enthaltenen Objekttyp. Die Jarray ist definitiv nützlich für die Erstellung von Java-Arrays und dann übergeben sie in Java-Objekte, aber es ist nicht sehr nützlich für die Arbeit in Jython-Objekte. Außerdem müssen alle Werte innerhalb eines Jarrays der gleiche Typ sein. Wenn Sie versuchen, eine Sequenz mit mehreren Typen zu einem Jarray zu übergeben, dann wird Ihnen ein TypeError einer oder anderen Art gegeben. Siehe Tabelle 2-8 für eine Auflistung von Zeichen-Typcodes, die mit jarray verwendet werden. Tabelle 2-8. Charakter-Typcodes für die Verwendung mit Jarray Eine weitere nützliche Funktion des Jarrays ist, dass wir leere Arrays erstellen können, wenn wir es wünschen, indem wir die Methode nullen () verwenden. Die Methode nullen () funktioniert ähnlich wie die Array () - Methode, die bereits gezeigt wurde. Um ein Array zu erstellen, das leer ist, übergeben Sie einfach die Länge des Arrays zusammen mit dem Typ auf die Nullen () - Methode. Lass uns einen kurzen Blick auf ein Beispiel werfen. Listing 2-29. Erstellen Sie eine leere Boolesche Array Listing 2-30. Erstellen Sie ein leeres Integer-Array Unter bestimmten Umständen, wenn Sie mit Java-Objekten arbeiten, müssen Sie eine Java-Methode aufrufen, die ein Java-Array als Argument benötigt. Die Verwendung des Jarray-Objekts ermöglicht eine einfache Möglichkeit, Java-Arrays zu erstellen, wenn es benötigt wird. Dateiobjekte werden zum Lesen und Schreiben von Daten in eine Datei auf dem Datenträger verwendet. Das Dateiobjekt wird verwendet, um einen Verweis auf die Datei auf dem Datenträger zu erhalten und es zum Lesen, Schreiben, Anhängen oder einer Anzahl verschiedener Aufgaben zu öffnen. Wenn wir einfach die Funktion open (filename, mode) verwenden, können wir ein Dateiobjekt zurückgeben und es einer Variablen zur Verarbeitung zuordnen. Wenn die Datei noch nicht auf der Festplatte vorhanden ist, wird sie automatisch erstellt. Das Modusargument wird verwendet, um zu ermitteln, welche Art von Verarbeitung wir in der Datei ausführen möchten. Dieses Argument ist optional und wenn ausgelassen, wird die Datei im schreibgeschützten Modus geöffnet. Siehe Tabelle 2-9. Tabelle 2-9. Betriebsarten für Dateitypen Es gibt viele Methoden, die auf Dateipositionen zur Manipulation des Dateiinhalts verwendet werden können. Wir können lesen (Größe) in einer Datei, um seinen Inhalt zu lesen. Größe ist ein optionales Argument hier und es wird verwendet, um zu erzählen, wie viel Inhalt aus der Datei zu lesen. Wenn es weggelassen wird, wird der gesamte Dateiinhalt gelesen. Die Methode readline () kann verwendet werden, um eine einzelne Zeile aus einer Datei zu lesen. Readlines (size) wird verwendet, um eine Liste mit allen Datenzeilen zurückzugeben, die in einer Datei enthalten sind. Wieder gibt es eine optionale Größe Parameter, der verwendet werden kann, um zu sagen, wie viele Bytes aus der Datei zu lesen. Wenn wir Inhalte in die Datei platzieren wollen, macht die Schreib - (String-) Methode genau das. Die write () - Methode schreibt einen String in die Datei. Beim Schreiben in eine Datei ist es oft wichtig, genau zu wissen, welche Position in der Datei Sie schreiben werden. Es gibt eine Gruppe von Methoden, um uns mit der Positionierung in einer Datei mit Integern zu helfen, um Bytes in der Datei darzustellen. Die tell () - Methode kann in einer Datei aufgerufen werden, um der aktuellen Position der Dateiobjekte zu geben. Die ganze Zahl, die zurückgegeben wird, ist in einer Anzahl von Bytes und ist ein Versatz vom Anfang der Datei. Die Methode search (offset from from) kann verwendet werden, um die Position in einer Datei zu ändern. Der Offset ist die Nummer in Bytes der Position, die du gerne gehst, und von der Stelle in der Datei, wo Du den Rechnungspreis berechnen möchtest. Wenn aus gleich 0, wird der Offset aus dem Anfang der Datei berechnet. Ebenso, wenn es gleich 1 ist, wird es aus der aktuellen Dateiposition berechnet und 2 wird vom Ende der Datei sein. Die Voreinstellung ist 0, wenn von ausgelassen wird. Schließlich ist es wichtig, Ressourcen effizient in unseren Programmen zuzuordnen und zu entteilen, oder wir werden einen Speicheraufwand und Lecks verursachen. Ressourcen sind in der Regel ein bisschen anders zwischen CPython und Jython behandelt, weil Garbage Collection anders verhält. In CPython ist es nicht so wichtig, sich Sorgen zu machen, um die Ressourcen zuzuordnen, da sie automatisch de-allocated werden, wenn sie außerhalb des Geltungsbereichs sind. Die JVM bemerkt sofort Müll sammeln, so dass eine ordnungsgemäße Verteilung der Ressourcen wichtiger ist. Die Methode close () sollte in einer Datei aufgerufen werden, wenn wir damit arbeiten. Die richtige Methodik, die bei der Arbeit mit einer Datei zu verwenden ist, zu öffnen, zu verarbeiten und dann jedes Mal zu schließen. Allerdings gibt es effizientere Wege zur Durchführung solcher Aufgaben. In Kapitel 7 werden wir die Verwendung von Kontextmanagern diskutieren, um die gleiche Funktionalität effizienter durchzuführen. Listing 2-32. Dateimanipulation in Python-Iteratoren Der Iterator wurde in der Version 2.2 in Python zurückgeführt. Es erlaubt die Iteration über Python-Container. Alle iterable Container haben eine integrierte Unterstützung für den Iterator-Typ. Zum Beispiel sind Sequenzobjekte iterierbar, da sie eine Iteration über jedes Element innerhalb der Sequenz zulassen. Wenn Sie versuchen, einen Iterator auf ein Objekt zurückzugeben, das keine Iteration unterstützt, erhalten Sie höchstwahrscheinlich einen AttributeError, der Ihnen mitteilt, dass iter nicht als Attribut für dieses Objekt definiert wurde. Es ist wichtig zu beachten, dass Python-Methodennamen mit Doppel-Unterstrichen spezielle Methoden sind. Zum Beispiel kann in Python eine Klasse mit der init () Methode initialisiert werden. Ähnlich wie ein Java-Konstruktor. Weitere Einzelheiten zu Klassen und speziellen Klassenmethoden finden Sie in Kapitel 7. Iteratoren ermöglichen einen einfachen Zugriff auf Sequenzen und andere iterable Container. Einige Container wie Wörterbücher haben spezialisierte Iterationsmethoden, die in sie eingebaut wurden, wie Sie in früheren Abschnitten gesehen haben. Iterator-Objekte sind erforderlich, um zwei Hauptmethoden zu unterstützen, die das Iterator-Protokoll bilden. Diese Methoden sind nachstehend in Tabelle 2-10 definiert. Um einen Iterator auf einen Container zurückzugeben, ordnen Sie der Variablen nur container. iter () zu. Diese Variable wird zum Iterator für das Objekt. Dies bietet dem eine die Möglichkeit, Iteratoren herumzugehen, in Funktionen und dergleichen. Der Iterator ist dann selbst wie eine wechselnde Variable, die ihren Zustand beibehält. Wir können die Arbeit mit dem Iterator verwenden, ohne das ursprüngliche Objekt zu beeinflussen. Wenn Sie den nächsten () Aufruf verwenden, wird der nächste Eintrag innerhalb der Liste fortgesetzt, bis alle Elemente abgerufen wurden. Sobald dies geschieht, wird eine StopIteration-Ausnahme ausgegeben. Das Wichtige, was hier zu beachten ist, ist, dass wir eigentlich eine Kopie der Liste erstellen, wenn wir den Iterator zurückgeben und einer Variablen zuordnen. Diese Variable gibt ein Element aus dieser Kopie jedes Mal zurück, wenn die nächste () - Methode aufgerufen wird. Wenn wir weiterhin die nächste () auf die Iterator-Variable aufrufen, bis der StopIteration-Fehler ausgegeben wird, enthält die Variable keine Elemente mehr und ist leer. Zum Beispiel, wenn wir einen Iterator aus einer Liste erstellt haben, dann die nächste () - Methode darauf aufgerufen, bis sie alle Werte abgerufen hat, dann wäre der Iterator leer und die ursprüngliche Liste wäre unberührt geblieben. Listing 2-33. Erstellen Sie einen Iterator aus einer Liste und verwenden Sie es Listing 2-34. Iteration über Sequenz - und Listenreferenzen und Kopien Das Erstellen von Kopien und referenzierenden Elementen in der Python-Sprache ist ziemlich einfach. Das einzige, was Sie beachten müssen, ist, dass die Techniken, die verwendet werden, um veränderliche und unveränderliche Objekte zu kopieren, ein wenig abweichen. Um eine Kopie eines unveränderlichen Objekts zu erstellen, ordnen Sie es einfach einer anderen Variablen zu. Die neue Variable ist eine exakte Kopie des Objekts. Wenn Sie versuchen, das gleiche mit einem veränderlichen Objekt zu tun, werden Sie tatsächlich nur einen Verweis auf das ursprüngliche Objekt erstellen. Wenn Sie also Operationen auf der Kopie des Originals durchführen, wird der gleiche Vorgang tatsächlich auf dem Original durchgeführt. Dies geschieht, weil die neue Zuordnung das gleiche veränderliche Objekt im Speicher als das Original verweist. Es ist irgendwie wie jemand, der dich an einen anderen Namen ruft. Eine Person kann Sie bei Ihrem Geburtsnamen anrufen und ein anderer kann Sie mit Ihrem Spitznamen anrufen, aber beide Namen werden Sie natürlich verweisen. Listing 2-35. Arbeiten mit Kopien Um eine Kopie eines veränderlichen Objekts effektiv zu erstellen, haben Sie zwei Möglichkeiten. Sie können entweder erstellen, was als flache Kopie oder eine tiefe Kopie des ursprünglichen Objekts bekannt ist. Der Unterschied besteht darin, dass eine flache Kopie eines Objekts ein neues Objekt erstellt und dann mit Verweisen auf die im ursprünglichen Objekt enthaltenen Elemente füllt. Wenn Sie also irgendwelche dieser Elemente ändern, wird jedes Objekt betroffen sein, da sie beide dieselben Elemente verweisen. Eine tiefe Kopie erstellt ein neues Objekt und kopiert dann rekursiv den Inhalt des Originalobjekts in die neue Kopie. Sobald Sie eine tiefe Kopie eines Objekts durchführen, können Sie Operationen auf jedem in der Kopie enthaltenen Objekt ausführen, ohne das Original zu beeinflussen. Sie können die deepcopy-Funktion im Kopiermodul der Python-Standardbibliothek verwenden, um eine solche Kopie zu erstellen. Lets Blick auf einige weitere Beispiele für die Erstellung von Kopien, um Ihnen eine bessere Vorstellung davon, wie das funktioniert. Garbage Collection Dies ist einer der großen Unterschiede zwischen CPython und Jython. In CPython ist ein Objekt Müll gesammelt, wenn es außerhalb des Umfangs geht oder nicht mehr benötigt wird. Dies geschieht automatisch und muss selten vom Entwickler verfolgt werden. Hinter den Kulissen verwendet CPython eine Referenzzähltechnik, um eine Zählung auf jedem Objekt zu pflegen, die effektiv bestimmt, ob das Objekt noch verwendet wird. Im Gegensatz zu CPython, Jython nicht implementieren eine Referenzzählung Technik für Alterung aus oder Garbage Collection unbenutzte Objekte. Stattdessen nutzt Jython die Müllsammelmechanismen, die die Java-Plattform bietet. Wenn ein Jython-Objekt veraltet oder unerreichbar wird, kann die JVM es nicht oder nicht zurückfordern. Einer der Hauptaspekte der JVM, die Entwickler in den frühen Tagen so glücklich gemacht haben, ist, dass es nicht mehr nötig war, sich nach dem Code zu beruhigen. In der Programmiersprache C muss man sich bewusst sein, welche Objekte derzeit benutzt werden, so dass, wenn sie nicht mehr benötigt werden, das Programm etwas aufräumen würde. Nicht in der Java-Welt kümmert sich der GC-Thread auf die JVM um alle Müllabfuhr und Aufräumarbeiten für dich. Auch wenn wir noch nicht im Detail über Klassen gesprochen haben, sahen Sie ein kurzes Beispiel dafür, wie sie in Kapitel 1 sind. Es ist eine gute Zeit zu erwähnen, dass Python einen Mechanismus für die Objektbereinigung bietet. In jeder Klasse kann eine Finalisierungsmethode definiert werden, um sicherzustellen, dass der Garbage Collector bestimmte Aufgaben ausführt. Jeder Cleanup-Code, der ausgeführt werden muss, wenn ein Objekt außerhalb des Geltungsbereichs liegt, kann in dieser Finalizer-Methode platziert werden. Es ist wichtig zu beachten, dass die Finalizer-Methode nicht als eine Methode gezählt werden kann, die immer aufgerufen wird, wenn ein Objekt abgestanden ist. Dies ist der Fall, weil die Finalizer-Methode von der Java Garbage Collection Thread aufgerufen wird, und es gibt keine Möglichkeit, sicher zu sein, wann und wenn der Garbage Collector auf einem Objekt aufgerufen wird. Eine weitere Frage der Note mit dem Finalizer ist, dass sie eine Performance-Strafe entstehen. Wenn du eine Bewerbung kodierst, die bereits schlecht ist, dann kann es nicht eine gute Idee sein, viele Finalisierer hineinzuwerfen. Das folgende ist ein Beispiel für einen Python-Finalizer. Es ist eine Instanzmethode, die benannt werden muss. Listing 2-37. Python Finalizer Beispiel Der Nachteil der Verwendung der JVM Garbage Collection Mechanismen ist, dass es wirklich keine Garantie, wann und wenn ein Objekt zurückgefordert wird. Bei der Arbeit mit leistungsintensiven Objekten ist es also am besten, sich nicht auf einen Finalizer zu verlassen, der angerufen werden soll. Es ist immer wichtig, dafür zu sorgen, dass in solchen Fällen bei der Arbeit mit Objekten wie Dateien und Datenbanken korrekte Codierungstechniken verwendet werden. Verwenden Sie niemals die Methode close () für eine Datei in einen Finalizer, da dies ein Problem verursachen kann, wenn der Finalizer nicht aufgerufen wird. Best Practice ist, um sicherzustellen, dass alle obligatorischen Bereinigung Aktivitäten durchgeführt werden, bevor ein Finalizer aufgerufen werden würde. In diesem Kapitel wurde viel Material behandelt. Du solltest dich nach dem Lesen durch dieses Material besser mit Python vertraut machen. Wir begannen das Kapitel, indem wir die Grundlagen der Zuordnung eine Zuordnung von Daten zu bestimmten Objekten oder Datentypen abdecken. Sie haben gelernt, dass die Arbeit mit jedem Typ von Datenobjekt verschiedene Türen öffnet, wie die Art und Weise, wie wir mit jedem Typ von Datenobjekt arbeiten, sich unterscheidet. Unsere Reise in Datenobjekte begann mit Zahlen und Streichern, und wir diskutierten die vielen Methoden, die dem String-Objekt zur Verfügung standen. Wir haben gelernt, dass Strings Teil der Sequenzfamilie von Python-Sammlungsobjekten zusammen mit Listen und Tupeln sind. Wir haben gedeckt, wie wir mit Listen erstellen und arbeiten können, und die Vielfalt der Möglichkeiten, die uns bei der Verwendung von Listen zur Verfügung stehen. Sie haben entdeckt, dass Listenverständnisse dazu beitragen können, Kopien einer bestimmten Liste zu erstellen und ihre Elemente nach einem Ausdruck oder einer Funktion zu manipulieren. Nach der Besprechung von Listen haben wir Wörterbücher, Sets und Tupel besprochen. Nach der Besprechung der Sammeltypen haben wir gelernt, dass Jython seinen eigenen Satz von Sammlungsobjekten hat, die sich von denen in Python unterscheiden. Wir können den Vorteil nutzen, dass wir die Java-Plattform an unseren Fingerspitzen haben und Java-Sammeltypen aus Jython verwenden. Wir haben die Diskussion über Referenzen, Kopien und Garbage Collection beendet. Erstellen von verschiedenen Kopien von Objekten nicht immer geben Ihnen, was youd erwarten, und dass Jython Garbage Collection unterscheidet sich einiges von der von Python. Das nächste Kapitel hilft Ihnen, einige der Themen, die Sie in diesem Kapitel kennen gelernt haben, zu kombinieren, wie Sie lernen, wie Sie Ausdrücke definieren und mit Kontrollfluss arbeiten. Technische Analyse in Excel: Teil I 8211 SMA, EMA, Bollinger Bands In diesem drei - Teil-Serie oder Artikel 8220Technische Analyse in Excel8221 werden wir untersuchen, wie Händler Excel verwenden können, um technische Analyse (TA) auf historische Marktdaten anzuwenden. Dazu gehören die Berechnung einiger der populärsten Analysenindikatoren und die Umsetzung einer Trading-Strategie-Backtesting-Kalkulationstabelle (in Teil III). Backtesting beinhaltet die Erstellung von Kauf - und Verkaufssignalen auf Basis von TA-Indikatoren und die Berechnung der Strategie P038L. We8217d möchten gern im Vorfeld darauf hinweisen, dass alle Berechnungen in diesen Artikeln mit Standard-Excel-Funktionen in Excel 2011 und später durchgeführt werden. Wir werden keine VBAcustom Excel Makros verwenden. Dies geschieht absichtlich, um Kalkulationstabellen einfach und funktional zu verstehen, die von Nichtprogrammierern verständlich sind. In the first part of this article series we will create an Excel spreadsheet where we will use formulas some common technical analysis indicators such as: Simple Moving Average, Bollinger Bands, and Exponential Moving Average. Well explain the formulas and include step-by-step instructions below. In addition, we are providing a spreadsheet we8217ve created by following steps listed in this article so that you can use it for your own market data analysis or as basis for building your own spreadsheets. Sample Excel File Excel file (download ) containing formulas for calculation of simple moving average, Bollinger Bands, and exponential moving average as described in this post. For this example weve got a CSV file with 6 months of hourly SPY data, covering Sep 3, 2013 8211 Feb 28, 2014. SPY is an ETF tracking SampP500 index. We have nearly 2000 data points in this file. The file contains OHCL price columns, volume, and timestamp column. Disclaimer: this file has been generated using IB Data Downloader . Data file: historicaldataSPY1hour20140301 (text file 8211 to download 8211 right-click and select 8220Save Linked File As8221) Simple Moving Average Basic Calculation Simple Moving Average (SMA) is simply the average price over last N number of bars. Lets calculate SMA for the close prices from our sample data file. Well be calculating a 20-day moving average based on the SPY close price (column D). Let8217s add column header SMA-20 in column G and we type in the following formula value in cell G21 (since row 21 is the first one that has enough data to calculate 20-day SMA): After hitting return to save the formula you should see value 164.57 or close to that in cell G21. In order to calculate SMA-20 for all of the remaining cells below 8211 just select cell G21, move cursor over cell and double-click the small square in the lower-right corner of that cell. You should now see values in column G calculated for the remainder of SPY prices. Generalizing SMA Calculation Now we have calculated 20-day simple moving average values in column G. Its great, but what if we want to calculate 50-day, or 200-day SMA now Updating formula values every time you want to change SMA range is pretty tedious and error-prone. Lets make our calculation more generic by adding a 8220length8221 parameter. We can start off by storing SMA range parameter in a separate cell so that we can reference it in or formula. Here are the steps we followed to implement a generic SMA calculation in our spreadsheet: Let8217s start off by creating a little table on the side where we can store some input parameter values for our indicators. In cell O1 lets type Variable Name, in cell P1 lets type Value. In cell O2 lets type name of our variable: PERIOD. In cell P2 we specify value of the PERIOD variable which well be using to specify period length for our generalized SMA calculation. Changing this variable will trigger recalculation of SMA with the current period value. Lets use value 14 for now. Lets type column header value SMA in cell H1 column H will contain values for our generic SMA indicator. In cell H2 enter this formula: Lets dissect this formula. We are now using value of our PERIOD variable from cell P2. We had to add in front of column and row numbers to freeze reference to cell P2 as we copy SMA formula to other cells in column H. Weve also replaced absolute reference to the Close column price range with the OFFSET Excel function. OFFSET returns a range of cells based on the offset in terms of number rows and columns from a given 8220reference8221 cell. First parameter is the reference cell (in our case H2 itself), second is an expression calculating the first row of the range based on the value of length parameter (P2), 3rd parameter is the column offset to the Close column (-4), negative value represents offset to the left while positive is offset to the right of the reference cell, and the last function parameter with value 1 represents the width of the range returned by OFFSET function, which in our case is just one column: D (CLOSE). Save the formula in cell in H2 and expand it to the rest of cells in column H by double-clicking the little square in lower-right corner of the cell, or dragging the formula down. Removing Formula Errors Now, you will notice that first several rows in the column have error value REF. This happens because there are not enough rows in our data set to calculate the SMA value, and the range returned by OFFSET function goes over the edge of the worksheet for some rows. There exists a number of various techniques to hide error values in excel. Some of them involve formulas which return blank or zero values if a cell value contains an error. While this is perfectly valid technique - it complicates cell formulas and makes them hard to read. Instead, well use conditional formatting to simply hide error values be changing foreground color to white. To change cells font color to white and use no error highlighting follow these instructions: Select columns H-N In Excel: Home - gt Conditional Formatting - gt Highlight Cell Rules - gt More Rules. In the New Formatting Rule dialog select Errors and in Format with select Custom format, then set Fill color to white and font color to white as well. Bollinger Bands Introduction Bollinger Bands is a simple but useful indicator providing valuable information on historical price volatility of a financial instrument, as well as current price deviation from a moving average. When price moves become more volatile 8211 the bands widen, in the periods of relative calm 8211 they come closer together. The relative position of the current price to the bands can also be used to estimate whether market is overbought or oversold. If the current price is close to or crossed upper band 8211 the price is considered in overbought territory, while price close tocrossed lower band 8211 underlying market is considered oversold. Basic Calculation Bollinger Bands indicator could be calculated using either simple moving average or exponential moving average as the basis. Bollinger Bands consists of three data series: moving average (simple or exponential) and two standard deviation (boundary) lines, one above, and one below the moving average, usually at 2 standard deviations from the moving average. Exponential moving average (covered below) gives more weight to the more recent price action, while Simple moving average provides a more stable and less jittery indicator. There are a total of 2 input parameters: 1) moving average period (number of bars), 2) number of standard deviations for the upper band lower bands. In this example well use simple moving average we already calculated in column H (see instructions in the section above). All thats remaining is to add columns for upper and lower bands. We are still using 14-day moving average period value. The first row that has enough data for 14-day SMA is row 15 (since row 1 is used for column header). The upper band will be in column I, so in cell I15 we type the following formula: In this formula we are simply adding two standard deviations of the Close prices from cells D2:D15 to the SMA value. Here the only difference from the previous formula is that we are subtracting two standard deviations from SMA. Excel formula STDEV() calculates standard deviation for a series of values. In this case we are multiplying value by 2 to get 2 standard deviations, and addingsubtracting the result from the moving average to generate the upperlower band values. To expand the formulas 8211 just roll over and double-click on a small square in the lower-right corner of the cell to replicate formula for the rest of the data range. Generalized Bollinger Band Computation Now. how about generalizing the Bollinger Band formula so that we dont have to update our formulas every time we want to calculate Bollinger bands for different number of standard deviations from MA or when we change moving average length. Lets add another parameter to our generic variables table on the right of the spreadsheet. Lets type Std devs: in cell O3, and 2.0 in P3. Next, let8217s add the following formula in I15: In this formula weve replaced 2 with P3 8211 which points to our variable in cell P3 containing number of standard deviations for the bands, and calculate offset based on the PERIOD variable in cell P2. The only difference from the formula in the previous step is that weve replaced after H15 with 8211 (minus), to subtract number of standard deviations from SMA, and we had to change offset to the price columnd. notice -6, instead of -5 in the cols parameter to the OFFSET function to refer to column D (CLOSE). Dont forget to copy new formulas in cells I15 and J15 to the rest of the respective column cells. You can now change values of PERIOD and Std devs variables in cells P2 amp P3, and have SMA and Bollinger Band values automatically recalculated. Bollinger Bands Chart in Excel Watch this video with instructions for adding a Bollinger Band chart to the spreadsheet we created above. Exponential Moving Average Exponential Moving Average (EMA) is type of moving average that is similar to a simple moving average, except that more weight is given to the latest data. The exponential moving average is also known as 8220exponentially weighted moving average8221. Computation Instructions Well use column K to calculate EMA. Lets set our PERIOD value to 1 (cell P2), so that we could enter formula at the top of our sheet and have some values we can see entering the formulas. We can set PERIOD to any value after we are done and have EMA (and SMA) automatically recalculated. In cell K2 we set the first value of the EMA series to be simply equal to the Close value (D2) in the same row, just because we need to seed EMA computation with some sensible value. Next, in cell K3 we enter a standard EMA formula which uses the industry-standard exponent function 2(1number of periods in MA). To better understand the math behind this refer to this page. In this formula we multiply rows Close price (D3) by the exponent function, using P2 to reference our number of periods variable, and add to the result the previous EMA value (K2), multiplied 1- the exponent. This is the standard EMA formula. Now expand the formula to the rest of the column by clicking a square in the lower right of cell K3. We can now change PERIOD value to any other number, make sure your conditional formatting rule is updated to hide error values displayed in cells that dont have enough data going back to calculate their values. Part I Conclusion In this first part of our 3-part series we calculated Simple Moving Average, Bollinger Bands, and Exponential Moving Average technical analysis indicators for our sample historical data set. In the next part well cover two of the most famous technical analysis indicators: MACD and RSI. Before you continue reading this article series we8217d like to bring your attention to a couple of books we hand-picked from a large number of volumes available on the subjects of technical analysis and trading with Microsoft Excel. We found that the selections we listed below provide invaluable fundamental information on using technical analysis and Excel-based trading idea generation, testing, and execution. Combining material described in these books will enable you to develop and test your own trading systems and take them to markets sooner and with more confidence. IB Data Downloader IB Data Downloader version 3.3 is now available Download historical data from Interactive Brokers. Stocks, Futures, ETFs, Indexes, Forex, Options, FOPs. Now supports options historical data download Runs on Windows, MacOS, Linux. Automatically handles IB API pacing violations, no restrictions on duration due to pacing limitations Supports historical data for expired futures contracts. IB Excel Trader IB Excel Trader version 1.6 is now available Trade Stocks, ETFs, Futures, and Forex directly from Excel. Implement custom trading rules using spreadsheet formulas or VBA. Program entry rules for single or bracket exit orders. Market, Stop, Limit, Stop-Limit, as well as complex algo orders are supported. Order Log sheet (new). Contains a detailed list of each order status change in a filterable Excel table. Use our Customization Service to extend IB Excel Trader and contract our programmers to develop your custom trading strategies. Interactive Brokers (IB) is a low cost provider of trade execution and clearing services for individuals, advisors, prop trading groups, brokers and hedge funds. IBs premier technology provides direct access to stocks, options, futures, forex, bonds and funds on over 100 markets worldwide from a single IB Universal account. Member NYSE, FINRA, SIPC. Visit interactivebrokers for more information. kürzliche Posts
No comments:
Post a Comment