Доброго времени суток!
В этом посте я постараюсь максимально просто рассказать весь процесс запуска торгового бота в сети Bitshares. Существует два варианта работы: своя нода + бот и публичная нода + бот. Лично я использую второй вариант, так как он прост и не надо поддерживать работу ноды.
Начну с варианта №2
Первое, что нам понадобится - это выделенный сервер (VPS), я брал тут, под работу только бота достаточно самых бюджетных характеристик сервера (мой стоит 2.99 евро в месяц).
Проходим регистрацию и создаём сервер с ОС Ubuntu 16.04 на борту.
Обновляем
apt-get update
apt-get upgrade
- Устанавливаем pip3, python3 предустановлен
apt-get install python3-pip
- Устанавливаем зависимости
apt-get install libffi-dev libssl-dev python3-dev
- Устанавливаем библиотеку
pip3 install bitshares
- Создадим wallet, для этого в редакторе nano открываем файл wallet.py
nano wallet.py
- Вносим туда следующие строки
from bitshares import BitShares
bitshares = BitShares()
bitshares.wallet.create("supersecret-passphrase")
bitshares.wallet.unlock("supersecret-passphrase")
bitshares.wallet.addPrivateKey("5xxxxxxxxxxxxxxxxxxxx")
Где supersecret-passphrase - это пароль который вы придумываете сами, а "5xxxxxxxxxxxxxxxxxxxx" - ваш приватный WIF KEY от аккаунта в Bitshares (Аккаунт - права доступа - действующие права - кликнуть на ключ - показать приватный wif).
- Сохраняем файл, закрываем редактор и запускаем wallet ОДИН раз, после чего этот файл стоит удалить!
python3 wallet.py
- Создадим файл бота
nano 1percent.py
- Скопируйте данный код и перенесите его в файл 1persent.py
# подключаем необходимые библиотеки для работы
from bitshares import BitShares
from bitshares.account import Account
from bitshares.asset import Asset
from bitshares.market import Market
from bitshares.amount import Amount
import time
import datetime
# функция выставления ордеров
def create_orders():
# продаем 100 юаней
# обязательно проверяем наличие этих юаней
# иначе бот вылетит по ошибке и торговля встанет
if account.balance(base) >= our_order:
print(market.sell(our_price, our_order, order_livetime, False, our_account))
# ставим задержку на выставление ордера
time.sleep(15)
# проверяем есть ли открытые ордера
open_orders = market.accountopenorders(our_account)
# проверяем, что наш ордер полностью сработал
while True:
# получаем кол-во ордеров
count = len(open_orders)
if count > 0:
print('orders count is ', count)
# получаем предыдущий ордер
last_order = open_orders[count-1]
currency = str(last_order['quote']).split(' ')[1]
if (currency == 'CNY'):
break
else:
break
# получаем баланс в шарах
balance = account.balance(quote)
# обязательно!!! отнимаем 0.02 шары на комиссию для транзакций
bts = balance.get('amount') - 0.02
# находим цену откупа
buy_price = bts / our_order2
# откупаем 101 юань
print(market.buy(buy_price, our_order2, order_livetime, False, our_account))
# конец функции выставления ордеров
# наша основная функция торговли
def trade():
# получаем кол-во ордеров
count = len(open_orders)
# выводим кол-во ордеров на аккаунте
print('orders =',count)
# получаем предыдущий ордер
prev_order = open_orders[count-1]
# выводим ID ордера
print(prev_order['id'])
# выводим цену ордера
print('цена ордера = ', prev_order['price'])
# получаем цену ордера
order_price = prev_order['price']
# находим последнюю рыночную цену
# берем именно highestBid, потому что latest иногда
# показывает криво из-за округления 0.00000001 таких вот ордеров
ticker = market.ticker()
data = ticker.get('highestBid')
latest = data.get('price')
# выводим последнюю цену покупки
print('highestBid = ', latest)
# выводим на сколько упал рынок
print('рынок упал на ', order_price/latest)
# если рынок упал на 1.5% и больше
if (order_price/latest) <= 0.985:
print('рынок упал свыше 1.5%')
# выставляем ордера
create_orders()
# конец функции торговли
# отсюда начинается сама программа
# коннектимся к любимой ноде
bitshares = BitShares("wss://api-ru.bts.blckchnd.com")
# открываем свой локальный кошелек
bitshares.wallet.unlock("secretpass")
# размер ордера в bitCNY
our_order = 100.00
our_order2 = 101.00
# наша цена продажи
our_price = 0.000001
# время жизни ордера в секундах
order_livetime = 31536000
# наш аккаунт
our_account = "nickname"
# наш символ для торговли
our_symbol = "CNY"
# наша пара
base = Asset(our_symbol)
quote = Asset("BTS")
# выбираем рынок
market = Market(base, quote, bitshares_instance=bitshares)
# получаем аккаунт для работы бота
account = Account(our_account)
print('account =', account)
# запускаем бесконечный цикл
while True:
# проверяем есть ли открытые ордера
open_orders = market.accountopenorders(our_account)
print(len(open_orders))
# если нет ордеров, то продаем по рынку юани
if len(open_orders) == 0:
# выставляем ордера
create_orders()
# если есть уже хоть 1 ордер значит шара пошла вниз :)
elif len(open_orders) > 0:
# запускаем функцию торговли
trade()
# задержка в 30 секунд
time.sleep(30)
# выводим текущую дату, чтобы видеть что бот еще жив и тп.
datenow = str(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
print(datenow)
Не забудьте изменить на свои данные строки: bitshares.wallet.unlock("supersecret-passphrase") и our_account = "accountname", а также, что на аккаунте должны быть минимум 100 BitCNY и 1 Bitshares.
- Запускаем торгового бота
screen -dmS bot python3 1percent.py
Запустили бота в screen (screen - это отдельное окно и при закрытии сессии бот продолжит свою работу 24/7)
Проверить работу бота можно командой
screen -x bot
- Выйти из screen не убивая его
Ctrl A+D
Если всё прошло правильно, то будет нечто такое
Вариант №1
- Для начала я ОЧЕНЬ рекомендую ознакомится с этими статьями:
Статья №1
Статья №2 на русском, но нет описания под ubuntu 16.04
Статья №3
Для наших целей статья №3 подойдёт очень хорошо. Так как нам не нужна полная нода, то требования к серверу не такие уж и серьёзные - естественно ubuntu 16.04, ОЗУ 8Гб, SSD 60Гб и выше.
- Создали сервер и, сразу же после обмена ключами ssh, обновляемся
apt-get update
apt-get upgrade
- Устанавливаем зависимости
apt-get install cmake make libbz2-dev libdb++-dev libdb-dev libssl-dev openssl libreadline-dev autoconf libtool git ntp libcurl4-openssl-dev g++ libcurl4-openssl-dev
- Скачиваем исходники
git clone https://github.com/bitshares/bitshares-core.git
- Переходим в директорию bitshares-core
cd bitshares-core
- Обновляем модули
git submodule update --init --recursive
- Собираем
cmake -DBOOST_ROOT="$BOOST_ROOT" -DCMAKE_BUILD_TYPE=Release .
- Запускаем окончательную сборку
make
- Теперь наступил момент запуска самой ноды
screen -dmS noda ./bitshare-core/programs/witness_node/witness_noda --data-dir data --rpc-endpoint "0.0.0.0:8090" --max-ops-per-account 1000 --partial-operations true --track-account “1.2.xxxxxxxx” --track-account “1.2.xxxxxxxx”
track-account “1.2.xxxxxxxx” - ваши личные id, посмотреть их можно в эксплорере в клиенте.
- Далее нам надо в Боте переписать строку подключения бота к сети на свою ноду
bitshares = BitShares("wss://api.bts.blckchnd.com")
Вместо wss://api.bts.blckchnd.com вписываем ws://ваш публичный ip-адрес сервера:8090
- Бот сможет работать с личной нодой только после полной синхронизации самой ноды с сетью (это ~10-12 часов)
сложнА..
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
Если по шагам пройти, то нет - максимально старался!))
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
у меня есть лицензия gunbot но нету денег для того чтобы им пользоваться) и к dex он версию пилить не будет(
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
Тогда ручками))
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit