Nous allons vous emmener dans le monde de la quantification -- MACD double sens fonctionnement des glissades stop-loss analyse de code

Auteur:L'inventeur de la quantification - un petit rêve, Créé: 2016-04-22 13:53:14, Mis à jour: 2023-06-14 10:38:59

Le MACD vous amène dans le monde de la quantification en double sens avec des opérations de glissement et d'analyse de code stop-loss

Dans l'article précédent, nous avons expliqué les stratégies de simplification de la quantification de 30 lignes de code, et dans cet article, nous allons guider les débutants de la quantification de plus en plus près de l'amusement de la conception de stratégies de quantification. L'auteur, qui est encore un ignorant de la finance, de l'investissement, des valeurs mobilières et autres, continue: "Je ne comprends même pas le processus de négociation des contrats à terme. Il y a des gens qui ont l'impression d'être dans un état d'inconscient, de perplexité, de perplexité à cause des noms et des termes qu'ils n'ont pas encore entendus, mais qui ont l'impression d'être dans un état d'inconscient (ce qui est aussi un peu compréhensif! Après avoir consulté le contenu, j'ai eu les concepts de base à l'esprit, et j'ai combiné mon langage JS que je connaissais un peu, pour écrire une simple lettre. En termes simples, la ligne K est un indicateur de la tendance du marché dans un certain cycle, qui permet d'observer la dynamique du marché. La ligne moyenne est l'indicateur utilisé dans l'article précédent et, comme l'indicateur MACD, reflète la tendance du marché. Les concepts, les algorithmes, les formules d'induction, etc. de ces deux indicateurs ne sont pas décrits de la même manière.

Le code contient les variables globales suivantes, les règles anciennes, une explication par une, les vieux oiseaux peuvent ignorer.

Nom de la variable Valeur initiale Expliquer
L'intervalle 2000 Cette variable est le cycle de consultation, c'est-à-dire la durée pendant laquelle le programme est en attente de suspension. L'unité est une milliseconde, 1000 millisecondes est une seconde, donc cette variable a une valeur initiale de 2 secondes.
Réservé à l'État 0 C'est une variable d'affichage de l'état, qui indique un espace libre.
Résultats de l'enquête 1 C'est une variable d'état qui indique que vous avez plusieurs positions.
Résultats de l'analyse 2 La variable d'état indique une position en libre-échange.
Résultats de l'analyse 3 La variable d'état de détention indique qu'elle n'est pas en stock.
Nom de l'équipe 4 Il y a des centaines de milliers d'entre eux.
État Réservé à l'État Variable d'état, initialement en état d'impasse.
SignalDelay (décalage du signal) 0 Le signal a été retardé et n'est pas utile pour le moment.
ArrêtezProfit 0.002 Cette variable est plus importante, le taux de stop-loss, par exemple, le capital * taux de stop-loss ((0.002)) indique un maximum de perte de 0,002 fois le capital, la perte maximale.
étape 0.5 La longueur de pas de l'arrêt de glissement.
Op Montant 1 Le nombre d'opérations est fixe.
bénéfice 0 Je suis désolée.

L'objet global, utilisé pour enregistrer les informations de stockage, contient plusieurs méthodes, principalement pour réaliser des arrêts glissants.

    var holdOrder = {//持仓信息对象
	    orderState: ORDER_INVALID,// 持仓状态
	    price: 0, //持仓均价
	    amount: 0, //持仓量
	    time: null, // 操作时间
	    stopPrice: 0, // 止损价
	    level: 1,   //止损等级
	    updateCurrentProfit: function(lastPrice,amount){//更新当前盈亏
	        if(state === STATE_SELL){//当前 空头持仓
	        	return (lastPrice - this.price) * amount;
	        }
	        if(state === STATE_BUY){//当前 多头持仓
	        	return - (lastPrice - this.price) * amount;
	        }
	    },
	    SetStopPrice: function(ticker,stopState){//更新止损价
	    	if(stopState === STATE_FREE){ //更新止损时状态 为空闲
	    		return this.stopPrice;
	    	}
	    	if(stopState === STATE_BUY){ //更新止损时状态 为多仓
	            if(this.orderState === ORDER_INVALID){
	        	    return this.stopPrice;
	            }
	            if(this.stopPrice === 0){//初始 止损价为0 时 
	            	this.stopPrice = this.price * ( 1 - stopProfit );
	            }
	            if( ticker.Last <= this.price ){ //最后成交价 小于等于  持仓均价时
	                this.stopPrice = this.price * ( 1 - stopProfit );
	                this.level = 1;
	            }else{//其它情况
	        	    if( ticker.Last - this.price > this.level * step ){//超出当前等级   设置滑动止损
	                    this.stopPrice = this.price * (1 - stopProfit) + (ticker.Last - this.price );
	                    //更新止损价为滑动后的止损价
	                    this.level++;//上调止损等级
	        	    }else{//其它
	        	    	this.stopPrice = this.stopPrice;//保持当前止损价不变
	        	    }
	            }
	    	}else if( stopState === STATE_SELL){//空头持仓类似
	    		if(this.orderState === ORDER_INVALID){
	        	    return this.stopPrice;
	            }
	            if(this.stopPrice === 0){
	            	this.stopPrice = this.price * ( 1 + stopProfit );
	            }
	            if( ticker.Last >= this.price ){
	                this.stopPrice = this.price * ( 1 + stopProfit );
	                this.level = 1; 
	            }else{
	        	    if( this.price - ticker.Last > this.level * step ){
	                    this.stopPrice = this.price * (1 + stopProfit) - ( this.price - ticker.Last );
	                    this.level++;
	        	    }else{
	        	    	this.stopPrice = this.stopPrice;
	        	    }
	            }
	    	}
	        return this.stopPrice;//返回止损价
	    },
	    initHoldOrder: function(){//平仓后  用于 初始化持仓信息的  函数
	        this.orderState = ORDER_INVALID;
	        this.price = 0;
	        this.amount = 0;
	        this.time = null;
	        this.stopPrice = 0;
	        this.level = 1;
	    }
	};
  • Le code a été téléchargé sur github: Cliquez iciGithubJe suis désolé.

  • Si vous n'avez pas encore rejoint le groupe officiel de QQ, veuillez vous joindre au groupe:


    Je vais vous donner un aperçu rapide des fonctions qui seront utilisées.

    fonction MACD_Cross (() {// détecte l'indicateur MACD, une fonction à l'état croisé Var records = exchange.GetRecords (();// récupère les données de la ligne K while ((!records.registrements.length < 45) { // Les données de ligne K ne peuvent pas être nulles, elles sont plus grandes que 45 colonnes et ne sont pas conformes aux normes. records = exchange.GetRecords (en anglais seulement); Je ne sais pas si j'ai bien compris. Je ne sais pas. var macd = TA.MACD ((records,12,26,9);// appelle une fonction indicateur dont le paramètre est le paramètre par défaut du MACD. var dif = macd[0]; ligne // dif var dea = macd[1]; ligne //dea colonne var = macd[2]; // colonne MACD var len = records.length; // longueur de cycle de la ligne K si (( (dif[len-1] > 0 && dea[len-1] > 0) && dif[len-1] > dea[len-1] && dif[len-2] < dea[len-2] && column[len-1] > 0.2) { // Conditions de la fourche: diff et dea sont tous deux supérieurs à 0, diff traverse le dia de bas en haut et la colonne MACD est supérieure à 0.2 retour 1; // retourner 1 pour le signal de la fourchette d'or. Je ne sais pas. si (dif [len-1] < 0 && dea [len-1] < 0) && dif [len-1] < dea [len-1] && dif [len-2] > dea [len-2] && column [len-1] < -0.2) { // Déterminez les conditions de la fourchette: retour 2;// retourner 2 représente le signal de la fourchette morte. Je ne sais pas.
    retour 0; // Golden Fork 、Dead Fork, pour les signaux 0 en attente, à l'exception du signal Je ne sais pas. fonction getTimeByNormal(time) {// fonction qui obtient le temps Convertir le temps en millisecondes en temps standard Var timeByNormal = nouvelle Date (en anglais seulement); Il est possible d'utiliser le mode de calcul de temps par défaut. var strTime = timeByNormal.toString (); Var showTimeArr = strTime.split (en anglais seulement); var showTime = showTimeArr[3]+-+showTimeArr[1]+-+showTimeArr[2]+-+showTimeArr[4]; retour showTime; Je ne sais pas.


    Ci-dessous, vous pouvez accéder à la fonction principale de la stratégie, qui utilise la même stratégie de ligne droite que la précédente, en utilisant la bibliothèque de modèles de transactions.

    fonction principale le compte init =\(.GetAccount(exchange);// Tout d'abord, nous enregistrons les informations de compte à l'origine, appelant ici la fonction d'exportation de la bibliothèque de modèles. var nowAccount = initAccount;// Déclarer une variable indiquant l'information du compte maintenant Var diffMoney = 0; // Différence de l'argent Var diffStocks = 0;// coins Différence var repair = 0; // calculer le montant utilisé pour corriger les pertes et gains Var ticker = exchange.GetTicker ((); // obtenir le marché actuellement Log (("compte initial:",initAccount); // la sortie affiche les informations du compte initial. while ((true) {// cycle de la fonction principale scan ((); // fonction de balayage, expliquée plus loin, principalement pour juger des positions ouvertes, des positions arrêtées et des opérations d'ouverture, des positions arrêtées. ticker = exchange.GetTicker();// dans le cycle de while pour obtenir le marché si ((!ticker) {// si rien n'a été obtenu pour (null) sautez la boucle suivante pour recommencer Continuez; Je ne sais pas. if ((holdOrder.orderState == ORDER_VALID) {// Déterminez si l'ordre est en cours de détention Log (("en cours de stockage:",holdOrder); // si en cours de stockage Je ne sais pas. if ((holdOrder.orderState == ORDER_INVALID) {// si elle n'est pas en stock (s'il est en stock) } Maintenant, le compte = \).GetAccount ((exchange); // Obtenez des informations sur le compte actuel diffMoney = nowAccount.Balance - initAccount.Balance; // Calcule la différence de fonds entre le compte courant et le compte initial diffStocks = nowAccount.Stocks - initAccount.Stocks; // Calcule la différence de monnaie entre le compte courant et le compte initial réparer = diffStocks * ticker.Last; // convertir la différence de monnaie * prix de transaction final, en monnaie équivalente, pour le calcul des gains et pertes LogProfit ((diffMoney + repair, RMB, maintenant dans le compte: ,nowAccount, cette fois en gain: ,profit);// sortie de l'information sur les gains et les pertes Je ne sais pas. Sleep ((Interval);// Retour d'enquête Je ne sais pas. Je ne sais pas.


    La prochaine partie de la stratégie est le dépistage des positions ouvertes, ainsi que les opérations d'ouverture des positions ouvertes.

    fonction scan (() { var sellInfo = null; // déclaration Variable pour stocker les informations de mise en place, initialement null var buyInfo = null; // déclaré ouvert, initialement nul var opFun = null;// fonction d'ouverture d'un stock, deux états, ouverture de plusieurs stocks, ouverture d'un stock vide. Var singal = 0; // le signal while ((true) {// Détection et opération var ticker = exchange.GetTicker ((); // obtenir le marché if ((!ticker) { // jugement Obtenir échoué Sauter ci-dessous et continuer à revenir en arrière Continuez; Je ne sais pas. holdOrder.SetStopPrice ((ticker,state); // définition du prix de dépôt Si vous avez un problème avec le système d'exploitation, veuillez vérifier si vous avez un problème avec le système d'exploitation de votre système d'exploitation. // Détermine si la stratégie est en cours d'exécution ou non. Si le signal MACD est en cours d'exécution ou non, il correspond à la stratégie en cours d'exécution ou non. holdOrder.initHoldOrder (();// Initialement les informations de stockage OpFun = singal === 1?Je vais acheter..Sell ;// décide des positions ouvertes ou vides selon les résultats rendus par la fonction MACD_Cross. OpAmount;// Opération d'ouverture d'un magasin le statut est défini comme étant détenu. holdOrder.price = buyInfo.price; // Retourne le prix de l'ordre par la fonction d'opération opFun. le montant de la commande est le montant de la commande holdOrder.time = getTimeByNormal (((new Date (()))) getTime (()));// définir l'heure à laquelle le stockage commence state = singal === 1? STATE_BUY : STATE_SELL; // mettre à jour la politique de l'état pour les lots multiples ou les lots vides Var compte =\(.GetAccount ((exchange); // Obtenez les informations de compte if ((singal === 1) {// produit l'orientation de l'ouverture et les informations sur le compte en cours Log (("faire plus de transactions ".., compte: "account"); Je ne sais pas. Log ((("boutique ouverte ".., compte: "account"); Je ne sais pas. Je ne sais pas. Je ne sais pas. var lastPrice = holdOrder.price;// attribuer le prix moyen de la détention à lastPrice Si vous avez un problème avec les commandes, veuillez nous contacter pour nous contacter. // Si vous avez plusieurs positions et que l'information est en portefeuille et que le prix final de la transaction est inférieur au prix du stop-loss, effectuez ce qui suit Log (("Paris de stop-loss multiples", "Prix de stop-loss initial:" "holdOrder.price * (1 - stopProfit), "--Pris de stop-loss glissant: "holdOrder.stopPrice", "Pris de transaction final:" "ticker.Last", "niveau de stop-loss:" "holdOrder.level");//Information sur les positions de stop-loss multiples Je vais essayer d'avoir une idée..Sell ((holdOrder.amount);// Le solde HoldOrder.orderState = ORDER_INVALID;// Informations de mise en équilibre Objet mis à jour Il est possible de télécharger des fichiers sur le serveur. Il est possible de télécharger des fichiers sur le serveur. Il s'agit d'une commande qui a été envoyée par le serveur. profit = holdOrder.updateCurrentProfit ((lastPrice, sellInfo.amount);// mise à jour des gains et pertes flottants state = STATE_FREE;// Mise à jour du statut Arrêtez! Je ne sais pas. Si le prix est supérieur au prix de vente, le prix de vente est supérieur au prix de vente. Si le prix est supérieur au prix de vente, le prix de vente est supérieur au prix de vente. Log (en anglais) (en anglais) (en anglais) (en anglais) (en anglais) (en anglais) Je vais vous dire.Je ne sais pas si j'ai bien compris. Le code de l'ordre est le suivant: Il est possible de télécharger des fichiers sur le serveur. Il est possible de télécharger des fichiers sur le serveur. Il s'agit d'une commande qui a été envoyée par le serveur. Le profit = holdOrder.updateCurrentProfit ((lastPrice, sellInfo.amount) est le prix de vente de l'ordre. Il est possible d'utiliser les paramètres suivants: Je ne sais pas. Je ne sais pas. if(state === STATE_BUY && MACD_Cross() === 2 ) {// lorsque l'indicateur MACD est bloqué, le point mort est égalé. Je vais essayer d'avoir une idée..Sell (en anglais seulement); Log (en anglais), prix de stop-loss initial de l'ordre: holdOrder.price * (1 - stopProfit), prix de stop-loss glissant de l'ordre: holdOrder.stopPrice, prix final de l'ordre: hold, ticker.Last, niveau de stop-loss: holdOrder.level);// test Le code de l'ordre est le suivant: Il est possible de télécharger des fichiers sur le serveur. Il est possible de télécharger des fichiers sur le serveur. Il s'agit d'une commande qui a été effectuée par le client. Le profit = holdOrder.updateCurrentProfit ((lastPrice, sellInfo.amount) est le prix de vente de l'ordre. Il est possible d'utiliser les paramètres suivants: Je ne sais pas. Je ne sais pas. if(state === STATE_SELL && MACD_Cross() === 1 ) {// lorsque le MACD est vide, l'indicateur est plafonné Pour les commandes, le nombre de commandes est le même. Log (en anglais), prix de stop-loss initial: stop, holdOrder.price * (1 + stopProfit), prix de stop-loss glissant: stop, holdOrder.stopPrice, prix de fin de transaction: stop, ticker.Last, niveau de stop-loss: stop, holdOrder.level);// test Le code de l'ordre est le suivant: Il est possible de télécharger des fichiers sur le serveur. Il est possible de télécharger des fichiers sur le serveur. Il s'agit d'une commande qui a été effectuée par le client. Le profit = holdOrder.updateCurrentProfit ((lastPrice, sellInfo.amount) est le prix de vente de l'ordre. Il est possible d'utiliser les paramètres suivants: Je ne sais pas. Je ne sais pas. Je ne sais pas. Sleep (intervalle);//intervalle de consultation, c'est laisser le programme en pause un instant. Je ne sais pas. Je ne sais pas.


Le code est fatigué, la boisson est en pause.

Je vais vous parler des principes de l'arrêt du glissement.

Dans ce code sur l'arrêt du glissement, il est indiqué qu'il y a une différence entre les deux.SetStopPriceLes fonctions sont basées sur les données transmisesstopState(arrêt) etticker(données du marché) pour mettre à jour le prix de stop-loss.stopState === STATE_BUYLe prix de l'offre est calculé sur la base de la valeur de l'offre.orderStatePour l'état nul (c'est-à-dire pas de position en vigueur), retournez le prix de stop-loss actuel. Si le prix de stop-loss est 0, initializez-le au prix moyen de l'achat multiplié par(1 - stopProfit)Dans le même temps, le prix final de la transaction est calculé en fonction de l'évolution de la situation.ticker.LastLe prix de l'acquisition et de la détentionthis.priceLa différence entre la valeur de l'écartement et la valeur de l'écartement de la valeur de l'écartement est la valeur de l'écartement de la valeur de l'écartement.this.level) est comparé au multiplicateur de la longueur d'étape. Si le niveau actuel est dépassé, le prix de stop-loss est mis à jour à la valeur après le glissement, tout en augmentant le niveau de stop-loss. Sinon, le prix de stop-loss actuel est maintenu.stopState === STATE_SELLLa logique est similaire, mais l'écart entre le prix de la transaction finale et le prix de l'acquisition est négatif, et l'écart est diminué lors de la mise à jour du prix de cessation. Enfin, le prix de cessation est retourné après la mise à jour.

Le stop-loss est une stratégie de gestion des risques.

Au cours de la tenue, le prix de stop-loss est ajusté en fonction des fluctuations du prix du marché afin de réduire les pertes ou de protéger les bénéfices. Selon la logique du code, les points clés pour réaliser un stop-loss glissant sont les suivants:updateCurrentProfitLa méthode est utilisée pour mettre à jour les gains et les pertes actuels en fonction de l'état de détention et du dernier prix (lastPrice). Si le détenu est à vendre (STATE_SELL), les gains sont multipliés par la différence entre le prix le plus récent et le prix de détention; si le détenu est à acheter (STATE_BUY), les gains et les pertes sont négatifs. La méthode SetStopPrice est utilisée pour mettre à jour les prix de stop-loss.1 - stopProfitSi le prix final est supérieur à la longueur d'avance de la position actuelle, le prix de la transaction est placé comme prix de la transaction après le glissement et le niveau de la transaction est élevé. Dans le cas contraire, le prix de la transaction reste le même. Si le niveau de la transaction est nul, la logique est similaire.

Vous pouvez tout d'abord revenir en arrière et essayer, n'oubliez pas de vous référer à ce modèle de bibliothèque de crypto-monnaie.

Les sources


Contenu lié

En savoir plus

le milieu du cielBonjour, je suis un échangeur de billets sur www.banbiren.com, auteur d'une plateforme de change, j'apprends à quantifier les transactions, mon QQ: 39866099, pouvez-vous m'inviter à rejoindre le groupe, je ne peux pas me joindre à la recherche?

NulLes progrès sont rapides.

la muieC'était dur.

L'inventeur de la quantification - un petit rêveBon ^^, vous pouvez postuler directement, MAC QQ n'a pas trouvé de place >_<, 1 groupe numéro: 309368835 Il y a maintenant plusieurs places.

L'inventeur de la quantification - un petit rêveJe ne sais pas si c'est une bonne idée.

L'inventeur de la quantification - un petit rêveNous avons étudié ensemble.