Alexus083 0 Опубликовано: 21 марта 2019 Share Опубликовано: 21 марта 2019 Добрый день. Можно ли в боте внести изменения, чтобы бот не выставлял лимитный ордер на покупку или продажу, а именно покупал по рыночной цене, когда цена подойдет к расчитанной ботом цене на покупку или продажу? Цитата Ссылка на сообщение Поделиться на других сайтах
bitsotik 0 Опубликовано: 23 марта 2019 Share Опубликовано: 23 марта 2019 21.03.2019 в 13:26, Alexus083 сказал: Добрый день. Можно ли в боте внести изменения, чтобы бот не выставлял лимитный ордер на покупку или продажу, а именно покупал по рыночной цене, когда цена подойдет к расчитанной ботом цене на покупку или продажу? Я бы не советовал вам в боте использовать тип ордера "маркет мэйкер". Если планируете выставить ордер на покупку, может сложиться так, что цена коснется нужной вам и резко отскочит назад и бот купит по рынку, но тогда цена уже вам вряд ли понравится. Используйте вид ордера "TAKE_PROFIT". Например при выставлении ордера на покупку задавайте такие параметры: symbol DASHBTC, side BUY ... stopPrice 0.0227 - ЦЕНА АКТИВАЦИИ ЗАЯВКИ price 0.02274 - максимальная цена, по которой боту разрешено будет купить. п.с. В названии темы пишите или четко на англ. Bot или четко на русском: Бот, а не вперемешку, иначе звучит как "Вот" вместо бот. Цитата Ссылка на сообщение Поделиться на других сайтах
admin 67 Опубликовано: 27 марта 2019 Share Опубликовано: 27 марта 2019 Если нужно то конечно можно, вот так будет выглядеть непосредственно создание - нужно будет указать кол-во к покупке res = bot.createOrder( symbol=settings['symbol'], recvWindow=15000, side='BUY', type='MARKET', quantity=settings['amount'] ) Цитата Ссылка на сообщение Поделиться на других сайтах
bitsotik 0 Опубликовано: 27 марта 2019 Share Опубликовано: 27 марта 2019 При заказе истории сделок 'myTrades' isBestMatch - за что отвечает этот параметр? Остается догадываться, что тут идет речь о том - исполнен ли мой ордер полностью или нет. Так? isMaker - надо полагать что если False, то это не мой ордер и в запросе get order даст ошибку. *** Если в отношении isBestMatch я думаю не верно, то как тогда узнать - исполнен ли ордер полностью? Цитата Ссылка на сообщение Поделиться на других сайтах
admin 67 Опубликовано: 28 марта 2019 Share Опубликовано: 28 марта 2019 isMaker это значит что покупал не по рынку а по своей цене isBestMatch - этот параметр всегда true и его можно игнорировать Что бы узнать, исполнен ли ордер, нужно либо явно проверить его состояние, либо получить уведомление из сокетов, либо сравнить сумму сделки с суммой ордера Цитата Ссылка на сообщение Поделиться на других сайтах
bitsotik 0 Опубликовано: 29 марта 2019 Share Опубликовано: 29 марта 2019 Сокеты - это дополнительный запрос, пока с ними не разбирался. Сравнить сумму сделки с суммой ордера наверно можно лишь в том случае, если сумма сделки прописана где-то в базе ордеров, сделаных ботом. Иначе, кроме всего прочего, приходит еще один параметр - quoteQty, ну тут понятно. Цитата Ссылка на сообщение Поделиться на других сайтах
Andrei22 11 Опубликовано: 1 апреля 2019 Share Опубликовано: 1 апреля 2019 Эх эти сокеты )) Несколько дней мучаюсь как сделать структуру. Надо klines=5m и klines=15m на много пар. Пока вижу сделать так: 1. на удаленном сервере сделать через cron, javascript который: при первом включении делает rest api limit 500 klines нужных пар, слушает сокеты бинанса и пишет в базу sql по одной как появляютя, тобишь каждую секунду добавляется новое значение, 501 стирается. (если обновились) 2. бот при включении коннектится к sql серверу, если есть коннект и данные свежие то использует их, если нет то обращается через rest api только уже через timeout. Вот назрели вопросы ))) Через 24 часа если не оборвать соединение, то бинанс выдаст ошибку или просто перестанет обновляться? Или лучше запустить отдельный скрипт на этом же локальном компьютере и собирать свечи в файлик sqlite3? а все боты с этого локального компьютера будут лазить в этот файл db за своими данными по свечкам? SSD в этом случае не лопнет? )) И reconnect делать в этом случае в on_message если что то вернется не то или по времени? Еще думал что может первый раз взять через api свечи, записать их в словари, а вебсокеты будут обновлять эти словари, но я так думаю что тут двухпоточность какая то нужна чтоб параллельно бот работал и словари обновлялись ))) Пытался это осознать у Андрея в примере sockets.py арбитражного бота, но познаний python не хватает ) Цитата Ссылка на сообщение Поделиться на других сайтах
Andrei22 11 Опубликовано: 1 апреля 2019 Share Опубликовано: 1 апреля 2019 macd, macdsignal, macdhist = talib.MACD(closeBar['close'], fastperiod=12, slowperiod=26, signalperiod=9) Еще ни где не увидел, closeBar['close'] кол-во влияет на точность того что он вернет, если подсовываешь klines 5m? 100, 200, 500, 1000? Цитата Ссылка на сообщение Поделиться на других сайтах
admin 67 Опубликовано: 2 апреля 2019 Share Опубликовано: 2 апреля 2019 21 час назад, Andrei22 сказал: Эх эти сокеты )) Несколько дней мучаюсь как сделать структуру. Надо klines=5m и klines=15m на много пар. Пока вижу сделать так: 1. на удаленном сервере сделать через cron, javascript который: при первом включении делает rest api limit 500 klines нужных пар, слушает сокеты бинанса и пишет в базу sql по одной как появляютя, тобишь каждую секунду добавляется новое значение, 501 стирается. (если обновились) 2. бот при включении коннектится к sql серверу, если есть коннект и данные свежие то использует их, если нет то обращается через rest api только уже через timeout. Вот назрели вопросы ))) Через 24 часа если не оборвать соединение, то бинанс выдаст ошибку или просто перестанет обновляться? Или лучше запустить отдельный скрипт на этом же локальном компьютере и собирать свечи в файлик sqlite3? а все боты с этого локального компьютера будут лазить в этот файл db за своими данными по свечкам? SSD в этом случае не лопнет? )) И reconnect делать в этом случае в on_message если что то вернется не то или по времени? Еще думал что может первый раз взять через api свечи, записать их в словари, а вебсокеты будут обновлять эти словари, но я так думаю что тут двухпоточность какая то нужна чтоб параллельно бот работал и словари обновлялись ))) Пытался это осознать у Андрея в примере sockets.py арбитражного бота, но познаний python не хватает ) Почему именно JavaScript, может быть речь идет о nodeJS? И при чем тут cron, на крон можно любой скрипт повесить, тот же питоновский. SQLite хорош, когда не так часто нужно туда лазить, если нужно реально много пар, то лучше возьмите Redis в качестве БД. Он работает в оперативке, но так же скидывает данные на диск - это можно отключить, если хотите. Главное, не открывайте порты Redis наружу, пускай он будет доступен только для скриптов на этом сервере. Я бы делал так - сервер на линуксе, там питоновский скрипт, который через сокеты берет данные с биржи, обновляет данные в редис. При ошибках (а-ля on_error, on_close, подробнее тут https://bablofil.ru/binance-webscokets/), пускай скрипт вылетает. За ним следит линуксовый процесс watch, который сразу же поднимет скрипт, тот заново подцепится к бирже, к Redis и т.п., и продолжит работу. Если не сможет подключиться, скрипт снова вылетит, watch его снова подхватит и так до тех пор, пока коннекты не наладятся. Другие боты запущены на этом же сервере, они берут данные из редис, и работают. Если что, можно на них тоже натравить watch, он будет их запускать при вылетах. Я не знаю, какая у вас нагрузка намечается, но мне кажетс многопоточность в этом случае не даст желаемого результата, хотя можно и с ней все сделать Цитата Ссылка на сообщение Поделиться на других сайтах
admin 67 Опубликовано: 2 апреля 2019 Share Опубликовано: 2 апреля 2019 21 час назад, Andrei22 сказал: macd, macdsignal, macdhist = talib.MACD(closeBar['close'], fastperiod=12, slowperiod=26, signalperiod=9) Еще ни где не увидел, closeBar['close'] кол-во влияет на точность того что он вернет, если подсовываешь klines 5m? 100, 200, 500, 1000? Вообще MACD точнее работает на длительных таймфреймах, неделях там, например. На минутах будет больше ложных срабатываний. Главное, что бы кол-во свечей было намного больше чем max(fastperiod=12, slowperiod=26, signalperiod=9) - в данном случае 26. Функция возьмет по 12 свечей для получения одной средней, по 26 свечей будет брать и группировать, подсчитывая вторую скользящую и т.п. В общем, данных должно хватать, и таймфреймы желательно брать помедленнее, но это только вопрос стратегии Цитата Ссылка на сообщение Поделиться на других сайтах
bitsotik 0 Опубликовано: 4 апреля 2019 Share Опубликовано: 4 апреля 2019 Второй день пристально наблюдаю за ночным режимом binance, пока на паре BNBUSDT. Картина следующая: Исполняется ордер, смотрю его по "get order" (статус и т.п.) - выдает: Order does not exist и конечно же с обработкой ордера теперь большие проблеммы. Хорошо, выставляю ордер вручную, приходит ответ по api что все успешно лимитный ордер выставлен. Не тут то было... Деньги с баланса сняты, запрос списка активных ордеров выдает пустоту, то есть получился ордер невидимка. Курс пошел вверх, мою цену проскочили, ордер не исполнен и деньги на баланс не вернулись. Может через пол часика где-то все образуется, но движуха потеряна. Кто-нибудь может это пояснить? Цитата Ссылка на сообщение Поделиться на других сайтах
bitsotik 0 Опубликовано: 4 апреля 2019 Share Опубликовано: 4 апреля 2019 При попытке отправить ордер типа MARKET получаю ответ:Mandatory parameter 'type' was not sent, was empty/null, or malformed. Чё ему надо? Цитата Ссылка на сообщение Поделиться на других сайтах
admin 67 Опубликовано: 6 апреля 2019 Share Опубликовано: 6 апреля 2019 05.04.2019 в 00:38, bitsotik сказал: При попытке отправить ордер типа MARKET получаю ответ:Mandatory parameter 'type' was not sent, was empty/null, or malformed. Чё ему надо? неправильно MARKET написали или type, полагаю. Вот так правильно res = bot.createOrder( symbol=settings['symbol'], recvWindow=15000, side='BUY', type='MARKET', quantity=settings['amount'] ) Цитата Ссылка на сообщение Поделиться на других сайтах
Alexus083 0 Опубликовано: 8 апреля 2019 Автор Share Опубликовано: 8 апреля 2019 27.03.2019 в 20:15, admin сказал: Если нужно то конечно можно, вот так будет выглядеть непосредственно создание - нужно будет указать кол-во к покупке res = bot.createOrder( symbol=settings['symbol'], recvWindow=15000, side='BUY', type='MARKET', quantity=settings['amount'] ) Спасибо большое, оказывается было так просто. Теперь пытаюсь добавить в этого бота трейлинг-стоп, но моих познаний нехватает. Понравились мне эти боты, как бы их скрестить? https://forum.bablofil.ru/topic/169-бот-для-trailing-stop-на-binance Цитата Ссылка на сообщение Поделиться на других сайтах
bitsotik 0 Опубликовано: 15 апреля 2019 Share Опубликовано: 15 апреля 2019 Здравствуйте. Поясните, пожалуйста, что это за айсберг такой всё-таки?) Создал лимит ордер, где: quantity = 1.01, а icebergQty = 1 Из описания понял что айсберг - это невидимая часть ордера. После исполнения ордера получилось только 1.01 монеты, хотя я расчитывал получить вместе с невидимой частью 2.01/ Сделал запрос по id ордера: origQty: 1.01000000 icebergQty: 1.00000000 executedQty: 1.01000000 В чем подвох? Как понимать эту штуковину?) Цитата Ссылка на сообщение Поделиться на других сайтах
admin 67 Опубликовано: 18 апреля 2019 Share Опубликовано: 18 апреля 2019 quantity =1.01, а icebergQty = 1 В книге ордеров должен был появиться ордер с 10% от 1.01 (т.е. 0,101) Когда его кто-то выкупал, он пополнялся монетами, до тех пор, пока общее проданное кол-во не составило 1.01, цена при этом оставалась той же. Вы как бы не создавали стенку, видимую для других, но скрывали от них общий объем, удерживая цену Цитата Ссылка на сообщение Поделиться на других сайтах
bitsotik 0 Опубликовано: 18 апреля 2019 Share Опубликовано: 18 апреля 2019 Тут вроде понятно, а icebergQty что тогда делает? Цитата Ссылка на сообщение Поделиться на других сайтах
admin 67 Опубликовано: 19 апреля 2019 Share Опубликовано: 19 апреля 2019 Подпитывает ордер, который вы создали Для окружающих выглядит так, что выставлен лимитный ордер, но если его закрыть то выставится еще с такой же ценой и еще и еще Цитата Ссылка на сообщение Поделиться на других сайтах
Andrei22 11 Опубликовано: 13 мая 2019 Share Опубликовано: 13 мая 2019 В продолжение по вебсоектам ))) Как правильно делать реконнект? Не пойму проблему, вроде работает и 3 дня потом вылетает ошибка [WinError 10054] Удаленный хост принудительно разорвал существующее подключение ... ### closed ### Вот часть кода которое я использую: local_time = int(time.time()) restart_time = local_time + 82800 # 23 часа (82800 сек) def on_message(ws, message): global nonce global restart_time nonce += 1 socket_data = json.loads(message) if socket_data['e'] == 'error': # close and restart the socket print(socket_data['e']) print(socket_data['m']) ws.close() ....... local_time = int(time.time()) if local_time > restart_time: print("время рестарта") # ws.close() time.sleep(30) local_time = int(time.time()) restart_time = local_time + 82800 nonce = 0 # ws.on_open = on_open # ws.run_forever() def on_error(ws, error): print(error) def on_close(ws): print("### closed ###") def on_open(ws): print("### connected ###") if __name__ == "__main__": ws = websocket.WebSocketApp( "wss://stream.binance.com:9443/ws/" +............, on_message=on_message, on_error=on_error, on_close=on_close) ws.on_open = on_open while True: try: ws.run_forever() except: pass Запутался уже просто )) 1. Бинанс сам разрывает соединение и мне не нужно это отлавливать по error как сейчас выше? 2. Если надо самому обрывать соединение и реконнектиться то в условии if local_time > restart_time: соедиенние не закрывается (конечно раскомментировав), во всяком случае если в условии прописано ws.on_open = on_open ws.run_forever(), то он напишет заново ### connected ### и такое ощущение что дополнительно не разрывая предыдущие, если закомменитровать ws.on_open = on_open ws.run_forever() то тогда напишет ### closed ###. Если в def on_close(ws): написать ws.on_open = on_open ws.run_forever() то же заново не подключиться. Запутался уже как правильно рестарт сделать )))) То что написано выше, это последнее что придумал, но не уверен и не знаю как проверить правильно ли и одно соединение так получается хоть и работает больше суток. Цитата Ссылка на сообщение Поделиться на других сайтах
Andrei22 11 Опубликовано: 13 мая 2019 Share Опубликовано: 13 мая 2019 Буржуи пишут что вроде и этого хватает ))) while True: try: ws.run_forever() except: pass Цитата Ссылка на сообщение Поделиться на других сайтах
Andrei22 11 Опубликовано: 14 мая 2019 Share Опубликовано: 14 мая 2019 ??? кто знает ??? Цитата Ссылка на сообщение Поделиться на других сайтах
admin 67 Опубликовано: 21 мая 2019 Share Опубликовано: 21 мая 2019 я так делал, работает, только убить процесс сложновато Цитата Ссылка на сообщение Поделиться на других сайтах
Theankud 0 Опубликовано: 5 сентября 2019 Share Опубликовано: 5 сентября 2019 ДОБРЫЙ ДЕНЬ,подскажите,пожалуйста, в простом боте для Binance без индикаторов ..который v1... как сделать ,чтобы он при покупке для расчета брал не среднюю цену из стаканов, а первую...крайнюю цену ? Цитата Ссылка на сообщение Поделиться на других сайтах
admin 67 Опубликовано: 5 сентября 2019 Share Опубликовано: 5 сентября 2019 Возьмите код из бота для индикаторов, он там как раз покупает по рынку Цитата Ссылка на сообщение Поделиться на других сайтах
Theankud 0 Опубликовано: 5 сентября 2019 Share Опубликовано: 5 сентября 2019 (изменено) Спасибо что ответили ,но Вы не правильно поняли...не надо по рынку... # Берем цены покупок (для цен продаж замените bids на asks) prices = [float(bid[0]) for bid in offers['bids']] try: # Рассчитываем среднюю цену из полученных цен avg_price = sum(prices) / len(prices) как выделить цену покупки крайнюю в стакане...чтобы бот не высчитывал среднюю цену, а брал одну крайнюю цену... Изменено 5 сентября 2019 пользователем Theankud Цитата Ссылка на сообщение Поделиться на других сайтах
Рекомендованные сообщения
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.