Les ressources ont été chargées... Je charge...

Introduction détaillée à la stratégie de haute fréquence des crypto-monnaies

Auteur:Le foin, Créé: 2023-03-10 10:09:13, mis à jour: 2024-11-11 22:39:27

img

Je suis désolé. J'ai écrit un article en 2020 sur les stratégies de haute fréquence, et j'ai vu que les gens qui utilisent des fréquences plus élevées sont plus susceptibles d'avoir des problèmes de santé.https://www.fmz.com/digest-topic/6228Après la publication de cet article, ma stratégie de haute fréquence a été stable pendant une longue période, mais les bénéfices ont diminué progressivement et ont même été interrompus. J'ai mis beaucoup d'efforts à le modifier ces derniers mois et je peux gagner un peu d'argent. Cet article présente plus en détail les idées de ma stratégie de haute fréquence et une partie du code simplifié, qui joue le rôle d'un pivot, et nous vous invitons à échanger des commentaires.

Conditions de négociation à haute fréquence

  • Les comptes de commissions, par exemple, le bitcoin, le maker de commissions de 5 sur 100 000 s'il y a un volume de transactions de 100 millions de U par jour, la commission est de 5000 U. Bien sûr, le preneur est basé sur le taux VIP, donc si la stratégie n'a pas besoin de payer, le niveau VIP n'a pas beaucoup d'impact sur la stratégie de haute fréquence. En général, les différents niveaux d'échange ont des taux de commissions différents et doivent maintenir un volume de transactions élevé.

  • La vitesse. La politique de haute fréquence est appelée haute fréquence parce qu'elle est rapide. L'adhésion à un serveur de colo de l'échange pour obtenir le moins de temps de latence et la connexion la plus stable est également l'une des conditions du volume interne.

  • Le marché approprié. Le trading à haute fréquence est appelé la perle du trading quantitatif. Je suis convaincu que beaucoup de traders programmatiques ont essayé, mais la plupart devraient s'arrêter parce qu'ils ne gagnent pas d'argent et ne trouvent pas de direction à suivre. La principale raison devrait être de trouver le mauvais marché.

  • Faire face à la concurrence. Le marché de n'importe quelle transaction est dynamique et change, aucune stratégie de transaction ne peut être une fois pour toutes, le trading à haute fréquence est plus évident, entrer dans ce marché est directement en concurrence avec un groupe de traders les plus intelligents et les plus diligents. Dans un marché à zéro jeu, plus vous gagnez, moins les autres gagnent.

Principe de haute fréquence

Les stratégies de haute fréquence sont divisées en plusieurs catégories:

  • La haute fréquence de couverture, l'opportunité de trouver une couverture sur ce marché ou sur un autre marché, et de tirer profit de l'avantage de la vitesse.
  • Les tendances à haute fréquence, pour tirer profit de leurs jugements sur les tendances à court terme
  • Les commerçants sont des commerçants qui font des achats et des transactions sur les deux côtés, contrôlent les stocks et gagnent de l'argent en récupérant des commissions.
  • Il y a beaucoup d'autres choses à dire.

Ma stratégie est de combiner la tendance et le marché, d'abord de déterminer la tendance, puis d'envoyer une commande, de la vendre immédiatement après la transaction, de ne pas garder de stockage, ci-dessous la combinaison de stratégies de code.

L'architecture stratégique

Le code ci-dessous est basé sur l'architecture de Bitcoin Perpetual Contract, qui souscrit principalement au flux d'ordres de profondeur du websocket pour les marchés et les informations de position. Comme les marchés et les informations de compte sont souscrits séparément, il est nécessaire de continuer à utiliser le read ((-1) pour déterminer si les informations les plus récentes sont accessibles, l'EventLoop ((1000) est utilisé ici, ce qui évite les cycles morts directs et réduit la charge du système.

var datastream = null
var tickerstream = null
var update_listenKey_time = 0

function ConncetWss(){
    if (Date.now() - update_listenKey_time < 50*60*1000) {
        return
    }
    if(datastream || tickerstream){
        datastream.close()
        tickerstream.close()
    }
    //需要APIKEY
    let req = HttpQuery(Base+'/fapi/v1/listenKey', {method: 'POST',data: ''}, null, 'X-MBX-APIKEY:' + APIKEY) 
    let listenKey = JSON.parse(req).listenKey
    datastream = Dial("wss://fstream.binance.com/ws/" + listenKey + '|reconnect=true', 60)
    //Symbols是设定的交易对
    let trade_symbols_string = Symbols.toLowerCase().split(',')
    let wss_url = "wss://fstream.binance.com/stream?streams="+trade_symbols_string.join(Quote.toLowerCase()+"@aggTrade/")+Quote.toLowerCase()+"@aggTrade/"+trade_symbols_string.join(Quote.toLowerCase()+"@depth20@100ms/")+Quote.toLowerCase()+"@depth20@100ms"
    tickerstream = Dial(wss_url+"|reconnect=true", 60)
    update_listenKey_time = Date.now()
}

function ReadWss(){
    let data = datastream.read(-1)
    let ticker = tickerstream.read(-1)
    while(data){
        data = JSON.parse(data)
        if (data.e == 'ACCOUNT_UPDATE') {
            updateWsPosition(data)
        }
        if (data.e == 'ORDER_TRADE_UPDATE'){
            updateWsOrder(data)
        }        
        data = datastream.read(-1)
    }
    while(ticker){
        ticker = JSON.parse(ticker).data
        if(ticker.e == 'aggTrade'){
            updateWsTrades(ticker)
        }
        if(ticker.e == 'depthUpdate'){
            updateWsDepth(ticker)
        }
        ticker = tickerstream.read(-1)
    }
    makerOrder()
}

function main() {
    while(true){
        ConncetWss()
        ReadWss()
        worker()
        updateStatus()
        EventLoop(1000)
    }
}

Indicateurs stratégiques

Comme je l'ai mentionné précédemment, ma stratégie de haute fréquence nécessite de déterminer la tendance avant d'exécuter les achats. Jugez les tendances à court terme principalement sur la base des données de transaction par transaction, à savoir AggTrade dans l'abonnement, comprenant la direction des transactions, le prix, le nombre, le temps de transaction, etc.

  • Le volume moyen de transactions par transaction, qui est l'agrégation des commandes dans la même direction et à des prix différents dans les 100 ms, reflète la taille de l'ordre de vente, ce qui est un poids de données élevé. On peut supposer que si le volume de transactions de la commande est supérieur à celui de la vente, le marché est dominé par les acheteurs.
  • La fréquence des commandes, ou intervalle des commandes, est également basée sur des données de transaction par tranche. La moyenne des transactions précédentes est indépendante de la notion de temps et n'est pas tout à fait précise. Si les commandes d'une direction, bien que la moyenne des transactions soit faible, sont très fréquentes, elles contribuent également à l'intensité de cette direction.
  • Le prix moyen de l'écart d'échange, ce qui est plus facile à comprendre, c'est-à-dire vendre un moins acheter un. La plupart des échanges actuels sont à un écart de tick, si l'écart d'échange est plus grand, cela représente souvent un marché.
  • Le prix moyen d'achat et de vente est calculé en comparant le prix moyen des achats et des ventes effectués individuellement avec le prix le plus récent. Par exemple, le prix d'achat le plus récent est supérieur au prix moyen de l'achat, ce qui permet de déterminer au préalable si une percée a eu lieu.

La logique stratégique

Déterminez les tendances à court terme

//bull代表短期看涨,bear短期看跌
let bull =  last_sell_price > avg_sell_price && last_buy_price > avg_buy_price &&
            avg_buy_amount / avg_buy_time > avg_sell_amount / avg_sell_time;
let bear =  last_sell_price < avg_sell_price && last_buy_price < avg_buy_price && 
            avg_buy_amount / avg_buy_time < avg_sell_amount / avg_sell_time;

Si le prix de vente le plus récent est supérieur au prix de vente moyen, le prix d'achat le plus récent est supérieur au prix d'achat moyen et la valeur de l'achat à intervalles fixes est supérieure à la valeur de l'ordre de vente, on peut juger de la hausse ou de la baisse à court terme.

Le prix

function updatePrice(depth, bid_amount, ask_amount) {

    let buy_price = 0
    let sell_price = 0
    let acc_bid_amount = 0
    let acc_ask_amount = 0

    for (let i = 0; i < Math.min(depth.asks.length, depth.bids.length); i++) {
        acc_bid_amount += parseFloat(depth.bids[i][1])
        acc_ask_amount += parseFloat(depth.asks[i][1])
        if (acc_bid_amount > bid_amount  && buy_price == 0) {
            buy_price = parseFloat(depth.bids[i][0]) + tick_size
        }
        if (acc_ask_amount > ask_amount  && sell_price == 0) {
            sell_price = parseFloat(depth.asks[i][0]) - tick_size
        }
        if (buy_price > 0 && sell_price > 0) {
            break
        }
    }
    return [buy_price, sell_price]
}

Ici encore, on utilise l'ancienne approche de l'hypothèse de la profondeur d'hypothèse jusqu'à la quantité requise, qui suppose que 10 pièces de paiement peuvent être effectuées en 1s, sans tenir compte de la nouvelle annonce, le prix de vente est fixé à 10 pièces.

Nombre de commandes

let buy_amount = Ratio * avg_sell_amount / avg_sell_time
let sell_amount = Ratio * avg_buy_amount / avg_buy_time

Le ratio représente un ratio fixe, où le volume d'achat correspond à un ratio fixe du nombre d'ordres vendus récemment. Cette stratégie s'adapte à la taille de l'ordre en fonction de l'activité actuelle des achats.

Conditions suivantes

if(bull && (sell_price-buy_price) > N * avg_diff) {
    trade('buy', buy_price, buy_amount)
}else if(position.amount < 0){
    trade('buy', buy_price, -position.amount)
}
if(bear && (sell_price-buy_price) >  N * avg_diff) {
    trade('sell', sell_price, sell_amount)
}else if(position.amount > 0){
    trade('sell', sell_price, position.amount)
}

Par exemple, avg_diff est la différence de prix de la transaction moyenne, qui ne sera payée que lorsque la différence de prix de l'ordre d'achat est supérieure à un certain nombre de fois et que le paiement sera effectué en cas de besoin. Si vous avez un ordre vide, vous pouvez également vous démarquer et éviter les factures à long terme.

Architecture en parallèle

var tasks = []
var jobs = []

function worker(){
    let new_jobs = []
    for(let i=0; i<tasks.length; i++){
        let task = tasks[i]
        jobs.push(exchange.Go.apply(this, task.param))
    }
    _.each(jobs, function(t){
        let ret = t.wait(-1)
        if(ret === undefined){
            new_jobs.push(t)//未返回的任务下次继续等待
        }
    })
    jobs = new_jobs
    tasks = []
}

/*
需要的任务参数写在param里
tasks.push({'type':'order','param': ["IO", "api", "POST","/fapi/v1/order",
        "symbol="+symbol+Quote+"&side="+side+"&type=LIMIT&timeInForce=GTX&quantity="+
        amount+"&price="+price+"&newClientOrderId=" + UUID() +"&timestamp="+Date.now()]})
*/

Les données surveillées

  • L'importance de la vitesse des stratégies de retard et de haute fréquence a été soulignée. Les stratégies doivent surveiller et enregistrer les différents délais, tels que les commandes, les retraits, les retours de positions, la profondeur, le flux d'ordres, les positions, le cycle global, etc. Les délais anormaux doivent être triés en temps opportun et trouver des moyens de réduire le temps de retard stratégique global.
  • Le pourcentage de transactions effectuées, le pourcentage de transactions effectuées dans les statistiques, le pourcentage de transactions effectuées dans les statistiques, le pourcentage de transactions effectuées dans les statistiques, le pourcentage de transactions effectuées dans les statistiques.
  • Le taux de rendement de l'endettement, le taux de rendement de l'endettement moyen statistiquement, est la référence la plus importante pour déterminer si une stratégie est efficace.
  • Le pourcentage de commissions, statistiquement le pourcentage de commissions représentant le revenu total, reflète la dépendance de la stratégie à la commission. Les stratégies qui négocient tous les différents niveaux de commissions, les stratégies qui ne sont pas rentables, peuvent être rentables si la commission est supérieure d'un niveau.
  • Le taux d'échec de la commande est le taux le plus élevé de la stratégie.
  • Le taux de transaction des commandes est souvent un facteur de demande, et si le taux est trop bas, cela indique que la stratégie de retrait est trop fréquente et doit être résolue.
  • La distance moyenne entre les ordres d'achat et de vente, qui reflète l'intervalle entre les ordres stratégiques et les ordres de vente, est la plus grande partie de la distance entre les ordres d'achat et les ordres de vente.

Autres suggestions

  • La stratégie de haute fréquence de cet article est celle du marché monétaire monétaire, limité, la plupart des cas et la plupart des monnaies ne sont pas rentables, mais il est impossible de prédire quelle devise sera rentable à l'avenir, il est donc possible de négocier plusieurs ou même toutes les monnaies, ne manquez pas l'occasion. Même avec la limitation de la fréquence des échanges, un robot peut également négocier plusieurs paires de transactions, bien sûr, pour une vitesse optimale, un sous-compte peut négocier une transaction, un serveur pour un robot, mais cela coûtera beaucoup plus cher.
  • Le montant et les conditions de la commande sont déterminés en fonction du taux de rendement. Les transactions en multi-monnaies entraînent des coûts trop élevés pour l'essai. Si la surveillance n'est pas rentable, utilisez un volume de transaction minimal et réduisez la fréquence des transactions jusqu'à ce que la stratégie dynamique de surveillance du taux de rendement soit positive, puis augmentez progressivement le volume de transaction pour augmenter le rendement.
  • Pour obtenir plus d'informations, les transactions à haute fréquence sont également caractérisées par une plus grande quantité de données traitées et une plus grande quantité d'informations utilisées. Toutes les informations de marché de la paire de transactions sur un seul échange doivent être référencées, et peuvent également être référencées en permanence aux données du stock, aux données de la paire de transactions d'autres échanges, voire à celles d'autres devises.
  • Les serveurs de Binance sont situés à Tokyo, mais les serveurs des autres bourses sont différents.
  • Le code de stratégie de cet article n'est qu'un exemple de code simple, qui supprime de nombreux détails fastidieux mais qui doivent être pris en compte, et les indicateurs utilisés sont uniquement à titre de référence, pas directement utilisés.

Relationnée

Plus de

mztcoinDemandez à Grasshopper, quelle est la logique de la vente? La transaction est suspendue immédiatement après la transaction, sans avoir de stockage de stockage.

mztcoinLe dieu de l'herbe est agressif

DANGOULe dieu de l'herbe

77924998Quel est le serveur AWS utilisé par Grasshopper?

Je suis désolée.Le plus dur.

- Je ne sais pas.La grasse herbe est un programme payant de haute fréquence.

Mon cœur est toujours là.Est-ce que cette stratégie peut être utilisée si vous pouvez la copier?

Réalisé par TradeManIl a appelé les pratiquants de la grasse herbe, espérant qu'ils pourraient enseigner plus, apprendre à entrer dans le commerce à haute fréquence.

Une vague dans le ventIl est agressif.

Je suis zéro.Le dieu de l'herbe est agressif!

Quantitatif de l'ocIl est agressif.

Le foinIl est trop difficile de voir, et cela n'a aucun sens.