GDAX: алгоритмическая торговля с помощью NodeJs

С нашим доступом к фондовому рынку алгоритмическая торговля (алгоритмическая торговля, торговля по черному ящику и т. Д.) Кажется очень забавным побочным проектом, привлекательным вариантом для потенциального увеличения нашего благосостояния, а также отличным упражнением для мозга для разработчиков.

Вы, вероятно, уже знаете, что наши фондовые рынки и все, что связано с финансами, жестко регулируется, с большим количеством необходимых лицензий и сертификатов, что звучит беспорядочно, с которым новичок не хотел бы иметь дело. Так что же нам делать? Начнем с более рискованного, но более доступного для нас варианта: торговли криптовалютой.

Криптовалютные рынки еще не так жестко регулируются, и торговые платформы, такие как GDAX.com, предоставляют прекрасную возможность начать разработку и настройку наших торговых моделей.

Эта статья станет базовой отправной точкой для вас и вашего творчества, мы рассмотрим базовую настройку, на основе которой вы сможете начать создавать свою собственную платформу алгоритмической торговли.

GDAX предоставляет хорошо документированные API, а также собственный клиент NodeJS. (документацию по API можно найти здесь: https://docs.gdax.com/)

Давайте начнем.

Я предполагаю, что читатели уже имеют базовый опыт работы с JavaScript и NodeJs, и что у вас есть активная учетная запись в Coinbase и Gdax.

Создайте свой торговый пакет:

mkdir trading
cd trading
touch index.js
npm init

Добавьте библиотеку GDAX-NODE в качестве зависимости вашего проекта:

npm install gdax

Превосходно. Теперь давайте закодируем что-нибудь. Мы начнем с общедоступного API, для которого не требуется зарегистрированный аккаунт.

Давайте посмотрим, какими продуктами Gdax мы можем торговать:

const GDAX = require(‘gdax’);
const publicClient = new GDAX.PublicClient();
const callback = (error, response, data) => {
    if (error)
        return console.dir(error);
    return console.dir(data);
}
publicClient.getProducts(callback);

Вы получите примерно такой результат:

Это полезная информация, которую вы можете время от времени проверять, чтобы убедиться, что ваши размещенные заказы соответствуют верхним и нижним границам.

Еще один полезный метод, который мы можем попробовать с общедоступным клиентом, - это getCurrencies ():

publicClient.getCurrencies(callback);

Что даст такой результат:

Действительно просто! Верно? Теперь перейдем к более интересной части: работе с вашей учетной записью Gdax.

Перейдите на https://www.gdax.com/settings/api и создайте ключ API, для того, чтобы просто поиграть и протестировать, я рекомендую предоставить только разрешение READ для вашего ключа.

Теперь вернемся к нашему index.js, давайте аутентифицируемся:

const passPhrase = “yourPasssPhrase”;
const apiKey = “yourAPIkey”;
const base64secret = “somethingSomethingBase64==”;
const apiURI = ‘https://api.gdax.com';
const authenticatedClient = new GDAX.AuthenticatedClient(apiKey, base64secret, passPhrase, apiURI);

Отлично, теперь мы действительно можем начать работать со счетами и использовать свои заклинания для зарабатывания денег на кодировании.

Давайте посмотрим, что на самом деле представляют собой наши учетные записи:

authenticatedClient.getAccounts(callback);

Вы получите результат, похожий на этот:

Это важный метод, который позволяет вам проверять свои балансы на всех своих счетах и ​​получать информацию о них.

Как только вы узнаете идентификаторы всех своих учетных записей, вы можете запросить каждую учетную запись индивидуально для более точного контроля:

const ACCOUNT_ETH = ‘some-super-long-account-id’;
authenticatedClient.getAccount(ACCOUNT_ETH, callback);

Ладно, все это круто! И мы, вероятно, уже начали думать о наших торговых стратегиях, и первое, что вас интересует, это как узнать текущую цену валюты. Это сложно.

GDAX активно отговаривает от опроса этой информации (бомбардировки запросами), если вы все-таки проведете опрос, вы, скорее всего, достигнете их пределов дросселирования или даже будете заблокированы, так что не делайте этого. Так как же узнать текущую цену? Это немного сложно, но, разумеется, выполнимо.

Здесь нам нужно будет установить сокетное соединение с их серверами, прослушать всю поступающую информацию и отфильтровать ее с помощью их WebsocketClient.

Давайте возьмем один продукт, например, Etherium:

const ETH_USD = ‘ETH-USD’;
const websocket = new GDAX.WebsocketClient([ETH_USD]);
const websocketCallback = (data) => console.dir(data);
websocket.on('message', websocketCallback);

Вывод будет очень быстрым и будет выглядеть примерно так:

Теперь, как нам получить текущую цену на Эфириум из этого беспорядка? Мы видим, что поступает много заказов, некоторые только что получены, некоторые еще открыты. После изучения документации становится ясно, что нас интересуют только те заказы, которые выполнены и / или выполнены. Это означает, что транслируемая распродажа только что закрылась (фактически произошла), и мы можем использовать информацию о ценах, которая была предоставлена ​​с этим заказом.

Изменен обратный вызов для отслеживания текущих цен:

const websocketCallback = (data) => {
     if (!(data.type === ‘done’ && data.reason === ‘filled’))
         return;
     console.dir(data);
}

Бац! Теперь у вас есть все, чтобы начать строить свою торговую логику. У вас есть учетные записи. со всей необходимой информацией и остатками, и теперь вы даже можете отслеживать изменение цен на Эфириум.

Хорошо. Допустим, у вас завершена первая версия вашего алгоритма, как мы на самом деле торгуем?

const websocketCallback = (data) => {
    if (!(data.type === 'done' && data.reason === 'filled'))
        return;
    const analytics = someBrilliantAnalyticalMethod(data);
    if (analytics.buy)
        return placeBuyOrder(analytics.buyDetails)
    if (analytics.sell)
        return placeSellOrder(analytics.sellDetails)
}

Как мы размещаем заказы на покупку и продажу ell?

Очень просто, вернемся к нашему authenticatedClient:

function placeBuyOrder(buyDetails) {
    const buyParams = {
        ‘price’: buyDetails.price,
        ‘size’: buyDetails.size,
        ‘product_id’: ETH_USD,
    };
    this.buyOrderId = authenticatedClient.buy(buyParams, callback);
}
function placeSellOrder(buyDetails) {
    const sellParams = {
        ‘price’: buyDetails.price,
        ‘size’: buyDetails.size,
        ‘product_id’: ETH_USD,
    };
    this.sellOrderId = authenticatedClient.sell(sellParams,  callback);
}

Обратите внимание, что методы покупки и продажи AuthenticatedClient возвращают идентификатор размещенного заказа, который необходимо сохранить для будущих проверок выполнения.

Чтобы проверить все размещенные заказы:

authenticatedClient.getOrders(callback);

Чтобы проверить статус отдельного заказа:

authenticatedClient.getOrder(orderID, callback);

Вот и все. Начать очень просто.

Основное предостережение и источник вашего успеха скрыты внутри someBrilliantAnalyticalMethod (), упомянутого в приведенном выше коде, который позже, в зависимости от выбранной стратегии, может быть введен в реальный мир акций и облигаций. У всех будет разная и уникальная реализация, так что читайте, практикуйтесь, теряйте деньги, настраивайте, практикуйтесь и снова совершенствуйтесь.

Удачи и сильного ветра за спиной!

Обновление: некоторые фрагменты кода в этой статье устарели, за последними разработками и модификациями вы можете следить за этим проектом на Gighub: https://github.com/rinchik/gdax-pocket -ui , описанный здесь: https://blog.rinatussenov.com/algorithmic-trading-with-nodejs-gdax-pocket-ui-150e227d0d6a