Entwicklung von CTA-Strategien für absolute Gewinne von Quantitative Transaktionen bis zu Asset Management

Schriftsteller: , Erstellt: 2019-06-26 10:27:41, Aktualisiert: 2023-10-30 20:30:50

[TOC]

img

Vorwort

Warum sollten wir diese Lektion lernen?Was bringt es, wenn man diesen Kurs lernt? Erstens basiert der Kurs auf JavaScript und Python, und die Sprache ist nur eine Technologie, und schließlich wollen wir diese Technologie in eine Branche umsetzen.

Wenn Sie bereit sind, in den Bereich des quantitativen Handels einzutauchen, können Sie auch von Ihren Kollegen unterstützt werden. Wenn Sie ein Liebhaber von Aktien- oder Futures-Investments sind, kann Quantitativer Handel Ihrem Hauptthema vollkommen helfen, indem Sie eine Handelsstrategie entwickeln, um in den Finanzmärkten zu profitieren, und erweitern Sie die Kanäle und Plattformen für Ihre Investitionsfinanzierung.

Vorher möchte ich über meine persönliche Handelserfahrung berichten. Ich bin nicht aus der Finanzwelt, sondern aus der Statistik. Ich begann als Student mit dem subjektiven Handel mit Aktien und wurde später zufällig zum quantitativen Handler in privaten nationalen Fonds, der hauptsächlich Strategieforschung und Strategieentwicklung betreibt.

Ich bin seit mehr als einem Jahrzehnt in diesem Kreis tätig und habe verschiedene Strategien entwickelt. Meine Anlagedeutung ist: Risikokontrolle über alles, Fokus auf absoluten Gewinn. Unser Kurs ist: Entwicklung von CTA-Strategien für absolute Gewinne, von der Quantifizierung des Handels bis zur Vermögensverwaltung.

1. Futures CTA-Strategie und Logik, um Geld zu verdienen

1.1 Kennenlernen von Futures CTA

Was ist ein CTA? Was genau ist ein CTA? Ein CTA wird im Ausland als Kommoditätshandelsberater bezeichnet und im Inland als Investmentmanager bezeichnet. Traditionell konzentriert sich ein CTA auf das Kapital von großen Anlegern und beauftragt es dann an professionelle Investmentfirmen, um schließlich durch einen Handelsberater (d. h. einen CTA) in Aktien-Futures, Kommoditäts-Futures und Staatsanleihen-Futures zu investieren.

Aber in der Praxis wird das Konzept der CTA mit der wachsenden Entwicklung des globalen Futures-Marktes immer größer und umfangreicher als die traditionellen Futures. Es kann nicht nur in den Futures-Markt investiert werden, sondern auch in den Zinsmärkten, den Aktienmärkten, den Devisenmärkten und den Optionsmärkten.

Bis in die 80er Jahre war die E-Disk-Technologie noch nicht sehr gut entwickelt, als die meisten Händler die zukünftige Entwicklung von Commodity-Futures mit Hilfe von manuellen technischen Indikatoren wie dem William-Indikator, KDJ, RSI, MACD, CCI und anderen beurteilten. Später gründeten Händler spezielle CTA-Fonds, um Kunden bei der Verwaltung von Vermögenswerten zu unterstützen.

Veränderung der Größe des CTA-Fonds img Einheit: Milliarden Dollar

Wenn man sich das Bild oben ansieht, insbesondere mit dem Aufstieg von Quantitative Trading, ist die Größe der globalen CTA-Fonds von 130,6 Milliarden US-Dollar im Jahr 2005 auf mehr als 300 Milliarden US-Dollar im Jahr 2015 gestiegen.

Mit der Größe stieg auch die Performance des CTA-Fonds, der Barclays CTA Index, der als repräsentativer Branchenbenchmark für globale Handelsberater gilt. Von Ende 1979 bis Ende 2016 erzielte der Barclays CTA-Fonds eine kumulierte Ertragsrate von 28.95 Mal, eine jährliche Ertragsrate von 9.59%, einen Sharpe von 0.37 und einen maximalen Rückzug von 15.66%.

Da die CTA-Strategie in der Vermögensverteilung in der Regel nur sehr wenig mit den anderen Strategien zusammenhängt. Wie in den folgenden Bilderkreisen zeigt sich, war der CTA-Fonds-Index der Barclays nicht nur nicht gesunken, sondern erwirtschaftete auch positive Gewinne während der globalen Börsenbeermärkte von 2000-2002 und der globalen Subprime-Krise von 2008.

img

Die Entwicklung der CTA in China ist auch nur knapp zehn Jahre, aber die Dynamik ist stark, was vor allem auf das relativ offene Handelsumfeld der inländischen Commodity-Futures, die niedrigere Handelskapitalgrenze, die Einführung eines Sicherungssystems, das mehr freie und zweiseitige Transaktionen ermöglicht, die niedrigen Transaktionsgebühren, die technologische Architektur der Börsen, die im Vergleich zu Aktien fortschrittlicher und einfacher zum Systemhandel ist, usw. zurückzuführen ist.

Seit 2010 existieren die CTA-Fonds hauptsächlich in Form von Privatfonds. Mit der schrittweisen Öffnung der Inlandspolitik für die Anlage von Fonds-Einzelhändlern, die CTA-Fonds in Form von Fonds-Einzelhändlern existieren, ist ihre transparentere und öffentlichere Funktionsweise auch ein notwendiges Instrument für die Verteilung von Vermögenswerten von mehr Investoren geworden.

img

Wie in der Abbildung zu sehen ist, ist die CTA-Strategie auch für Einzelhändler besser geeignet als andere Handelsstrategien, unabhängig von der Leichtigkeit der Erreichbarkeit, der Kapitalgrenze, der Ausführung der Handelsstrategie und der API-Verknüpfung. Inländische Futures sind sehr klein, z. B. ein paar tausend Pfund Mais oder Bohnen, und es gibt kaum eine Kapitalgrenze.

img

Der Designprozess für die CTA-Strategie ist relativ einfach. Zunächst werden die historischen Daten vorbereitet und dann in ein Quantitativmodell eingegeben. Das Quantitative Modell umfasst die Handelsstrategien, die durch Tools wie mathematisches Modellieren, Programmierung und Design erstellt werden.

1.2 Zukunfts-CTA-Strategietypen

Aus handelspolitischer Sicht ist die CTA-Strategie auch vielfältig: Sie kann eine Trend- oder eine Schlusstrategie sein; sie kann eine langfristige Strategie im großen Zyklus sein oder eine kurzfristige Strategie innerhalb eines Tages; die strategische Logik kann auf technischer oder grundlegender Analyse basieren; sie kann subjektiv oder systematisch handeln.

CTA-Strategien werden in verschiedenen Kategorien unterteilt. Je nach Handelsmethode können sie in subjektive und systematische Trades unterteilt werden. Die Entwicklung der CTA-Strategien im Ausland ist relativ fortgeschritten.

Insgesamt machen Trend-Strategien etwa 70% des gesamten Handelsmarktes aus, Mittelwert-Rückkehr-Strategien etwa 25% und Gegen-Trend- oder Trendumkehr-Strategien etwa 5%. Die größten Trend-Strategien, die je nach Haltungszeitraum am größten Anteil haben, können in folgende Kategorien eingeteilt werden: Hochfrequenz-Handel, Intraday-Handel, Mittel-Short-Handel, Mittel-Lang-Handel.

Häufige StrategienDerzeit gibt es auf dem Markt zwei hauptsächliche Hochfrequenz-Handelsstrategien, eine ist die Hochfrequenz-Handelsstrategie und die andere ist die Hochfrequenz-Satzstrategie. Die Marktstrategie bietet Liquidität auf dem Handelsmarkt, d. h. in einem Handelsmarkt mit Marktteilnehmern muss der Marktteilnehmer sicherstellen, dass seine Einheiten gehandelt werden können.

Strategie für HochfrequenzsätzeEine hohe Frequenz-Sortierung ist ein Handel mit zwei stark korrelierten Aktien oder einer Kombination aus ETF und ETF. Gemäß der Berechnungsmethode der ETF kann der Erwartungspreis einer ETF in derselben Weise berechnet werden. Der Indexpreis der ETF kann den Erwartungspreis der ETF subtrahieren, um einen Preisdifferenz zu erhalten, der normalerweise in einem Preis-Pannel fährt und, wenn der Preis-Differenz den Tunnel durchbricht, auf den Preis-Differenz gehandelt werden kann.

InnenstrategieWenn es sich im wahrsten Sinne des Wortes nicht um Übernachtungen handelt, kann es als Tagesgeschäftsstrategie bezeichnet werden. Da Tagesgeschäfte eine kurze Haltezeit haben und normalerweise nicht sofort profitabel sind, gehen sie schnell aus. Daher sind die Risiken bei dieser Art des Handels geringer.

Mittel- und LangzeitstrategieIn der Theorie ist die Strategie mit der größeren Kapazität mit dem geringeren Risikogewinn verknüpft. Insbesondere bei institutionellen Geschäften werden mehr mittlere, lange Strategien eingesetzt, da die Kurzzeitstrategie begrenzt ist und große Kapital nicht in kurzer Zeit ein- und ausgehen können.

CTA-Strategie-DatenGenerell werden CTA-Strategien mit Minuten-, Stunden- und Tagesdaten untersucht, darunter: Öffnungs-, Höchst-, Mindest- und Schlusskurs, Volumen usw. Nur wenige CTA-Strategien verwenden Tick-Daten, wie z. B. tiefe Daten wie Kauf-, Verkaufspreise, Kauf- und Verkaufsvolumen in L2-Daten.

img

Die grundlegende Idee für die CTA-Strategie basiert zunächst auf traditionellen technischen Indikatoren, da es viel öffentliche Referenzen gibt und die Logik in der Regel relativ einfach ist. Die meisten basieren auf statistischen Prinzipien.

Es gibt auch einige klassische Handelsmodelle auf dem Markt, auf die man sich beziehen und verbessern kann, darunter: Multilevel-Portifikate, DualThrust, R-Breaker, Beachtrading, Gridtrading usw.

All dies sind Handelsstrategien, die auf traditioneller technischer Analyse basieren. Der Prozess besteht darin, auf der Grundlage historischer Daten und der richtigen Handelsidee Faktoren oder Kauf- und Verkaufsbedingungen zu erarbeiten, die einen Wahrscheinlichkeitsvorteil haben, und unter der Annahme, dass der Markt in der Zukunft diese Gesetzmäßigkeit beibehalten wird, um schließlich die Handelsstrategie mit Code zu implementieren und automatisch zu handeln.

Der größte Vorteil der CTA-Strategie ist, dass sie unabhängig davon, ob der aktuelle Markt steigt oder fällt, einen absoluten Gewinn erzielen kann, insbesondere bei einer schnellen Umstellung des Marktes oder bei deutlichen Schwankungen der Marktentwicklung.

1.3 Gewinnprinzipien der CTA-Futures

Die Futures-CTA-Strategien machen Geld, hauptsächlich wegen folgender Gründe:

  1. Preisbewegung ist gegenläufig, sie setzt sich immer in einer Trendform fort. Wenn ein Investor einen Anstieg des Preises beobachtet, kauft er nach dem Wind, was zu einem weiteren Anstieg des Preises führt. Das gleiche gilt für einen Preisrückgang.
  2. Die Toleranz jedes Anlegers für die Gewinn-Verlust-Ratio ist unsymmetrisch und die Risikobereitschaft ist unterschiedlich. Für die meisten Einzelhändler ist es eher eine konservative Trend-Handelsmethode, die den Markt leichter bewegt.
  3. Die Preisbildung wird durch Transaktionen bestimmt, und zwar werden sie von Menschen vorangetrieben, aber die Natur der Menschen ist schwer zu ändern, was dazu führt, dass sich eine feste Form wiederholt.

Ein weiteres Merkmal von Trend-Tracking-Handel ist, dass man wenig Geld verliert, wenn es keinen Markt gibt, und viel Geld verdient, wenn der Markt kommt, aber alle, die Geschäfte gemacht haben, wissen, dass der Markt die meiste Zeit aufgrund von Stimmungsmärkten ist und nur in geringerem Maße Trendmärkte ist.

Da Trend-Folge-Strategien in Bezug auf die Erträge instabil sind, bauen viele Anlageinstitute ein Portfolio mit einer Vielzahl von Strategien zusammen, in denen auch eine bestimmte Anzahl von Umkehrstrategien eingesetzt werden.

CTAs und traditionelle Vermögenswerte img

Wie wir oben gesehen haben, werden in der Theorie verschiedene oder weniger verwandte Strategien unterschiedliche Handelssignale gleichzeitig in der Lage, verschiedene Veränderungen des Marktpreises zu erwarten. Da sich mehrere Ertragskurven überlappen und die Gesamterträge sich ergänzen, werden die Ertragskurven langsamer, wodurch die Ertragsvolatilität verringert wird.

Aus der obigen Sicht lässt sich folgern, dass es besser ist, anstatt eine Master-Stufe-Strategie zu entwickeln, mehrere Zwischenschachtel-Strategien zu entwickeln, um diese zu kontrollieren. Hier können wir von den Algorithmen des Zufallswaldes in der Maschinellen Lerntechnik lernen, dass der Zufallswald kein eigenständiger Algorithmus ist, sondern ein Entscheidungsrahmen, der mehrere Entscheidungsträume umfasst.

Als nächstes muss eine Mutterstrategie entwickelt werden, die durch eine Bewertung der Liquidität, Ertragsfähigkeit und Stabilität der verschiedenen Sorten im gesamten Kommoditäts-Futures-Markt eine Kombination von Kommoditäts-Futures mit niedrigem Ertragsfluktuationsrate auswählen, eine branchenneutrale Auswahl durchführen, die Gesamtfluktuation durch die branchenübergreifende Konfiguration des Portfolios weiter reduzieren und schließlich durch Marktwert-Matching aufbauen kann.

Jede Sorte kann auch mehrere Parameter-Strategien konfigurieren, um eine Kombination von Parametern auszuwählen, die sich in der Nähe einer guten Nachbewertung befinden. Wenn die Markttrends deutlich sind, werden die Parameter-Strategien in der Regel übereinstimmen, was einer Hebung entspricht; wenn der Markt in einem turbulenten Markt ist, werden die Parameter-Strategien in der Regel uneinheitlich, was zu einer Risikobesicherung mit einem Über- oder Niederschlag führt, was einer Verringerung der Positionen entspricht. Dies kann die maximale Rückbewertungsrate des Portfolios weiter reduzieren, während die Gesamtrendite unverändert bleibt.

2. Klassische Futures-CTA-Strategien

Newton sagte einmal: "Wenn ich weiter sehe als alle anderen, dann weil ich auf den Schultern von Riesen stehe".

Die CTA-Strategien, die auf dem Markt veröffentlicht werden, sind einheitliche Strategien, Brin-Band-Strategien, Strand-Händler-Strategien, Dynamik-Strategien, Options-Strategien usw. Es gibt eine Eigenschaft von Quantitative-Handelsstrategien, nämlich, dass sie in Erscheinung treten, und dass Strategien, sobald sie veröffentlicht werden, langsam versagen.

2.1 Basisanalyse von Futures (Inventar, Basisdifferenz, Preis)

Die Fundamentalanalyse muss sich nicht um kurzfristige Preisbewegungen kümmern, sondern vielmehr um die Faktoren, die den Preis beeinflussen und beurteilen, wie viel die Sorte wert ist.

img

Wenn wir uns die Grafik ansehen, dann gibt es viele Faktoren, die die Preise beeinflussen. Linling hat mehrere Dutzend Faktoren, die sich ständig ändern.

In der Tat, die grundlegende Analyse von Commodity-Futures analysiert nicht alle Faktoren, sondern wir müssen nur die Kernkomponenten der grundlegenden Analyse erfassen, um Regeln aus den komplexen Informationen zu finden.

MakrofaktorenMakroökonomische Daten sind kompliziert und wechselnd, jeden Tag, jede Stunde, jede Minute, und es werden viele Wirtschaftsdaten veröffentlicht, von Politikern, Zentralbanken, Banken, offiziellen und inoffiziellen. Außer bei politischen und wirtschaftlichen Krisen ist Makroanalyse ein gutes Gesprächsmaterial und ist nicht sehr praktisch. Der bekannte US-amerikanische Fondsmanagement-Experte Peter Lynch sagte einmal: "Ich verbringe nicht mehr als 15 Minuten pro Jahr mit der Analyse der wirtschaftlichen Entwicklung".

VielfaltIn der grundlegenden Analyse analysiert die Sortenanalyse hauptsächlich die Anstiegsraten, die Angebots- und Nachfragebeziehungen, die Warenbestände, die Gewinnspanne der Industrie usw.

Die Freunde, die Futurgeschäfte betreiben, wissen, dass die inländischen Kommoditätsfutures einfach in folgende Kategorien unterteilt werden können: Industrieprodukte und Agrarprodukte. Die Analyse von Industrieprodukten und Agrarprodukten unterscheidet sich. Wir erläutern sie aus der Sicht von Angebot und Nachfrage.

Nach den wirtschaftlichen Gesetzen wird der Preis der Ware letztendlich durch die Angebots- und Nachfrageverhältnisse bestimmt. Die Zukunft des Warenpreises kann theoretisch nur bestimmt werden, wenn man Daten über Angebot und Nachfrage erhält. Für industrielle Produkte ist es einfacher, Daten über Angebot zu erhalten, aber schwer, Daten über Nachfrage zu erhalten.

In der Tat können wir auch weiter reduzieren. Das gegenseitige Ergebnis von Angebot und Nachfrage in den Wirtschaftsmärkten ist Inventar. Wir können durch Inventardaten über die starke und schwache Beziehung zwischen Angebot und Nachfrage entscheiden. Wenn ein Warenbestand hoch ist, bedeutet dies, dass die Marktleistung größer ist als die Nachfrage.

Zusätzlich zur Analyse der Warenbestände muss auch die Preisdifferenz zwischen dem Nahrungsmittelmarkt und dem Futuresmarkt analysiert werden, also die sogenannte Basisdifferenz. Wenn der Futurespreis größer als der Nahrungsmittelpreis ist, nennen wir dies einen Futures-Lift; wenn der Futures-Preis kleiner als der Nahrungsmittelpreis ist, nennen wir dies einen Futures-Lift. Gemäß dem Futures-Versorgungssystem sollte der Futures-Preis am Termin des Futures-Versorgungszeitraums dem Nahrungsmittelpreis entsprechen.

img

Ob Auf- oder Abwasser, aufgrund der Einschränkungen des Futures-Delivery-Systems sollte der Preis des Futures zum Auslieferungstermin theoretisch dem Preis des Terminums entsprechen. Mit der Annäherung des Terminums neigen der Terminus-Preis und der Terminus-Preis zur Übereinstimmung, wobei einer der Terminus-Zurückkehr zum Terminus ist und der andere der Terminus-Zurückkehr zum Terminus ist.

Auf der Grundlage der oben genannten Prinzipien können wir den zukünftigen Futurespreis sowohl aus Inventar als auch aus Basiswert beurteilen. Wenn ein Warenbestand niedriger ist und der Futurespreis viel niedriger ist als der aktuelle Preis, dann können wir beurteilen: Die Kraft der Nachfrage im Markt ist größer als die Kraft der Versorgung, und es ist wahrscheinlicher, dass der zukünftige Futurespreis steigt.

Schließlich haben wir die Wahrscheinlichkeitsrichtung der zukünftigen Preise durch Inventar und Gewichtung bestimmt, aber es gibt keine genaueren Verkaufspunkte, so dass auch die technische Analyse benötigt wird, um eindeutige In- und Ausgangssignale zu geben. Die gesamte Struktur der Grundlagenanalyse ist: Niedriges Inventar + Tiefenbewässerung + Technische Analyse Mehrfachsignale = mehr tun; Hohe Inventar + erhebliche Erhöhung des Wassers + Technische Analyse Luftkopfsignale = Leer tun.

2.2 Strandhandelsgesetze

In Bezug auf die Handelsstrategie müssen wir von dem repräsentativen Strandhandelsgesetz sprechen. Das Strandhandelsgesetz stammt aus einem der berühmtesten Experimente in der Geschichte des Handels, in dem der Handelsspezialist Richard Dennis herausfinden wollte, ob große Trader geboren oder ausgebildet wurden. Zu diesem Zweck rekrutierte er 1983 13 Leute, die ihm die Grundkonzepte des Futures-Handels sowie seine eigenen Handelsmethoden und -prinzipien beibrachten. Diese Praktiker wurden als Strandhandler bezeichnet.

In den folgenden vier Jahren erzielten die Seagulls einen Jahresgewinn von 80%. Dennis hat auch gezeigt, dass man mit einem einfachen System und Regeln wenige oder gar keine Handelserfahrung hat, um ein guter Trader zu werden. Aber es gibt einzelne Seagulls, die Seagull-Handelsregeln auf der Website verkaufen. Um dieses Verhalten zu verhindern, beschlossen die beiden ursprünglichen Seagulls, Curtis Feith und Arthur Madock, die Seagull-Handelsregeln auf der Website kostenlos für die Öffentlichkeit zu machen.

Als die Wahrheit herauskam, wurde festgestellt, dass die Seefleisch-Handelsregeln optimierte Dongjian-Kanäle verwenden und die ATR-Indikatoren für die Positionsverwaltung verwenden. Nach Jahrzehnten des historischen Tests ist es eine Handelsmethode, mit der auch normale Einzelhändler leicht Geld verdienen können.

Kernprinzipien für Strände

  • Machen Sie sich einen Vorteil: Finden Sie eine Handelsstrategie, die einen positiven Erwartungswert hat, da sie in der langfristigen Rechnung eine positive Rendite erzeugen kann.
  • Risikomanagement: Risiken kontrollieren, sich festhalten, sonst können Sie nicht auf den Tag warten, an dem Sie Ergebnisse erzielen.
  • Stärke: Nur wenn du deine Strategie mit Stärke ausführst, kannst du wirklich Systemergebnisse erzielen.
  • Einfach gesagt: Einfache Systeme sind langfristig lebendiger als komplexe Systeme.

Was sagen die Strandhandelsgesetze eigentlich? 1, Markt - was zu kaufen und was zu verkaufen ist, und auf welchen Märkten man im Wesentlichen handelt. Seejays sind Futures-Händler, sie wählen nur Märkte mit hoher Liquidität, da die Wahl eines nicht aktiven Marktes zusätzliche Ein- und Ausstiegspreise erhöht und viele Trendchancen verpasst. 2. Positionsgröße - wie viel man kauft und verkauft - ist ein sehr wichtiger Teil der Strategie, der oftmals von den meisten ignoriert oder falsch behandelt wird. Die Offshore-Trading-Regel verwendet ATR, den Indikator für die durchschnittliche tatsächliche Schwankungsbreite, um die Position zu ermitteln. Es ist ein sehr geschicktes Design, das die Positionsgröße anhand der absoluten Schwankungsbreite des Marktes anpasst und die Positionsgröße reduziert, wenn die Marktfluktuation stark ist, und erhöht, wenn die Marktfluktuation gering ist. 3, Marktzugang -- Bei der Eintritt der Seekünstler in den Markt, der sich aus dem Dongjian-Kanal leiten lässt, wenn der Preis den Höchstpreis der ersten 20 oder 55 K-Linien überschreitet, wird er mehr eingegeben, wenn der Preis den niedrigsten Preis der ersten 20 oder 55 K-Linien überschreitet, wird er frei eingegeben. 4. Stop-Loss - Trades ohne Stop-Loss sind auf lange Sicht nicht erfolgreich, aber die meisten Handler halten Verlustpositionen und hoffen, dass der Markt umkehrt. Die Haie sind streng darauf ausgerichtet, wann sie aus Verlustpositionen aussteigen, wenn sie mehrere Aufträge halten und der Preis 2 Einheiten sinkt. 5. Stopp - Stopp bei der Flut bedeutet, dass viele Flügel verloren gehen, was auch für viele Händler schwer zu akzeptieren ist. Wenn Sie derzeit mehrere Aufträge halten, und der Preis fällt unter den 10-Tage-Dongshan-Kanal, vereinbaren Sie alle Aufträge.

Wir können also sehen, dass die Strandhandelsgesetze, obwohl sie einfach erscheinen, in Wirklichkeit eine echte Handelssystemverformung gebildet haben, die alle Aspekte eines vollständigen Handelssystems abdeckt, ohne den Händlern den Raum für subjektive, imaginäre Entscheidungen zu lassen, was genau die Vorteile der programmatisierten Bedienung des Systems zum Einsatz bringt.

Der größte Vorteil von Offshore-Trading ist, dass es uns hilft, eine effektive Handelsmethode zu entwickeln, die eine Kombination aus einer Vielzahl von Positionen, dynamischen Stop-Loss- und Trend-Follow-Strategien, insbesondere der Verwendung von ATR-Werten und Positionsmanagement, kombiniert.

3. Strategie für die Entwicklung von Futures in der Praxis

3.1 Entwicklung einer CTA-Trendstrategie auf der Basis der Sprache

Ende des letzten Jahrhunderts begann in den USA eine wunderbare Handelsmethode in der Finanzinvestition zu populär werden, die nach der Praxis von Tausenden von Menschen als wirksam und von großem Nutzen erkannt wurde und von vielen Investment-Experten und professionellen Handlern anerkannt wurde. Sie ist bis heute perfekt für fast alle Finanzinvestitionen geeignet, egal ob es sich um Forex, Gold, Aktien, Futures, Rohöl, Indizes und Anleihen handelt.

Der Begriff Chaos bezieht sich ursprünglich auf die Beschreibung eines chaotischen Zustands des Universums, dessen Idee lautet: Das Ergebnis ist unvermeidlich, aber aufgrund vorhandener Kenntnisse kann das Ergebnis nicht berechnet werden, da die Berechnung selbst auch das Ergebnis verändert und letztendlich möglicherweise das größte oder kleinste Ergebnis ergeben kann, ohne dass es ein unvermeidliches Ergebnis gibt. Dies ist sehr ähnlich dem Handelsmarkt, in dem die Teilnehmer den Markt analysieren und auch beim Kauf und Verkauf handeln. Der Markt ist dauerhaft variabel, wenn die Teilnehmer eine neue Form des Marktes erfahren, wird der Markt ebenfalls erfahren, dass er von den Teilnehmern erkannt wird, so dass er sich verändert.

Die Chaos-Operation ist eine komplette Reihe von Investitionsideen, Handelsstrategien und Ein- und Ausstiegssignalen, die von Bill Williams erfunden wurden. Derzeit sind viele Investoren international mit Chaos-Operation in den Markt gehandelt. Aufgrund der Verzögerung der Entwicklung des Finanzmarkts in China ist Chaos-Theorie auch eine relativ neue Idee, so dass es nur wenige Menschen gibt, die Chaos-Operation studieren.

Die theoretische Grundlage für Chaosoperationen ist, wie der Name schon sagt, die Chaostheorie, die vom Meteorologen Edward Lorenz als eine der größten wissenschaftlichen Entdeckungen des späten 20. Jahrhunderts vorgeschlagen wurde. Bill Williams brachte die berühmte Schmetterlings-Effekt-Flügel hervor. Bill Williams verwendete die Chaos-Theorie kreativ für den Bereich der Finanzinvestitionen und kombinierte sie mit Disziplinen wie Spaltgeometrie und Nichtlineardynamik, um eine Reihe von sehr effektiven technischen Analyseindikatoren zu schaffen.

Die ganze Chaos-Operation besteht aus fünf großen Dimensionen (technische Indikatoren):

  • Alligator-Flechte

  • Der Fractal

  • Das Momentum

  • Beschleunigung

  • Die Balance Line

    img

Wie wir in der obigen Abbildung sehen, ist die Fische-Linie eine Balance-Linie, die in Form von Spaltgeometrie und nichtlinearer Dynamik verwendet wird. Sie ist im Wesentlichen eine Ausdehnung des Index-gewichteten beweglichen Mittelpunkts, eine Art Ebenlinie, die jedoch eine etwas kompliziertere Methode als die normale Ebenlinie hat.

// 参数
N1:=11;
N2:=21;

// 定义价格中线
N3:=N1+N2;
N4:=N2+N3;
HL:=(H+L)/2;

// 鳄鱼线
Y^^SMA(REF(HL,N3),N4,1);
R:=SMA(REF(HL,N2),N3,1);
G:=SMA(REF(HL,N1),N2,1);

Zuerst definieren wir die beiden äußeren Parameter N1 und N2, dann berechnen wir den Durchschnitt von HL für den höchsten und den niedrigsten Preis anhand der äußeren Parameter, und dann berechnen wir den Durchschnitt von HL für die verschiedenen Parameter.

In der Chaos-Operation definiert man ein sehr bildliches Konzept der Spaltform. Man kann es so beschreiben: Wenn man die Handfläche öffnet, die Finger nach oben, der Mittelfinger ist die Spaltform, der kleine und der Name-Finger auf der linken Seite, der Zeigefinger und der Daumen auf der rechten Seite stehen für die nicht-innovativ hohen K-Linien. Eine Grundspaltform besteht aus diesen 5 K-Linien.

// 分形
TOP_N:=BARSLAST(REF(H,2)=HHV(H,5))+2;
BOTTOM_N:=BARSLAST(REF(L,2)=LLV(L,5))+2;

TOP:=REF(H,TOP_N);
BOTTOM:=REF(L,BOTTOM_N);

MAX_YRG^^MAX(MAX(Y,R),G); 
MIN_YRG^^MIN(MIN(Y,R),G); 

TOP_FRACTAL^^VALUEWHEN(H>=MAX_YRG,TOP);
BOTTOM_FRACTAL^^VALUEWHEN(L<=MIN_YRG,BOTTOM);

Mit dem Kalkulation der Falkenlinien und der Spaltform können wir eine einfache Chaos-Operationsstrategie schreiben, die mit einer Reihe von Index-gewichteten beweglichen Durchschnitten als Referenzpreis für die Kalkulation der Falkenlinien und Spaltformen berechnet wird. Die ursprüngliche Chaos-Operationsstrategie ist natürlich komplexer. Der Code lautet:

// 如果当前无多单,并且收盘价升破上分形,并且上分形在鳄鱼线上方时,多头开仓
BKVOL=0 AND C>=TOP_FRACTAL AND TOP_FRACTAL>MAX_YRG,BPK(1);
// 如果当前无空单,并且收盘价跌破下分形,并且下分形在鳄鱼线下方时,空头开仓
SKVOL=0 AND C<=BOTTOM_FRACTAL AND BOTTOM_FRACTAL<MIN_YRG,SPK(1);

// 如果收盘价跌破鳄鱼的下巴时,多头平仓
C<Y,SP(BKVOL);
// 如果收盘价升破鳄鱼的下巴时,空头平仓
C>Y,BP(SKVOL);

Um es zu erleichtern, habe ich eine detaillierte Anmerkung direkt in den Code geschrieben, und wir können die Transaktionslogik dieser Strategie in den folgenden Punkten zusammenfassen:

  • Mehrfachöffnung: Wenn es derzeit nicht mehrere Aufträge gibt und der Schlusskurs ansteigt, wird die Splitform gebrochen und die Splitterform liegt oberhalb der Shark Line.
  • Leeröffnung: Wenn keine Leerbestellungen vorhanden sind und der Schlusskurs unterhalb der Sharkline liegt.
  • Einige von ihnen sind in der Lage, sich zu entscheiden, was sie tun sollen.
  • Einer von ihnen war ein junger Mann, der in der Schule lebte und in der Schule war.

Im Folgenden werden wir sehen, wie sich die Ergebnisse dieser einfachen Chaos-Operations-Strategie-Rückmeldung auswirken. Um die Rückmeldung näher an die reale Umgebung zu bringen, setzen wir hier die Prozeduren auf das doppelte der Börse, mit einem Sprung von 2 Sprüngen pro Börse und Börse.

img img img

Die Strategie erwies sich aus Sicht der Kapitalkurve und der Rückmessungsdaten gut, die Gesamtkapitalkurve war jedoch stabil nach oben. Aber nach Ende 2016 haben sich die Marktmerkmale der Schraubstahlsorte geändert, und die vorherige einseitige Entwicklung der hohen Schwankungen hat sich in eine breite Aufwärtstrendentwicklung verwandelt. Aus der Kapitalkurve ist der Gewinn von 2017 bis heute deutlich schwach.

Die Essenz der Chaos-Operation besteht darin, einen Wendepunkt zu finden, ohne sich darum zu kümmern, wie der Markt weitergeht, und ohne sich um einen echten oder falschen Durchbruch zu kümmern. Wenn ein Durchbruch stattfindet, tritt man direkt ein. Versuche niemals, den Markt vorherzusagen, sondern sei ein Beobachter und ein Nachfolger.

3.2 Entwicklung von CTA-Satzstrategien basierend auf JavaScript

In seinem 1987 erschienenen Buch The Alchemist's Algorithm of Currency hat Soros eine bedeutende Proposition gemacht: Ich glaube, dass Marktpreise in dem Sinne, dass sie einen Vorurteil für die Zukunft haben, immer falsch sind. Er argumentiert, dass die Marktwirksamkeitshypothese nur eine theoretische Hypothese ist, dass die Marktteilnehmer in der Tat nicht immer rational sind und dass es unmöglich ist, zu jedem Zeitpunkt vollständig auf alle Informationen zuzugreifen und sie objektiv zu interpretieren. Auch wenn es sich um die gleiche Information handelt, gibt es für alle unterschiedliche Rückmeldungen. Das heißt, der Preis selbst enthält bereits die falschen Erwartungen der Marktteilnehmer, so dass der Marktpreis im Wesentlichen immer falsch ist. Dies ist vielleicht die Quelle des Profits der Profitgeber.

Aufgrund der oben genannten Prinzipien wissen wir auch, dass in einem ineffizienten Futures-Markt die Marktwirkung zwischen den unterschiedlichen Perioden nicht immer synchron ist und die Preisgestaltung nicht vollständig wirksam ist. Auf der Grundlage der Preise der unterschiedlichen Perioden der gleichen Handelsmarke können Futures-Kontrakte aus verschiedenen Perioden gleichzeitig gekauft und verkauft werden, wenn ein großer Preisunterschied auftritt.

Wie bei den Kommoditäts-Futures gibt es auch eine Kombination von langfristigen Leitzinsverträgen, wie sie auf der OkEX-Börse vorhanden sind: ETC in der Woche, ETC in der nächsten Woche, ETC im Quartal. Zum Beispiel, wenn der Preisunterschied zwischen ETC in der Woche und ETC im Quartal in der Länge der Zeit bei etwa 5 bleibt. Wenn ein Tag einen Preisunterschied von 7 erreicht, erwarten wir, dass der Preisunterschied zu einem bestimmten Zeitpunkt in der Zukunft wieder auf 5 zurückkehrt.

Trotz dieser Preisdifferenz gibt es viel Unsicherheit bei der künstlichen Vermarktung, obwohl sie zeitaufwändig, ungenau und durch Preisänderungen beeinflusst wird. Es ist das Schöne an einer quantitativen Modellierung, die die Vermarktungsmöglichkeiten erfasst und eine Vermarktungsstrategie entwickelt, sowie an einem programmatisierten Algorithmus, der automatisch Handelsbestellungen an die Börse sendet, um schnell und genau zu erfassen und effizient und stabil zu verdienen.

Dieser Kurs zeigt, wie man mit Hilfe von ETC-Futures-Kontrakten auf der OkEX-Börse und der inventorischen Quantitative Trading-Plattform in digitalen Währungstransaktionen eine einfache Optionsstrategie demonstriert, um die sichtbaren Gewinne zu erfassen, die bei jeder Gelegenheit erzielt werden können, und die Risiken, die beim Hedgen entstehen können.

Erstellen Sie eine Strategie für die langfristige Abwicklung von digitalen WährungenSchwierigkeit: DurchschnittStrategische Umgebung

  • Der Markenname ist ETH Classic (ETC).
  • Preisunterschiedsdaten: ETC in der Woche - ETC im Quartal (Coherenzprüfung ausgeschlossen)
  • Handelsprozess: 5 Minuten
  • 头寸匹配:1:1
  • Transaktionsart: über die gleiche Sorte

Strategische Logik

  • Überschuss: Wenn das aktuelle Konto nicht gehalten wird und der Preis weniger als boll nach unten geht, wird ein Überschuss getätigt. Das heißt: ETC in der Woche kaufen, ETC im Quartal verkaufen.
  • Aufschlag: Wenn das aktuelle Konto nicht gehalten wird und der Preis größer als der Boll ist, wird der Aufschlag gemacht.
  • Ausgleichsbedingungen: Wenn das aktuelle Konto mehr ETC in der Woche hält und mehr ETC im Quartal hält, und die Preisdifferenz größer ist als die Boll-Mittelstrecke, dann ist die Ausgleichsbedingungen ausgeglichen.
  • Ausgleichsbedingungen: Ausgleichsbedingungen gelten, wenn das aktuelle Konto ETC in der Woche hält und mehrere ETC-Bestellungen im Quartal hält, und die Preisdifferenz kleiner ist als die Boll-Mittelstrecke, d. h. wenn das aktuelle Konto ETC in der Woche hält und ETC im Quartal verkauft.

Wie kann man seine Ideen in einem Programm umsetzen? Wir haben versucht, den Rahmen zu erstellen, bevor die Erfinder die Handelsplattform quantifizieren.

function Data() {}  // 基础数据函数
Data.prototype.mp = function () {}  // 持仓函数
Data.prototype.boll = function () {}  // 指标函数
Data.prototype.trade = function () {}  // 下单函数
Data.prototype.cancelOrders = function () {}  // 撤单函数
Data.prototype.isEven = function () {}  // 处理单只合约函数
Data.prototype.drawingChart = function () {}  // 画图函数

function onTick() {
    var data = new Data(tradeTypeA, tradeTypeB);  // 创建一个基础数据对象
    var accountStocks = data.accountData.Stocks;  // 账户余额
    var boll = data.boll(dataLength, timeCycle);  // 计算boll技术指标
    data.trade();  // 计算交易条件下单
    data.cancelOrders();  // 撤单
    data.drawingChart(boll);  // 画图
    data.isEven();  // 处理持有单个合约
}

//入口函数
function main() {
    while (true) {  // 进入轮询模式
        onTick();  // 执行onTick函数
        Sleep(500);  // 休眠0.5秒
    }
}

Stellen Sie sich vor, wie der Transaktionsprozess in der Hauptgeschäft ist. Im Systemgeschäft gibt es keine wesentlichen Unterschiede, sondern nur: Datenerfassung, Berechnung von Daten, Auftragsabwicklung, Bearbeitung nach der Auftragsabwicklung. So auch im Programm, wo der Programm zuerst die 20-Zeile-Main-Funktion ausführt, eine vertraglich vereinbarte Regel, dass der Programm, wenn er die Transaktionsstrategie ausgeführt hat, dann in den unbegrenzten Kreislaufmodus, also den Kreislaufmodus, eintritt.

In der onTick-Funktion ist das der Prozess, den wir in subjektiven Transaktionen durchführen: Zuerst erhalten wir die Basispreisdaten, dann erhalten wir den Kontostand, dann berechnen wir die Indikatoren, dann berechnen wir die Transaktionsbedingungen und ordnen die Aufträge an, und schließlich ist es die Bearbeitung nach der Bestellung, einschließlich: Abhebung der Aufträge, Zeichnung, Verarbeitung einzelner Kontrakte.

Es ist sehr einfach, einen strategischen Rahmen aufzubauen, der sowohl strategische Ideen als auch Transaktionsprozesse vergleicht. Die gesamte Strategie lässt sich in drei Schritte zusammengefasst:

  • Die Transaktionen werden vorbereitet.
  • Erhält und berechnet Daten.
  • Sie haben sich für die Verarbeitung der Bestellung entschieden.

Nach dem Aufbau des Handelsstrategienrahmens müssen die notwendigen Details in dem Strategie-Rahmencode basierend auf dem tatsächlichen Transaktionsprozess und den Transaktionsdetails ausgefüllt werden.

1. Vorbehandlung der Transaktionen

1. Die notwendigen globalen Variablen erklären

  • Erkläre ein Chartobjekt für ein konfiguriertes Diagrammvar chart = {}
  • Aufrufen der Chart-Funktion, Initiierung von Diagrammenvar ObjChart = Chart ( chart )
  • Erkläre eine leere Array, die für die Speicherung von Preisdifferenzfolgen verwendet wirdvar bars = []
  • Erkläre eine historische Datenspeicher-Zeitstrich-Variablevar oldTime = 0

2. Externe Parameter für die Konfigurationspolitik

var tradeTypeA = "this_week"; // 套利A合约
var tradeTypeB = "quarter"; // 套利B合约
var dataLength = 10; //指标周期长度
var timeCycle = 1; // K线周期
var name = "ETC"; // 币种
var unit = 1; // 下单量

3. Definition von Datenverarbeitungsfunktionen

  • Basis-Datenfunktion: Daten () Erstellen Sie eine Data-Konstruktionsfunktion und definieren Sie deren interne Eigenschaften. Dazu gehören: Konto-Daten, Haltungsdaten, K-Linien-Daten-Zeitfenster, Kauf-/Verkaufspreise von Leasing-A/B-Kontrakten, Positiv-/Overseins.
function Data(tradeTypeA, tradeTypeB) { // 传入套利A合约和套利B合约
    this.accountData = _C(exchange.GetAccount); // 获取账户信息
    this.positionData = _C(exchange.GetPosition); // 获取持仓信息
    var recordsData = _C(exchange.GetRecords); //获取K线数据
    exchange.SetContractType(tradeTypeA); // 订阅套利A合约
    var depthDataA = _C(exchange.GetDepth); // 套利A合约深度数据
    exchange.SetContractType(tradeTypeB); // 订阅套利B合约
    var depthDataB = _C(exchange.GetDepth); // 套利B合约深度数据
    this.time = recordsData[recordsData.length - 1].Time; // 获取最新数据时间
    this.askA = depthDataA.Asks[0].Price; // 套利A合约卖一价
    this.bidA = depthDataA.Bids[0].Price; // 套利A合约买一价
    this.askB = depthDataB.Asks[0].Price; // 套利B合约卖一价
    this.bidB = depthDataB.Bids[0].Price; // 套利B合约买一价
    // 正套价差(合约A卖一价 - 合约B买一价)
    this.basb = depthDataA.Asks[0].Price - depthDataB.Bids[0].Price;
    // 反套价差(合约A买一价 - 合约B卖一价)
    this.sabb = depthDataA.Bids[0].Price - depthDataB.Asks[0].Price;
}
  • Erhalten von Lagerfunktionen: mp () Durchläuft die gesamte Holding-Array und gibt die Anzahl der Haltungen für die angegebenen Kontrakte, die angegebenen Richtungen zurück, falls keine, gibt es false
Data.prototype.mp = function (tradeType, type) {
    var positionData = this.positionData; // 获取持仓信息
    for (var i = 0; i < positionData.length; i++) {
        if (positionData[i].ContractType == tradeType) {
            if (positionData[i].Type == type) {
                if (positionData[i].Amount > 0) {
                    return positionData[i].Amount;
                }
            }
        }
    }
    return false;
}
  • K-Linien und Indikatorfunktionen:boll ()) Neue K-Linien-Sequenzen werden basierend auf positiven/gegensetzten Preisdifferenzdaten zusammengesetzt.
Data.prototype.boll = function (num, timeCycle) {
    var self = {}; // 临时对象
    // 正套价差和反套价差中间值
    self.Close = (this.basb + this.sabb) / 2;
    if (this.timeA == this.timeB) {
        self.Time = this.time;
    } // 对比两个深度数据时间戳
    if (this.time - oldTime > timeCycle * 60000) {
        bars.push(self);
        oldTime = this.time;
    } // 根据指定时间周期,在K线数组里面传入价差数据对象
    if (bars.length > num * 2) {
        bars.shift(); // 控制K线数组长度
    } else {
        return;
    }
    var boll = TA.BOLL(bars, num, 2); // 调用talib库中的boll指标
    return {
        up: boll[0][boll[0].length - 1], // boll指标上轨
        middle: boll[1][boll[1].length - 1], // boll指标中轨
        down: boll[2][boll[2].length - 1] // boll指标下轨
    } // 返回一个处理好的boll指标数据
}
  • Die Funktion:trade () Es wird ein Auftragsvertrag mit dem Namen und dem Auftragstyp übermittelt, dann wird ein Auftragsvertrag mit dem Gegenpreis übertragen und das Ergebnis des Auftrags zurückgegeben. Da zwei Auftragsverträge in zwei verschiedenen Richtungen gleichzeitig ausgeführt werden müssen, wird innerhalb der Funktion ein Kauf-/Verkaufspreis nach dem Auftragsvertragstitel umgewandelt.
Data.prototype.trade = function (tradeType, type) {
    exchange.SetContractType(tradeType); // 下单前先重新订阅合约
    var askPrice, bidPrice;
    if (tradeType == tradeTypeA) { // 如果是A合约下单
        askPrice = this.askA; // 设置askPrice
        bidPrice = this.bidA; // 设置bidPrice
    } else if (tradeType == tradeTypeB) { // 如果是B合约下单
        askPrice = this.askB; // 设置askPrice
        bidPrice = this.bidB; // 设置bidPrice
    }
    switch (type) { // 匹配下单模式
        case "buy":
            exchange.SetDirection(type); // 设置下单模式
            return exchange.Buy(askPrice, unit);
        case "sell":
            exchange.SetDirection(type); // 设置下单模式
            return exchange.Sell(bidPrice, unit);
        case "closebuy":
            exchange.SetDirection(type); // 设置下单模式
            return exchange.Sell(bidPrice, unit);
        case "closesell":
            exchange.SetDirection(type); // 设置下单模式
            return exchange.Buy(askPrice, unit);
        default:
            return false;
    }
}
  • Funktion zur Abmeldung von Bestellungen:cancelOrders ()) Erhält alle ausstehenden Bestellungen und annulliert sie einzeln. Und wenn es ausstehende Bestellungen gibt, kehrt false zurück, wenn es keine gibt, kehrt true zurück.
Data.prototype.cancelOrders = function () {
    Sleep(500); // 撤单前先延时,因为有些交易所你懂的
    var orders = _C(exchange.GetOrders); // 获取未成交订单数组
    if (orders.length > 0) { // 如果有未成交的订单
        for (var i = 0; i < orders.length; i++) { //遍历未成交订单数组
            exchange.CancelOrder(orders[i].Id); //逐个取消未成交的订单
            Sleep(500); //延时0.5秒
        }
        return false; // 如果取消了未成交的单子就返回false
    }
    return true; //如果没有未成交的订单就返回true
}
  • Verarbeiten Sie einen einzigen Vertrag: isEven ()) Bei der Abwicklung von Leverage-Geschäften tritt eine Einbeinheit auf, bei der alle Positionen direkt mit einer einfachen Abwicklung ausgeglichen werden.
Data.prototype.isEven = function () {
    var positionData = this.positionData; // 获取持仓信息
    var type = null; // 转换持仓方向
    // 如果持仓数组长度余2不等于0或者持仓数组长度不等于2
    if (positionData.length % 2 != 0 || positionData.length != 2) {
        for (var i = 0; i < positionData.length; i++) { // 遍历持仓数组
            if (positionData[i].Type == 0) { // 如果是多单
                type = 10; // 设置下单参数
            } else if (positionData[i].Type == 1) { // 如果是空单
                type = -10; // 设置下单参数
            }
            // 平掉所有仓位
            this.trade(positionData[i].ContractType, type, positionData[i].Amount);
        }
    }
}
  • Grafikfunktion: drawingChart ()) Die Methode ObjChart.add () wird aufgerufen, um die notwendigen Marktdaten und Indikatordaten in einem Diagramm zu zeichnen: Aufwärts-, Mittel-, Abwärts-, Positiv-/ Gegengesetzteffekte.
Data.prototype.drawingChart = function (boll) {
    var nowTime = new Date().getTime();
    ObjChart.add([0, [nowTime, boll.up]]);
    ObjChart.add([1, [nowTime, boll.middle]]);
    ObjChart.add([2, [nowTime, boll.down]]);
    ObjChart.add([3, [nowTime, this.basb]]);
    ObjChart.add([4, [nowTime, this.sabb]]);
    ObjChart.update(chart);
}

4. In der Eingabefunktion main () werden Transaktionsvorbearbeitungscodes ausgeführt, die nach dem Start des Programms nur einmal ausgeführt werden; dazu gehören:

  • Es gibt keine wichtigen Informationen auf der Filterplatte.SetErrorFilter ( )
  • Setzen Sie die Art der digitalen Währung ein, mit der Sie handeln möchtenexchange.IO ( )
  • Grafiken, die vor dem Starten des Programms entworfen wurdenObjChart.reset ( )
  • Statusbar-Informationen vor dem Starten des ProgrammsLogProfitReset ( )

Nach der Definition der oben genannten Transaktionsvorbearbeitung geht man sofort in den nächsten Schritt, in den Routing-Modus, um die Funktion onTick () wiederholt auszuführen; und setzt die Ruhezeit der Routing-Funktion auf Sleep (), da die APIs einiger Kryptowährungs-Exchanges die Anzahl der Zugriffe innerhalb einer bestimmten Zeit einschränken.

function main() {
    // 过滤控制台中不是很重要的信息
    SetErrorFilter("429|GetRecords:|GetOrders:|GetDepth:|GetAccount|:Buy|Sell|timeout|Futures_OP");
    exchange.IO("currency", name + '_USDT'); //设置要交易的数字货币币种
    ObjChart.reset(); //程序启动前清空之前绘制的图表
    LogProfitReset(); //程序启动前清空之前的状态栏信息
    while (true) { // 进入轮询模式
        onTick(); // 执行onTick函数
        Sleep(500); // 休眠0.5秒
    }
}

Zweitens: Daten abrufen und berechnen

  1. Erhalten von Basisdatenobjekten, Kontostand und Boll-Indikatoren für die Nutzung der Handelslogik.
function onTick() {
    var data = new Data(tradeTypeA, tradeTypeB); // 创建一个基础数据对象
    var accountStocks = data.accountData.Stocks; // 账户余额
    var boll = data.boll(dataLength, timeCycle); // 获取boll指标数据
    if (!boll) return; // 如果没有boll数据就返回
}

Drittens: Unterbrechung und Weiterverarbeitung

  1. Nach der oben genannten Strategie-Logik wird der Kauf- und Verkauf ausgeführt. Zuerst wird beurteilt, ob die Preis- und Indikatorenbedingungen erfüllt sind, dann wird beurteilt, ob die Lagerbedingungen erfüllt sind, und schließlich wird die Trade () -Sonderfunktion ausgeführt.
// 价差说明
// basb = (合约A卖一价 - 合约B买一价)
// sabb = (合约A买一价 - 合约B卖一价)
if (data.sabb > boll.middle && data.sabb < boll.up) { // 如果sabb高于中轨
    if (data.mp(tradeTypeA, 0)) { // 下单前检测合约A是否有多单
        data.trade(tradeTypeA, "closebuy"); // 合约A平多
    }
    if (data.mp(tradeTypeB, 1)) { // 下单前检测合约B是否有空单
        data.trade(tradeTypeB, "closesell"); // 合约B平空
    }
} else if (data.basb < boll.middle && data.basb > boll.down) { // 如果basb低于中轨
    if (data.mp(tradeTypeA, 1)) { // 下单前检测合约A是否有空单
        data.trade(tradeTypeA, "closesell"); // 合约A平空
    }
    if (data.mp(tradeTypeB, 0)) { // 下单前检测合约B是否有多单
        data.trade(tradeTypeB, "closebuy"); // 合约B平多
    }
}
if (accountStocks * Math.max(data.askA, data.askB) > 1) { // 如果账户有余额
    if (data.basb < boll.down) { // 如果basb价差低于下轨
        if (!data.mp(tradeTypeA, 0)) { // 下单前检测合约A是否有多单
            data.trade(tradeTypeA, "buy"); // 合约A开多
        }
        if (!data.mp(tradeTypeB, 1)) { // 下单前检测合约B是否有空单
            data.trade(tradeTypeB, "sell"); // 合约B开空
        }
    } else if (data.sabb > boll.up) { // 如果sabb价差高于上轨
        if (!data.mp(tradeTypeA, 1)) { // 下单前检测合约A是否有空单
            data.trade(tradeTypeA, "sell"); // 合约A开空
        }
        if (!data.mp(tradeTypeB, 0)) { // 下单前检测合约B是否有多单
            data.trade(tradeTypeB, "buy"); // 合约B开多
        }
    }
}
  1. Nach der Fertigstellung der Bestellung müssen Abnormalitäten wie ausstehende Bestellungen, das Halten einzelner Verträge und die Erstellung von Diagrammen behandelt werden.
data.cancelOrders(); // 撤单
data.drawingChart(boll); // 画图
data.isEven(); // 处理持有单个合约

Über 200 Zeilen haben wir eine einfache, vollständige Strategie für die langfristige Verzinsung von digitalen Währungen erstellt.

// 全局变量
// 声明一个配置图表的 chart 对象
var chart = {
    __isStock: true,
    tooltip: {
        xDateFormat: '%Y-%m-%d %H:%M:%S, %A'
    },
    title: {
        text: '交易盈亏曲线图(详细)'
    },
    rangeSelector: {
        buttons: [{
            type: 'hour',
            count: 1,
            text: '1h'
        }, {
            type: 'hour',
            count: 2,
            text: '3h'
        }, {
            type: 'hour',
            count: 8,
            text: '8h'
        }, {
            type: 'all',
            text: 'All'
        }],
        selected: 0,
        inputEnabled: false
    },
    xAxis: {
        type: 'datetime'
    },
    yAxis: {
        title: {
            text: '价差'
        },
        opposite: false,
    },
    series: [{
        name: "上轨",
        id: "线1,up",
        data: []
    }, {
        name: "中轨",
        id: "线2,middle",
        data: []
    }, {
        name: "下轨",
        id: "线3,down",
        data: []
    }, {
        name: "basb",
        id: "线4,basb",
        data: []
    }, {
        name: "sabb",
        id: "线5,sabb",
        data: []
    }]
};
var ObjChart = Chart(chart); // 画图对象
var bars = []; // 存储价差序列
var oldTime = 0; // 记录历史数据时间戳

// 参数
var tradeTypeA = "this_week"; // 套利A合约
var tradeTypeB = "quarter"; // 套利B合约
var dataLength = 10; //指标周期长度
var timeCycle = 1; // K线周期
var name = "ETC"; // 币种
var unit = 1; // 下单量

// 基础数据
function Data(tradeTypeA, tradeTypeB) { // 传入套利A合约和套利B合约
    this.accountData = _C(exchange.GetAccount); // 获取账户信息
    this.positionData = _C(exchange.GetPosition); // 获取持仓信息
    var recordsData = _C(exchange.GetRecords); //获取K线数据
    exchange.SetContractType(tradeTypeA); // 订阅套利A合约
    var depthDataA = _C(exchange.GetDepth); // 套利A合约深度数据
    exchange.SetContractType(tradeTypeB); // 订阅套利B合约
    var depthDataB = _C(exchange.GetDepth); // 套利B合约深度数据
    this.time = recordsData[recordsData.length - 1].Time; // 获取最新数据时间
    this.askA = depthDataA.Asks[0].Price; // 套利A合约卖一价
    this.bidA = depthDataA.Bids[0].Price; // 套利A合约买一价
    this.askB = depthDataB.Asks[0].Price; // 套利B合约卖一价
    this.bidB = depthDataB.Bids[0].Price; // 套利B合约买一价
    // 正套价差(合约A卖一价 - 合约B买一价)
    this.basb = depthDataA.Asks[0].Price - depthDataB.Bids[0].Price;
    // 反套价差(合约A买一价 - 合约B卖一价)
    this.sabb = depthDataA.Bids[0].Price - depthDataB.Asks[0].Price;
}

// 获取持仓
Data.prototype.mp = function (tradeType, type) {
    var positionData = this.positionData; // 获取持仓信息
    for (var i = 0; i < positionData.length; i++) {
        if (positionData[i].ContractType == tradeType) {
            if (positionData[i].Type == type) {
                if (positionData[i].Amount > 0) {
                    return positionData[i].Amount;
                }
            }
        }
    }
    return false;
}

// 合成新K线数据和boll指标数据
Data.prototype.boll = function (num, timeCycle) {
    var self = {}; // 临时对象
    // 正套价差和反套价差中间值
    self.Close = (this.basb + this.sabb) / 2;
    if (this.timeA == this.timeB) {
        self.Time = this.time;
    } // 对比两个深度数据时间戳
    if (this.time - oldTime > timeCycle * 60000) {
        bars.push(self);
        oldTime = this.time;
    } // 根据指定时间周期,在K线数组里面传入价差数据对象
    if (bars.length > num * 2) {
        bars.shift(); // 控制K线数组长度
    } else {
        return;
    }
    var boll = TA.BOLL(bars, num, 2); // 调用talib库中的boll指标
    return {
        up: boll[0][boll[0].length - 1], // boll指标上轨
        middle: boll[1][boll[1].length - 1], // boll指标中轨
        down: boll[2][boll[2].length - 1] // boll指标下轨
    } // 返回一个处理好的boll指标数据
}

// 下单
Data.prototype.trade = function (tradeType, type) {
    exchange.SetContractType(tradeType); // 下单前先重新订阅合约
    var askPrice, bidPrice;
    if (tradeType == tradeTypeA) { // 如果是A合约下单
        askPrice = this.askA; // 设置askPrice
        bidPrice = this.bidA; // 设置bidPrice
    } else if (tradeType == tradeTypeB) { // 如果是B合约下单
        askPrice = this.askB; // 设置askPrice
        bidPrice = this.bidB; // 设置bidPrice
    }
    switch (type) { // 匹配下单模式
        case "buy":
            exchange.SetDirection(type); // 设置下单模式
            return exchange.Buy(askPrice, unit);
        case "sell":
            exchange.SetDirection(type); // 设置下单模式
            return exchange.Sell(bidPrice, unit);
        case "closebuy":
            exchange.SetDirection(type); // 设置下单模式
            return exchange.Sell(bidPrice, unit);
        case "closesell":
            exchange.SetDirection(type); // 设置下单模式
            return exchange.Buy(askPrice, unit);
        default:
            return false;
    }
}

// 取消订单
Data.prototype.cancelOrders = function () {
    Sleep(500); // 撤单前先延时,因为有些交易所你懂的
    var orders = _C(exchange.GetOrders); // 获取未成交订单数组
    if (orders.length > 0) { // 如果有未成交的订单
        for (var i = 0; i < orders.length; i++) { //遍历未成交订单数组
            exchange.CancelOrder(orders[i].Id); //逐个取消未成交的订单
            Sleep(500); //延时0.5秒
        }
        return false; // 如果取消了未成交的单子就返回false
    }
    return true; //如果没有未成交的订单就返回true
}

// 处理持有单个合约
Data.prototype.isEven = function () {
    var positionData = this.positionData; // 获取持仓信息
    var type = null; // 转换持仓方向
    // 如果持仓数组长度余2不等于0或者持仓数组长度不等于2
    if (positionData.length % 2 != 0 || positionData.length != 2) {
        for (var i = 0; i < positionData.length; i++) { // 遍历持仓数

Verwandt

Mehr

Dianwan99Lernen zu lernen

- Ich weiß.Lernen

Zunfeng91Lernen