Теперь, когда мы разобрались, что такое биржа биткоинов, отложенные ордера и 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, urllib.request, http.client
import time
import json
import sys
# эти модули нужны для генерации подписи API
import hmac, hashlib
# ключи API, которые предоставила exmo
API_KEY = ''
# обратите внимание, что добавлена 'b' перед строкой
API_SECRET = b''
# Тонкая настройка
CURRENCY_1 = 'BTC'
CURRENCY_2 = 'USD'
CURRENT_PAIR = CURRENCY_1 + '_' + CURRENCY_2
ORDER_LIFE_TIME = 3 # через сколько минут отменять неисполненный ордер на покупку CURRENCY_1
STOCK_FEE = 0.002 # Комиссия, которую берет биржа (0.002 = 0.2%)
AVG_PRICE_PERIOD = 15 # За какой период брать среднюю цену (мин)
CAN_SPEND = 10 # Сколько тратить CURRENCY_2 каждый раз при покупке CURRENCY_1
PROFIT_MARKUP = 0.001 # Какой навар нужен с каждой сделки? (0.001 = 0.1%)
DEBUG = True # True - выводить отладочную информацию, False - писать как можно меньше
STOCK_TIME_OFFSET = 0 # Если расходится время биржи с текущим
# Запросить с биржи лимиты и использовать данные в работе
PAIR_LIMITS = {}
with urllib.request.urlopen("https://api.exmo.com/v1.1/pair_settings") as url:
pairs_settings = json.loads(url.read().decode())
if CURRENT_PAIR in pairs_settings:
PAIR_LIMITS = pairs_settings[CURRENT_PAIR]
else:
print("Не удалось найти настройки пары", CURRENT_PAIR, "в ответе от биржи", pairs_settings)
sys.exit(1)
CURRENCY_1_MIN_QUANTITY = float(PAIR_LIMITS["min_quantity"]) # минимальная сумма ставки - берется из https://api.exmo.com/v1/pair_settings/
PRICE_PRECISION = int(PAIR_LIMITS["price_precision"])
# базовые настройки
API_URL = 'api.exmo.com'
API_VERSION = 'v1'
# Свой класс исключений
class ScriptError(Exception):
pass
class ScriptQuitCondition(Exception):
pass
# все обращения к 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= "{price:0.{prec}f}".format(prec=PRICE_PRECISION, 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="{price:0.{prec}f}".format(prec=PRICE_PRECISION, price=my_need_price),
type='buy'
)
print(new_order)
if DEBUG:
print('Создан ордер на покупку', new_order['order_id'])
else: # мы можем купить слишком мало на нашу сумму
raise ScriptQuitCondition('Выход, сумма для торгов (CAN_SPEND) меньше минимально разрешенной биржей')
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)
try:
balances = call_api('user_info')['balances']
alt_balance = float(balances[CURRENCY_1])
poss_profit = (CAN_SPEND*(1+STOCK_FEE) + CAN_SPEND * PROFIT_MARKUP) / (1 - STOCK_FEE)
if float(balances[CURRENCY_1]) > 0:
decision = input("""
У вас на балансе есть {amount:0.8f} {curr1}
Вы действительно хотите, что бы бот продал все это по курсу {rate:0.8f}, выручив {wanna_get:0.8f} {curr2}?
Введите Д/Y или Н/N
""".format(
amount=alt_balance,
curr1=CURRENCY_1,
curr2=CURRENCY_2,
wanna_get=poss_profit,
rate=poss_profit/alt_balance
))
if decision in ('N','n','Н','н'):
print("Тогда избавьтесь от {curr} (как вариант создайте ордер с ними по другой паре) и перезапустите бота".format(curr=CURRENCY_1))
sys.exit(0)
except Exception as e:
print(str(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 – тогда бот будет писать только по делу.
Так же не помешало бы в код добавить обработку некоторых исключительных ситуаций, перевести на ООП и так далее – но я не вижу смысла усложнять учебный код. Тот, кто заинтересуется, сможет сделать всё это и сам. Ну, или не делать, а просто пользоваться ботом как он есть :)
Заключение
Надеюсь, этот бот будет для вас полезен – и буду признателен обратной связи. Расскажите, каких результатов вы добились при использовании, с какими трудностями столкнулись и какие моменты показались вам непонятными.
Желаю вам стабильных, хороших заработков!
API_URL = 'api.exmo.com'
, но я пробовал заходить на биржу по адресу exmo.com и он заблокирован по России Ростелекомом. Можно зайти по адресу exmo.me Так мне все равно нужно прописать api.exmo.com' или все же нужно прописывать api.exmo.me?
Смотрите, какая ситуация:
Технически, разницы нет - и тот и другой адрес являются зеркалами, и можно обращаться как к одному, так и к другому без изменения кода.
НО
Для зоны .com владельцы биржи оформили и держат валидным сертификат https, а для зоны .me сертификат является невалидным- это можно увидеть, если зайти на https://api.exmo.me/v1/ticker/ из браузера.
Надеюсь, это скоро будет исправлено, но пока что, что бы заставить скрипт работать в зоне .me, вам нужно не только изменить
api.exmo.com на
api.exmo.me,
но еще и изменить
conn = http.client.HTTPSConnection(API_URL) на
conn = http.client.HTTPConnection(API_URL)
(убрать букву S)
После этого всё заработает. Но надо иметь в виду, что бот будет забирать информацию по не защищенному каналу, и ваш трафик можно будет перехватить и модифицировать. Так что, когда на зоне .me заработает валидный сертификат или когда Ростелеком разлочит зону .com надо будет вернуть всё обратно.
P.S. как ни странно, у меня exmo.com тоже был заблокирован Ростелекомом, но примерно с месяц назад стал снова доступен.
CURRENCY_1 = 'BTC'
CURRENCY_2 = 'USD'
на
CURRENCY_1 = 'BTC'
CURRENCY_2 = 'RUB'
например, или
CURRENCY_1 = 'DOGE'
CURRENCY_2 = 'BTC'
Так же можно сделать несколько версий скрипта - по одному на каждую пару, и запускать их параллельно.
Запускаете командую строку (cmd) в ней пишете python + путь к одному скрипту + Enter. Запускаете вторую командную строку, в ней python + путь к другому скрипту + Enter и т.п., будет одновременно играть по разным парам
Очень не хочется потерять $$
API_KEY = 'YOUR API KEY'
# обратите внимание, что добавлена 'b' перед строкой
API_SECRET = b'YOUR API SECRET'
Скорее всего, пропущена буква b перед строкой с API_SECRET , проверьте
Бот рассчитан на увеличение кол-ва валюты 2 - т.е. долларов в дефолтной настройке.
Он задуман так, что на вторую валюту (доллары) покупает первую валюту (биткоины) ,потом эти биткоины все продает, что бы увеличить доллары. Вторая валюта растет , а первая то обнуляется, то вырастает.
В данном случае вышло, что бот увидел, что у вас есть биткоины, подумал, что вы их купили и что их все нужно продать за 1.45$ + 0.1%(как написано в дефолтной настройке), ну и выставил лот. А эксмо продала по максимально выгодной цене для вас, по рыночной - т.е. вы за 25 долларов выручили не 1.45$, а сумму, близкую к 25$.
В общем, если вы больше ничего не делали и запустите бота еще раз, то все будет работать нормально. Первая валюта в паре изначально будет пустой, и будет покупаться на вторую валюту пары.
Ну точнее, в настройках стоит 1.45$, и он будет пытаться создать ордера именно на эту сумму, сколько бы долларов у вас не было - а это мало на сегодня из-за курса биткоина, я обновил статью, поставил 5 долларов, что бы преодолевать минимальный рубеж ставки, вам тоже стоит поменять это значение.
Для этого надо создать несколько копий файла, в каждом в настройках поменять валюту.
Потом запускаете командую строку (cmd) в ней пишете python + путь к одному скрипту + Enter. Запускаете вторую командную строку, в ней python + путь к другому скрипту + Enter и т.п., будет одновременно играть по разным парам.
Первый ордер всегда совершает в "-".
Пара ETH_BTC.
На балансе был только BTC.
После запуска сразу покупает ETH по завышеной: "по рынку" + 0,2%
Строку
conn = http.client.HTTPSConnection(API_URL)
Замените на
conn = http.client.HTTPSConnection(API_URL, timeout=60)
60 - это кол-во секунд для ожидания, можете поэксперементировать с этим значением, может вам нужно ставить больше
Нужно дописать чтобы происходил рестарт после ошибки с задержкой выполнения секунд в 30.
Попробуйте CAN_SPEND поставить 10 (рублей) или чуть больше, что бы приблизиться к минимальному разрешенному объему по этой паре.
Запускаю скрипт и он стоит на месте.
В дебаге много красного на подобие
f0\fs28\fsmilli14400 \cf2 \cb3 # \uc0\u1082 \u1083 \u1102 \u1095 \u1080 API, \u1082 \u1086 \u1090 \u1086 \u1088 \u1099 \u1077 \u1087 \u1088 \u1077 \u1076 \u1086 \u1089 \u1090 \u1072 \u1074 \u1080 \u1083 \u1072 exmo\cb1 \uc0\u8232
Подскажите, что не так?
Лучше конечно сразу в проект питона копировать.
Вроде все работает!
Стало интересно попробовать бота на poloniex.
Вопрос: изменения кода касаются только ссылки на ключи API или есть другие тонкие "нюансы"?
Тут два момента - первый это изменение ключей (причем часть запросов на полоникс уходит через POST на один URL, а часть через GET на другой, но всё это легко решаемо).
Второй момент - это формат возвращения данных - JSON, возвращаемый биржами, различается, местами кардинально, так что по коду придется вписывать изменения.
conn = http.client.HTTPSConnection(API_URL)
Замените на
conn = http.client.HTTPSConnection(API_URL, timeout=60) -- заработало... теперь пишет Открытых ордеров нет, Выход, не хватает денег.. причем деньги вроде есть....
Сам я этого пока не делал
Мож подправите, если время будет, я просто в этом ничего не понимаю ☹
Если поставите
STOCK_TIME_OFFSET =-3
то выровняете эту разницу.
Но это в общем-то нужно тем, у кого странные или пустые результаты возвращаются
У меня что-то все операции идут с повышением курса ибо он сразу покупает валюту обратно, тем самым используя текущий курс. В итоге через пяток операций ордер на продажу выставился выше, чем пиковое значение курса.
После того, как он купил валюту, он сразу же выставляет ордер на продажу, что бы избавиться от валюты и получить указанную наценку. Для продажи он рассчитывает кол-во купленной валюты и курс покупки, что бы потом продать за вычетом комиссии биржи и получить свою прибыль.
Так что да, он может купить на пике и ждать (это указано в разделе недостатки:)). Если в итоге ему удастся продать, то следующий лот на покупку он выставит по средней цене, что может быть как выше, так и ниже текущей.
Возможно ли вставить код, чтобы робот выполнял вот такой алгоритм?
Бот купил криптовалюту и ждет пока она поднимется на 1%. Если поднялась, тогда для страховки от разворота программа ставит отложенный ордер на продажу при проседании на 0.5%. Если монета все же начала падать, тогда он ее продает и мы выходим в ноль. А если крипта пошла вверх то поднимаем ордер на продажу еще на 0.5% на продажу. Это тоже самое что и Stop-Limit на полонексе, только в автоматическом режиме.
Общую мысль понял, только бот не должен заранее создавать ордер на продажу (т.к. это будет выгодная цена для для остальных участников, и не выгодная для вас, и ордер будет сразу исполняться биржей), а при достижении курсом роста в 1% должен мониторить ситуацию, и, в зависимости от дальнейшего направления тренда уже ждать, реагировать и создавать ордер на продажу по событию с той или иной наценкой. Впрочем, вы, наверное, это и имели в виду.
Думаю, это будет несложно добавить - надо ордер выставлять с наценкой в 1.5%, добавить ордеру признак ватерлинии в 1%, запоминать, переходила ли цена её или нет, если да, но потом пошла вниз то отменять и создавать дешевле, если да и цена пошла выше то ждать исполнения, но я сейчас не готов сказать, когда смогу за это взяться. Кроме того, это может с какой-то стороны и ухудшить торговлю, т.к. за то время, пока курс поднимется на 1% (а это иногда очень долго), можно провести несколько раундов торговли с меньшей наценкой на колебаниях, да и вообще курс может не вырасти. Тут надо подумать.
В любом случае, я специально выложил исходный код, что бы любой мог доработать его в соответствии со своими пожеланиями - сам или с помощью программистов, так что добавить возможно всё, что угодно)
Да вы правильно поняли.
Процент написал приблизительный, главное в этом деле не стать инвестором при падающей цене. Лучше меньше прибыль, но зато с $.
Плохо, что я не программист :( Буду заходить по чаше на эту страницу, может кто-то еще что-то сделает.
Спасибо за открытый код и тему.
К сожалению, ни пример, который вложен на exmo ни ваш, не может выполнить метод request - либо ошибка приема сертификата (SSL: CERTIFICATE_VERIFY_FAILED) , либо (если поменять API_URL на api.exmo.me ) пишет, что api.exmo.me это не api.exmo.com, и он прав ))
Подскажите, куда копать, как отключить проверку сертификата в методе request? Может быть, версия питона не подходит, либо его нужно с каким-то надстройками? У меня вер. 3.6
Если exmo.com меняется на exmo.me, то нужно еще и протокол соединения изменить с https на http:
conn = http.client.HTTPSConnection(API_URL) на
conn = http.client.HTTPConnection(API_URL)
т.к. на exmo.me висит (почему-то) тот же сертификат SSL, что и на exmo.com, что, в результате делает его невалидным для домена, и приходится ходить вообще, увы, без сертификата. Более подробно расписано в комментариях выше.
Если вкратце, то соединение между вами и сервером неожиданно становится нерабочим.
Причина может быть разной, иногда у эксмо такое бывают какие-то неполадки, может быть антивирус обрывает вам коннект, может быть нестабильный интернет, может быть запущено слишком много скриптов одновременно и сервер биржи "рвет" лишние коннекты, может быть на вашем роутере каким-то образом ограничивается трафик, еще можно попробовать exmo.com заменить на exmo.me и https на http, теоретически это разные сервера в одной подсети, один может работать лучше другого..
крипту
!!!! [Errno 104] Connection reset by peer
!!!! [Errno 104] Connection reset by peer
!!!! [Errno 104] Connection reset by peer
!!!! [Errno 104] Connection reset by peer
Предлагаю для начала поменять exmo.com на exmo.me, и протокол соединения изменить с https на http:
conn = http.client.HTTPSConnection(API_URL) на
conn = http.client.HTTPConnection(API_URL)
Первый совет - как и всем - попробуйте поменять exmo.com на exmo.me, и протокол соединения с https на http:
conn = http.client.HTTPSConnection(API_URL) на
conn = http.client.HTTPConnection(API_URL)
Подробности выше в комментариях.
Если проблема останется - проверьте, не отваливается ли Wi-Fi в это время, или, может-быть, какие-то сетевые проблемы на стороне сетевой карты, роутера и дальше.. Сам код работает с тем, что предоставляет операционная система, а она сообщает ему, что не удается найти домен, причин может быть много..
И не совсем понял про лишние нолики
Бот работает так, что если на балансе были эфиры, он их пытается продать..
Если на балансе были эфиры, то он их выставил с целью продать за 5$, а т.к. их было мало, то вот такой курс.
Остановите бота, продайте все эфиры до нуля по нужному курсу, запустите и должно работать..
( = ниже средней цены рынка, с учетом комиссии и желаемого профита)
"""
# купить больше, потому что биржа потом заберет кусок
my_need_price = avg_price + avg_price * (STOCK_FEE+PROFIT_MARKUP)
Разве при вычислении my_need_price должен стоять '+'? Так получается что он покупает выше средней, а не ниже.
Бот берет текущее время с компьютера, и сравнивает со временем создания ордера по времени биржи. И это кстати, также касается периода, за который он берет среднюю цену.
Вам нужно посмотреть, насколько расходится время, и внести коррективу в STOCK_TIME_OFFSET. Например, если расходится на час в каком-то направлении, то
STOCK_TIME_OFFSET = 1 # у вас на час раньше
или
STOCK_TIME_OFFSET = -1
Если поставите
STOCK_TIME_OFFSET =-3
то выровняете эту разницу.
Но это в общем-то нужно тем, у кого странные или пустые результаты возвращаются (делал по вашему ответу в предыдущих комментариях). У меня время Калининградское и я поставил STOCK_TIME_OFFSET =-2. Или надо было ставить +2?
Что нужно сделать, что бы отображалось время операции? Не так:
buy 0.0854926829194002 58.484537264011735
А вот так, примерно:
12:32:07 buy 0.0854926829194002 58.484537264011735
Возможно ли это вообще?
У мен задрал цену и не может продать теперь.
Буду модифицировать код под более менее умную покупку.
У мен задрал цену и не может продать теперь.
Буду модифицировать код под более менее умную покупку.
При текущем:
PROFIT_MARKUP = 0,001
STOCK_FEE = 0,002
Мы будем в минусе.
По моему нужно написать вот так:
wanna_get = CAN_SPEND + CAN_SPEND * (STOCK_FEE*2+PROFIT_MARKUP) # сколько хотим получить за наше кол-во
Комиссию-то мы дважды платим, при покупке и при продаже. Можно конечно еще более точнее написать, у нас же после покупки еще меньше стало, комиссию же заплатили.
wanna_get = CAN_SPEND + CAN_SPEND * (STOCK_FEE*2+PROFIT_MARKUP) # сколько хотим получить за наше кол-во
это тройная компенсация комиссии - 1 при покупке и 2 при продаже.
С майнинга приходит на биржу валюта ETH и бот ее быстро сливает на рубли, причем по не выгодному курсу.
Как сделать так, что бы бот продавал валюту только в определенном количестве - то, что разрешено по курсу в рублях CAN_SPEND
CURRENCY_1 = b'ключ ввел полностью'
CURRENCY_2 = b'ключ ввел полностью'
а надо
# Тонкая настройка
CURRENCY_1 = 'BTC'
CURRENCY_2 = 'USD'
у вас бот не понимает на какой паре торговать
Ну, например, замените строку
my_need_price = avg_price - avg_price * (STOCK_FEE+PROFIT_MARKUP)
на
my_need_price = float(offers[CURRENT_PAIR]['bid_top'])+0.00000001
Строка 21 - ORDER_LIFE_TIME = 3. Если ордер на покупку не сыграл, то через сколько минут отменить его и создать новый, с новой ценой, более приближенной к текущим реалиям
Можно добавить еще время и на продажу? Спасибо!
Вам нужно установить другую версию, 3.+
Вопрос такой, по какой формуле формируется цена входа в торги?
т.е.
CAN_SPEND = 5
хорошо, а
CAN_SPEND = 5,
очень, очень плохо
Может кто подскажет, как добавить еще одну валютную пару?
предполагаю, что нужно в питоне нужно создать еще один файл?
time.sleep(2)
Развернуто:
Тут вот в чем причина. У вас висит к примеру ордер на покупку монеты. Биржа разбила счет на две части. Вы купили только часть монет, которые собирались. Бот запускается раз в секунду, видит что ордеров нет (биржа не успела выставить вторую часть ордера), думает что купил все и выставляет ордер по такой цене, чтобы часть монеты которую Вы успели купить продать за такую сумму, за которую должен был продать все.
Тестирую на паре LTC/BTC. Бот не может выставить ордер на покупку. В логах нечто такое "buy 0.0 0.xxxxxxxxxxxxxxxxxxxxxxxxxxxx" где x - цифра. Судя по всему он генерирует цену с большим количеством знаков после запятой, чем может обработать биржа.
CAN_SPEND = 0.006
PROFIT_MARKUP = 0.05
Я к сожалению не удержался и выставил ордер на покупку вручную. Сейчас висит ордер на продажу, точный лог выдать не могу.
Может посдкажете что нужно изменить в коде? Или выдать точную строчку лога?
Все сразу заработало, но выводит "Открытых ордеров нет" и курс.
На exmo лежит 15$. Если вручную меняю usd->btc, после запуска бота он сливает btc->usd и опять "Открытых ордеров нет".
Менял can_spend от 0.1 до 5, profit от 0.0009 до 0.00111.
минуты ,менял +3 на ,-3, обратно на 0, с пробелами и без и все равно не пересчитывает,скажите что можно сделать?
Можно попробовать решение Евгения В. - выше в комментариях, возможно ваш случай. Или установить версию питона другой разрядности (32, 64)
Ну или файл с ботом назвали http
Подскажите что сделать необходим.. Хочу заставить бота трудиться.
несколько раз ставил цену в 2 раза выше рынка . а последний раз на 30 % .торговая пара ETH _ EUR
ORDER_LIFE_TIME = 5 #
STOCK_FEE = 0.002 #
AVG_PRICE_PERIOD =
CAN_SPEND = 250 #
PROFIT_MARKUP = 0.002 #
Такое может происходить, если параллельно торгуете на эфиры по другой паре, или отменяете частично исполненный ордер..
python -V
Что там пишется?
увеличил желаемый на 0,05 профит , трудятся)
но конечно поведение бота продать , когда курс в верх летит- не человеческая логика)
как бы их научить различать восходящий и на понижение тренды
в любом случае боты выгодны для биржи.... те в профите.
Насчет построения трендов и и работы с индикаторами тут есть отдельная статья (ссылка над комментариями), может быть и правда пора их к боту прикрутить..
Смотря, что имеется в виду.. Если некий коробочный закрытый продукт, под продажу и прочее, то лучше обратиться к какой-нибудь команде, что специализируется под маки.
Если для себя, то могу на том же питоне или яве, но не хочу)
Мне представляется более правильным вынос бота на выделенный сервер и работу с ним через веб-интерфейс - тогда можно управлять из любой системы, включая смартфоны и прочее, бот не зависит от того, включен ли у вас комп и т.п. Свои последние решения я именно так и делаю.
Бот выставляет бай на указанную сумму (5 долларов, например), после того, как бай выполнится, он выставляет купленное в селл, что бы получить 5.01 доллара. После того, как селл сработает, он снова выставляет бай на 5 долларов, цент идет в копилку. В общем, единовременно в торгах задействовано ровно столько, сколько указано в конфиге.
Ошибка 10469: Цена по ордеру больше максимально допустимой по этой валютной паре (10 BTC)
Вопрос вот какого характера. Бот при работе с мелкими суммами (10$) работает довольно таки исправно, подключил на три пары, в целях эксперимента, но когда сумма доходит уже до 50$ бот не закупает на 50$ (практически всегда) закупает на меньшую сумму меньшее количество криптовалюты, а потом то что закупил пытается продать и в итоге стоимость валюты при таком раскладе увеличивается в 1,5-2 раза, и конечно же бот долгое время не может продать, помогите разрешить этот момент. Я читал все комментарии, знаю здесь такие вопросы задавали, но как решить этот вопрос? И второе, сложно будет немного изменить код, и научить бота после выставления ордера на продажу использовать другую сумму для создания другого ордера на покупку, то есть что бы бот работал с несколькими ордерами, то есть будет легче купить и продать по 10$ несколькими ордерами, чем к примеру работать одним ордером в 100$. Заранее благодарен. с Уважением Сергей К.
P.S. это не все вопросы :-) другие (по проще) напишу по позже...
В любом случае всё сводится к изменению кода) Я постепенно веду статьи к боту версии 2, но со временем какая-то беда.. Думаю, оба вопроса, так же как и другие вопросы в комментариях, вполне можно заложить в новый алгоритм, так что пишите еще :)
По поводу аккаунта - когда вы восстановите данные со своей страницы и авторизуетесь тут, должно обновиться - если что, решим отдельно.
Надо ключи в кавычках указывать, все как в примере
Открытых ордеров нет
buy 0.0007277781978274247 6870.225042363293
Открытых ордеров нет
buy 0.0007277781978274247 6870.225042363293
Открытых ордеров нет
buy 0.0007277781978274247 6870.225042363293
Открытых ордеров нет
buy 0.0007277781978274247 6870.225042363293
Открытых ордеров нет
buy 0.00072773728009725 6870.611327389787
Открытых ордеров нет
buy 0.0007276537274545655 6871.400243479407
Открытых ордеров нет
buy 0.0007275260251239471 6872.606377411942
Открытых ордеров нет
buy 0.0007274259917260993 6873.551477223913
Открытых ордеров нет
buy 0.0007274259917260993 6873.551477223913
Скорее всего, сумма, выделенная для торгов в переводе на биткойны слишком мала - когда я писал статью, биткойн стоил в 10 раз меньше, и 5 долларов еще что-то да значили)
Нет-нет, это еще не V2. Насчет второго подумаю
Ctrl+C тоже пойдет
Торги могли быть по любой другой паре, в итоге на баланс упало (или осталось после торгов) немного LTC, которое бот и пытается продать.
ETH/LTC
LTC/BTC
LTC/USD
LTC/EUR
LTC/RUB
Еще на exmo добавили кешбек, может вам там что-то компенсировали?
Я проследил, Андрей, подглядел за Ботом, чего он делает, так вот он отменяет :-( частично исполненный ордер, сегодня начал так делать, то есть частично исполняется buy 0.01 LTC и он отменяет ордер, а потом продать не может.
А так LTC взяться не откуда пары у меня все разные...
Кстати Андрей, что касается валюты, я задаю Боту работу в 10RUB (USD, EUR) и эту сумму увеличиваю, 25, 50, 100, 200. Вот сейчас Бот берет для сделки 25 USD, 25 EUR, и 200 RUB, вот когда я поставил 200 RUB Бот начинает ошибаться по частично исполненным ордерам, либо выставляет часть по завышенной цене, либо вообще выставить не может, как я сегодня заметил. Завтра хочу увеличить для USD и EUR до 50 или 100, посмотреть как будет работать, нужно баланс пополнить, а может обновлю Бота, а после суммы увеличу. Решения по этому вопросу так и нет Андрей?
Но для его работы нужно установить пару библиотек, там в статье расписано. Смотрите сами, я бы обновил)
FYI
exmo.ME заработал по HTTPS
кто пользовался этим доменом, меняем настройки на защищенность )
Можно попробовать exmo.me сменить на exmo.com, биржа одна, точки входа разные
Ошибка 503 означает, что на сервере, к которому вы обращаетесь, что-то не запущено.
Т.е. вопрос к владельцам биржи, что там по ночам админы вертят ) Наверное, чинили что-то
Может это глюк или еще что-то, но не однократно наблюдал как бот когда часть ордера продал или купил. Отменял другую часть и ставил на продажу с вдвое завышенной ценой.
Валютная пара рип-рубли играл на сумму 777,56
Диагноз: Параметр nonce меньше или равен тому, что было использовано до "1510554126439". Это может быть случае если параллельно к API идёт обращаение с бота и еще с чего либо.
Лечение: Нужно поменять API key и API secret
Pavel К. я ставил Бота на USD, EUR, RUR - вот когда задаешь крупную сумму, в частности пара LTC-RUR сумму устанавливаю 200руб. для одного ордера, тогда Бот начинает здесь "путаться" скажем так. То есть закупив часть монет он отменяет не исполненный ордер, точнее не полностью исполненный, а потом то, что закупил продает за эти же 200руб, + комиссия биржи + навар, и получается цена практически в два раза выше имеющейся. Если сумма меньше 50, 100 тогда не глючит, конкретнее при 100RUR глючит реже, при этом Бот работает на паре BTC_USD на 100USD, и на паре ETH_EUR на 50EUR и таких ошибок не наблюдается.
Вот как бы Андрей эту ошибочку исправить, точне я бы сказал разрешить этот момент, почему так происходит, по сути он же проверяет исполнение ордера, и проверяет на наличие частично исполненного ордера, но почему то потом отменяет частично исполненный ордер :-(
И ещё я заметил (как мне показалось), чем выше сумма, которой Бот единовременно апеллирует, тем чаще Бот ошибается при работе.
Сегодня, завтра попробую испытать обновленный код Бота.
В очередной раз Андрей выражаю Вам признательность за Бота, за открытый код и за поддержку.
с Уважением Сергей К.
Во первых - спасибо за БОТа!
Я конечно же, соответственно с Вашими рекомендациями по освоению трейдинга новичками, сейчас в минусе ))
Делаю совсем первые шаги, но вот какой у меня вопрос - как можно сделать (что изменить в коде), чтобы цену продажи программа рассчитывала не из завершенных сделок, а из стоящих в очереди ордеров на продажу.
Т.к. когда торговля активная, то бот практически не может купить, т.к. с ценой опаздывает всегда. Я меняла установочные параметры, но не помогает. К примеру цена покупки 6650, он ставит 6621 (это далеко в списке ордеров очень)
И еще в AVG_PRICE_PERIOD у Вас задан 90, а затем еще умножается на 60 в строке 158. Не значит ли, что AVG_PRICE_PERIOD надо задавать в минутах? (прошу прощения, программирования не знаю).
Заранее благодарна за ответ!
мне кажется логичным, что на покупку лот выставляется или верхним (по максимальной цене покупки), или в верхней тройке стакана покупки - и пытается там удержаться. Не ориентируясь на стакан продаж.
А на последующую продажу - уже как получится, с учетом комиссии биржи и своего навара (от цены лота, который был только что продан). И в стакане продаж стоит до победы, чтобы не уйти в минус. Понятно, что работает это только на восходящем рынке.
Какую строчку кода брать для этого?
Или я не права? И алгоритм гораздо более сложный?
стакан покупок
129.1 0.89941013 116.113847
129 2.92629127 377.491573
128.9 0.32355078 41.7056955
128.73315792 0.19154096 24.6576726
128.6542 0.21202776 27.2782618
робот упорно стоит на
buy
128.5836
т.е. это 7-8 место в стакане. Я уже время ожидания поставила 1.5 минуты, но все равно он ставит цену значительно ниже верхушки стакана.
Торги не активные, в минуту 3-4 сделки, т.е. верхние ставки стакана меняются не часто.
Все правильно, нестабильная связь. Проблемы с сервером или сетью
P.S. Bonjour.
Доброго часа.
Вот это ограничение в 180 обращений в минуту - это ограничение на аккаунт или на IP?
И еще один вопросик, что если CURRENCY_2 у меня будет одна и та же допустим у двух Ботов на двух парах, ну к примеру BTC_USD и ETH_USD, Боты запутаются? Вообще я думаю не должны, и в V2 можно разрешить этот вопрос, верно?
Ну и не раз замечал, именно у них, что они на nonce ругаются не по делу. Думаю, там что-то с балансировщиком нагрузки, ну или еще с чем то.. Ну да, остается только забить
На смежные пары лучше не играть, один бот начнет скупать, а другой продавать)
Спасибо за открытый код бота!
Для биржи битрекс Вы выложили код со следующей стратегией - "Таким образом, он будет стараться купить дешевле, но продать как можно дороже, а если курс вырастет недостаточно и пойдет на спад, то будет выставлять по минимально допустимой цене (с учетом комиссии при покупке, при продаже и требуемого навара)."
Немогли бы Вы для эксмо заложить продажу так же не по заложенному изначально проценту, а плавающий на увеличение в зависимости от macd + возможность скинуть ордер если тренд развернулся как в битрексе, а не ждать до упора продажи как сейчас.
Заранее спасибо.
И если бы Вы открыли страницу с донат кошельками, многие могли бы Вас отблагодарить.
Все верно Дмитрий, у Вас именно эта проблема?
Как то можно это обойти?
Кто нибудь знает алгоритм как торговать на 2-х парах одновременно?
Да, так лучше не запускать, будут чудеса.
Не думаю, что есть какой то алгоритм кроме изменения кода - лучше играть на непересекающиеся пары
conn = http.client.HTTPSConnection(API_URL, timeout=60)
На:
conn = http.client.HTTPConnection(API_URL, timeout=60)
Цена зависит от этого значения.
Плюс, после получения цены к ней подмешивается комиссия, так что итоговая цена покупки/продажи отличается от расчетной.
А как вы проверяете, что не совпадает, она выходит за границы high/low последних свечей?
Нажмите File -> New File, сохраните, потом F5
CURRENCY_1_MIN_QUANTITY = 3(как минимум)
остальные стандартные правки как и у других комментаторов
https://bablofil.ru/macd-python-stock-bot/
По мне так стоит, так он будет реже ошибаться
Скачал две версии. Одна при установке пишет, что не та платформа (Виндоус 10).
Другая, которую нужно поместить C:\ta-lib, не содержит папки Python. Или она там не нужна?
PS: портировал бот от битрикса на эксмо, торгуется по всем парам. Но хочется чтобы быстрее реагировал.
Всем здрасьте :)
И спасибо за скрипты, начинаю разбираться.
Спасибо!
Пока с алгоритмами не разобрался, да и в питона первый раз вижу,
Но мысль такая - почему нам не использовать за базу встречные ордера на покупку/продажу
смотрим, максимальный ордер - хватаем его... конечно же учитывать при покупке/продаже комисию биржи и какой то процент прибыли... будет мало - но наверняка
или баян баянистый?
уберите время смещения с сервером
И вверх курс идет и в низ
постоянно получаю
Открытых ордеров нет
2017-12-23 22:55:35.551364 BTC_USD Открытых ордеров нет
2017-12-23 22:55:35.562107 BTC_USD Обработка...
Открытых ордеров нет
Что в начале должно на счету быть? BTC или USD ? у меня USD сейчас
Или при запуске BTC должны быть?
И вверх курс идет и в низ
постоянно получаю
Открытых ордеров нет
2017-12-23 22:55:35.551364 BTC_USD Открытых ордеров нет
2017-12-23 22:55:35.562107 BTC_USD Обработка...
Открытых ордеров нет
Что в начале должно на счету быть? BTC или USD ? у меня USD сейчас
Или при запуске BTC должны быть?
если есть ордера он так и напишет, если нет ордеров и денег на счету (USD) идет дальше по другим парам
MARKETS = [
'BTC_USD', 'BCH_USD',
'ETC_USD', 'ETH_USD',
]
Вижу по графикам, что курсы валюты поднимаются, но неизменно скрипт пишет, что условия рынка не подходят для торговли...
что можно подкрутить?
Кстати, имеется прога для андроид под названием TABTRADER в ней можно выставить на экран сразу несколько валют и бирж, или смотреть по какой то валюте детальный график... очень удобно.
Биржа Exmo присутствует. Можно для каждой биржи указать ключь API, тогда можно далать ордера прям из телефона, и получать оповещания по ордерам..
Но одновременно со скриптом один и тот же ключ к сожалению использовать нельзя. В документации написано, что можно в поддержке запросить второй АПИ ключ
Но даже и без подключения АПИ удобно мониторить курсы валют и бирж
скрипт не отменяет ордера. Или это тоже из за часового пояса? здесь тоже нужно что то думать
Я так понимаю, нужно добавить STOCK_TIME_OFFSET, внутри кода он присутствует, в настройках нету
У меня разница с временем сервера 6 часов
Тоесть, время сервера - 06:02, у меня 12:02
сколько должно быть в STOCK_TIME_OFFSET ?
Спасибо!
> + Добавил запрос минимальной суммы ставки с exmo по текущей паре.
Может имеет смысл минимальные суммы для каждой валюты руками прописать? Ведь они почти не меняются! Это позволит уменьшить количество запросов к API, которое хоть и большое но ограниченное.
Ну и как я и писал, может имеет смысл сделать навар ( MARKUP ) отдельно для каждой валюты?
Ведь например, у BTC в отличии от других валют курс к доллару намного больше. Сделав для каждой валюты свой навар, мы могли бы уменьшить риски пролета для валют с большим курсом...
Ну и CAN_SPEND лучше бы сделать отдельно для каждой валюты. Было бы для экспериментов с небольшими суммами удобнее
Что нибудь еще нового сделали ? :)
Эх, был бы код на Perl :)
Так вперед :)
Да и первый сайт на перле был еще в 1998 году :)
Сейчас не потяну переделывать
Вопрос такой, не пойму лили баян или что...
Что если для торговли за базу брать готовые, существующие ордера на покупку продажу? Сейчас считаю, вроде с учетом комисии биржи доля малая все равно есть... Мало но есть. Зато гарантировано сечет волны... или в чем то ошибаюсь?
К примеру время биржи 10:00, мое время - 16:00, разница 6 часов. Ставлю -6, но ничего не происходит.
Я понимаю что такая торговля будет в минус... но все же как это сделать?
buy 0.00022904723409398076 436591.1703564551
buy 0.00022904723409398076 436591.1703564551
и тд.
но я не вижу в активных ордерах на сайт чтоб создавались ордера на покупку, так и должно быть?
Это 10000 строк, мегабайт с хвостом, который постоянно обновляется.
Не много ли? Имеет ли смысл может уменьшить?
Конечно, почему нет.
Просто придется запускать через командную строку
открываете cmd, пишете python путь_к_боту_1.py
открываете еще одно cmd, пишете python путь_к_боту_2.py
Для изучения самое то. Респект программисту!
Кто сколько ставит навара себе с сделки? 0.1% так и оставляете?
Пробовал крутить настройки bull\bear, но точно понять как будут пересекаться линии относительно графика в своей голове сложно, собственно как и будет ли нормально торговать бот. Тестировать мелкими суммами для оптимальной настройки можно тупо месяцами, особенно когда "условия рынка не подходят для торговли". Назрел вопрос: а можно ли как-то визуально на каком-нибудь эмуляторе посмотреть изменчивость настроек bull\bear, что бы наглядно видеть что будет происходить? А то я реально не врубаюсь чем он там руководствуется. Еще долго тестировал при настройках BEAR_PERC = 70 BULL_PERC = 99.5, покупает редко, на все равно закупается на вершине пампа и не может потом ничего продать.
Вы можете запустить скрипт, сидеть, смотреть на графики и пересечения, и понимать где бот покупал бы, а где нет.
Правильно или нет, зависит от вашей точки зрения. С одной стороны, свечами по 5 минут вы получаете более тонкий контроль над изменением тренда, и оперативно реагируете на изменения. С другой стороны, чем меньше этот период, тем чаще будет ошибаться индикатор - большинство индикаторов заточены на часовые, дневные и недельные периоды - т.е. средний и долгий срок.
Я думаю все же, бот должен работать по следующему алгоритму:
Если нет ни резкого подъема ни спада, торгуем
Если резкий спад, продаем BTC, и ждем нормализации, курим табак. Продавать нужно даже, если курс опустился и не выгоден с точки зрения последних продаж, ведь в конечном счете при резком спаде мы выиграем на разнице курсов, купив дешевле.
Если спад устаканился, снова торгуем...
Если курс резко начал подниматься, закупаем BTC, и ждем, курим табак. Закупаться так же нужно без оглядки на невыгодность с точки зрения последних торгов, ибо в итоге окажемся в выгоде...
Еще, на мой взгляд, график нужно строить по существующим открытым ордерам, а не по последним продажам, тоесть нужно жить настоящим а не прошлым! Но это не точно..
Ну, детали конечно нужно допиливать, но одно важно - если мы закупили на верхней волне графика, то при спаде нужно продавать...
Заранее спасибо если все же выложите такой бот.
Так вот.
В стаканах покупок есть куча оптимистов, которые готовы купить BTC по 100 долларов за штуку, например. Они находятся в конце списка, поэтому вряд ли вы из когда увидите на сайте, хотя можно выцепить через API.
Так же немало оптимистов, желающих продать BTC по 20-30 000 $ при текущей цене в 15 000. Ордера есть, они висят, и могут висеть еще много месяцев.
Если посчитать суммарный объем в долларах, то объем на продажу как правило в два раза больше объемов на покупку, а средневзвешенная цена что там что там расходится процентов на 70 от текущей - каждая в свою сторону. Так что брать из стакана информацию, конечно, можно, а вот доверять ей, учитывая что каждый выставляет ЛЮБУЮ цену, порой оторванную от реальности - думаю, не самая лучшая идея.
Ну а насчет продавать при спаде - имеется в виду продавать с убытком, идти на перезакуп, покупать в расчете на то, что пойдет вверх? А закупать при росте? Это и будет зачастую покупка на пике... В общем не совсем я понял алгоритм (
Может кто то в сети видел, может демо версия какая то эмулирующая работу...
Отладили бы мы дружно все вместе алгоритм, выбрали бы лучший... а по нему уже и скрипт настроить...
Кто что думает?
Постараюсь поскорее выложить пример
Для начала проверьте, не запущен ли торрент :) Потом уже надо разбираться.
На крайний случай арендуйте VPS/VDS и запустите бота на нём
Выход, ждем пока не исполнятся/закроются все ордера на продажу (один ордер может быть разбит биржей на несколько и исполняться частями)
Выход, ждем пока не исполнятся/закроются все ордера на продажу (один ордер может быть разбит биржей на несколько и исполняться частями)
Выход, ждем пока не исполнятся/закроются все ордера на продажу (один ордер может быть разбит биржей на несколько и исполняться частями)
Выход, ждем пока не исполнятся/закроются все ордера на продажу (один ордер может быть разбит биржей на несколько и исполняться частями)
Выход, ждем пока не исполнятся/закроются все ордера на продажу (один ордер может быть разбит биржей на несколько и исполняться частями)
Выход, ждем пока не исполнятся/закроются все ордера на продажу (один ордер может быть разбит биржей на несколько и исполняться частями)
Выход, ждем пока не исполнятся/закроются все ордера на продажу (один ордер может быть разбит биржей на несколько и исполняться частями)
Выход, ждем пока не исполнятся/закроются все ордера на продажу (один ордер может быть разбит биржей на несколько и исполняться частями)
это нормально?
токо талиб не ставится...((
Например:
Бот играл ltc_usd, купил за 400$ 2 ltc.
Бот собирается их продать и получить 1% прибыли - значит нужно получить 404$. Курс составит 202$ за штуку.
В это время кто-то (другой бот или человек) взял и перевел полтора лайткойна. Или продал. Или еще чего.
В итоге бот, что бы выручить 404$ за продажу 0.5 оставшихся LTC выставляет ордер по курсу 808$.
У меня у одного бот пытается купить по цене выше, чем продал?
пробовал на разных парах, но если он скажем продал за 100 баксов, то покупает на 100+
Реально сейчас продал за 11200, а покупать хочет за 11278... Чт за фигня? Разъясните пожалуйста.
объясните пожалуйста, что не так?
Сам себе отвечу.
Итак, если у кого такая же ситуация будет, все объясняется легко.
есть минимальная сумма сделали и если я правильно помню, она 0.001 BTC, следовательно, у меня создавалась слишком маленький ордер.
Сейчас выставил на евро и понеслась душа в рай. Буду наблюдать, чем закончится.
Спасибо.
Добавил на сайт рабочего бота для wex.nz - https://bablofil.ru/bot-dlya-birgi-wex/
Добавил комментарии в код статьи
**kwargs - означает, что в программу можно передавать любое количество параметров в формате ключ-значение, и все они будут помещены в словарь kwargs который можно использовать внутри функции
# ключи API, которые предоставила exmo
API_KEY = 'YOUR API KEY'
# обратите внимание, что добавлена 'b' перед строкой
API_SECRET = b'YOUR API SECRET'
всевремя пишет так , ордера не открывает что о не правильно может? Открытых ордеров нет
!!!! 'BTC_XRP'
Открытых ордеров нет
!!!! 'BTC_XRP'
Открытых ордеров нет
...
Скорее всего, что то со связью, посмотрите комментарии выше, тут много случаев разобрано
Ctrl+C подойдет
Все-таки, верните STOCK_TIME_OFFSET в 0
Биржа живет по времени UTC и питон берет время по UTC, так что все должно совпадать. Менять этот параметр практически никогда не требуется.
Пытаюсь ордер отменить - ставит точно такую же высокую цену.....
CURRENCY_1_MIN_QUANTITY = 0.003
У вас стоит 10 долларов на покупку
Если брать курс 9000$, то ваших денег хватит на покупку 0.00111... А это меньше чем 0.003!
Вы указали, что 0.003 это минимальная ставка, которую принимает биржа. Отсюда и последствия
Аккаунт держать открытым не нужно, бот авторизуется независимо от человека
Ошибка 10464: Кол-во по ордеру меньше минимально допустимого по этой валютной паре (0.001 BTC).
Вы можете, что через апи, что через браузер выставить ордер по той цене, по которой продают остаток (но на минимально разрешенный объем), скупить мелочь и отменить свой частично исполненный ордер. Тогда вы не купите у наглого типа, и получите желаемое.
А по поводу идеи по API скупиnm мелочь и отменить идея интересна, спасибо.
Как вариант, можно играть по разным парам, на каждую пару свою сумму.
Спасибо за интересную информацию, ответ на свой вопрос нашёлся в переписке .
Подскажите, в Вашем боте предусмотрена средняя цена, которая берется из истории сделок.
А можно сделать среднюю цену которая будет браться из открытых ордеров?
Как это сделать?
Попробуйте запускать по другому, например python3.5 ./exmo.py
Запись об этом отмечена воскл.знаком. Что может быть не так?
26.07 20:50 buy 140.75072725 0.07104759 9.99999996
26.07 19:51 sell 140.65253802 0.07131048 10.02999999
26.07 19:45 buy 139.9513825 0.07145338 9.99999931
! 26.07 19:25 sell 139.71629109 0.03519237 4.91694741
! 26.07 05:17 buy 141.79208884 0.03526289 4.99999883
26.07 05:12 sell 142.45702144 0.00880577 1.25444376
26.07 05:03 sell 142.45702144 0.02639783 3.76055623
26.07 04:45 buy 141.74687785 0.03527414 4.99999921
26.07 03:56 sell 141.97343355 0.03532351 5.01499999
Полагаю, речь не про бота из этой статьи?
Этот бот в таком замечен не был)
Удачи всем!
Этот вопрос уже поднимался выше, но ответа не последовало. Подскажите, как и где изменить код данного бота, что бы отменялись ордера на продажу.
Спасибо!
Когда запускаю бота - он спокойно переводит весь депозит из долларов в рубли, и потом начинает считать среднюю цэну по доллару, которого ноль. Возможного - из-за этого не может посчитать?
Дополнение: Полезно вести какой-то лог, а то вообще бота не изучить.
Но Вы всегда можете изменить бота под себя так, как сочтете нужным ;)
Просьба помочь, при выборе пары USD_RUB ботом сразу продается весь баланс USD (то есть накопление баланса идет в RUB).
Есть ли способ сменить приоритет в накопление USD (чтобы основной баланс оставался в USD)?
Тоже решил попробовать использовать бота.
Но у меня тоже вылетает ошибка, как уже писали выше:
Открытых ордеров нет
buy 0.0004143517715461355 12067.041444863911
Выход, не хватает денег на создание ордера
Открытых ордеров нет
buy 0.0004143517715461355 12067.041444863911
Выход, не хватает денег на создание ордера
Открытых ордеров нет
buy 0.0004143656202697933 12066.638146148567
Выход, не хватает денег на создание ордера
Открытых ордеров нет
buy 0.0004143656202697933 12066.638146148567
Выход, не хватает денег на создание ордера
Открытых ордеров нет
buy 0.0004143656202697933 12066.638146148567
Выход, не хватает денег на создание ордера
Открытых ордеров нет
buy 0.0004143656202697933 12066.638146148567
Выход, не хватает денег на создание ордера
Открытых ордеров нет
buy 0.0004144073919492026 12065.421846077717
Выход, не хватает денег на создание ордера
Открытых ордеров нет
buy 0.00041442417133474987 12064.933336046332
Выход, не хватает денег на создание ордера
Открытых ордеров нет
buy 0.00041444095207915246 12064.444826014851
Выход, не хватает денег на создание ордера
но на счету 58$ этого по идее более чем.
Бот же хочет открывать ордера на ~5$
В ручную на бирже я без проблем купил: 0.00041444095207915246 btc
Код не изменял (кроме API_KEY и API_SECRET) все 58$ лежат в USD.
Подскажите что я делаю не так?
Один вопрос
Если комиссия биржи со зделки
STOCK_FEE = 0.002 # Комиссия, которую берет биржа (0.002 = 0.2%)
То профит стоит такой
PROFIT_MARKUP = 0.001 # Какой навар нужен с каждой сделки? (0.001 = 0.1%)
Это получается в минус идем?
Тоже вот решил попробовать бота. Для начала самого Вашего простого.
Что-то ругается у меня на все комментарии.
Удалил их.
Теперь начал ругаться на любой русский текст.
Приходится на английский переводить.
Из за чего это?
Создайте просто новый файл, откройте в блокноте.
Скопируйте туда весь код со статьи, с комментариями и т.п.
Сохраните.
Теперь в Idle откройте этот файл File->Open и запустите (F5)
Скопировал, вставил текст в блокнот, запустил, всё заработало.
Спасибо.
Чтобы протестировать обновление, мы уже ввели ограничение на 2 пары: BTC / GBP и BTC / TRY.
Следующее обновление необходимо для пользователей, которые работают с exchange через API. При размещении заказа с более чем 2 символами будет выведена ошибка:
Ошибка 50381: более 2 десятичных знаков не допускаются для пары BTC_USD , подскажите пожалуйста куда и как внести поправки в скрипт бота? Большое спасибо!!!
Можно скачивать новую версию и пользоваться.
Реально ли и насколько сложно будет самому переписать вашего бота для торговли на другой бирже?
И если реально, то на что стоит обратить внимание.
Заранее спасибо
Конечно реально, посмотрите ссылки под статьей на другие статьи цикла, там есть и другие боты для других бирж, можете взять за основу. На каждой бирже все по разному, везде будут свои тонкости