Développer une stratégie de CTA pour des gains absolus, de la quantification des transactions à la gestion des actifs

Auteur: , Créé: 2019-06-26 10:27:41, Mis à jour: 2023-10-30 20:30:50

[TOC] Je vous en prie.

img

Préambule

Pourquoi étudier cette leçon?Le premier est basé sur les langages de programmation JavaScript et Python, qui sont une technologie, et finalement nous allons appliquer cette technologie à une industrie. Quantitative trading est une industrie émergente qui connaît une croissance rapide et une forte demande de talents.

L'apprentissage systématique de ce cours vous permettra d'acquérir une meilleure compréhension du domaine des transactions quantitatives. Si vous êtes prêt à vous lancer dans le domaine des transactions quantitatives, les étudiants qui vous suivent vous aideront également. Si vous êtes un passionné d'investissement en actions ou en contrats à terme, les transactions quantitatives peuvent complètement vous aider dans votre métier de négociateur, en développant des stratégies de négociation qui vous permettront de réaliser des profits sur les marchés financiers et en élargissant les canaux et les plateformes de votre propre financement d'investissement.

Avant de commencer, je vais vous parler de mon expérience personnelle en matière de négociation. Je ne suis pas un professionnel de la finance, mais j'ai étudié les statistiques. J'ai commencé à négocier subjectivement des actions à l'époque de mes études, puis je suis devenu un praticien de la négociation quantitative des fonds privés nationaux, principalement en recherche et développement de stratégies.

J'ai passé plus d'une dizaine d'années dans ce cercle de négociation, avant et après, et j'ai développé toutes sortes de stratégies. Mon concept d'investissement est le suivant: contrôler le risque avant tout, se concentrer sur les gains absolus. Notre sujet de cours est: développer des stratégies CTA pour des gains absolus, de la quantification des transactions à la gestion des actifs.

1° La logique de la stratégie de CTA pour gagner de l'argent

1.1 Apprendre à connaître les CTA

Certains se demanderont peut-être ce qu'est un CTA. Qu'est-ce qu'un CTA? Un CTA est appelé à l'étranger un conseiller en négociation de matières premières, mais il est généralement appelé un gestionnaire d'investissement chez nous. Le CTA traditionnel est de concentrer les fonds de la plupart des investisseurs, puis de les confier à des institutions d'investissement spécialisées, et finalement d'investir dans des futures d'indices, des futures de matières premières, des futures de bons publics par l'intermédiaire d'un conseiller en négociation (c'est-à-dire un CTA).

Mais en réalité, au fur et à mesure que le marché mondial des futures grandit, le concept de CTA s'élargit et dépasse largement les futures traditionnelles. Il peut être utilisé non seulement pour investir dans le marché des futures, mais également sur les marchés des taux d'intérêt, des marchés boursiers, des marchés des devises et des marchés des options, etc.

Avant les années 80, la technologie des disques électroniques n'était pas encore bien développée, et la plupart des traders jugeaient l'évolution future des contrats à terme en traçant manuellement des indicateurs techniques tels que l'indicateur William, le KDJ, le RSI, le MACD et le CCI. Plus tard, des traders ont créé des fonds CTA spéciaux pour aider leurs clients à gérer leurs actifs. Ce n'est qu'après la popularité des disques électroniques que les fonds CTA ont vraiment commencé à apparaître.

Les changements dans la taille de la gestion des fonds CTA img Unité: un milliard de dollars

Si l'on regarde le graphique ci-dessus, en particulier avec l'essor de la négociation quantitative, la taille des fonds CTA dans le monde est passée de 130,6 milliards de dollars en 2005 à plus de 300 milliards de dollars en 2015; et la stratégie CTA est également devenue l'une des stratégies d'investissement les plus courantes des hedge funds mondiaux.

L'augmentation est accompagnée de la performance des fonds CTA, dont l'indice CTA de Ballack, représentatif de l'industrie des conseillers mondiaux en négociation de produits. Depuis la fin de 1979 jusqu'à la fin de 2016, les fonds CTA de Ballack ont enregistré des gains cumulés de 28,95 fois, avec un rendement annuel de 9,59%, un taux de change de 0,37 et un retrait maximal de 15,66%.

En raison de la faible pertinence des stratégies CTA dans le portefeuille d'actifs, les stratégies CTA restent généralement très peu liées aux autres stratégies. Comme indiqué ci-dessous, l'indice des fonds CTA de Barclays n'a pas baissé, mais a également enregistré des bénéfices positifs pendant la crise mondiale des actions de 2000-2002 et la crise mondiale des prêts de 2008.

img

Le développement de la CTA n'a duré qu'une dizaine d'années, mais la dynamique s'est accélérée, principalement grâce à l'environnement de négociation des futures sur produits de base plus ouvert au pays, à un seuil de fonds de transaction plus bas, à l'adoption d'un système de garantie permettant des transactions à double sens, à des frais de transaction moins élevés, à une architecture technologique plus avancée et plus facile à gérer par rapport aux actions, etc.

Depuis 2010, les fonds CTA existent principalement sous forme de fonds privés. Avec l'ouverture progressive de la politique nationale à l'investissement exclusif des fonds, les fonds CTA ont commencé à exister sous forme d'investissement exclusif des fonds, et leur mode de fonctionnement plus transparent et public est également devenu un outil nécessaire pour l'affectation des actifs de plus d'investisseurs.

img

Comme le montre le graphique ci-dessus, quelle que soit la facilité d'accès, le seuil de fonds, la façon dont la stratégie de trading est exécutée et l'API, la stratégie CTA est également plus adaptée aux traders individuels que les autres stratégies de trading. Les contrats de futures nationales sont très petits, par exemple: quelques milliers de dollars de maïs ou de haricots peuvent être négociés et il n'y a pratiquement pas de seuil de fonds.

img

Le processus de conception de la stratégie CTA est également relativement simple: les données historiques sont d'abord traitées au préalable, puis elles sont entrées dans un modèle quantifié, qui comprend des stratégies de transaction formées par des outils tels que la modélisation mathématique, la programmation et la conception, et génère des signaux de transaction en analysant ces données par le calcul. Bien sûr, dans le développement réel, ce n'est pas aussi simple que dans le diagramme ci-dessus.

1.2 Types de stratégies de CTA sur les contrats à terme

La stratégie CTA est également diversifiée du point de vue de la stratégie de trading: elle peut être une stratégie tendance ou une stratégie d'options; elle peut être une stratégie à long terme à moyen terme ou à court terme; la logique stratégique peut être basée sur l'analyse technique ou sur l'analyse fondamentale; elle peut être subjective ou systémique.

Les stratégies CTA sont classées selon les méthodes de négociation: subjective et systémique. Les stratégies CTA développées à l'étranger sont relativement avancées et les stratégies CTA des transactions systémiques sont proches de 100%. Selon les méthodes d'analyse, elles peuvent être divisées en: analyse fondamentale et analyse technique. Selon les sources de revenus, elles peuvent être divisées en: trading tendance et trading de choc.

Dans l'ensemble, les stratégies CTA représentent environ 70% des stratégies tendances, environ 25% des stratégies de retour sur la valeur moyenne et environ 5% des stratégies de contre-trend ou de renversement de tendance. Les stratégies tendances qui représentent le plus grand pourcentage, selon le cycle de détention, peuvent également être divisées en: trading à haute fréquence, trading intraday, trading à court terme, trading à long terme.

La stratégie de la ville à haute fréquenceIl existe actuellement deux stratégies de négociation à haute fréquence sur le marché, l'une est la stratégie de négociation à haute fréquence et l'autre est la stratégie de négociation à haute fréquence. La stratégie de négociation fournit de la liquidité sur le marché de négociation, c'est-à-dire que dans un marché de négociation où il y a des négociants, quelqu'un qui veut acheter ou vendre une transaction doit garantir la transaction de son échange.

Stratégie de tarification à haute fréquenceLe prix d'un ETF peut être déduit du prix d'un ETF par l'indice d'ETF et on obtient un écart qui fonctionne généralement dans un canal et qui peut être échangé en attendant le retour de l'écart si celui-ci dépasse le canal.

La stratégie du jourSi, au sens littéral, on ne détient pas de titres pendant la nuit, on peut appeler cela une stratégie de day trading. En raison de la courte durée de la période de détention des titres, les day traders ne peuvent généralement pas réaliser de bénéfices immédiats après leur entrée sur le marché.

Stratégie à long termeEn théorie, plus le cycle de détention est long, plus la capacité stratégique est grande, et moins le risque-rendement est élevé. En particulier dans les transactions institutionnelles, plus de stratégies de détention sont généralement de plusieurs jours à plusieurs mois, voire plus.

Données stratégiques du CTAGénéralement, les stratégies CTA sont basées sur des données de minute, heure et jour, telles que les prix d'ouverture, les prix les plus élevés, les prix les plus bas, les prix de clôture, le volume des transactions, etc. Seules quelques stratégies CTA utilisent des données de Tick, telles que les prix d'achat, de vente, d'achat et de vente dans les données L2.

img

Pour ce qui est de l'idée de base de la stratégie CTA, nous pensons d'abord aux indicateurs techniques traditionnels, car il y a beaucoup de références publiques à ce sujet, la logique est généralement relativement simple, et la plupart sont basés sur des principes statistiques. Par exemple, les différents indicateurs techniques que nous connaissons bien: MA, SMA, EMA, MACD, KDJ, RSI, BOLL, W&R, DMI, ATR, SAR, BIAS, OBV, etc., etc.

Il existe également des modèles de trading classiques sur le marché qui peuvent être utilisés et améliorés, tels que: les combinaisons multi-uniformes, la pression double, le R-Breaker, le trading de plage, le trading de grille, etc.

Ce sont des stratégies de trading basées sur l'analyse technique traditionnelle, dont le processus consiste à élaborer des facteurs ou des conditions d'achat ou de vente avec un avantage de probabilité sur la base des données historiques et de la bonne idée de trading, et à supposer que le marché continue à exister dans le futur, et à mettre en œuvre une stratégie de trading en code et à négocier automatiquement. Les positions ouvertes, arrêtées, coupes, augmentations, diminutions, etc. ne nécessitent généralement aucune intervention humaine.

Le principal avantage de la stratégie CTA est qu'elle offre des gains absolus, que le marché soit en hausse ou en baisse, en particulier lorsque le marché est en train de changer rapidement ou que la tendance est nettement fluide.

1.3 Principe de rentabilité de la stratégie CTA

Les stratégies de CTA futures sont rentables principalement pour les raisons suivantes:

  1. La tendance des prix est inverse, elle se poursuit toujours de manière tendancielle. Lorsque les investisseurs observent une hausse des prix, ils achètent avec le vent, ce qui entraîne une hausse des prix. La même chose est vraie pour la baisse des prix.
  2. La tolérance de chaque investisseur pour les ratios de profits et de pertes est asymétrique et la tolérance au risque est différente. Pour la plupart des détaillants, ils préfèrent opter pour des méthodes de négociation plus conservatrices et les marchés sont plus enclins à la tendance.
  3. La formation des prix est déterminée par les transactions, bien que les transactions soient menées par des hommes, mais la nature humaine est difficile à changer, ce qui conduit à l'apparition répétée de formes fixes.

En outre, le suivi des tendances est caractérisé par la perte d'un peu d'argent quand il n'y a pas de marché et le gain d'un peu d'argent quand le marché arrive, mais ceux qui ont effectué des transactions savent que le marché est souvent perturbé par le marché et que le marché est tendance pendant une petite période.

Comme les stratégies de suivi des tendances sont instables en termes de rendement, de nombreuses institutions d'investissement construisent un portefeuille avec une variété de stratégies, avec un certain nombre de stratégies d'inversion.

La CTA et les actifs traditionnels img

Comme nous le voyons sur le graphique ci-dessus, en théorie, plusieurs stratégies de styles différents ou moins pertinents émettront simultanément des signaux de trading différents face à divers changements de prix du marché. Comme de nombreuses courbes de gains se superposent, ce qui permet à l'ensemble des gains de se compléter, les courbes de gains deviennent plus lentes, ce qui réduit la volatilité des gains.

On peut en déduire qu'il est préférable de développer plusieurs stratégies de la souris centrale plutôt que de développer une stratégie de niveau maître. On peut ici tirer des leçons de l'algorithme de la forêt aléatoire dans l'apprentissage automatique. La forêt aléatoire n'est pas un algorithme indépendant, c'est un cadre de décision composé de plusieurs arbres de décision.

Ensuite, il est nécessaire de concevoir une stratégie de base permettant d'évaluer la liquidité, la rentabilité et la stabilité des différentes variétés sur l'ensemble du marché des contrats à terme sur les produits, de filtrer les combinaisons de produits à terme à faible volatilité de rendement, de filtrer de manière neutre dans l'industrie, de réduire davantage la volatilité globale par la diversification des secteurs du portefeuille, et enfin de négocier des combinaisons de produits à terme de plusieurs variétés pour construire une combinaison réelle de produits à terme par correspondance avec la valeur marchande.

Chaque variété peut également être configurée avec plusieurs stratégies de paramètres, en choisissant des combinaisons de paramètres proches de celles qui fonctionnent bien pour le retraitement. Lorsque les tendances du marché sont évidentes, les stratégies de plusieurs groupes de paramètres fonctionnent généralement de manière cohérente, ce qui est équivalent à un suroptimisme; lorsque le marché est dans un marché turbulent, les stratégies de plusieurs groupes de paramètres fonctionnent généralement de manière incohérente, ce qui entraîne une couverture de risque de surcroît ou de surcroît, ce qui est équivalent à une réduction de la position. Cela peut encore réduire le plus grand taux de retraitement du portefeuille tout en maintenant le rendement global inchangé.

2e exemple de stratégie CTA classique

Newton a dit un jour: "Si je vois plus loin que les autres, c'est parce que je me tiens sur les épaules d'un géant".

Les stratégies de CTA publiées sur le marché sont des stratégies homogènes, des stratégies de Brains, des stratèges de traders de plage, des stratégies de dynamisme, des stratégies d'options, etc. Les stratégies de négociation quantitative ont toutes une caractéristique, c'est-à-dire qu'elles sont mortes en un clin d'œil et que les stratégies, une fois publiées, échouent lentement. Mais cela n'affecte pas notre capacité à les apprendre, à tirer parti de leur essence et à voir les problèmes sur les épaules des géants.

2.1 Analyse fondamentale des contrats à terme (inventaire, écart de référence, prix)

L'analyse fondamentale ne se préoccupe pas de l'évolution des prix à court terme, croyant que la valeur sera finalement reflétée dans le prix, mais plutôt de l'analyse des facteurs qui influencent le prix et déterminent la valeur de la variété.

img

Si nous regardons le graphique ci-dessus, il y a beaucoup de facteurs qui influencent les prix des produits, des dizaines d'articles en tout, et des dizaines d'autres en détail, et ces données sont en constante évolution.

En fait, l'analyse fondamentale d'un produit à terme n'est pas une analyse de tous les facteurs, nous avons seulement besoin de saisir les éléments fondamentaux de l'analyse fondamentale, et nous pouvons détecter les règles dans une information complexe et complexe.

Les facteurs macroLes données macroéconomiques sont complexes et changeantes, chaque jour, à chaque instant, il y a beaucoup de données économiques publiées, dans les milieux politiques, les banques centrales, les banques centrales, officielles et non officielles. À l'exception des crises politiques et économiques, l'analyse macroéconomique est un bon matériel pour discuter, pas très pratique.

Facteurs de variétéDans l'analyse fondamentale, l'analyse de la variété est principalement l'analyse de l'augmentation de la demande, des relations d'offre et de demande, des stocks de produits, des bénéfices industriels, etc. On peut dire que la maîtrise de l'analyse des facteurs de la variété des produits à terme peut essentiellement déterminer la plupart des tendances du marché.

Les amis qui pratiquent les futures savent que les futures de produits de base peuvent être simplement divisées en: produits industriels et produits agricoles. Les méthodes d'analyse des produits industriels et des produits agricoles sont différentes, nous les expliquons à partir des deux aspects de l'offre et de la demande. Dans les produits industriels, l'offre est relativement stable, à moins qu'il n'y ait une percée technologique majeure, la capacité de production est peu susceptible de changer de manière significative dans un court laps de temps, de sorte que les facteurs qui affectent les prix des produits industriels sont principalement la demande.

Par conséquent, selon les lois de l'économie, les prix des produits sont définitivement déterminés par les relations de l'offre et de la demande, ce qui permet en théorie de déterminer les prix futurs des produits dès lors qu'il est possible d'obtenir des données sur l'offre et la demande. Pour les produits industriels, les données de l'offre sont plus faciles à obtenir que les données de la demande.

En fait, nous pouvons encore faire des réductions, l'offre et la demande dans le marché économique résultent de l'inventaire, nous pouvons juger de la relation entre l'offre et la demande sur le marché à partir des données d'inventaire. Si l'inventaire d'un produit est élevé, cela indique que la force de l'offre sur le marché est supérieure à la demande et que le prix du produit est sur le point de baisser si les conditions extérieures ne changent pas.

En plus d'analyser les stocks de produits, il est nécessaire d'analyser la différence de prix entre le marché actuel et le marché à terme, ce que l'on appelle le décalage. Si le prix du futur est supérieur au prix actuel, nous appelons cela le lever du futur; si le prix du futur est inférieur au prix actuel, nous l'appelons le débit du futur.

img

Qu'il s'agisse d'un raising ou d'un rabat, en raison des contraintes imposées par le système de livraison de contrats à terme, le prix des contrats à terme à la date de livraison devrait en théorie être égal au prix du marché au comptant. À l'approche de la date de livraison, les prix du marché au comptant et les prix des contrats à terme tendent à converger, l'un étant le retour du contrat au comptant et l'autre le retour du contrat au comptant.

Selon le principe ci-dessus, nous pouvons juger du prix futur des futures en utilisant à la fois les stocks et les marges. Si un produit est en stock et que le prix est beaucoup plus bas que le prix actuel, nous pouvons juger que la force de la demande sur le marché actuel est supérieure à la force de l'offre et qu'il est plus probable que les prix actuels augmenteront à l'avenir.

Enfin, nous avons déterminé la direction probable des prix futurs à partir des stocks et des marges, mais il n'y a pas de point de vente plus précis, il faut donc une analyse technique pour donner des signaux d'entrée et de sortie clairs.

2.2 La loi sur le commerce de la plage

En ce qui concerne les stratégies de trading, nous devons mentionner les lois représentatives de la négociation de plage. La loi de la négociation de plage provient de l'expérience la plus célèbre de l'histoire du trading, où le spéculateur sur les produits Richard Dennis a voulu savoir si les grands traders étaient nés ou développés. Pour cela, en 1983, il a recruté 13 personnes pour leur enseigner les concepts de base du trading de futures, ainsi que ses propres méthodes et principes de négociation.

Au cours des quatre années qui suivent, les marmottes réalisent un rendement annuel moyen de 80%. Dennis prouve également qu'avec un ensemble de systèmes et de règles simples, on peut faire de bons traders avec peu ou pas d'expérience de trading. Mais il y a des marmottes individuelles qui vendent des règles de trading de marmottes sur le site.

Une fois la vérité révélée, il a été découvert que les règles de négociation de la plage utilisaient des canaux Dongjian optimisés et utilisaient l'indicateur ATR pour gérer les positions. Après des décennies d'expérience, il est devenu un moyen de trading facile pour les détaillants ordinaires et est toujours efficace sur certaines variétés.

Les principes de base de la plage

  • Maîtriser les avantages: trouver une stratégie de trading qui a une valeur positive à espérer, car elle crée des rendements positifs à long terme.
  • Gérer les risques: contrôler les risques, rester en place, sinon vous ne pouvez pas attendre le jour où vous allez créer des résultats.
  • Persévérance: c'est seulement en persévérant dans la mise en œuvre de votre stratégie que vous obtiendrez vraiment les résultats du système.
  • Il est clair que les systèmes simples sont plus viables que les systèmes complexes dans le long terme.

Alors, la prochaine fois, voyons ce que dit la loi sur le commerce de la plage. 1, le marché - ce que l'on achète et ce que l'on vend, essentiellement sur quels marchés l'on négocie, les marins sont des négociants à terme, ils ne choisissent que les marchés à volume élevé et à forte liquidité, car ils choisissent des marchés peu actifs, ce qui augmente les prix d'entrée et de sortie supplémentaires, et ils manquent beaucoup d'opportunités de tendance. 2. la taille des positions - combien acheter - combien vendre est une partie très importante de l'ensemble de la stratégie, ce qui est souvent ignoré ou mal compris par la plupart des gens. La règle de trading offshore utilise l'ATR, l'indicateur de la largeur de fluctuation réelle moyenne, pour calculer les positions d'ouverture, les signaux de hausse et les signaux de stop-loss. C'est une conception très astucieuse, destinée à ajuster la taille des positions en fonction de la largeur absolue de la volatilité du marché, en réduisant la possession lorsque la volatilité du marché est élevée et en augmentant la possession lorsque la volatilité du marché est faible. 3, Entrée sur le marché -- L'entrée de la souris sur le marché s'appuie sur le canal de Dongjian, lorsque le prix dépasse le prix le plus élevé de la ligne K 20 ou 55 avant de monter, il entre plus, lorsque le prix dépasse le prix le plus bas de la ligne K 20 ou 55 avant de descendre, il entre à vide. Lorsque le signal apparaît, il entre sur le marché, qu'il s'agisse de fermer ou de descendre la ligne K. 4, Stop-Loss - Une transaction sans stop-loss n'est pas réussie sur le long terme, mais la plupart des traders tiennent des positions à perte, en espérant que le marché se retourne. 5 - Arrêter de flotter - Arrêter de flotter signifie perdre beaucoup de flot, ce qui est également une partie difficile à accepter pour de nombreux traders. Si vous détenez actuellement plusieurs ordres et que le prix tombe en dessous de la trajectoire du canal de Dongch'an du 10e jour, effacez tous les ordres en plus; si vous détenez actuellement des ordres vides et que le prix monte en dessous de la trajectoire du canal de Dongch'an du 10e jour, effacez tous les ordres vides.

On peut donc voir que les règles de trading de la plage semblent simples, mais qu'en réalité, elles ont formé une déformation du système de trading qui couvre tous les aspects d'un système de trading complet, sans laisser de marge de décision subjective à l'imagination des traders, ce qui permet d'exploiter les avantages de l'exploitation systématique du système.

Le plus grand avantage de la méthode de négociation sur la plage est qu'elle nous aide à construire une méthode de négociation efficace, qui combine des stratégies de construction de lots, de stop-loss dynamiques et de suivi des tendances du marché, en particulier l'utilisation des valeurs ATR et la gestion des positions. Bien sûr, il y a aussi un problème commun à la stratégie de suivi des tendances, qui est le remontage.

3° La stratégie de CTA pour le développement des futures en temps réel

3.1 Développement de stratégies de tendance CTA basées sur la langue Ma

À la fin du siècle dernier, une méthode magique de négociation a commencé à devenir populaire dans le domaine des investissements financiers aux États-Unis, et après avoir été pratiquée par des milliers de personnes, elle a été découverte comme efficace et d'une grande valeur pratique, et a été reconnue par de nombreux experts en investissement et traders professionnels, et est encore parfaitement applicable à presque tous les domaines d'investissement financier, qu'il s'agisse de devises, d'or, d'actions, de contrats à terme, de pétrole brut, d'indices et de obligations.

Le terme chaos désigne à l'origine une description d'un état de chaos universel, dont l'idée est la suivante: le résultat est inévitable, mais il est impossible de calculer le résultat en raison du savoir existant, car le calcul lui-même change le résultat, et peut éventuellement donner le résultat le plus ou le moins élevé, sans résultat inévitable. Ceci est très similaire au marché des transactions, où les participants analysent le marché et changent le marché lorsqu'ils achètent et vendent des transactions. Le marché est perpétuellement variable, et lorsque les participants apprennent une nouvelle forme du marché, le marché apprend également qu'il se produit et qu'il est connu par les participants.

L'opération de chaos est un ensemble complet d'idées d'investissement, de stratégies de négociation et de signaux d'entrée et de sortie, inventé par Bill Williams. Actuellement, de nombreux investisseurs internationaux utilisent l'opération de chaos pour négocier sur les marchés.

Comme son nom l'indique, la théorie de base de l'opération du chaos est la théorie du chaos, proposée par le météorologue Edward Lorenz, qui est l'une des plus grandes découvertes scientifiques de la fin du XXe siècle. C'est lui qui a inventé le fameux effet papillon. Bill Williams a appliqué de manière créative la théorie du chaos dans le domaine de l'investissement financier et a combiné des disciplines telles que la géométrie des fractions et la dynamique non linéaire pour créer une série d'indicateurs d'analyse technique très efficaces.

L'ensemble de l'opération Chaos est constitué de cinq dimensions (indicateurs techniques):

  • Ligne de requin (Alligator)

  • Le fractal

  • Le momentum

  • Accélération

  • La ligne de l'équilibre

    img

Comme nous l'avons vu dans le diagramme ci-dessus, les lignes de requin sont un ensemble de lignes d'équilibre utilisant la géométrie de fraction et la dynamique non linéaire, qui sont essentiellement des moyennes mobiles pondérées par l'indice d'expansion, qui appartiennent à la ligne uniforme, mais dont les calculs sont un peu plus complexes que les lignes uniformes ordinaires.

// 参数
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);

Tout d'abord, nous définissons les deux paramètres externes N1 et N2, puis nous calculons la moyenne HL du prix le plus élevé et du prix le plus bas en fonction des paramètres externes, puis nous calculons la moyenne HL avec des paramètres différents, respectivement.

Dans le mode de fonctionnement du chaos, un concept de fractionnement est défini de manière très symbolique. On peut utiliser l'analogie suivante: en ouvrant la paume, le doigt vers le haut, le doigt du milieu est le fractionnement vers le haut, le petit doigt à gauche et l'index, le pouce et le pouce à droite représentent respectivement les lignes K non innovantes de hauteur.

// 分形
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);

En calculant la ligne de requin et la fraction, nous pouvons écrire une stratégie simple d'opération de chaos basée sur ces deux conditions, en utilisant un ensemble d'indices et de moyennes mobiles pondérées comme prix de référence pour calculer la ligne de requin et la fraction. Bien sûr, la stratégie de l'opération de chaos de la version originale est plus complexe. Le code est le suivant:

// 如果当前无多单,并且收盘价升破上分形,并且上分形在鳄鱼线上方时,多头开仓
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);

Pour vous faciliter la compréhension, j'ai écrit une note détaillée directement dans le code, et nous pouvons résumer la logique de transaction de cette stratégie en quelques mots:

  • Opération multi-tête: si le nombre d'ordres n'est pas élevé et que le prix de clôture est supérieur à celui de la ligne de crocodile.
  • Ouvrez un poste vide: si vous n'avez pas d'ordre vide et que le prix de clôture tombe en dessous de la fraction et que la fraction inférieure se situe en dessous de la ligne des requins.
  • Les négociations à plusieurs niveaux: si le prix de clôture tombe en dessous de la mâchoire d'un requin.
  • Le marché est en train de s'effondrer.

Ensuite, nous verrons ce qu'il en résulte de cette simple stratégie de retouche d'opération chaotique. Pour rapprocher le retouche d'un environnement réel, nous avons défini le coût de l'opération à deux fois le coût de l'échange, les positions ouvertes et les positions ouvertes plus 2 sauts par glissement.

img img img

La stratégie s'est bien déroulée sur la courbe des capitaux et les données de performance des retrospectives. La courbe des capitaux globaux est en hausse régulière. Cependant, les caractéristiques du marché des aciers à vis ont changé après la fin de 2016, passant d'une tendance unilatérale à un taux d'élasticité élevé à une tendance à la volatilité à grande échelle.

En résumé, l'essence de l'opération chaotique est de trouver un tournant, sans se soucier de la façon dont le marché se déroule, sans se soucier de la fausse percée, et d'entrer directement dans la fracture si elle se produit.

3.2 Développement d'une stratégie de CTA basée sur JavaScript

Soros a fait une proposition importante dans son livre de 1987 L'alchimie de la finance de Liu: " Je crois que les prix du marché sont toujours erronés dans le sens où ils ont des préjugés sur l'avenir. " Il soutient que les hypothèses d'efficacité du marché ne sont que des hypothèses théoriques, que les acteurs du marché ne sont pas toujours raisonnables, et qu'il est impossible pour les acteurs à chaque point de temps d'accéder complètement et objectivement à toute l'information, et que même s'il s'agissait de la même information, les commentaires de chacun ne sont pas les mêmes. " C'est-à-dire que le prix lui-même contient déjà les mauvaises attentes des acteurs du marché, et donc que le prix du marché est toujours erroné.

Selon les principes ci-dessus, nous savons également que, dans un marché à terme inefficace, les contrats à taux d'échange à des périodes différentes ne sont pas toujours synchronisés par l'influence du marché et que leur prix n'est pas tout à fait efficace. Ainsi, en fonction des prix des contrats à taux d'échange à des périodes différentes du même indice de négociation, il est possible d'acheter et de vendre simultanément des contrats à taux d'échange à des périodes différentes, en faisant un arbitrage à travers les périodes.

Comme pour les futures sur produits, les crypto-monnaies ont également des combinaisons de contrats d'effet de levier à long terme associées; comme dans l'échange OkEX: ETC la semaine, ETC la semaine suivante, ETC le trimestre. Par exemple, supposons que la différence de prix entre ETC la semaine et ETC le trimestre se maintient à environ 5 sur une longue période. Si une différence de prix d'un jour atteint 7, nous prévoyons que la différence de prix reviendra à 5 à un moment donné dans le futur.

Bien que cette différence de prix existe, il y a souvent beaucoup d'incertitude dans les arbitrages artificiels, en raison du temps, de la mauvaise précision et des effets des variations de prix. L'attrait des arbitrages quantifiés réside dans la capture des opportunités et la stratégie de négociation des arbitrages par des modèles quantifiés, ainsi que dans le fait que les algorithmes programmatiques envoient automatiquement des ordres de négociation aux échanges, capturent rapidement et précisément les opportunités et génèrent des bénéfices efficaces et stables.

Ce cours vous apprendra comment, dans les transactions de devises numériques, en utilisant les plateformes de négociation quantifiées par les inventeurs et les contrats à terme ETC sur l'échange OkEX, démontrer une stratégie de négociation simple qui permet de saisir les opportunités de négociation instantanées, de saisir les bénéfices visibles à chaque fois, tout en couvrant les risques potentiels.

Créer une stratégie de financement à long terme pour la monnaie numériqueDifficulté: niveau moyenEnvironnement stratégique

  • Les échanges ont été effectués par ETC.
  • Données sur les différences de prix: ETC semaine - ETC trimestre (sauf vérification de l'intégrité)
  • Cycle de négociation: 5 minutes
  • 头寸匹配:1:1
  • Type de transaction: période transversale de la même variété

La logique stratégique

  • Conditions d'ouverture d'un déficit: si le compte actuel n'est pas détenu et que le déficit est inférieur au déficit de boll, un déficit est effectué; c'est-à-dire: acheter l'ETC pendant la semaine et vendre l'ETC pendant le trimestre.
  • Conditions d'ouverture de l'écart de prix: si le compte actuel n'est pas détenu et que l'écart de prix est supérieur à l'écart de boll sur la trajectoire, l'écart de prix est effectué.
  • Conditions d'équilibrage des écarts de prix: si le compte courant détient plus d'entrées d'ETC par semaine et plus d'entrées d'ETC par trimestre, et que le prix est plus élevé que le prix moyen de l'ETC, il y a une différence de prix plus élevée; c'est-à-dire: vendre plus d'ETC par semaine et acheter plus d'ETC par trimestre.
  • Conditions d'équilibrage des écarts de prix: si le compte actuel détient des écarts de prix de l'ETC la semaine suivante et détient plusieurs écarts de prix de l'ETC au cours du trimestre, et que le prix est inférieur à l'écart de prix de l'ETC au cours de la semaine suivante, le prix de l'ETC est équilibré; c'est-à-dire: acheter des écarts d'ETC la semaine suivante et vendre des écarts de prix de l'ETC au cours du trimestre suivant.

Ce qui précède est une simple description logique de la stratégie d'optimisation à long terme de la monnaie numérique, alors comment mettre en œuvre vos idées dans le programme? Nous avons essayé de construire le cadre avant que les inventeurs ne quantifient les plateformes de trading.

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秒
    }
}

Imaginez ce que serait le processus de transaction dans une transaction principale. Dans une transaction systémique, il n'y a pas de différence essentielle, mais seulement: l'acquisition de données, le calcul des données, la transaction de commande, le traitement après la commande. Il en va de même dans un programme, où le programme exécute d'abord la 20e ligne de la fonction main, une règle conventionnelle qui prévoit que lorsque le programme exécute la stratégie de transaction, il entre dans un mode de cycle infini, le mode de consultation, dans le mode de consultation, une exécution répétée de la fonction onTick.

Dans la fonction onTick, c'est le processus de transaction que nous utilisons dans les transactions subjectives: d'abord, nous obtenons les données de prix de base, puis nous obtenons le solde du compte, puis nous calculons les indicateurs, puis nous commençons à calculer les conditions de transaction et à passer des commandes, et enfin, nous traitons après la commande, y compris: retrait des commandes, dessin, traitement des contrats individuels.

Il est facile de construire un cadre stratégique en comparant les idées stratégiques et les processus de transaction.

  • Le traitement préalable à la transaction.
  • Les données sont collectées et calculées.
  • La demande est déposée et traitée ultérieurement.

Une fois le cadre de stratégie de transaction construit, il est nécessaire de remplir le code de détail nécessaire dans le cadre de stratégie en fonction du processus de transaction réel et des détails de transaction.

Premièrement, le traitement préalable des transactions.

1. Déclarer les variables globales nécessaires

  • Déclarer un objet chart pour configurer un graphiquevar chart = {}
  • Appeler la fonction Chart pour initialement le graphiquevar ObjChart = Chart ( chart )
  • Déclarer une plage vide pour stocker une séquence de différence de prixvar bars = []
  • Déclarer une variable de la chronologie des données historiquesvar oldTime = 0

2. Paramètres externes de la stratégie de configuration

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

3. Définition des fonctions de traitement de données

  • Fonction de base de données: Data () Créez une fonction de construction Data et définissez ses propriétés internes. Il s'agit notamment de données de compte, de données de stockage, de données de temps de ligne K, de prix d'achat/vente sur les contrats A/B et de différence de prix positif/contre-soutien.
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;
}
  • Obtenir la fonction de stockage: mp () Traversez l'ensemble de l'arrayé de détention pour retourner le nombre de détentions pour un contrat spécifié, une direction spécifiée, et retournez false s'il n'y en a pas
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;
}
  • Ligne K et fonction indicateur:boll ()) Une nouvelle séquence de lignes K est synthétisée sur la base des différences de prix positives/contre-sets; et les données sur les pistes, les pistes moyennes et les pistes inférieures calculées par l'indicateur Boll sont renvoyées.
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指标数据
}
  • La fonction suivante:trade () Envoyer le nom du contrat de sous-traitance et le type de contrat de sous-traitance, puis le prix de sous-traitance par rapport au prix de sous-traitance, et retourner le résultat du sous-traitance. Comme il est nécessaire de sous-traiter simultanément deux sous-traitants dans des directions différentes, une conversion est effectuée en fonction du prix d'achat/de vente selon le nom du contrat de sous-traitance.
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;
    }
}
  • La fonction annuler les commandes:cancelOrders () Retrouvez l'archive de toutes les commandes en suspens et annulez-la une par une. Et retournez false si vous avez des commandes en suspens, et true si vous n'avez pas de commandes en suspens.
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
}
  • Traiter avec un seul contrat: isEven ()) Dans le traitement des transactions à effet de levier, il y a une situation à pied unique, qui consiste à traiter toutes les positions directement avec une simple liquidation. Bien sûr, il peut également être modifié en mode suivi.
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);
        }
    }
}
  • Fonction de dessin:drawingChart ()) Appellez la méthode ObjChart.add () pour dessiner les données de marché et les données d'indicateurs nécessaires dans le graphique: en hausse, en baisse, en hausse, en hausse, en hausse / en baisse.
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. Dans la fonction d'entrée main (), exécute des codes de prétraitement de transaction qui ne s'exécutent qu'une seule fois après le démarrage du programme; notamment:

  • Le filtre de la console n'est pas une information importante.SetErrorFilter ( )
  • Créer une monnaie numérique à échangerexchange.IO ( )
  • Graphiques dessinés avant le démarrage du programmeObjChart.reset ( )
  • Informations sur les barres d'état avant le démarrage du programmeLogProfitReset ( )

Après avoir défini le prétraitement de transaction ci-dessus, il suffit de passer à l'étape suivante, en mode consultation, d'exécuter à plusieurs reprises la fonction onTick ().

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秒
    }
}

Deuxièmement, obtenir et calculer des données.

  1. Obtenir des objets de données de base, des soldes de compte, des données d'indicateurs de Boll pour une utilisation logique des transactions.
function onTick() {
    var data = new Data(tradeTypeA, tradeTypeB); // 创建一个基础数据对象
    var accountStocks = data.accountData.Stocks; // 账户余额
    var boll = data.boll(dataLength, timeCycle); // 获取boll指标数据
    if (!boll) return; // 如果没有boll数据就返回
}

Troisièmement, la demande et le traitement ultérieur

  1. Selon la logique stratégique ci-dessus, l'opération d'achat et de vente est exécutée. La première étape consiste à déterminer si les conditions de prix et d'indicateur sont satisfaites, puis à déterminer si les conditions de possession sont satisfaites, puis à exécuter la fonction de sous-ordre trade ().
// 价差说明
// 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. Une fois la commande terminée, il est nécessaire de traiter les anomalies telles que les commandes en suspens, la tenue d'un contrat individuel et de dessiner des graphiques.
data.cancelOrders(); // 撤单
data.drawingChart(boll); // 画图
data.isEven(); // 处理持有单个合约

Au-dessus, nous avons créé une stratégie simple de devises numériques à long terme avec plus de 200 lignes de code.

// 全局变量
// 声明一个配置图表的 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++) { // 遍历持仓数

Relationnée

Plus de

Je vous en prie.Apprendre à apprendre

Je suis désolée.Apprendre

Je suis désolée.Apprendre