Перейти к публикации
Форум ботоводов

Andrei22

Members
  • Публикации

    47
  • Зарегистрирован

  • Посещение

  • Дней в лидерах

    9

Все публикации пользователя Andrei22

  1. https://www.youtube.com/watch?v=oybUBSnFilM
  2. Достаточно разобраться из чего состоит облако, и тогда все что нужно можно взять в талибе.
  3. Тут есть что тебе надо для начала https://mrjbq7.github.io/ta-lib/func_groups/momentum_indicators.html
  4. Поверь на слово, если ты не знаешь как подключать индикаторы, не стоит использовать маржинальное плечо.
  5. Нет. На примере бинанса: Бинанс разрешает что ваше время не может быть больше чем на 1 секунду чем время сервера, иными словами вы не можете ордер поставить из будущего. Одну сек они видимо на погрешность дают. Ваше время может быть меньше чем на бинансе, если я правильно помню они дают 5 сек на это, здесь уже расчет идет на то что сеть может быть загружена, интернет плохой т.п. Другими словами они считают нормой 5 сек если ордер затеряется, но они позволяют и вручную создавать это окно времени в которое по вашему времени может быть нормальная задержка. Это параметр recWindow, он если память не изменяет допустим до 60 сек., иными словами если ордер дойдет до биржи в течении минуты то его примут, только это время в прошлом а не в будущем ! Если не указать recWindow то примется стандартное окно (толи 5, толи 15 сек). Синхронизация нужна только для `авторизованных` запросов, там где ключи используются. Для свечек, курсов не важна синхронизация, там придет когда придет (запрос-ответ).
  6. Для начала по дружески ключи поменяй, а то вся страна их уже увидела )))
  7. Andrei22

    Бот для Yobit

    создай бат файл там же где лежит бот, например start.bat внутрь: @ECHO OFF TIMEOUT /T 30 MODE 120,20 title Yobit bot ))) setlocal set PYTHONPATH=./ python ./yobit_perc.py endlocal pause далее, ПКМ создать ярлык (ярлык это ссылка на этот бат файл) далее ПКМ на Пуск -> выполнить -> пишешь shell:startup (откроется папка автозагрузки) далее ПКМ на ярлык - > копировать -> вставить в папку автозагрузки звук проверь что диск с ))) и есть ли этот wave там: import winsound soundfile = "c:/Windows/Media/chimes.wav" winsound.PlaySound(soundfile, winsound.SND_FILENAME | winsound.SND_ASYNC)
  8. спс, что то не подумал в документацию по request заглянуть ))) А это точно так? status_code насколько я понял ошибки по протоколу http вернет типа (200, 304, 404, 500 и т.п.), а бинанс свои ошибки создает 429, -2013 (причем минус 2013), - 2011 и т.д А вот бинансные -2013, -2011 таким способом не увидеть?
  9. Делаю так: # Получаем по ордеру последнюю информацию по бирже stock_order_data = bot.orderInfo(symbol=orders_info[order]['order_pair'], orderId=order) # проверка запроса на предупреждение бана check = stock_order_data for i in check: if i == 'code': code_error = int(check["code"]) if code_error == 429: time.sleep(3) Интересует как убедиться что bot.orderInfo не возвращает 429. А еще лучше чтоб это прописать в файл binance.api ко всем запросам не обязательно orderinfo и там делать проверку, а в самом main файле уже не проверять.
  10. ))) Все равно Андрей у тебя не правильно, обрати внимание именно на каких цифрах не правильно считает в первом посту Попробуй print(adjust_to_step(0.58,0.01000000)) и вернет 0.57
  11. Трёхногий арбитраж ))) Я только в танках знаю трехногих раков ))) По сути:У Андрея тут в блогах уже готовые есть https://bablofil.ru/inner-arbitrage/ и это https://bablofil.ru/vnutrenniy-arbitraj-chast-2/
  12. # Ф-ция, которая приводит любое число к числу, кратному шагу, указанному биржей # Если передать параметр increase=True то округление произойдет к следующему шагу def adjust_to_step(value, step, increase=False): return ((int(value * 100000000) - int(value * 100000000) % int( float(step) * 100000000)) / 100000000)+(float(step) if increase else 0) если пара BNBUSDT, ее CURR_LIMITS['filters'][2]['stepSize'] получит с биржи 0.01000000 если settings['amount'] дать цифру 0.58 (settings['amount']=0.58) quantity = adjust_to_step(settings['amount'], CURR_LIMITS['filters'][2]['stepSize']) quantity будет равна 0.57 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! пол дня голову ломал, решение нашел только такое: перед вызовом функции adjust_to_step сделать settings['amount'] = float(settings['amount'] + 0.00000001) а далее уже quantity = adjust_to_step(settings['amount'], CURR_LIMITS['filters'][2]['stepSize']) Проблемные цифры нашел только 0.57, 0.58, 1.13 ))) Та же проблема если округлять так: ticks = {} for filt in CURR_LIMITS['filters']: if filt['filterType'] == 'LOT_SIZE': ticks[pair] = filt['stepSize'].find('1') - 1 break quantity = settings['amount'] order_quantity = math.floor(quantity * 10 ** ticks[pair]) / float(10 ** ticks[pair]) *************************** settings['amount'] = float(settings['amount'] + 0.00000001) - спасает
  13. Я как бэктестер ))) Нашел одинаковое условие в 1.0.7 версии: if macd[-1] > macdsignal[-1] and macdhist[-1] > 0: # Линия макд выше сигнальной и на гистограмме они выше нуля Тут или комментарий неправильно написан или условие. Условие между and всегда одинаковое, когда линия макд больше сигнальной то гистограмма всегда больше 0. А если коммент написан как задумывалось то должно быть так: if macd[-1] > macdsignal[-1] and macd[-1] > 0 and macdsignal[-1] > 0:
  14. у меня так работает: local_time = int(time.time()) restart_time = local_time + 82800 # 23 часа (82800 сек) def on_message(ws, message): global restart_time if 'e' in socket_data: ....... if 's' in socket_data: ......... local_time = int(time.time()) if local_time > restart_time: print("время рестарта") time.sleep(30) local_time = int(time.time()) restart_time = local_time + 82800 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:............. 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
  15. Что то новая залитая версия идентичная старой ) Уже сравнение сделал файлов и по размеру и содержимому. Не вижу что изменилось )))
  16. Напишу тут про синхронизацию ))) Все равно не работает синхронизация времени как написано в "Бот для бинанса с индикаторами". Я что то не до понимаю )) if __name__ == "__main__": sync_time(bot, log, False, limits) t1 = threading.Thread(target=main_flow) t2 = threading.Thread(target=sync_time, args=(bot, log, True, limits)) threads = [t1, t2] for t in threads: t.start() for t in threads: t.join() этот блок кода создаст второй поток и запустит функцию sync_time передав туда limits для определения серверного времени в функции же включится цикл и limits то ему передастся только один раз при включении !! Или я не прав? def sync_time(bot, log, pause, limits): while True: try: # Получаем ограничения торгов по всем парам с биржи local_time = int(time.time()) server_time = int(limits['serverTime']) // 1000 # Бесконечный цикл программы shift_seconds = server_time - local_time if local_time + shift_seconds != server_time: bot.set_shift_seconds(shift_seconds) получается что когда пройдет таймаут if pause: time.sleep(10000) цикл начнется заново, local_time возьмет через time.time(), а вот server_time то останется прежним !!! shift_second станет -10000 и условие ниже никогда не выполнится. Голову сломал как второй поток берет заново время биржи. 2 вопроса: Может где то в main потоке надо как то передавать повторно в поток 2 limits? Или в функции где if pause после time.sleep брать новый limits?
  17. Andrei22

    Стакан Бинанса

    Спасибо Андрей, я не дождался ответа и начал делать в пятый раз прям точь в точь дословно как написано в инструкции, теперь я убедился что там каждое слово важно и его последовательность ))). Делать буфер стал словарем в словаре где ключ это номер события {1:{msg....}}, {2:{msg....}}.. так я смог удалять и не принимать не нужные u. Проблема не описаннная в пункте 6, если интернет пропадет/зависнет или счетчик u не тот прилетит или собьется то больше обновляться не будет, пришлось отлавливать очередность u и снимать слепок заново если что ))
  18. Биржа то какая? На бинансе вроде нет состояния выполнен/не выполнен https://github.com/binance-exchange/binance-official-api-docs/blob/master/web-socket-streams.md
  19. Уже раз 5 пытался победить, не получается собрать стаканы ((( Хелп нужен делаю как тут написано, кстати уже изменили относительно того что в блоге написано: How to manage a local order book correctly Open a stream to wss://stream.binance.com:9443/ws/bnbbtc@depth. Buffer the events you receive from the stream. Get a depth snapshot from https://www.binance.com/api/v1/depth?symbol=BNBBTC&limit=1000 . Drop any event where u is <= lastUpdateId in the snapshot. The first processed event should have U <= lastUpdateId+1 AND u >= lastUpdateId+1. While listening to the stream, each new event's U should be equal to the previous event's u+1. The data in each event is the absolute quantity for a price level. If the quantity is 0, remove the price level. Receiving an event that removes a price level that is not in your local order book can happen and is normal. Беру по апи из п.3 стакан, как есть присваиваю его переменной, назовем snapshot. c п.4 уже немного непонятно ) Удалить любые события где u меньше или равно snapshot. ???? Как тогда буфер должен выглядеть? Он должен быть как массив? 0:{ "e": "depthUpdate", "E": 123456789, "s": "BNBBTC", "U": 157, "u": 160, "b": [ ....... 1:{ "e": "depthUpdate", "E": 123456789, "s": "BNBBTC", "U": 161, "u": 173, "b": [ ....... 2:{ "e": "depthUpdate", "E": 123456789, "s": "BNBBTC", "U": 174, "u": 200, "b": [ ....... Если так то п.4 я должен удалять строчки из массива? По логике там будет потом только одна последняя (свежая п.5 и п.6) Далее мне же буфер надо сколхозить с snapshot и потом его по событиям обновлять. Вроде все сделал примерно так как описал выше, где объемы 0 удаляю, где цена одинаковая а объемы разные - меняю объем, где нет цены в слепке а есть в стриме - добавляю цену если объем больше 0. Работает 3 минуты и становится заметно что крайняя цена ближе к спреду начинает отличаться от вебморды, и видно что таких цен и объемов уже нет а они остаются в snapshot и не прилетает цена с объемом 0 чтоб их удалить. Прилетают на удаление другие всякие, причем заметил что в основном уже те которые я сам же недавно из стрима добавлял, а те которые из апи достались не замечал, они скорее всего и остаются не удаленными. Уже километр кода написал, стер, написал, гору сигарет выкурил, не пойму что не так ))) Может кто уже делал, (знаю что Андрей делал )) ), и если не трудно выложите это рабочее. Python.
  20. в гугле: import telebot описание создания habr.com, 10 минут работы если есть забугорный сервер
  21. Andrei22

    Binance Margin

    Андрей, я конечно дико извиняюсь, но тогда на гитхабе вверху в sapi удалить надо строчки: 'marginLoan': {'url': 'sapi/v1/margin/loan', 'method': 'POST', 'private':True}, 'marginRepay': {'url': 'sapi/v1/margin/repay', 'method': 'POST', 'private':True}, они дублируются внизу ))
  22. Andrei22

    Binance Margin

    типа вот так: 'marginLoanG': {'url': 'sapi/v1/margin/loan', 'method': 'GET', 'private': True}, 'marginRepayG': {'url': 'sapi/v1/margin/repay', 'method': 'GET', 'private': True}, а иначе он постом продолжает занимать )))
  23. Andrei22

    Binance Margin

    еще два не учтенных ! 'marginLoan': {'url': 'sapi/v1/margin/loan', 'method': 'POST', 'private': True}, 'marginRepay': {'url': 'sapi/v1/margin/repay', 'method': 'POST', 'private': True}, они должны быть еще с GETот чтоб получать значения Query loan record (USER_DATA) Get /sapi/v1/margin/loan Weight: 5 Parameters: Name Type Mandatory Description asset STRING YES txId LONG NO the tranId in POST /sapi/v1/margin/loan startTime LONG NO endTime LONG NO current LONG NO Currently querying page. Start from 1. Default:1 size LONG NO Default:10 Max:100 recvWindow LONG NO timestamp LONG YES txId or startTime must be sent. txId takes precedence. и repay тоже добавить GET
×
×
  • Создать...