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.
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.
Les stratégies de haute fréquence sont divisées en plusieurs catégories:
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.
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)
}
}
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.
//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.
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.
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.
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.
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() +"×tamp="+Date.now()]})
*/
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.