Пишем торгового робота для биржи Exmo. Как написать бота для биржи
Пишем торгового робота для биржи Exmo
Теперь, когда мы разобрались, что такое биржа биткоинов, отложенные ордера и API, пришло время написать своего собственного бота.
Тем, кто попал сюда впервые, и не знает о чем идет речь, советую прочитать предыдущие статьи цикла – вы сможете найти перечень внизу этой статьи.
Итак, что это за бот и как он будет работать
Бот будет выполнять рутинную работу за вас – он будет мониторить состояние биржи, отслеживать текущий курс, создавать ордера на покупку по выгодному курсу, и, после их выполнения, продавать купленную валюту.
Бот будет работать на вашем компьютере, подключаться к бирже под вашей учетной записью, все, что вам потребуется – стабильный интернет, наличие некоторой суммы на балансе биржи, ну и установленный интерпретатор Python (о том, как его установить, я писал в этой статье).
Если сделка на покупку не реализуется в течении какого-то времени (у меня это три минуты) бот отменяет ордер и создает новый, с новым курсом.
Если сделка на покупку прошла, то бот создает ордер на продажу, и держит этот ордер до тех пор, пока он не будет целиком исполнен.
Бот берет среднюю цену по рынку за некоторый период (из-за ограничений exmo, за последние 100 сделок, на других биржах я действовал по другому), и создает ордера на покупку с указанной наценкой – т.е. ниже текущей цены рынка, после чего создает ордера на покупку – опять же с указанной наценкой – получается выше цены рынка. В сумму продаж/покупок закладывается комиссия биржи и, таким образом, нивелируется. Совершая сделки, бот отдает бирже требуемый ею кусок, но прибыль для владельца бота остается неизменной.
Бот отслеживает частичное исполнение ордера – он не будет создавать новых ордеров, пока предыдущий не был полностью исполнен или отменен. Если предыдущий ордер был исполнен частично, бот будет ждать завершения всех сделок по этому ордеру.
Бота можно останавливать и запускать в любой момент и с разных компьютеров – он при запуске проверит состояние ордеров, баланса и так далее – нет нужды бояться того, что при перезапуске потеряются ордера, деньги или что-то еще.
Бот неоднократно протестирован в различных режимах – и с локального компьютера, и в качестве серверного процесса, и мультирежиме – торговле одновременно несколькими валютными парами (в текущем примере мультирежима нет, но можно запускать несколько экземпляров бота с разными настройками – они будут работать параллельно).
Сколько зарабатывает:
В рамках подготовки этой статьи (и отладки алгоритма), я играл на сумму 1 доллар 49 центов – и вот какие он сделки совершал (читать снизу вверх):
Если проанализировать доход/расход, то бот принес 3.5 цента за день – при том, что я играл на полтора доллара – это 2.4% со вклада в день.
Не стоит спешить экстраполировать эту сумму на ежемесячный доход, так как на биржах есть периоды как бешеной активности, так и долгого застоя курса. Тем не менее бот алгоритм спроектирован так, что бы не терять деньги на торгах. Если даже график изменился не в лучшую сторону, и продать по выгодной цене не выходит, бот будет ждать позитивного изменения графика вечно.
Недостатки бота:
Так как бот учебный, некоторые вещи упрощены и убраны из кода – нет стоп-лоссов и тейк-профитов, курс берется по последним 100 сделкам, которые возвращает эта биржа, и есть вероятность, что бот купит на пике, и потом долго не сможет продать (тут придется либо ждать, либо продать по курсу рынка, выбор за человеком).
Так же в примере используется торговля по одной валютной паре, хотя вполне возможно изменить алгоритм для торговли несколькими парами параллельно.
Так же для упрощения вес не пишется в локальную базу данных, а делается запрос к API. С одной стороны, это хорошо для бота, так как информация всегда приходит актуальная, с другой стороны – плохо, так как эта биржа ограничивает количество API запросов до 180 в минуту. Код, который написан здесь, будет работать без проблем, но если вы запустите параллельно несколько экземпляров бота, с разными валютными парами, например, вполне можете наткнуться на это ограничение.
Алгоритм работы:
Для наглядности составлена блок-схема алгоритма работы – полностью транслировать её в текст я смысла не вижу, поясню основные принципы.
Бот играет на сумму которую вы указали – в данном случае для примера выбрана сумма 10 долларов США. На эту сумму бот старается купить биткойнов по курсу, чуть ниже текущего курса рынка. Если в течении некоторого времени (три минуты в примере) купить не получается, этот ордер на покупку отменяется, и создается новый, чуть ниже текущей цены уже на этот момент времени.
Если же ордер на покупку исполняется, то бот создает отложенный ордер на продажу этой валюты – он старается продать купленную валюту, и получить за это условные 10 долларов + желаемую наценку.
И в том и в другом случае, в отложенные ордера вносится поправка на комиссию биржи – сделка планируется таким образом, что бы, при успешном завершении, биржа смогла взять свой процент, и что бы это никаким образом не сказалось на благополучии игрока.
Все, что бот зарабатывает, не тратится – бот играет на указанную сумму, а полученный излишек просто копится на балансе.
Вот блок-схема работы:
Как начать пользоваться:
1. Регистрируйтесь на бирже (если еще этого не сделали):
2. Перейдите в Account-settings-API, нажмите “Generate and save”, и получите ключ и подпись:
3. Установите интерпретатор Python 3.4 и выше (описано в этой статье)
4. Создайте файл с названием exmo.py и скопируйте туда код, указанный ниже
5. В коде, в строках 11 и 13, укажите ключи API, полученные в шаге 2
6. В строке 24 укажите сумму, на которую будет играть бот – CAN_SPEND = 1.45 – сейчас указано 1.45 доллара.
7. На балансе не должно быть currency_1 – например, если играете на паре BTC_USD, то BTC заранее переведите в доллары или в другую валюту, а то продаст в минус.
8. Сохраните и запускайте (F5) – бот начнет работать.
Вы можете его запустить, даже если на бирже сейчас нет денег – бот вас предупредит, и просто ничего не купит. Но, конечно, для успешной работы нужно, что бы деньги были 🙂 На 11.04.2017 минимальная сумма на балансе должна составлять примерно 1.5 доллара – это примерно равно минимальной сумме сделки на бирже, 0.001 Btc.
Сам код бота:
import urllib, http.client import time import json # эти модули нужны для генерации подписи API import hmac, hashlib # ключи API, которые предоставила exmo API_KEY = 'YOUR API KEY' # обратите внимание, что добавлена 'b' перед строкой API_SECRET = b'YOUR API SECRET' # Тонкая настройка CURRENCY_1 = 'BTC' CURRENCY_2 = 'USD' CURRENCY_1_MIN_QUANTITY = 0.001 # минимальная сумма ставки - берется из https://api.exmo.com/v1/pair_settings/ ORDER_LIFE_TIME = 3 # через сколько минут отменять неисполненный ордер на покупку CURRENCY_1 STOCK_FEE = 0.002 # Комиссия, которую берет биржа (0.002 = 0.2%) AVG_PRICE_PERIOD = 15 # За какой период брать среднюю цену (мин) CAN_SPEND = 5 # Сколько тратить CURRENCY_2 каждый раз при покупке CURRENCY_1 PROFIT_MARKUP = 0.001 # Какой навар нужен с каждой сделки? (0.001 = 0.1%) DEBUG = True # True - выводить отладочную информацию, False - писать как можно меньше STOCK_TIME_OFFSET = 0 # Если расходится время биржи с текущим # базовые настройки API_URL = 'api.exmo.com' API_VERSION = 'v1' # Свой класс исключений class ScriptError(Exception): pass class ScriptQuitCondition(Exception): pass CURRENT_PAIR = CURRENCY_1 + '_' + CURRENCY_2 # все обращения к API проходят через эту функцию def call_api(api_method, http_method="POST", **kwargs): # Составляем словарь {ключ:значение} для отправки на биржу # пока что в нём {'nonce':123172368123} payload = {'nonce': int(round(time.time()*1000))} # Если в ф-цию переданы параметры в формате ключ:значение if kwargs: # добавляем каждый параметр в словарь payload # Получится {'nonce':123172368123, 'param1':'val1', 'param2':'val2'} payload.update(kwargs) # Переводим словарь payload в строку, в формат для отправки через GET/POST и т.п. payload = urllib.parse.urlencode(payload) # Из строки payload получаем "подпись", хешируем с помощью секретного ключа API # sing - получаемый ключ, который будет отправлен на биржу для проверки H = hmac.new(key=API_SECRET, digestmod=hashlib.sha512) H.update(payload.encode('utf-8')) sign = H.hexdigest() # Формируем заголовки request для отправки запроса на биржу. # Передается публичный ключ API и подпись, полученная с помощью hmac headers = {"Content-type": "application/x-www-form-urlencoded", "Key":API_KEY, "Sign":sign} # Создаем подключение к бирже, если в течении 60 сек не удалось подключиться, обрыв соединения conn = http.client.HTTPSConnection(API_URL, timeout=60) # После установления связи, запрашиваем переданный адрес # В заголовке запроса уходят headers, в теле - payload conn.request(http_method, "/"+API_VERSION + "/" + api_method, payload, headers) # Получаем ответ с биржи и читаем его в переменную response response = conn.getresponse().read() # Закрываем подключение conn.close() try: # Полученный ответ переводим в строку UTF, и пытаемся преобразовать из текста в объект Python obj = json.loads(response.decode('utf-8')) # Смотрим, есть ли в полученном объекте ключ "error" if 'error' in obj and obj['error']: # Если есть, выдать ошибку, код дальше выполняться не будет raise ScriptError(obj['error']) # Вернуть полученный объект как результат работы ф-ции return obj except ValueError: # Если не удалось перевести полученный ответ (вернулся не JSON) raise ScriptError('Ошибка анализа возвращаемых данных, получена строка', response) # Реализация алгоритма def main_flow(): try: # Получаем список активных ордеров try: opened_orders = call_api('user_open_orders')[CURRENCY_1 + '_' + CURRENCY_2] except KeyError: if DEBUG: print('Открытых ордеров нет') opened_orders = [] sell_orders = [] # Есть ли неисполненные ордера на продажу CURRENCY_1? for order in opened_orders: if order['type'] == 'sell': # Есть неисполненные ордера на продажу CURRENCY_1, выход raise ScriptQuitCondition('Выход, ждем пока не исполнятся/закроются все ордера на продажу (один ордер может быть разбит биржей на несколько и исполняться частями)') else: # Запоминаем ордера на покупку CURRENCY_1 sell_orders.append(order) # Проверяем, есть ли открытые ордера на покупку CURRENCY_1 if sell_orders: # открытые ордера есть for order in sell_orders: # Проверяем, есть ли частично исполненные if DEBUG: print('Проверяем, что происходит с отложенным ордером', order['order_id']) try: order_history = call_api('order_trades', order_id=order['order_id']) # по ордеру уже есть частичное выполнение, выход raise ScriptQuitCondition('Выход, продолжаем надеяться докупить валюту по тому курсу, по которому уже купили часть') except ScriptError as e: if 'Error 50304' in str(e): if DEBUG: print('Частично исполненных ордеров нет') time_passed = time.time() + STOCK_TIME_OFFSET*60*60 - int(order['created']) if time_passed > ORDER_LIFE_TIME * 60: # Ордер уже давно висит, никому не нужен, отменяем call_api('order_cancel', order_id=order['order_id']) raise ScriptQuitCondition('Отменяем ордер -за ' + str(ORDER_LIFE_TIME) + ' минут не удалось купить '+ str(CURRENCY_1)) else: raise ScriptQuitCondition('Выход, продолжаем надеяться купить валюту по указанному ранее курсу, со времени создания ордера прошло %s секунд' % str(time_passed)) else: raise ScriptQuitCondition(str(e)) else: # Открытых ордеров нет balances = call_api('user_info')['balances'] if float(balances[CURRENCY_1]) >= CURRENCY_1_MIN_QUANTITY: # Есть ли в наличии CURRENCY_1, которую можно продать? """ Высчитываем курс для продажи. Нам надо продать всю валюту, которую купили, на сумму, за которую купили + немного навара и минус комиссия биржи При этом важный момент, что валюты у нас меньше, чем купили - бирже ушла комиссия 0.00134345 1.5045 """ wanna_get = CAN_SPEND + CAN_SPEND * (STOCK_FEE+PROFIT_MARKUP) # сколько хотим получить за наше кол-во print('sell', balances[CURRENCY_1], wanna_get, (wanna_get/float(balances[CURRENCY_1]))) new_order = call_api( 'order_create', pair=CURRENT_PAIR, quantity = balances[CURRENCY_1], price=wanna_get/float(balances[CURRENCY_1]), type='sell' ) print(new_order) if DEBUG: print('Создан ордер на продажу', CURRENCY_1, new_order['order_id']) else: # CURRENCY_1 нет, надо докупить # Достаточно ли денег на балансе в валюте CURRENCY_2 (Баланс >= CAN_SPEND) if float(balances[CURRENCY_2]) >= CAN_SPEND: # Узнать среднюю цену за AVG_PRICE_PERIOD, по которой продают CURRENCY_1 """ Exmo не предоставляет такого метода в API, но предоставляет другие, к которым можно попробовать привязаться. У них есть метод required_total, который позволяет подсчитать курс, но, во-первых, похоже он берет текущую рыночную цену (а мне нужна в динамике), а во-вторых алгоритм расчета скрыт и может измениться в любой момент. Сейчас я вижу два пути - либо смотреть текущие открытые ордера, либо последние совершенные сделки. Оба варианта мне не слишком нравятся, но завершенные сделки покажут реальные цены по которым продавали/покупали, а открытые ордера покажут цены, по которым только собираются продать/купить - т.е. завышенные и заниженные. Так что берем информацию из завершенных сделок. """ deals = call_api('trades', pair=CURRENT_PAIR) prices = [] for deal in deals[CURRENT_PAIR]: time_passed = time.time() + STOCK_TIME_OFFSET*60*60 - int(deal['date']) if time_passed < AVG_PRICE_PERIOD*60: prices.append(float(deal['price'])) try: avg_price = sum(prices)/len(prices) """ Посчитать, сколько валюты CURRENCY_1 можно купить. На сумму CAN_SPEND за минусом STOCK_FEE, и с учетом PROFIT_MARKUP ( = ниже средней цены рынка, с учетом комиссии и желаемого профита) """ # купить больше, потому что биржа потом заберет кусок my_need_price = avg_price - avg_price * (STOCK_FEE+PROFIT_MARKUP) my_amount = CAN_SPEND/my_need_price print('buy', my_amount, my_need_price) # Допускается ли покупка такого кол-ва валюты (т.е. не нарушается минимальная сумма сделки) if my_amount >= CURRENCY_1_MIN_QUANTITY: new_order = call_api( 'order_create', pair=CURRENT_PAIR, quantity = my_amount, price=my_need_price, type='buy' ) print(new_order) if DEBUG: print('Создан ордер на покупку', new_order['order_id']) else: # мы можем купить слишком мало на нашу сумму raise ScriptQuitCondition('Выход, не хватает денег на создание ордера') except ZeroDivisionError: print('Не удается вычислить среднюю цену', prices) else: raise ScriptQuitCondition('Выход, не хватает денег') except ScriptError as e: print(e) except ScriptQuitCondition as e: if DEBUG: print(e) pass except Exception as e: print("!!!!",e) while(True): main_flow() time.sleep(1)Примечания по коду:
Строки 16 и 17 обозначают валютную пару. В данном примере это BTC_USD, но вы можете поменять на любую другую.
Строка 19 – CURRENCY_1_MIN_QUANTITY = 0.001. Это минимальная ставка, которая допускается на бирже. Для разных валют она разная, и, вообще, стоило бы получать её автоматически через API запрос. Но это усложнит код, поэтому я указал её как константу. Тем не менее, если вы планируете торговать другой валютой, вам следует поменять это значение, иначе торговля может затрудниться.
Строка 21 – ORDER_LIFE_TIME = 3. Если ордер на покупку не сыграл, то через сколько минут отменить его и создать новый, с новой ценой, более приближенной к текущим реалиям.
Строка 22 – STOCK_FEE = 0.002. Комиссия биржи за совершенную сделку. Непохоже, что бы она когда-то менялась, но, тем не менее, вы, при необходимости, сможете поменять её здесь если понадобится.
Строка 23 – AVG_PRICE_PERIOD = 90. Бот, в идеале, смотрит сделки за последние 90 минут, что бы узнать среднюю цену, в данной реализации он получает список совершенных сделок, и берет те из них, кто моложе 90 минут. Другой вопрос, что биржа не возвращает больше 100 записей, так что в данном случае число 90 сильно завышено.
Строка 24 – CAN_SPEND = 1.45. Важный параметр – сумма денег, которую вы доверяете боту для игры. В данном случае – 1 доллар 45 центов. Это удобно в том случае, когда бот играет на одну валютную пару, а вы – на другую, ну и еще гарантирует, что бот не проиграет всё, что нажито. В общем, чем больше эта сумма, тем больше денег он может заработать.
Строка 25 – PROFIT_MARKUP = 0.001. Это сумма наценки, которую вы хотите получить. В данном случае – это 0.1% от ставки. Чем больше это число, тем больше вы заработаете, но и курс будет раздуваться больше – т.е. вам придется дольше ждать исполнения сделки. Допускается дальнейшее дробление – например, число 0.00111 подходит. Если указать ноль, то бот будет работать вхолостую, обогащая биржу. Вы при этом, терять и зарабатывать не будете.
В строке 26 указано DEBUG = True. С этим параметром будет очень «разговорчивым», он будет комментировать каждое свое действие. Когда вам это надоест, советую вместо True написать False – тогда бот будет писать только по делу.
Так же не помешало бы в код добавить обработку некоторых исключительных ситуаций, перевести на ООП и так далее – но я не вижу смысла усложнять учебный код. Тот, кто заинтересуется, сможет сделать всё это и сам. Ну, или не делать, а просто пользоваться ботом как он есть 🙂
Заключение
Надеюсь, этот бот будет для вас полезен – и буду признателен обратной связи. Расскажите, каких результатов вы добились при использовании, с какими трудностями столкнулись и какие моменты показались вам непонятными.
Читайте также
- Использование SSH и SFTP с языком PHP
В современном мире, где так много сторонних компонентов и программ для создания совместного доступа, важно понимать и использовать протоколы SCP…
- Установка Zabbix на сервер
rpm -ivh http://repo.zabbix.com/zabbix/3.0/rhel/7/x86_64/zabbix-release-3.0-1.el7.noarch.rpm yum install zabbix-server-mysql zabbix-web-mysql yum install zabbix-agent Источник https://www.zabbix.com/documentation/3.0/ru/manual/installation/install_from_packages shell> mysql -uroot -p<password> mysql> create database zabbix…
evilinside.ru
Автоматизируй это! Как перестать тратить время на рутину и заставить компьютер работать
Самый ценный ресурс, который есть у каждого – это время. Оно тикает и утекает с каждой секундой, и восполнить его, увы, нельзя. Поэтому разбазаривать такой ценный ресурс – ну, опрометчиво, что ли.
Когда я сталкиваюсь с необходимостью тратить свое время на выполнение одних и тех же задач время от времени, или текущая задача требует монотонного однообразного труда, я задумываюсь о том, как переложить эту задачу на вычислительные мощности компьютера. Сейчас часть задач выполняется на моем компьютере в фоне, не мешая мне, и делая за меня полезную работу.
Конечно, программа не напишет за вас хорошую статью и не сможет полноценно общаться в комментариях – но часть задач снимет. Что более приятно – сейчас не требуется учиться много лет и штудировать сотни книг для автоматизации своих задач – достаточно освоить один язык программирования. И это не займет много времени.
Возможно, да и скорее всего, вы не станете крутым программистом, ваш код будет далек от идеала, и в Google работать вас не возьмут – но код будет РАБОТАТЬ, выполнять поставленную задачу, и приносить вам прибыль – да и вообще, вы столько денег отдали за свой компьютер, пускай отрабатывает.
Типичные примеры для автоматизации:
1. Сбор и систематизация информации.
Например, когда мне потребовалось найти сайты на движке Wordpress для SEO-задач, я написал несложный скрипт. Он собирает такие сайты, складывает в базу, и выполняет некоторые задачи с этими сайтами. Сейчас в базе более 2 млн сайтов и пополняется. Без автоматизации я бы не смог собрать такой объем.
Другой пример – отслеживание позиций своего (или чужого) сайта в поисковой системе. Скрипт работает на сервере, с регулярными интервалами собирает информацию и выдает мне отчет по требованию. Для этой задачи я бы мог пользоваться платными сервисами или бесплатными с ограничениями, но несложный скрипт экономит мне деньги и снимает все ограничения – а на сбор информации руками у меня бы уходило несколько часов в день.
2. Отслеживание чего-либо.
Например, пока был жив FaucetBox, любой владелец биткоин-крана мог добавить свой кран в каталог на сайте. Мой скрипт отслеживал список, и, если видел появившийся новый кран, проверял его периодичность и размер выплат, после чего обновлял таблицу уже на моем сайте (не на этом). Причем на моем сайте информация о кранах бралась с разных источников, и аккумулировалась в одном месте, в удобном для просмотра виде. Для домашней автоматизации подойдет сбор информации в таблицу Excel.
Отдельный скрипт так же по расписанию проверял доступность кранов – если кран переставал работать, он помечал его в таблице как неактивный, а через какое-то время вносил в черный список. Таким образом, я мог мониторить новые и существующие краны, и предоставлять другим людям актуальные списки (читай, заработок на рефералах и рекламе).
Еще пример отслеживания – бот для Vkontakte, Facebook, Twitter и т.п. К примеру, мой бот в твиттере отслеживал отписавшихся друзей, отписывался от них в отместку, следил за новостями по определенным тематикам и так далее.
Если вы торгуете на фондовой бирже, вам будет полезно отслеживать курсы акций, которыми торгуете или планируете торговать и упоминание в СМИ о компаниях, эти акции выпустившие.
3. Постинг куда-либо
Примеры:
Размещение статей и или картинок по расписанию, отложенный постинг своих материалов. Например, два скрипта – один качает красивые картинки с указанных вами ресурсов, складируя на вашем компьютере, другой на эти картинки накладывает умные мысли и постит по очереди в ваши группы в соцсетях.
Размещение ссылок на ваши сайты в Интернете (так называемое, Черное SEO) – прогон сайта по каталогам, форумам и т.п. За это ушлые челы берут деньги, но никто не мешает делать это самостоятельно (еще и брать за это деньги). Но Черное SEO это отдельная тема для разговора.
4. Торговля на бирже, ставки аукциона и т.п.
Тут все очевидно – ваш скрипт может получать информацию с биржи и создавать/отменять/исполнять отложенные ордера. Может делать заказы на Ebay или Amazon нужных вам товаров за нужную цену – для перепродажи например. Может сразу же выставлять на том же Ebay или Amazon – почему нет?
5. Выкачивание материалов
Иногда находится ресурс с чем-то очень ценным – редкой музыкой, полезными статьями, книгами, инструкциями и так далее. Это может быть сайт или группа в соцсети. Если вам требуется информацию эту собрать и сохранить себе с какой-то целью – вы можете делать это руками (пока счет не пошел на сотни и тысячи), а можете написать несложный скрипт.
6. Расчеты, моделирование и испытание
Хотя многие расчеты можно сделать в том же Excel, не всегда это удобно. Например, для тестирования стратегии торгового робота для биржи я скачивал архивы сделок за 5 лет, и с помощью скрипта проверял стратегию – как если бы бот вошел на биржу 5 лет назад и играл по этой стратегии – и смотрел, как меняется благосостояние бота от месяца к месяцу, от года к году.
7. Любая другая рутинная задача, с которой вы столкнулись
Реклама
С чего начать
Именно этот момент отпугивает многих людей – программирование считается сложным, требуется изучить устройство компьютера, битовую арифметику, протоколы передачи данных и многое-многое другое. Бррррр.
И это так, но только если вы планируете стать профессиональным программистом, делать высокопроизводительные программы на заказ – но цель то не в этом, а в том, что бы получать доход с помощью имеющихся прикладных инструментов. Вы, может быть, не станете кутюрье – но научитесь штопать носки. Вы научитесь держать иглу, сшивать несколько кусков материи, и, после небольшой практики, еще и освоите швейную машинку. Всего этого вам этого вполне хватит для работ по дому.
Какой язык программирования выбрать?
Тут буду безапелляционен – выбирайте Python (ссылка на википедию, но там много лишних слов, на мой взгляд).
Почему именно так?
1. Он универсален – работает как в Windows, так и в Linux, таким образом вы можете писать скрипты на своем компьютере а потом без переделки размещать на сервере, а так же практически любой пример, который вы найдете в интернете, будет у вас работать.
2. Его просто изучить – этот язык программирования изначально задуман простым для изучения, и, к тому же, по нему выпущено много обучающих книг и видеокурсов. Да и русскоязычных сайтов с форумами хватает.
3. Изначально при установке Python поддерживает много всего – как говорится, «батарейки в комплекте». Вам достаточно установить программу себе на компьютер, и начать программировать.
4. Если вам понадобится какой-то изысканный функционал – например, получать информацию с сайта, заполнять Excel, строить диаграммы, итог выгружать в PDF и отправлять результат по почте – вам достаточно установить дополнительные модули и просто запрограммировать действия в нужной последовательности – итоговый скрипт может занимать всего несколько строк кода!
5. Он современный и популярный, и быстро развивается – энтузиасты и сообщество создает готовые библиотеки для работы с соцсетями, для проведения научных расчетов, поддерживается создание графического интерфейса и многое другое – и всё это постоянно обновляется и улучшается.
6. Мало? Ну тогда еще упомяну, что многие крутые компании делают сайты на питоне – например, Instagram написан на этом языке программирования. Еще стоит упомянуть Dropbox, Disqus, сайт и багтрекер компании Mozilla. Этот язык активно используется в Google, Facebook, NASA и Reddit, так же служит скриптовым в программах для 3D графики – лидеров рынка Autodesk Maya, Blender и Houdin. Ну и, конечно же (дайте подмазаться к великим) – сайт bablofil.ru тоже написан на Python!
Как установить и начать использовать?
Тут всё просто – заходим на официальный сайт и скачиваем программу с самой высокой версией ( в моем случае, это версия 3.6.0, кнопка слева). В моем случае качается 32-битная версия программы, но вы можете скачать и 64-битную если планируете обработку больших объемов данных. В любом случае, какую бы вы версию не скачали, она должна работать. У меня, например, установлена и та, и другая – но это специально.
После скачивания запускаем, соглашаясь со всем
На этапе запуска рекомендую поставить обе галочки. Ну и нажать на установку
Ну а потом как обычно – далее, далее, далее, готово! На этом этапе вы установили интерпретатор Python и среду разработки – не вбивайте пока в голову, в общем, вы уже можете программировать.
Так же советую сразу установить модули, которые вам непременно пригодятся для работы в Интернете. Откройте командную строку, напишите там pip install requests и нажмите Enter
Теперь надо написать первую программу – проверить установку и себя
Запускаем программу IDLE – это как блокнот, в котором можно писать и запускать код.
У вас появится окно, в котором можно начинать писать программу. Начнем с простейшей проверки – заставим компьютер писать «hello world». Для того, что бы вывести на экран какую-то информацию используется команда print() – а внутри скобок, пишется то, что надо вывести.
Напечатайте в появившемся окне текст print("hello world") и нажмите F5 – программа предложит сохранить куда-то код, и, после того, как вы его сохраните, она запустится.
Программа отработала и вывела нам наш текст
Значит оно работает, но как-то это не круто – зачем писать hello world?
Надо написать простую, но полезную программу. Мммм. Пусть это будет расчет денег на вашем банковскому счету через двадцать лет, если каждый год число денег увеличивается на 8%.
Допустим, у вас изначально 10 000 рублей. Напишем эту простую программу.
Открываем снова IDLE, удаляем оттуда print("hello world") и пишем такой код:
# начальный капитал amount = 10000 # количество лет years_cnt = 20 # ежегодный процент year_percent = 8 for i in range(years_cnt): amount += amount*(8/100) print("Прошло лет:", (i+1), ", на счету теперь: ", amount)Должно получиться вот так:
Нажимаем F5, сохраняем (если попросит), и наслаждаемся результатом:
Неплохо так, за 20 лет сумма почти в 5 раз увеличилась. Еще бы знать какая будет инфляция :)
Попробуйте погонять этот код – изменить количество лет, процент, стартовую сумму – программировать не так страшно, как поначалу кажется.
Вам, конечно, этот код кажется непонятным и странным, и совершенно неясно, что тут происходит – но это только в начале пути. Для дальнейшего изучения языка я бы посоветовал найти и прочитать книгу Марка Лутца «Изучаем Python» -какое-нибудь из последних изданий. Книга ТОЛСТАЯ, и пугающая – но вам не нужно читать её от и до – вам нужны, по сути, первые главы – что такое переменные, циклы, функции, посмотреть примеры и прорешать задачи. И всё – вы уже можете применять свои знания себе во благо.
Можно посмотреть видеокурсы – но тут советовать не буду, те, которые я видел, были либо для профи в других языках, либо содержали много ненужной информации для новичков. Но тем не менее посмотрите на youtube – обучающих роликов действительно много, ролики в топе – хорошие, но выбирайте те, в которых объясняют понятно для вас. Если даже он пропустит какой-то момент, ничего страшного – найдете информацию в книге или в другом ролике.
Ну и я планирую в других статьях выкладывать образцы кода для заработка – в том числе и те, что указывал выше в примерах – и подробно объяснять, где что происходит.
Так что следите за новостями на сайте, изучайте новое, совершенствуйте старое, желаю вам удачи в ваших начинаниях! Ну, и как обычно, задавайте вопросы в комментариях, постараюсь ответить всем.
До новых встреч!
bablofil.ru
Как запустить бота на сервере
Небольшая статья о том, как заставить бота работать не на вашем компьютере, а где-то еще в интернете, круглосуточно, с хорошим постоянным интернет-соединением. Зачем? А что бы не приходилось комп держать постоянно включенным. Поехали.
Шаг первый. Арендуем выделенный сервер.
Я пользуюсь DigitalOcean.com, т.к. мне нравится сервис и удобство пользования. Для работы бота достаточно аренды виртуального сервера за 5$ в месяц. Если зарегистрируетесь по моей ссылке (если не работает, то попробуйте эту), то сайт предоставит вам в долг 10$, чего должно хватить на два месяца тестирования. Можно найти и другой VPS/VDS, в статье же будет рассмотрен запуск бота на VPS на базе Ubuntu.
Итак, регистрация. Тут нет ничего сложного. Переходим на сайт, и нажимаем SIGN UP:
Просят подтвердить почту - идем в свой почтовый ящик и подтверждаем
После этого сервис попросит вас указать данные карты, с которой 1го числа следующего месяца будет произведено списание средств. По-моему, необязательно что бы на ней были деньги, главное, что бы это была рабочая карта со сроком годности и т.п.
После прохождения регистрации, вы попадаете в панель управления дроплетами. Дроплеты – это как раз виртуальные выделенные сервера, вам предстоит создать свой и запустить на нём бота.
Нажмите Create и выберите Droplets
Выбираете Ubuntu (какая там будет доступна на данный момент), и сервер за 5$ в месяц.
Ниже будет выбор страны базирования сервера, прочее, что вам пока что не нужно, проматывайте вниз и нажимайте зеленую кнопку Create
Дроплет начнет разворачиваться и появится в списке дроплетов – дождитесь конца установки.
После окончания вам на почту придет информация о сервере – IP адрес, логин и пароль
Итак, дроплет создан, пора начать им пользоваться в наших целях.
Реклама
Шаг второй. Подключение к серверу и смена пароля.
Так как сервер на базе Linux, то придется немного изменить свои привычки, и освоить кое-что новое. Нам понадобятся две программы, первая – консольный клиент putty (почувствуй себя хакером ;)) Качаем тут
(если не знаете, какую качать, качайте первую).
После скачивания и установки запускайте, и давайте подключимся к вновь созданному серверу. Программа запросит реквизиты для подключения. Укажите IP адрес, который вам прислали в письме, и нажмите Enter.
Появится черное окно, и запрос, доверяете ли вы этому серверу – нажимайте «Да».
После этого в черном окне появится приглашения на ввод имени пользователя и пароля. Введите root, нажмите Enter, введите пароль из почты. Важно – пароль не отображается на экране, так что нет повода для паники. Совет – скопированный текст можно вставлять правой кнопкой мыши, так что введите сначала root, Enter, потом копируйте пароль на почте, нажимайте правой кнопкой мыши в черном окне и Enter – и вы должны попасть на свой сервер.
От вас сразу же потребуют, что бы вы сменили пароль, так что
- Укажите текущий пароль (он не отобразится) Enter.
- Придумайте и введите новый пароль (он тоже не будет отображаться), Enter, и
- Еще раз укажите новый пароль. Запомните, а лучше запишите его!
Если пароль будет слишком простым, то система ругнется и попросит придумать новый.
Реклама
Шаг третий – закинуть бота на сервер.
Тут нужна будет программа WinSCP. Скачать её можно отсюда https://winscp.net/eng/download.php.
Устанавливаем, запускаем (я указываю интерфейс коммандера, а не проводника), после запуска указываем IP адрес, пользователь – root, пароль – тот, что вы придумали на прошлом шаге. Нажимаем «Войти». Вас спросят, доверяете ли вы серверу, отвечайте «Да»
У вас будут открыты две панели – слева ваш компьютер, справа – ваш сервер. Нужно из левой панели в правую перетащить ваш файл с ботом. Найдите где там он у вас лежит, и мышкой перетащите – я уже перетащил:
В файле должны быть уже прописаны ключи и все такое. Если у вас несколько ботов, перетаскивайте всех, под разными названиями, конечно.
Реклама
Шаг четвертый – запуск бота.
Возвращаемся в окно putty, что бы проверить работу бота. Если putty уже закрылось, то переподключитесь, указав уже новый пароль. Про старый в любом случаем уже можно забыть.
Итак, вы на сервере, для начала давайте проверим, что все работает как надо.
Выполните команду
python3.5 ./exmo.py
И вы должны увидеть что-то вроде:
Нажмите Ctrl+C, что бы остановить бота. Он работает, но если вы сейчас закроете putty или выключите компьютер или отвалится интернет, то и бот перестанет работать. Поэтому бота мы будем запускать по другому.
Выполните команду
screen
Вы увидите окно с текстом, нажмите просто Enter
Визуально вам покажется, что ничего не произошло, но на самом деле вы запустили виртуальную сессию на сервере, которая будет работать независимо от того, подключены вы или нет. Что бы проверить, что вы все сделали правильно, выполните команду
echo $STY
Если вернется строка с информацией, значит вы внутри виртуальной сессии.
Так что запускайте бота тут, в этой виртуальной сессии
python3.5 ./exmo.py
и он будет работать круглосуточно.
Проверьте, закройте окно putty и подключитесь заново. Ничего не происходит, бота нет?! На самом деле, он продолжает работать в фоне. Выполните команду
screen -ls
и вы увидите запущенные виртуальные сессии
Число в начале строки – это PID процесса. Что бы подключится к выбранному экрану, выполните команду
screen -r -d 2013
2013 надо будет заменить на ваше число, разумеется. И.. вы снова попадете к боту и можете посмотреть, чем он там занимается.
Реклама
Дополнительно.
Что бы запустить несколько ботов, надо для каждого запустить свою сессию screen, и в каждой сессии запускать по боту. Т.е. упрощенно говоря, выполняете screen, Enter, python3.5 ./bot1.py, после чего закрываете putty (либо нажимаете Ctrl+A+D), и опять screen, Enter, python3.5 ./bot2.py и т.п.
Так же процитирую полезную иформацию из комментариев:
Я запустил у себя на сервере сразу 8 ботов и чтобы не путаться в файлах и не запоминать цифры при обращении к нужному боту создавал их под именами. Вызывается командой: screen -S "----------" (вместо ------ написать название валюты например BTC) получается запись: 463.BCH (12/19/2017 09:55:02 AM) (Detached) 351.ETH (12/19/2017 09:38:11 AM) (Detached) 32721.ZEC (12/19/2017 09:29:58 AM) (Detached) 31661.XMR (12/19/2017 04:00:47 AM) (Detached) 18677.XRP (12/15/2017 05:52:05 PM) (Detached) 18534.ETC (12/15/2017 05:49:01 PM) (Detached) 18470.LTC (12/15/2017 05:47:43 PM) (Detached) 18408.BTC (12/15/2017 05:45:51 PM) (Detached) И второе, когда пробовал как торгует бот насоздавал кучу сессий, потом их останавливал и создавал новые, но не работающие сессии остались и сильно мешали, потом нашел команду по их удалению: Подключиться к сессии screen -r -d 2013 (число-работающий бот) Cntr+a и ввести :quit
Если требуется внести изменения в бота, то алгоритм будет следующим: Вы подключаетесь к сессии бота, как написано выше, нажимаете Ctrl+C, что бы его остановить, с помощью winSCP закидываете новую версию файла на сервер (или правите прямо там), и заново запускаете python3.5 ./exmo.py
UPD. Для того, что бы установить ta-lib и прочее, нужно выполнить эти команды:
apt install python3-pip pip3 install numpy wget http://prdownloads.sourceforge.net/ta-lib/ta-lib-0.4.0-src.tar.gz tar -xvzf ./ta-lib-0.4.0-src.tar.gz cd ./ta-lib/ ./configure --prefix=/usr make make install pip3 install TA-libРеклама
Заключение
Геморрой, согласен) Но это если в первый раз делаешь. Зато потом это все работает как часы, не отъедает лишней памяти, не приходится ни за что переплачивать, позволяет паралелльно с ботом держать еще и свой сайт, да и кучу всего. В общем, дорогу осилит идущий, удачи вам в ваших начинаниях!
bablofil.ru