Skip to content
Trading bot which trade by signals
PHP HTML
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
PHP
README.md

README.md

Funnybot v 1.0

Telegram RUS https://t.me/joinchat/F16v6U3VVb6oCc10di4DVQ

Требования

  • PHP
  • MySQL
  • PHP-cURL (В базовом комплекте php не поставляется, устанавливается отдельно)

Назначение программы

Торговля по сигналам на криптовалютной бирже binance в автоматическом режиме.

Логика программы

  1. Получение сигналов об открытии позиций
  2. Сравнение сигналов с данными открытых позиций в хранилище
  • Если такой позиции не открыто - далее п.3. Если позиция открыта - п.7.
  1. Получение данных о котировках
  2. Получение данных о отправленных ордерах
  • Если ордера не исполнены - отменяем ордера. Далее п.5.
  • Если ордера отсутствуют, далее п.5
  • Если ордера исполнены - записывание данных об открытии позиции в хранилище, удаление данных об отправленных ордерах из хранилища, далее п.7.
  1. Сравнение данных о балансах необходимых для открытия позиции
  • Если средств хватает - далее п.6. Иначе п.7.
  1. Отправка ордера на покупку, запись в хранилище данных об отправленных ордерах
  2. Сравнение котировок и вычисление профита по открытым позициям
  • Если профит растет, обновляем данные по открытой позиции в хранилище
  • Если профит падает, проверяем настройки выхода
  • Если условие выхода выполнено, закрываем позицию, отправляем ордер продажи, удаляем запись по открытой позиции из хранилища, записываем в хранилище данные по получению профита.
  1. Далее п.1

Состав программы

Основной код

Обработка:

  • получение данных о балансах пользователя биржи через API
  • получение данных котировках биржи через API
  • получение данных о выполненных ордерах пользователя биржи через API
  • получение данных о неисполненных ордерах пользователя биржи через API
  • получение данных о сигналах через API
  • вычисление данных об открытых позициях
  • сравнение правил биржи и настроек пользователя
  • вычисление контрольных правил для открытия/закрытия позиций
  • отправка ордеров через API

Хранение:

  • хранение настроек биржи в MySQL
  • хранение настроек пользователя в MySQL
  • хранение данных об открытых ордерах в MySQL
  • хранение данных об открытых ордерах в MySQL

Вспомогательный код

Обработка:

  • получение данных о настройках пользователя из MySQL
  • запись данных о настройках пользователя в MySQL
  • получение данных настройках биржи через API

Описание функций

  1. Хранение настроек пользователя

MySQL

Таблица settings

Поле Тип Обязательный Описание
id Целое число Да Номер комплекта настроек
api_key Строка Да API ключ для торговли
api_secret Строка Да API секретный ключ для торговли
open_url Строка Да Ссылка для получения сигналов открытия позиции
amount Число с точкой Да Размер позиции для открытия позиции. Эквивалентное в USDT
fee Число с точкой Да Размер комиссии биржи за совершение сделки
delta Число с точкой Да Размер погрешности, необходимый для вычисления соответствия ордера
pause Целое число Да Время паузы в секундах, до начала действия проверок выхода.
close_url Строка Нет Ссылка для получения сигналов закрытия позиции
close_time Целое число Нет Время в секундах, после которого позиция закрывается
close_lose Число с точкой Нет Значение падения профита от максимального, ниже которого позиция закрывается
close_exit Число с точкой Да Значение падения цены котировки в процентах, ниже которого позиция закрывается
  1. Хранение ордеров

MySQL

Таблица orders

Поле Тип Описание
id Целое число Номер по порядку
symbol Строка Обозначение котировки (BTCUSDT)
order_id Целое число Номер ордера на бирже
price Число с точкой Цена
qty Число с точкой Количество
side Строка Направление сделки (BUY или SELL)
open_time Целое число Время отправки ордера в формате timestamp
position Целое число При открытии позиции = 0. При закрытии позиции = номер позиции, которую закрывает ордер
close_res Строка Причина закрытия (URL, TIME, LOSE, EXIT)
set_id Целое число Номер настройки пользователя по которой работает торговая программа
  1. Хранение открытых позиций

MySQL

Таблица positions

Поле Тип Описание
id Целое число Номер по порядку
symbol Строка Обозначение котировки (BTCUSDT)
price Число с точкой Цена открытия позиции
qty Число с точкой Количество
open_time Целое число Время открытия позиции в формате timestamp
max_price Число с точкой Максимальная цена. Значение обновляется в таблице если текущее значение больше предыдущего.
set_id Целое число Номер настройки пользователя по которой работает торговая программа
  1. Хранение закрытых позиций

MySQL

Таблица history

Поле Тип Описание
id Целое число Номер по порядку
symbol Строка Обозначение котировки (BTCUSDT)
open_price Число с точкой Цена открытия позиции
close_price Число с точкой Цена закрытия позиции
qty Число с точкой Количество
open_time Целое число Время открытия позиции в формате timestamp
close_time Целое число Время закрытия позиции в формате timestamp
close_res Строка Причина закрытия позиции (URL, TIME, LOSE, EXIT)
set_id Целое число Номер настройки пользователя по которой торговая программа отработала позицию
  1. Хранение параметров торгуемых пар биржи

MySQL

Таблица pairs

Поле Тип Описание
id Целое число Номер по порядку
symbol Строка Обозначение торгуемой пары
base Строка Основная валюта
quote Строка Котируемая валюта
min_price Число с точкой Минимальная цена
max_price Число с точкой Максимальная цена
step_price Число с точкой Шаг цены
min_qty Число с точкой Минимальный объем
max_qty Число с точкой Максимальный объем
step_qty Число с точкой Шаг объема
  1. Получение сигналов

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 и расшифровывает их и сохраняет на время цикла в памяти.

  1. Получение балансов пользователя

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 и расшифровывает их и сохраняет на время цикла в памяти.

  1. Получение активных ордеров пользователя

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 и расшифровывает их и сохраняет на время цикла в памяти.

  1. Получение котировок

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 и расшифровывает их и сохраняет на время цикла в памяти.

  1. Отправка ордера

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 данные об отправленном ордере.

  1. Отмена ордера

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 данные об отправленном ордере.

  1. Получение параметров биржи

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, конец.
You can’t perform that action at this time.