[TOC] В 2020 году я написал статью о высокочастотных стратегиях, которые помогают людям, которые хотят работать на высоких частотах, получить доступ к цифровым технологиям.https://www.fmz.com/digest-topic/6228После публикации статьи, моя стратегия высокой частоты была стабильной в течение длительного времени, но медленная прибыль постепенно снижалась, и даже однажды была прекращена. В последние месяцы я снова потратил усилия на реорганизацию, и в настоящее время я могу заработать немного денег. Эта статья будет более подробно рассказывать о моих идеях высокой частоты и части упрощенного кода, который играет роль бросающего козырьки.
Например, в настоящее время maker возвращает комиссию в размере 5 из 100 000 если ежедневный объем торгов составляет 100 миллионов U, а комиссию - 5000 U. Конечно, taker также основан на VIP-коэффициенте, поэтому, если стратегия не требует оплаты, VIP-класс не имеет большого влияния на высокочастотную стратегию. В общем обмене различные классы имеют различные комиссионные ставки, которые требуют поддержания более высокой транзакции.
Скорость. Политика высокой частоты называется высокой частотой, потому что она быстрая. Присоединение к цветовому серверу обмена, получение минимальной задержки и наиболее стабильного соединения также является одним из условий внутреннего волокна.
Подходящий рынок. Высокочастотный трейдинг называют жемчужиной количественного трейдинга. Я считаю, что многие программируемые трейдеры пытались, но большинство людей должны остановиться, потому что не зарабатывают и не могут найти направления для улучшения. Основная причина должна быть в том, что они искали неправильный рынок. Начальная стадия стратегии должна найти относительно легкий рынок, чтобы зарабатывать деньги на сделках, чтобы быть выгодным, а также улучшить обратную связь, что способствует продвижению стратегии.
Столкнуться с конкуренцией. Рынок любой сделки динамично меняется, нет стратегии торговли, которая может быть использована раз и навсегда. Высокочастотные сделки более очевидны, вход на этот рынок напрямую соперничает с группой самых умных и усердных трейдеров. На рынке с нулевым игровым режимом вы зарабатываете больше, чем другие.
Высокочастотные стратегии различаются
Моя стратегия состоит в том, чтобы сочетать тренд и рынок, сначала определить тренд, а затем разместить заказ, продать заказ сразу после сделки, не держать запасные позиции.
Следующий код, основанный на архитектуре бесконечных контрактов, в основном подписывается на websocket deep-depth order flowtrades market, а также на информацию о позиции. Поскольку информация о рынке и учетной записи подписывается отдельно, необходимо постоянно использовать read ((-1) для определения доступа к последней информации, здесь используется EventLoop ((1000), что избегает прямых мертвых циклов и снижает нагрузку на систему. EventLoop ((1000) блокирует до WSS или отправляет совместные задания, когда время возвращения превышает 1000 мс.
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)
}
}
Как я уже говорил ранее, моя высокочастотная стратегия требует предварительного определения тренда, а затем выполнения покупки. Определение краткосрочных тенденций основывается на данных по каждой сделке, т.е. aggTrade в подписке, включает направление, цену, количество, время сделки и т.д.
//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;
Если последняя цена продажи больше средней цены продажи, последняя цена покупки больше средней цены покупки, а стоимость фиксированного интервала покупки больше стоимости продажи, тогда следует судить о краткосрочной положительной стороне.
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]
}
Здесь все еще используется старый подход, повторяющийся глубину до требуемой суммы, здесь предполагается, что в течение 1s можно совершить оплату в размере 10 копеек, без учета новых заказов, цена продажи установлена на место, где упадет оплата в размере 10 копеек.
let buy_amount = Ratio * avg_sell_amount / avg_sell_time
let sell_amount = Ratio * avg_buy_amount / avg_buy_time
Ratio представляет собой фиксированную пропорцию, которая представляет собой фиксированную пропорцию количества покупок к количеству недавно проданных заказов. Такая стратегия может адаптироваться к размерам заказов в зависимости от текущей активности продаж.
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)
}
При этом avg_diff представляет собой разницу в среднем расчете, которая будет оплачиваться только в том случае, если текущая цена покупки и продажи больше определенного кратного значения, и будет оплачиваться только тогда, когда вы видите, что вы хотите, если у вас есть пустые заказы, это также будет равномерно, избегая долгосрочных счетов.
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()]})
*/
mztcoinСпросите, что за логика в продаже? Поставьте заказ на продажу сразу после сделки, не имея запасов, то есть поставьте заказ в одном и том же цикле, что заказать, что за цена, что делать?
mztcoinСтремительный бог травы
ДАНГОУСтрельба с богом травы
77924998Какой сервер AWS использует Grasshopper?
Сюкити.Ожесточенный
БвксяокГрас-бог предлагает платные высокочастотные курсы
Мое сердце по-прежнемуЕсли вы хотите сделать копию, это может быть полезным.
Автор: ТрэйдменПозвонив травяному богу, я хочу больше преподавать и учиться внедрять высокочастотные сделки.
*Волна в ветровом проеме*Ожесточенный
Фмнуро"Серьезный бог травы!"
Ок количественныйОжесточенный
ТраваЭто слишком сложно, и это не имеет большого смысла.