4.2 Comment mettre en œuvre le trading stratégique dans le langage JavaScript

Auteur:La bonté, Créé: 2019-04-27 11:53:15, mis à jour:

Résumé

Dans l'article précédent, nous avons présenté les connaissances fondamentales que lorsque vous utilisez JavaScript pour écrire un programme, y compris la grammaire de base et les matériaux.

Introduction de la stratégie

La bande de Bollinger est l'un des indicateurs techniques les plus couramment utilisés, inventé par John Bollinger dans les années 1980. en théorie, les prix fluctuent toujours autour d'une certaine plage de valeurs.

La méthode de calcul consiste à utiliser le principe statistique, à calculer d'abord l'écart-type du prix pour une période de temps, puis à additionner ou soustraire 2 fois l'écart-type de la moyenne mobile pour trouver l'intervalle de confiance du prix.

img

En raison du concept d'écart type, la largeur de la bande de Bollinger est ajustée dynamiquement en fonction des fluctuations de prix récentes. Lorsque les fluctuations sont faibles, les bandes de Bollinger seront plus étroites; sinon les fluctuations seront plus grandes et les bandes de Bollinger seront plus larges. Lorsque le canal BOLL passe de l'étroite à l'étroite, le prix revient progressivement à la moyenne. Lorsque le canal BOLL passe de l'étroite à l'étroite, cela signifie que le prix du marché commence à changer.

Méthode de calcul de l'indicateur de bande de Bollinger

Parmi tous les indicateurs techniques, la méthode de calcul de la bande de Bollinger est l'une des plus compliquées, qui introduit le concept d'écart type dans les statistiques, impliquant le calcul de la trajectoire moyenne (MB ), de la trajectoire supérieure (UP) et de la trajectoire inférieure (DN).

  • Relèche centrale = moyenne mobile simple de N périodes

  • Relée supérieure = relée intermédiaire + écart type de la période K × N

  • Relèche inférieure = relèche moyenne − écart type de la période K × N

function main( ) { // program entry
    while (true) { // enter the loop
        exchange.SetContactType('this_week'); // set contact type
        var records = exchange.GetRecods(); // get the k line array
        var boll = TA.B0LL(records, 50); // get the 50-cycle BOLL indicator array
        var top = boll[0]; // get the upper-rail BOLL indicator array
        var ma = boll[l]; // get the middle-rail BOLL indicator array
        var bottom = boll[2]; // get the lower-rail BOLL indicator array
        Log(top); // print the upper-rail BOLL indicator array to the log
        Log(ma); // print the middle-rail BOLL indicator array to the log
        Log(bottom);// print the lower-rail BOLL indicator array to the log
    }
}

La logique de la stratégie

Les bandes de Bollinger sont utilisées de différentes manières et peuvent être utilisées seules ou en combinaison avec d'autres indicateurs.

img

Si le prix revient à nouveau au milieu de la bande de Bollinger après avoir ouvert la position longue, nous pensons que la force du pouvoir d'achat s'affaiblit, ou que la force du pouvoir de vente se renforce, c'est donc là que le signal de fermeture de position entre en jeu.

Conditions de négociation

  • Position longue ouverte: s'il n'y a pas de position et que le prix de clôture est supérieur à la barre supérieure.

  • Position courte: si aucune position n'existe et que le prix de clôture est inférieur au niveau du rail inférieur.

  • Fermeture de position longue: si la position longue est maintenue et que le prix de clôture est inférieur à la moyenne,

  • Fermeture de position courte: si la position courte est maintenue et que le prix de clôture est supérieur au niveau moyen,

Mise en œuvre du code de stratégie

Pour réaliser la stratégie, nous devons d'abord considérer quelles données nous avons besoin? à travers quelle API pour obtenir? puis comment calculer la logique de trading? enfin, quelle façon de placer l'ordre?

Étape 1: Utiliser le cadre stratégique de la CTA

Le cadre de stratégie CTA est un ensemble de frameworks standard que FMZ Quant a officiellement conçu. En utilisant ce framework, vous pouvez ignorer le problème de programmation trivial et vous concentrer directement sur la logique de la programmation. Par exemple, si vous n'utilisez pas ce framework, vous devrez envisager de changer le prix de l'ordre, le type d'ordre, le retrait des ordres, etc.

function main() {
    $.CTA("this_week", function(st) {
        // write your strategy here
    })
}

Ce qui précède est le cadre de stratégie CTA utilisant l'outil FMZ Quant. Il s'agit d'un format de code fixe, et tout le code de logique de trading commence à la ligne 3.

Notez que le code de variété de négociation ci-dessus est this_week, ce qui signifie qu'il représente l'utilisation de la ligne k hebdomadaire, les données de négociation utilisant les données hebdomadaires.

Étape 2: obtenir toutes sortes de données

Pensez-y, quels types de données avons-nous besoin? de notre stratégie de trading logique, nous devons d'abord obtenir l'état de la position actuelle, et puis comparer le prix de clôture avec l'indicateur Bollinger Band rails supérieur, moyen et inférieur.

  • Obtenez les données de la ligne K.

La première est d'obtenir la matrice de données de la ligne K et le prix de clôture de la ligne K précédente, avec la matrice de ligne K, nous pouvons calculer l'indicateur de la bande de Bollinger. il peut être écrit comme ceci:

function main() {
    $.CTA("this_week", function(st) {

        var r = st.records; // get the k line data
        if (r.length < 20) return; // filter the length of k line data
        var close = r[r.length - 2].Close; // get the previous k line closing price

    })
}

Comme indiqué ci-dessus:

Ligne 4: Obtenez le tableau de lignes K, qui est un format fixe.

Ligne 5: Filtrer la longueur de la ligne K, parce que le paramètre pour calculer l'indicateur de la bande de Bollinger est 20, quand la ligne K est inférieure à 20, il est impossible de calculer l'indicateur de la bande de Bollinger.

Ligne 6 : De la matrice de lignes K obtenue, obtenez d'abord l'objet de la ligne K précédente, puis obtenez le prix de clôture de cet objet. Obtenir l'avant-dernier élément de cette matrice, qui est la longueur de cette matrice moins 2 ((r[r.longueur - 2]).

Les éléments du tableau K-line sont tous des objets, l'objet contient le prix d'ouverture, le prix le plus élevé, le prix le plus bas et le prix de clôture; également le volume et l'heure de négociation.

Par exemple, pour obtenir le prix de clôture, il suffit d'ajouter ". " suivi du nom de l'attribut (r[r.length - 2].Close).

  • Obtenez des données de temps de ligne K.

Comme il s'agit d'une stratégie intraday, nous devons fermer toutes les positions avant un certain temps ((la plupart des échanges de crypto-trading sont généralement ouverts 24 heures sur 24 et 7 jours sur 7), nous devons donc juger si la ligne K actuelle est proche de ce certain moment lorsque nous devons arrêter de trader ou faire une pause. Si elle est proche de cette ligne K de fermeture, fermez toutes les positions. Si ce n'est pas le cas, continuez la stratégie. Le code est écrit comme suit:

function main() {
    $.CTA("this_week", function(st) {

        var r = st.records; // get the k line data
        if (r.length < 20) return; // filter the length of k line data
        var close = r[r.length - 2].Close; // get the previous k line closing price

        var time = new Date(r[r.length - 1].Time); // according the current k-line timestamp, create a time object
        var isClose = time.getHours() == 14 && time.getMinutes() == 45; // judging whether the current k-line is 14:45. this is just a example, you can specify any time you want during the 24 hours
    })
}

Comme indiqué ci-dessus:

Ligne 8: obtenez les objets de l'attribut timestamp de la ligne K, puis créez un objet time ((new Date (timestamp)).

Ligne 9: Calculer les heures et les minutes en fonction de l'objet temps, et déterminer si l'heure de la ligne K actuelle est 14:45.

  • Obtenez les données de position

L'information de position est une condition très importante dans la stratégie de négociation quantitative. Lorsque les conditions de négociation sont établies, il est nécessaire de juger si une commande doit être passée en fonction du statut de la position et du nombre de positions. Par exemple, lorsque les conditions d'ouverture de positions longues sont établies, s'il y a une position de détention, ne passez pas l'ordre; s'il n'y a pas de position de détention, passez l'ordre. comme ceci:

function main() {
    $.CTA("this_week", function(st) {

        var r = st.records; // get the k line data
        if (r.length < 20) return; // filter the length of k line data
        var close = r[r.length - 2].Close; // get the previous k line closing price

        var time = new Date(r[r.length - 1].Time); // according the current k-line timestamp, create a time object
        var isClose = time.getHours() == 14 && time.getMinutes() == 45; // judging whether the current k-line is 14:45. this is just a example, you can specify any time you want during the 24 hours

        var mp = st.position.amount; // get the holding position information

    })
}

Comme indiqué ci-dessus:

Ligne 11: Obtenez l'état de la position actuelle. S'il y a une position longue, la valeur est 1; s'il y a une position courte, la valeur est -1; s'il n'y a pas de position, la valeur est 0.

  • Obtenez les données de la bande de Bollinger

Ensuite, nous devons calculer les valeurs des rails supérieurs, intermédiaires et inférieurs de l'indicateur de la bande de Bollinger. nous devons d'abord obtenir le tableau Boolean, puis obtenir les valeurs des rails supérieurs, intermédiaires et inférieurs de ce tableau. Dans l'outil quantique FMZ, il est très simple d'obtenir le tableau Boolean, il suffit d'appeler directement l'API de la bande de Bollinger, c'est un tableau bidimensionnel.

L'ordre pour obtenir la valeur est: d'abord obtenir le tableau spécifié dans le tableau, puis obtenir l'élément spécifié à partir du tableau spécifié, comme indiqué ci-dessous:

var arr = [[100, 200, 300],[10,20,30],[1,2,3]]; // this is a two-dimensional array
var test = arr[0]; //first obtain the specified array in the array and assign the value to variable "test"
var demo1 = test[0]; //then get a value from the test array
demo1; // the result is : 100

var demo2 = arr[0][0]; // you also can write like this
demo2; // the result is the same : 100

Ci-dessous, de la 13e à la 19e ligne obtiennent la bande de Bollinger partie de codage des rails supérieur, intermédiaire et inférieur, où la ligne 13 utilise l'outil FMZ Quant API, qui peut accéder directement à la matrice de bande de Bollinger; la ligne 14 à la ligne 16 obtiennent la matrice bidimensionnelle respectivement pour la matrice de rails supérieur, intermédiaire et inférieur; la ligne 17 à la ligne 19 obtiennent la valeur spécifiée de la matrice de rails supérieur, intermédiaire et inférieur.

function main() {
    $.CTA("this_week", function(st) {

        var r = st.records; // get the k line data
        if (r.length < 20) return; // filter the length of k line data
        var close = r[r.length - 2].Close; // get the previous k line closing price

        var time = new Date(r[r.length - 1].Time); // according the current k-line timestamp, create a time object
        var isClose = time.getHours() == 14 && time.getMinutes() == 45; // judging whether the current k-line is 14:45. this is just a example, you can specify any time you want during the 24 hours

        var mp = st.position.amount; // get the holding position information

        var boll = TA.BOLL(r, 20, 2); //calucating the Bollinger Band indicator
        var upLine = boll[0]; // get the up-rail array
        var midLine = boll[1]; // get the middle-rail array
        var downLine = boll[2]; // get the lower-rail array
        var upPrice = upLine[upLine.length - 2];  // get the previous K-line upper rail value
        var midPrice = midLine[midLine.length -2]; // get the previous K-line middle rail value
        var downPrice = downLine[downLine.length -2]; // get the previous K-line lower rail value

    })
}

Étape 3: commande et échange

Avec les données ci-dessus, nous pouvons écrire la logique de trading et la partie de placement des ordres maintenant. C'est également très simple, le plus couramment utilisé est l'instruction if, qui peut être décrite comme suit: si les conditions 1 et 2 sont vraies, placez l'ordre; si la condition 3 ou la condition 4 est vraie, placez l'ordre.

function main() {
    $.CTA("this_week", function(st) {

        var r = st.records; // get the k line data
        if (r.length < 20) return; // filter the length of k line data
        var close = r[r.length - 2].Close; // get the previous k line closing price

        var time = new Date(r[r.length - 1].Time); // according the current k-line timestamp, create a time object
        var isClose = time.getHours() == 14 && time.getMinutes() == 45; // judging whether the current k-line is 14:45. this is just a example, you can specify any time you want during the 24 hours

        var mp = st.position.amount; // get the holding position information

        var boll = TA.BOLL(r, 20, 2); //calucating the Bollinger Band indicator
        var upLine = boll[0]; // get the up-rail array
        var midLine = boll[1]; // get the middle-rail array
        var downLine = boll[2]; // get the lower-rail array
        var upPrice = upLine[upLine.length - 2]; // get the previous K-line upper rail value
        var midPrice = midLine[midLine.length -2]; // get the previous K-line middle rail value
        var downPrice = downLine[downLine.length -2]; // get the previous K-line lower rail value

        if (mp == 1 && (close < midPrice || isClose)) return -1; // if holding long position, and the closing price is less than the mid-rail, or the current time is 14:45, closing long position.
        if (mp == -1 && (close > midPrice || isClose)) return 1; // if holding short position, and the closing price is greater than the mid-rail, or the current time is 14:45, closing short position.
        if (mp == 0 && close > upPrice && !isClose) return 1; // if there are no holding position, and the closing price is greater than the upper-rail, or the current time is not 14:45, open long position.
        if (mp == 0 && close < downPrice && !isClose) return -1;// if there are no holding position, and the closing price is less than the lower-rail, or the current time is not 14:45, open short position.

    })
}

Dans la figure ci-dessus, les lignes 21 à 24 représentent la logique de négociation et la partie de codage des ordres de placement.

Prenons l'exemple de la position longue ouverte. Il s'agit d'une instruction if. Si une seule ligne de code est exécutée dans cette instruction, les crochets " {} " peuvent être omis. L'instruction est traduite en texte signifiant: si la position actuelle est 0 et le prix de clôture est supérieur au rail supérieur, et le temps de la ligne k n'est pas 14:45, alors " retourner 1 "

vous constaterez peut-être que ces lignes ont " retour 1 " et " retour -1 ", qui est un format fixe, ce qui signifie: si c'est la direction d'achat, écrivez " retour 1 "; si c'est la direction de vente, écrivez " retour -1 ".

Code de stratégie complet

À ce stade, un code de stratégie complet est écrit. Si le cadre de trading, les données de trading, la logique de trading et le placement d'ordre sont écrits séparément, c'est très simple.

function main() {
    $.CTA("this_week", function(st) {
        var r = st.records; // get the k line data
        if (r.length < 20) return; // filter the length of k line data
        var close = r[r.length - 2].Close; // get the previous k line closing price
        var time = new Date(r[r.length - 1].Time); // according the current k-line timestamp, create a time object
        var isClose = time.getHours() == 14 && time.getMinutes() == 45; // judging whether the current k-line is 14:45. this is just a example, you can specify any time you want during the 24 hours
        var mp = st.position.amount; // get the holding position information
        var boll = TA.BOLL(r, 20, 2); //calucating the Bollinger Band indicator
        var upLine = boll[0]; // get the up-rail array
        var midLine = boll[1]; // get the middle-rail array
        var downLine = boll[2]; // get the lower-rail array
        var upPrice = upLine[upLine.length - 2]; // get the previous K-line upper rail value
        var midPrice = midLine[midLine.length -2]; // get the previous K-line middle rail value
        var downPrice = downLine[downLine.length -2]; // get the previous K-line lower rail value
        if (mp == 1 && (close < midPrice || isClose)) return -1; // if holding long position, and the closing price is less than the mid-rail, or the current time is 14:45, closing long position.
        if (mp == -1 && (close > midPrice || isClose)) return 1; // if holding short position, and the closing price is greater than the mid-rail, or the current time is 14:45, closing short position.
        if (mp == 0 && close > upPrice && !isClose) return 1; // if there are no holding position, and the closing price is greater than the upper-rail, or the current time is not 14:45, open long position.
        if (mp == 0 && close < downPrice && !isClose) return -1;// if there are no holding position, and the closing price is less than the lower-rail, or the current time is not 14:45, open short position.
    })
}

Il y a deux choses que vous devez savoir:

  1. Essayez (mais pas nécessairement) d'écrire la logique de stratégie lorsque la condition actuelle de la ligne K est établie, puis placez l'ordre sur la ligne k suivante. Ou la condition précédente de la ligne k est établie, placez des ordres sur la ligne k actuelle, de cette façon, le résultat du backtest et la performance réelle du marché ne sont pas très différents.

  2. En général, la logique de la position de clôture devrait être écrite devant la logique de la position d'ouverture. Le but de cela est d'essayer de faire en sorte que la logique de la stratégie réponde à vos attentes. Par exemple, si la logique de la stratégie répond juste à la situation où elle doit faire le sens inverse de la négociation après avoir juste fermé une position, la règle de ce genre de situation est de fermer la position d'abord et d'ouvrir ensuite la nouvelle position. Si nous écrivons la logique de la position de clôture devant la logique de la position d'ouverture, elle remplira parfaitement cette règle.

Pour résumer

Ci-dessus, nous avons appris chaque étape du développement d'une stratégie de trading quantitative intraday complète, y compris: introduction de la stratégie, méthode de calcul de l'indicateur de Bollinger, logique de la stratégie, conditions de trading, mise en œuvre du code de stratégie, etc. Grâce à ce cas de stratégie, non seulement nous connaissons les méthodes de programmation des outils FMZ Quant, mais nous pouvons également construire d'autres stratégies qui sont adaptées selon ce modèle.

Si nous écrivons l'expérience ou le système utilisé dans le trading subjectif avant d'écrire la stratégie quantitative, puis de le traduire en code un par un, vous constaterez que l'écriture d'une stratégie quantitative sera beaucoup plus facile.

Communiqué de la section suivante

Dans le développement de la stratégie de trading quantitative, si seulement on peut choisir un langage de programmation, sans hésitation, il doit être Python. De l'obtention de données au backtesting, même la partie de placement des commandes, Python a couvert toute la chaîne d'affaires. Dans le domaine de l'investissement quantitatif financier, Python a occupé une position extrêmement importante, la prochaine section du cours, nous commencerons à apprendre le langage Python.

Exercices après l'école

  1. Essayez d'utiliser les connaissances de cette section pour mettre en œuvre une stratégie de moyenne mobile double.

  2. Essayez de mettre en œuvre la stratégie d'indicateur KDJ en utilisant le langage JavaScript sur la plateforme FMZ Quant.


Plus de