Статьи

Как построить бот криптовалютного автотрейдера с PHP?

Этот пост был первоначально опубликован на Medium и размещен здесь с разрешения автора. Почему бы не пойти туда и дать им немного ❤️?

устрашающий-робот-wallpaper.jpg

Этот учебник проведет вас через весь процесс создания бита с биткойнами на PHP — от установки до первого выполнения автоматической торговли и далее.

Cryptocurrencies

Мне не нужно было вам говорить, но пару месяцев назад вы могли купить Эфир криптовалюты за 11 долларов, он быстро вырос до 43 долларов (я купил между этими ценами) и теперь по состоянию на июнь 2017 года превысил 335 долларов. виды прибыли почти невероятны для традиционного инвестора, и все же они распространены в этой области.
Взволнован еще? Итак, вот сценарий:

Вы заработали кучу денег на криптовалютах, и у вас есть некоторые опасения по поводу перетаскивания их через ваш банк из-за возможных проблем с налогом на прирост капитала. Есть места, где есть решение, если вы хотите использовать эти деньги для других инвестиций. Эти места не заставят вас сфотографировать вашу лицензию и отправить ее, просто используйте электронную почту, и они предоставят вам депозитный кошелек BTC, демо-счета, API-интерфейсы, затем, когда вы будете готовы, вы отправите деньги, и пришло время идти , вы можете торговать всем, от казначейских облигаций до Forex, используя криптовалюты в качестве основного денежного инструмента.

Но, вы говорите, я кодер, который любит автоматизировать вещи, конечно, мы можем запустить BTC-бота, и мы можем сделать так, чтобы он просто выполнял за нас работу, это заставит нас спать миллионами, верно?

Возможно нет.

Мое решение

Я не хочу писать бота и публиковать его с единой стратегией и просто сказать «здесь, используйте это», я не думаю, что это кому-нибудь полезно, я бы лучше дал вам инструменты и показал, как писать Стратегии самостоятельно, покажите, как настроить сбор данных для стратегий и как реализовать их в торговой системе, и увидеть результаты.

Кроме того, я не хочу создавать это на новом или непонятном языке, я хочу, чтобы это было написано на PHP, с которым большинство людей знакомо и в рамках (Laravel — вот отличный премиум курс на продажу и куча бесплатных статей, если вы не знакомы с ним), который прост в использовании, но достаточно мощный, чтобы вы могли создавать то, что вам нужно. Если вы думаете, что PHP предназначен только для веб-страниц, читайте дальше, это должно вас удивить.

Мне нравится строить системы. Я работал над этим постом некоторое время, и он представляет собой большую часть непроизводных пользовательских работ. Если вы читали некоторые другие мои учебные пособия, вы знаете, что мне нравится писать учебные пособия, которые «хотелось бы, чтобы я нашел вместо того, чтобы писать», так что вы готовы к тщательному прочтению, с большим стилем копирования-вставки рецепты.

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

Шаги, которые мы собираемся предпринять:

  • Получить шаблон / рамки установлены.
  • Пройдите через основные части системы, посмотрите, что находится где.
  • Установите и настройте необходимое нам программное обеспечение.
  • Создание учетной записи в брокерских конторах, которые мы будем использовать, настройка ключей API для скриптов.
  • Запустите тесты и примеры.
  • Настройте потоки веб-сокетов для получения данных.
  • Поиск стратегий для наших автоматических агентов.
  • Углубитесь в доступные нам Индикаторы и Свечи.
  • Кодируем наш первый агент.
  • Тестирование агента.
  • Несколько заключительных слов о рисках, которые вы принимаете.

Получить шаблон / каркас установлен (Bowhead)

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

Рекомендуется использовать чрезвычайно удобную для Laravel коробку Homestead Improved Vagrant для создания хорошей изолированной среды разработки, с которой можно начать менее чем за 5 минут. Если вы не знакомы с Vagrant, вот отличное повторное введение , и если вы хотите углубиться, эта книга премиум-класса научит вас удивительным вещам.

git clone https://github.com/joeldg/bowhead.git cd bowhead composer install cp .env-example .env sudo pecl install trader echo "extension=trader.so" | sudo tee /etc/php/7.1/mods-available/trader.ini sudo phpenmod trader 

Теперь давайте объясним текущую структуру папок приложения.

приложение / консоль / Команды /

Здесь находятся все наши консольные команды.

  • BitfinexWebsocketCommand.php — поток рыночных данных из Bitfinex
  • CoinbaseWebsocketCommand.php — поток рыночных данных из GDAX
  • ExampleForexStrategyCommand.php — пример стратегии форекс
  • ExampleStrategyCommand.php — Наш пример стратегии
  • ExampleUsageCommand.php — Основные примеры использования
  • GetHistoricalCommand.php — получение исторических данных от брокера
  • OandaStreamCommand.php — Потоковые рыночные данные из Oanda

приложение / Util /

Здесь находятся все доступные классы утилит.

  • Bitfinex.php — обертка API Bitfinex
  • BrokersUtil.php — Утилиты для различных брокеров
  • Candles.php — Все 60 свечных методов TALib обернуты
  • Coinbase.php — GDAX API-оболочка
  • Console.php — Цвет консоли, таблицы и прогресс
  • Indicators.php — 21 Indicators.php TALib и скользящие средние.
  • Oanda.php — API-оболочка Oanda
  • OneBroker.php — обертка API 1Broker
  • Other.php — возможные показатели, еще не реализованные
  • testStrategy.php — вот ваша тестовая стратегия
  • Whaleclub.php — Whaleclub API-оболочка

приложение / скрипты

Дополнительные и некоторые данные тестирования, эти сценарии являются сценариями прогнозирования цен SKLearn, взятыми из исследования потребления пива, которое я считаю действительно полезным, их можно использовать для прогнозов рыночных цен.

  • close_prediction.py — скрипт SKLearn для прогнозирования цены закрытия
  • ohlc-btc.csvohlc-btc.csv данных CSV, если необходимо
  • open_prediction.py — скрипт SKLearn для прогнозирования цены открытия — скрипт python в корневом каталоге, называемый streaming.py, который является частью потоковой команды Oanda.

Если вы запустите php artisan , вы должны увидеть что-то вроде следующего, интересующая вас часть находится ниже.

Снимок экрана 2017-06-11 в 1.08.02 AM.png

Redis и MySQL

Redis действительно не нуждается в настройке из коробки, он установлен и готов, если вы используете Homestead Improved .

MySQL потребуется база данных и несколько таблиц. Измените учетные данные в файле .env (создайте его из .env.example если он не существует).

 DB_CONNECTION=mysql DB_HOST=localhost DB_PORT=3306 DB_DATABASE=homestead DB_USERNAME=homestead DB_PASSWORD=secret 

Давайте добавим дамп БД в MySQL:

 mysql -u homestead -psecret < app\Script\DBdump.sql 

Откройте базу данных в таком инструменте, как Sequel Pro, и вы получите пример данных в таблице bowhead_ohlc (open, high, low, close).

API аккаунты нам нужны для настройки автоматической торговли

Полное раскрытие. По возможности я установил для вас бонусы по этим ссылкам. На всех сайтах, указанных ниже, предлагаются бесплатные учетные записи, которые не требуют «проверки» и не требуют депозита. Ссылки являются реферальными ссылками, которые также приносят мне некоторые льготы, если вы зарегистрируетесь.

1) Whaleclub — основной сайт, на котором мы хотим торговать для этого урока. Они извлекают свои рыночные данные из веб-сокета Bitfinex и сравнивают с потоковыми данными Oanda для Forex. Этот сайт позволяет вам торговать многими инструментами и товарами с BTC с кредитным плечом до 20x, с Forex до 222x, а также предоставлять бинарные опционы на основе BTC. У них простой, понятный интерфейс и отличный API. Ключ API можно найти, нажав на свое имя в правом верхнем углу и нажав на API. (используйте ключ DEMO API для запуска)

2) Брокер вторичный сайт, на котором мы хотим торговать, он похож на других маркет-мейкеров на базе BTC и также имеет систему «отслеживания трейдера», которая довольно интересна, особенно для того, чтобы люди следили за «вами». Ключ API находится справа, прямо под значком электронной почты, там есть небольшое окно с ползунками, затем нажмите «Доступ и управление API».

3) Oanda — это место, где мы получаем наши потоковые данные Forex, вам нужен аккаунт. Доступ к API находится здесь .

4) Coinbase / GDAX — это то, что раньше называлось «Coinbase Exchange» и теперь называется GDAX. Я начал торговать там с тех пор, как они открылись. Ключ API находится в правом верхнем углу, затем нажмите API и создайте свои ключи.

5) Bitfinex — вам нужна учетная запись с ключом API, чтобы мы могли получать котировки криптовалюты. Ключи API находятся в разделе «Учетная запись», затем нажмите «API».

6) Poloniex похож на Bitfinex, но поддерживает много альт-монет. Ключи API находятся в разделе «Настройки» — «Ключи API».

7) TradingView не является обязательным, но вам понадобится учетная запись, потому что все индикаторы, которые использует лук, можно просматривать на графиках, чтобы помочь вам построить свои стратегии.

Причиной этой комбинации является то, что API Whaleclub и 1Broker ограничены по скорости, WC разрешает только 60 запросов в минуту, если мы хотим убедиться, что у нас есть потоковые данные в реальном времени для работы, нам нужно передавать из брокерской конторы BTC. То же самое с Forex.

Обязательно посмотрите на этих сайтах и ​​посмотрите, что они могут предложить. Я был рядом с множеством сайтов брокеров и маркет-мейкеров, а для BTC все они хороши с июня 2017 года. Для Форекс Oanda отлично, но для целей торговли с использованием BTC нам просто нужны потоковые данные Forex.

Получив ключи API для этих сайтов, вы захотите поместить их в свой файл .env .

ПРИМЕЧАНИЕ. Начните с использования ключей DEMO / TEST API, НЕ используйте ключи API на реальные деньги с непроверенными торговыми сценариями.

Давайте проверим, что мы настроены правильно.

У Bowhead есть тестовый скрипт для проверки того, что все настроено правильно, и что у вас есть правильные ключи API, версия PHP и расширение Trader правильно установлены.

 php artisan bowhead:example_usage 

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

Давайте получим данные в

У нас есть две вещи, которые нам нужно сделать для данных, чтобы мы могли создать автоматизированную торговую систему, которая может торговать парами как Крипто, так и Форекс. Мы будем использовать эти данные для торговли на сайтах маркет-мейкеров BTC в режиме реального времени.

  • Получайте потоковые данные Forex, поступающие в нашу базу данных от Oanda.
  • Получайте потоковые данные криптовалюты, поступающие в нашу базу данных от Bitfinex

Примечание. На сервере, на котором запущено приложение, должна быть установлена ​​экранная команда. Экран — это инструмент терминала для отсоединения окон и поддержания их в фоновом режиме. Вы можете отсоединить экран, выйти из системы, вернуться и подключить его к другому месту в другое время.

 screen python streaming.py screen php artisan bowhead:oanda_stream 

Снимок экрана 2017-06-11 в 3.46.42 PM.png

Вот как выглядит форекс-стример, если вы снова включите эхо.

Теперь, если рынки Forex открыты (восточное время США, с воскресенья 17:00 до 16:00 пятницы), вы начнете видеть данные, поступающие в таблицу bowhead_ohlc для валютных пар, которые торгуются в Whaleclub. Список находится в streaming.py и может быть изменен там. Следующие пары все потоковые в вашу базу данных в режиме реального времени сейчас. USD_JPY, EUR_USD, AUD_USD, EUR_GBP, USD_CAD, USD_CHF, USD_MXN, USD_TRY, USD_CNH, NZD_USD

Теперь у нас есть регулярные данные Форекс, давайте добавим в валютную пару BTC / USD.

 screen php artisan bowhead:websocket_bitfinex 

Рынки шифрования открыты 24/7, и вы должны начать видеть текущие данные, поступающие немедленно.

Чтобы увидеть эти запущенные процессы и подключиться к ним, используйте screen -list и screen -r

 ~$ screen -list There are screens on: 4604.ttys005.Joels-MacBook-Pro-2 (Detached) 4636.ttys005.Joels-MacBook-Pro-2 (Detached) 4652.ttys005.Joels-MacBook-Pro-2 (Detached) 3 Sockets in /var/folders/bq/79z2kd916hbd39n5bckb5_s00000gn/T/.screen. 

Цифры слева — это идентификаторы экрана, поэтому в этом случае вы можете вернуться к последнему (Bitfinex) экрану с помощью следующей команды.

 screen -r 4604 

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

Это супервизор Conf, который я использую для этого, возможно, вам придется изменить каталог для вашего пользователя. Из /etc/supervisor/conf.d/crypt.conf :

 [program:oanda] command=/usr/bin/python streaming.py user=ubuntu directory=/home/ubuntu/bowhead startretries=3 stopwaitsecs=10 autostart=true [program:o_stream] command=/usr/bin/php artisan bowhead:oanda_stream user=ubuntu directory=/home/ubuntu/bowhead startretries=3 stopwaitsecs=10 autostart=true [program:wsbitfinex] command=/usr/bin/php artisan bowhead:websocket_bitfinex directory=/home/ubuntu/bowhead startretries=3 stopwaitsecs=10 autostart=true 

Вы можете увидеть, как они выглядят в Supervisor с

 ~$ sudo supervisorctl o_stream RUNNING pid 31644, uptime 1 day, 22:15:24 oanda RUNNING pid 31645, uptime 1 day, 22:15:24 wsbitfinex RUNNING pid 31646, uptime 1 day, 22:15:24 supervisor> help default commands (type help <topic>): ===================================== add exit open reload restart start tail avail fg pid remove shutdown status update clear maintail quit reread signal stop version supervisor> 

примечание: в настоящее время Bowhead поддерживает только BTC / USD от Bitfinex, я буду добавлять ETH и LTC в будущих ревизиях. Вы можете создать ETH-версию этого, если хотите, скопировав и изменив файл BitfinexWebsockCommand.php для использования ETHUSD и переименовав класс. Вам нужно будет добавить любой новый класс $commands массив $commands в app/Console/Kernel.php

Поиск стратегий

Итак, мы настроили наш шаблон / каркас. У нас есть учетные записи, и у нас есть данные, поступающие в нашу базу данных. У нас также есть наш индикатор / сигналы и свечи работают. Давайте посмотрим, как создать очень простую стратегию.

Теперь, когда мы видим, как мы можем это использовать, нам нужны стратегии, и нам нужно знать, как найти больше стратегий. Quantopian — отличный ресурс для стратегий.

Например, два, на которые я недавно смотрел: «Акции на ходу» и «Торговля на нескольких сигналах TA-Lib», оба интересны, однако, говоря, что мы используем методы TALib в носовой части, давайте рассмотрим последний, дополнительно это будет только быть для BTC, поскольку Oanda не возвращает Volume с парами форекс.

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

  • Индекс денежного потока (МФИ)
  • Индекс товарного канала (cci)
  • Генератор импульсов Чандо (СМО)

Это простая техническая стратегия, в которой, если все три показателя совпадают, мы идем в том направлении, в котором они говорят. Вот основная часть стратегии в коде.

 $indicators = new \Bowhead\Util\Indicators(); $recentData = $util->getRecentData('BTC/USD'); $cci = $indicators->cci($instrument, $recentData); $cmo = $indicators->cmo($instrument, $recentData); $mfi = $indicators->mfi($instrument, $recentData); /** instrument is overbought, we will short */ if ($cci == -1 && $cmo == -1 && $mfi == -1) { $overbought = 1; } /** It is underbought, we will go LONG */ if ($cci == 1 && $cmo == 1 && $mfi == 1) { $underbought = 1; } 

Не беспокойтесь о том, чтобы поместить это куда-либо, эта стратегия включена в Bowhead как консольная команда

 php artisan bowhead:example_strategy 

ПРИМЕЧАНИЕ: НЕ запускайте это на своем живом аккаунте, пока вы не протестировали его, используйте ваш ключ API для запуска.

Вывод будет выглядеть так!

Снимок экрана 2017-06-11 в 1.02.00 PM.png

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

Индикаторы Bowhead и Свечи

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

Чтобы все было как можно проще, без ущерба для функциональности, все методы в обеих этих библиотеках возвращают -1, 0 или 1. Где «1» всегда будет стороной «покупка» или «бычий», а «-1» будет всегда быть продающей или «медвежьей» стороной, где это применимо. Есть пара, которые возвращают -100 и 100 в качестве возвращаемых, пожалуйста, прочитайте комментарии над каждым методом и в каждом классе для получения дополнительной информации об аномальных возвращаемых значениях, поскольку есть ссылки, чтобы объяснить, что они делают и почему мы их используем, а также то, что они представлять и как вы можете использовать их в своих сценариях.

Candles.php — метод allCandles() проверит наличие 60 определенных свечей в вашем наборе данных. Он возвращает сложный массив, который будет даже предоставлять данные точки расположения свечи и точки данных вокруг свечи. Для целей автоматического сценария current массив в возвращаемых значениях — это свечи, которые в данный момент активны.

Indicators.php — предоставляет несколько индикаторов по набору данных, это все общие технические индикаторы, такие как полосы Боллинджера, RSI и многие типы скользящих средних. К ним относятся исследования перекрытия, индикаторы импульса, индикаторы объема и индикаторы волатильности. Индикаторы цикла пока отсутствуют. Основными методами являются adx , adx , aroonosc , sar , cci , cci , mfi , stoch , rsi , macd , bollingerBands , bollingerBands с MA-методами sma , ema , wma , dema , tema , trima , kama , mama и t3 которые может комбинироваться с использованием macdext() довольно динамично.

Методы SMA обычно вызываются сами по себе, так как они не могут ответить сигналом покупки или продажи

Эти два набора индикаторов и свечей можно комбинировать различными способами, которые отмечены в комментариях вверху каждого класса. Комбинируя пересечения скользящих средних с медвежьим / бычьим свечным паттерном (который не был бы очевиден для скользящей средней), вы можете определить свои входы и выходы намного лучше.

Упаковка этих методов трейдера таким образом предоставляет вам большую гибкость, чтобы вы могли использовать их очень легко, и, как вы заметили выше, перевод стратегии очень прост, когда у вас есть только buy (1) / hold (0) / sell ( -1) сигналы.

Кодируй это

Итак, давайте сделаем еще один быстрый скрипт, который покажет, что мы делаем, на этот раз давайте создадим бота Forex, который торгует всеми парами на WC, и он будет использовать следующую техническую стратегию.

  • Индекс среднего направленного движения (ADX) — это индикатор тренда, который обычно возвращает число от 0 до 100. Под 20 лет указывает на слабую тенденцию, за 50 указывает на сильную тенденцию. Bowhead возвращает -1 для младше 20 и 1 для более 50;

  • Две простые скользящие средние, на периоде 6 и периоде 40. Период 6 SMA будет очень внимательно следить за ценой и просто сгладить любые скачки. SMA 40 — намного более сглаженное среднее значение, которое пересечет период 6 в различных точках, когда начнутся движения. ADX — это проверка того, что мы находимся в тренде, а не на боковом рынке.

  • Когда ADX регистрирует тренд (более 50), а наша SMA (40) пересекает SMA (6), мы можем купить, так как тренд сейчас движется вверх.

  • Когда ADX регистрирует тренд и наша SMA (40) пересекает SMA (6), мы можем продавать, поскольку тренд сейчас движется вниз.

Вот как это выглядит на TradingView, оранжевый внизу — ADX, зеленая линия — SMA (6), а синяя линия — SMA (40). Вы можете видеть, где вы, скорее всего, захотите совершать сделки, и вот, у нас есть некоторые пересечения линий в этих точных местах или рядом с ними.

Снимок экрана 2017-06-11 в 2.17.14 PM.png

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

 $recentData = $util->getRecentData($instrument); $adx = $indicators->adx($instrument, $recentData); $_sma6 = trader_sma($recentData['close'], 6); $sma6 = array_pop($_sma6); $prior_sma6 = array_pop($_sma6); $_sma40 = trader_sma($recentData['close'], 40); $sma40 = array_pop($_sma40); $prior_sma40 = array_pop($_sma40); /** have the lines crossed? */ $down_cross = (($prior_sma6 <= $sma40 && $sma6 > $sma40) ? 1 : 0); $up_cross = (($prior_sma40 <= $sma6 && $sma40 > $sma6) ? 1 : 0); Now you can just if ($adx == 1 && $down_cross) { $buy = 1; } if ($adx == 1 && $up_cross) { $sell = 1; } 

Тестирование это

Итак, я предоставил это как следующий файл, ADX будет выдавать ошибки (-9) по крайней мере без 21 точки данных, так что имейте это в виду.

 app/Console/Commands/ExampleForexStrategyCommand.php ~$ php artisan bowhead:example_forex_strategy 

Вот как это выглядит.

Снимок экрана 2017-06-11 в 1.02.00 PM.png

Заключительные слова и заметка о риске

Теперь вы можете находить стратегии и быстро создавать собственные скрипты для торговли криптовалютами с помощью технических индикаторов и свечных паттернов. Небо это предел.

Поскольку это в рамках Laravel, вы можете создавать веб-страницы для управления вашей автоматической торговлей, легко создавать стратегии с помощью веб-инструментов. Вы можете использовать систему очередей и заданий, чтобы иметь стратегию «работники» (я буду добавлять ее по мере ее обновления), трансляции и так далее.

Теперь поговорим о риске.

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

Я лично довольно терпим к риску, и иногда это окупается. Я использую Bowhead для торговли WC «Turbo» (то есть бинарных опционов Forex), это «предположение», если цена будет расти или падать в 1-минутных и 5-минутных контрактах. Если вы угадаете правильно, выиграйте до 75% прибыли, если вы угадаете неправильно, вы потеряете всю свою ставку. Есть несколько стратегий Форекс специально для Turbo Trading, с которыми мне повезло. Тем не менее, имейте в виду, что большинство требует, чтобы вы были на трендовом рынке. Поэтому такой индикатор, как ADX на более длительный период, не является плохим выбором.

Вот пример одной стратегии, которая работала.

Снимок экрана 2017-06-07 в 6.41.23 PM.png
Пример работающей стратегии бега

Конечная нота

Во второй части мы поговорим о том, как ваш бот общается со всеми биржами, и даже попытаются выявить расхождения в ценах, построив в реальном времени стреддл-бот GDAX, используя около пяти стратегий Forex, и даже настроив Bowhead в качестве API.

Если вы заметили какие-либо ошибки здесь или у вас возникли проблемы с кодом, пожалуйста, дайте мне знать, оставьте комментарий здесь или откройте проблему в репозитории Github, и я ее устраню.

— Имейте в виду, что этот проект находится в стадии активной разработки.