Telegram RUS https://t.me/joinchat/F16v6U3VVb6oCc10di4DVQ
- PHP
- MySQL
- PHP-cURL (В базовом комплекте php не поставляется, устанавливается отдельно)
Торговля по сигналам на криптовалютной бирже binance в автоматическом режиме.
- Получение сигналов об открытии позиций
- Сравнение сигналов с данными открытых позиций в хранилище
- Если такой позиции не открыто - далее п.3. Если позиция открыта - п.7.
- Получение данных о котировках
- Получение данных о отправленных ордерах
- Если ордера не исполнены - отменяем ордера. Далее п.5.
- Если ордера отсутствуют, далее п.5
- Если ордера исполнены - записывание данных об открытии позиции в хранилище, удаление данных об отправленных ордерах из хранилища, далее п.7.
- Сравнение данных о балансах необходимых для открытия позиции
- Если средств хватает - далее п.6. Иначе п.7.
- Отправка ордера на покупку, запись в хранилище данных об отправленных ордерах
- Сравнение котировок и вычисление профита по открытым позициям
- Если профит растет, обновляем данные по открытой позиции в хранилище
- Если профит падает, проверяем настройки выхода
- Если условие выхода выполнено, закрываем позицию, отправляем ордер продажи, удаляем запись по открытой позиции из хранилища, записываем в хранилище данные по получению профита.
- Далее п.1
- получение данных о балансах пользователя биржи через API
- получение данных котировках биржи через API
- получение данных о выполненных ордерах пользователя биржи через API
- получение данных о неисполненных ордерах пользователя биржи через API
- получение данных о сигналах через API
- вычисление данных об открытых позициях
- сравнение правил биржи и настроек пользователя
- вычисление контрольных правил для открытия/закрытия позиций
- отправка ордеров через API
- хранение настроек биржи в MySQL
- хранение настроек пользователя в MySQL
- хранение данных об открытых ордерах в MySQL
- хранение данных об открытых ордерах в MySQL
- получение данных о настройках пользователя из MySQL
- запись данных о настройках пользователя в MySQL
- получение данных настройках биржи через API
- Хранение настроек пользователя
MySQL
Поле | Тип | Обязательный | Описание |
---|---|---|---|
id | Целое число | Да | Номер комплекта настроек |
api_key | Строка | Да | API ключ для торговли |
api_secret | Строка | Да | API секретный ключ для торговли |
open_url | Строка | Да | Ссылка для получения сигналов открытия позиции |
amount | Число с точкой | Да | Размер позиции для открытия позиции. Эквивалентное в USDT |
fee | Число с точкой | Да | Размер комиссии биржи за совершение сделки |
delta | Число с точкой | Да | Размер погрешности, необходимый для вычисления соответствия ордера |
pause | Целое число | Да | Время паузы в секундах, до начала действия проверок выхода. |
close_url | Строка | Нет | Ссылка для получения сигналов закрытия позиции |
close_time | Целое число | Нет | Время в секундах, после которого позиция закрывается |
close_lose | Число с точкой | Нет | Значение падения профита от максимального, ниже которого позиция закрывается |
close_exit | Число с точкой | Да | Значение падения цены котировки в процентах, ниже которого позиция закрывается |
- Хранение ордеров
MySQL
Поле | Тип | Описание |
---|---|---|
id | Целое число | Номер по порядку |
symbol | Строка | Обозначение котировки (BTCUSDT) |
order_id | Целое число | Номер ордера на бирже |
price | Число с точкой | Цена |
qty | Число с точкой | Количество |
side | Строка | Направление сделки (BUY или SELL) |
open_time | Целое число | Время отправки ордера в формате timestamp |
position | Целое число | При открытии позиции = 0. При закрытии позиции = номер позиции, которую закрывает ордер |
close_res | Строка | Причина закрытия (URL, TIME, LOSE, EXIT) |
set_id | Целое число | Номер настройки пользователя по которой работает торговая программа |
- Хранение открытых позиций
MySQL
Поле | Тип | Описание |
---|---|---|
id | Целое число | Номер по порядку |
symbol | Строка | Обозначение котировки (BTCUSDT) |
price | Число с точкой | Цена открытия позиции |
qty | Число с точкой | Количество |
open_time | Целое число | Время открытия позиции в формате timestamp |
max_price | Число с точкой | Максимальная цена. Значение обновляется в таблице если текущее значение больше предыдущего. |
set_id | Целое число | Номер настройки пользователя по которой работает торговая программа |
- Хранение закрытых позиций
MySQL
Поле | Тип | Описание |
---|---|---|
id | Целое число | Номер по порядку |
symbol | Строка | Обозначение котировки (BTCUSDT) |
open_price | Число с точкой | Цена открытия позиции |
close_price | Число с точкой | Цена закрытия позиции |
qty | Число с точкой | Количество |
open_time | Целое число | Время открытия позиции в формате timestamp |
close_time | Целое число | Время закрытия позиции в формате timestamp |
close_res | Строка | Причина закрытия позиции (URL, TIME, LOSE, EXIT) |
set_id | Целое число | Номер настройки пользователя по которой торговая программа отработала позицию |
- Хранение параметров торгуемых пар биржи
MySQL
Поле | Тип | Описание |
---|---|---|
id | Целое число | Номер по порядку |
symbol | Строка | Обозначение торгуемой пары |
base | Строка | Основная валюта |
quote | Строка | Котируемая валюта |
min_price | Число с точкой | Минимальная цена |
max_price | Число с точкой | Максимальная цена |
step_price | Число с точкой | Шаг цены |
min_qty | Число с точкой | Минимальный объем |
max_qty | Число с точкой | Максимальный объем |
step_qty | Число с точкой | Шаг объема |
- Получение сигналов
6.1 Получение сигналов через API биржи и вывод в API торговой программы
PHP screener_api.php
Получение сигналов происходит при обращении к странице и передаче параметров поиска. В результате страница выдает ответ в формате JSON.
Запрос*
GET http://funnymay.com/api/screener_api.php
Параметр | Тип | Обязательный | Описание |
---|---|---|---|
bs | Строка | Нет | Базовая валюта |
qt | Строка | Нет | Котируемая валюта |
vr | Строка | Нет | Относительный объем |
ch | Строка | Нет | Изменение в % |
qp | Строка | Нет | Эквивалент в USDT |
p10 | Строка | Нет | Положение цены относительно SMA10 |
p20 | Строка | Нет | Положение цены относительно SMA20 |
p50 | Строка | Нет | Положение цены относительно SMA50 |
p100 | Строка | Нет | Положение цены относительно SMA100 |
p200 | Строка | Нет | Положение цены относительно SMA200 |
hl50d | Строка | Нет | Положение цены относительно Hi-Lo 50 дней |
hl52w | Строка | Нет | Положение цены относительно Hi-Lo 52 недель |
m | Строка | Нет | Соотношение майера |
d | Строка | Нет | Дни подряд |
Описание параметров и значений можно узнать на странице https://github.com/savinkirillnick/FUNNYMAY
Ответ
{
"status":0
}
или
{
"status":1,
"data": [
{
"symbol":"EOSETH",
"price":0.32914,
"change":5.745,
"eq_usdt":45.0123
},
{ ... }
]
}
Примечание: Настройку строки запроса можно осуществить на сайте http://funnymay.com/screener.php API-ссылка генерируется внизу страницы.
Сигналы можно получать по любой другой ссылке, главное чтобы формат ответа соответствовал требуемому.
6.2 Получение данных от API торговой программы и расшифровка
PHP main.php
Функция основного кода передает запрос к странице screener_api.php, получает данные в формате JSON
и расшифровывает их и сохраняет на время цикла в памяти.
- Получение балансов пользователя
7.1 Получение балансов пользователя через API биржи и вывод в API торговой программы
PHP binance_api.php
Получение балансов происходит при обращении к странице и передаче необходимых параметров. В результате страница выдает ответ в формате JSON
.
Запрос
GET /api/binance_api.php
Параметр | Тип | Обязательный | Описание |
---|---|---|---|
mode | Строка | Да | getBalances |
api_key | Строка | Да | API ключ для торговли |
api_secret | Строка | Да | API секретный ключ для торговли |
Ответ
{
"status":0
}
или
{
"status":1,
"data": {
"BTC":0.01,
"LTC":1.2345,
"ETH":0.0,
...
}
}
7.2 Получение данных от API торговой программы и расшифровка
PHP main.php
Функция основного кода передает запрос к странице binance_api.php, получает данные в формате JSON
и расшифровывает их и сохраняет на время цикла в памяти.
- Получение активных ордеров пользователя
8.1 Получение активных ордеров пользователя через API биржи и вывод в API торговой программы
PHP binance_api.php
Получение активных ордеров происходит при обращении к странице и передаче необходимых параметров. В результате страница выдает ответ в формате JSON
.
Запрос
GET /api/binance_api.php
Параметр | Тип | Обязательный | Описание |
---|---|---|---|
mode | Строка | Да | getOrders |
api_key | Строка | Да | API ключ для торговли |
api_secret | Строка | Да | API секретный ключ для торговли |
Ответ
{
"status":0
}
или
{
"status":1,
"data": [
{
"id":12345,
"symbol":"BTCUSDT",
"side":"BUY",
"qty":0.01,
"price": 7700.0,
"filled":0.0,
"open_time": 1546008440
},
{ ... }
]
}
8.2 Получение данных от API торговой программы и расшифровка
PHP main.php
Функция основного кода передает запрос к странице binance_api.php, получает данные в формате JSON
и расшифровывает их и сохраняет на время цикла в памяти.
- Получение котировок
9.1 Получение котировок через API биржи и вывод в API торговой программы
PHP binance_api.php
Запрос
GET /api/binance_api.php
Параметр | Тип | Обязательный | Описание |
---|---|---|---|
mode | Строка | Да | getPrices |
Ответ
{
"status":0
}
или
{
"status":1,
"data": {
"BTCUSDT": 7509.95,
"ETHUSDT": 130.54,
"LTCUSDT": 75.0,
...
}
}
9.2 Получение данных от API торговой программы и расшифровка
PHP main.php
Функция основного кода передает запрос к странице binance_api.php, получает данные в формате JSON
и расшифровывает их и сохраняет на время цикла в памяти.
- Отправка ордера
10.1 Работа API торговой программы
*PHP binance_api.php
Запрос
GET /api/binance_api.php
Параметр | Тип | Обязательный | Описание |
---|---|---|---|
mode | Строка | Да | sendOrder |
api_key | Строка | Да | API ключ для торговли |
api_secret | Строка | Да | API секретный ключ для торговли |
symbol | Строка | Да | Обозначение торговой пары |
price | Число с точкой | Да | Цена покупки или продажи |
qty | Число с точкой | Да | Объем покупки или продажи |
side | Строка | Да | Направление сделки (BUY, SELL) |
Ответ
{
"status":0
}
или
{
"status":1,
"order_id":1
}
10.2 Работа основного кода программы
PHP main.php
После отправки ордера и получении ответа status = 1
записываем в хранилище orders данные об отправленном ордере.
- Отмена ордера
11.1 Работа API торговой программы
PHP binance_api.php
Запрос
GET /api/binance_api.php
Параметр | Тип | Обязательный | Описание |
---|---|---|---|
mode | Строка | Да | cancelOrder |
api_key | Строка | Да | API ключ для торговли |
api_secret | Строка | Да | API секретный ключ для торговли |
order_id | Строка | Да | Номер ордера на бирже |
Ответ
{
"status":0
}
или
{
"status":1
}
11.2 Работа основного кода программы
PHP main.php
После получении ответа status = 1
удаляем из хранилища orders данные об отправленном ордере.
- Получение параметров биржи
12.1 Получение параметров биржи через API биржи и вывод в API торговой программы
PHP binance_api.php
Запрос
GET /api/binance_api.php
Параметр | Тип | Обязательный | Описание |
---|---|---|---|
mode | Строка | Да | getRules |
Ответ
{
"status":0
}
или
{
"status":1,
"data": [
{
"symbol": "ETHBTC",
"base": "ETH",
"quote": "BTC",
"min_price": 0.00000100,
"max_price": 100000.00000000,
"step_price": 0.00000100,
"min_qty": 0.00100000,
"max_qty": 100000.00000000,
"step_qty": 0.00100000
},
{ ... }
]
}
12.2 Получение данных от API торговой программы, расшифровка и хранение
PHP main.php
Функция основного кода передает запрос к странице binance_api.php, получает данные в формате JSON
, расшифровывает их и сохраняет в хранилище rules.
13 Обработка сигналов
PHP main.php
Функция основного кода.
- Расшифровка данных signals_api
- Получение из хранилища positions записей совпадающих по полю symbol
- Если запись существует, то проверяем стоит ли она на паузе.
- Если пауза еще действует, то докупка позиции запрещается. Конец.
- Если время паузы истекло, то позиция докупается. Отправляется ордер на покупку. Конец.
- Если запись не существует, то проверяем, отправлен ли у нас ордер на покупку. Получение из хранилища orders записей совпадающих по полю symbol
- Если ордер отправлен, проверяем соответствует ли он критериям сигналов
- Если цена ордера вышла за рамки delta в %, то отменяем данные ордер и отправляем новый, по данным из сигналов; удаляем из хранилища orders старую запись об неисполненном ордере и создаем новую запись.
- Если цена ордера не вышла за рамки delta в %, конец.
- Если ордер отсутствует в хранилище, отправляем новый ордер на покупку.
14 Обработка параметров покупки и продажи
PHP main.php
Функция основного кода
- Расшифровка данных метода get_balances
- Проверка достаточности средств для совершения сделки
- Проверка размера цены посылаемого ордера критериям min_price, max_price и step_price биржи
- Проверка размера объема посылаемого ордера критериям min_qty, max_qty и step_qty биржи
15 Обработка отправленных ордеров
PHP main.php
Функция основного кода
- Расшифровка данных об ордерах на бирже из get_orders
- Получение данных по отправленным ордерам в хранилище orders
- Проверка открывает или закрывает ордер позицию.
- Если открывает, проверяем исполнился ордер на бирже или нет
- Если ордер исполнился на бирже, удаляем ордер из хранилища orders и создаем запись об открытии позиции в positions
- Если ордер не исполнился, конец.
- Если ордер закрывает позицию, проверяем исполнился он или нет
- Если ордер исполнился на бирже, удаляем ордер из хранилища orders, удаляем запись в хранилище positions и создаем запись об завершенной позиции в history
- Если ордер не исполнился, конец.
16 Обработка открытых позиций
PHP main.php
Функция основного кода
- Расшифровка данных о котировках из get_prices
- Получение данных по открытым позициям в хранилище positions.
- Проверка стоит ли позиция на паузе
- Если стоит на паузе, пропускаем проверки закрытия по условиям и проверяем критерий падения цены ниже close_exit.
- Если время паузы истекло, проверяем условия выхода
- Если предусмотрено закрытие позиции по ссылке, то получаем сигналы на закрытие по ссылке
- Если сигнал на закрытие совпадает с открытой позицией, то позиция закрывается, иначе пропускаем закрытие по ссылке
- Если предусмотрено закрытие по времени, проверяем сколько времени прошло
- Если прошло времени больше, чем требовалось для выдерживания позиции, то позиция закрывается, иначе пропускаем закрытие по времени
- Если предусмотрено закрытие по падению профита, то вычисляем отношение текущего профита к максимальному профиту за все время
- Если профит упал ниже предусмотренного критерия, то позиция закрывается, иначе пропускаем закрытие по падению профита
- Проверяем упала ли цена ниже критической цены close_exit в %.
- Если цена упала ниже close_exit, отправляем ордер на закрытие позиции.
- Если цена выше close_exit, конец.