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

Andrei22

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

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

  • Посещение

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

    1

Последний раз Andrei22 выиграл 27 марта

Публикации Andrei22 были самыми популярными!

Репутация

1 Neutral

Посетители профиля

Блок посетителей профиля отключен и не будет отображаться другим пользователям

  1. На бинансе, и переведенное у Андрея написано так: Откройте подключение к Open a stream to wss://stream.binance.com:9443/ws/bnbbtc@depth Собирайте в буфер информацию, которую получите оттуда Получите текущую информацию (слепок) по стаканам с адреса https://www.binance.com/api/v1/depth?symbol=BNBBTC&limit=1000 У себя в буфере удалите (и не принимайте) все события, у которых u <= lastUpdateId слепка и u > lastUpdateId+1 Каждое новое событие стрима должно быть выше предыдущего u на единицу Данные в каждом событии – абсолютные значения текущей цены и объема Если объем 0, удалите у себя цену Получение данных с 0, которых нет у вас в книге, допускается, и не является какой-либо ошибкой. Получается по api взял слепок из 1000 ордеров, а далее начиная 4 пункта лажа. Ну отфильтрую нулевые объемы, проверю что u новое, а сам updatedepth дает по 10-15 ордеров из них половина с нулевым объемом. Ну даже так, останется 5-10 ордеров свежих, обновлю я их, а остальные то 100, 500, 700 и т.п. их уже может убрали и нет того объема уже! Вопрос есть ли все таки способ по WS брать стаканы (более 30 хотя бы)? Например мне надо для того если ордер выставляю на продажу по маркету на "овномонете" скажем на 50к USDT, чтоб я мог подсчитать среднюю цену которая получится и не напрягать весом в 10 через API.
  2. Andrei22

    Bot для Binance с MACD

    pip install numpy надо еще (На win, пуск->выполнить->cmd)
  3. Andrei22

    Bot для Binance с MACD

    Это работает? Не совсем понятен stoch для чего, он более точный и не так прыгает как простой rsi?
  4. Andrei22

    Бот для Yobit

    в сторону интернета )) Ответа от биржи походу нет. Ключи api прописаны? Модули питона все установлены (pip install .......)? если включали уже до этого, увеличьте число nonce ))
  5. возможно все ))) У вас сейчас написано скорее всего amount + profit + fee, сделайте amount чтоб брал как свободный баланс с биржи. Одновременно несколько пар: Считаете сколько пар активных не купивших quote, делите свободную сумму на кол-во этих пар. Скажем у вас 100$ на четыре пары, первый раз поделится по 25 всем, если две пары скажем продадут за 26 и 28$, то у вас будет 54$ на свободные пары, "функция" их поделит вам по 27$. Если продастся одна пара из четырех, например за 40$ то она одна и будет использовать весь свободный баланс ))
  6. Буржуи пишут что вроде и этого хватает ))) while True: try: ws.run_forever() except: pass 
  7. В продолжение по вебсоектам ))) Как правильно делать реконнект? Не пойму проблему, вроде работает и 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() то же заново не подключиться. Запутался уже как правильно рестарт сделать )))) То что написано выше, это последнее что придумал, но не уверен и не знаю как проверить правильно ли и одно соединение так получается хоть и работает больше суток.
  8. Andrei22

    Bot для Binance с MACD

    # Получаем по ордеру последнюю информацию по бирже stock_order_data = bot.orderInfo(symbol=orders_info[order]['order_pair'], orderId=order) order_status = stock_order_data['status'] после добавить: pair _name = orders_info[order]['order_pair']
  9. Andrei22

    Bot для Binance с MACD

    При вызове функции chek_indicators не определена пара "pair_name", другими словами на строке 334 вы хотите запустить функцию но не указываете какаю пару надо проверять. Если у вас бот работает с одной парой то просто в начале пропишите где нибудь pair_name='BTCUSDT' или что там у вас. Если много парный бот, то место где вы создаете pair_name должно быть раньше чем строка 334 где вы ее используете.
  10. macd, macdsignal, macdhist = talib.MACD(closeBar['close'], fastperiod=12, slowperiod=26, signalperiod=9) Еще ни где не увидел, closeBar['close'] кол-во влияет на точность того что он вернет, если подсовываешь klines 5m? 100, 200, 500, 1000?
  11. Эх эти сокеты )) Несколько дней мучаюсь как сделать структуру. Надо 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 не хватает )
  12. Стандартные сервера для обновления времени по интернету вечно заняты и обновляются с 20ой попытки, и если учесть что попытка эта делается раз в неделю по дефолту, то практически время автоматом и не обновляется. Вот кому надо способ: Сервера синхронизации для РФ: 0.ru.pool.ntp.org, 1.ru.pool.ntp.org, 2.ru.pool.ntp.org Как изменить период синхронизации времени в Windows: Все довольно просто. Открываем редактор реестра, для этого выбираем Пуск-Выполнить и вводим команду regedit далее следуем по следующему пути: HKEY_LOCAL_MACHINE SYSTEM CurrentControlSet Services W32Time TimeProviders NtpClient SpecialPollInterval параметр SpecialPollInterval именно то, что нам нужно. Он содержит в себе количество секунд — период обновления синхронизации времени в системе. По умолчанию равен 604800 секунд (не забываем для удобства поставить десятичную систему счисления вместо шестнадцатеричной) Таким образом если мы хотим к примеру, чтобы время синхронизировалось раз в 3 часа, то 60 секунд в минуте*60 минут в часе * 3 часа = 10800 секунд. Меняем значение параметра SpecialPollInterval на ваше количество секунд (не забываем посмотреть чтобы была отмечена десятичная система) Чтобы измененения вступили в силу, необходимо либо перезагрузить систему, либо выполнить следующую команду, которая обновит данные w32tm /config /update Делаем это также как запускали редактор реестра (Пуск-Выполнить) Проверяем, обновляя время кнопкой «Обновить сейчас«, и смотрим строчку «Следующее выполнение синхронизации:
  13. Он не сработает на yobit, там нет продажи по рынку. 1. Цена поднимется до пика, опустится до stop_loss_fiexed, создаст лимитный ордер на продажу и все ! Цена будет падать, ордер будет висеть. 2. Если только все верхние ордера выгрызать по очереди, но там куча ботов вверху по 10 копеек ))
  14. Вот источник где это брал https://github.com/sammchardy/python-binance/issues/188 убрав мне ненужное останется: import numpy as np import matplotlib.pyplot as plt from binance_api import Binance bot = Binance( API_KEY='', API_SECRET='' ) # offers = bot.depth( # symbol='BNBBTC', # limit=100 # ) # prices = [float(bid[0]) for bid in offers['bids']] # prices = np.array(prices) prices = np.array([0.00061422, 0.00061422, 0.00061593, 0.00061672, 0.0006161, 0.00061233, 0.000615, 0.00061305, 0.00061346, 0.00061417, 0.00061428, 0.00061418, 0.0006115, 0.00061203, 0.0006125, 0.00061295, 0.00061296, 0.00061295, 0.00061242, 0.00061144, 0.00060874, 0.00060661, 0.00060512, 0.00060931, 0.000611, 0.0006129, 0.00061296, 0.000613, 0.00061138, 0.0006115, 0.0006123, 0.0006123, 0.00061288, 0.00061494, 0.000615, 0.0006146, 0.00061488, 0.00061399, 0.00061285, 0.0006129, 0.0006129, 0.00061291, 0.0006134, 0.00061338, 0.00061355, 0.0006139, 0.00061475, 0.0006167, 0.0006158, 0.000617, 0.00061638, 0.00061452, 0.0006164, 0.00061641, 0.00061646, 0.00061898, 0.0006198, 0.00061818, 0.00061922, 0.00061979, 0.00061977, 0.00061924, 0.00061626, 0.00061488, 0.000616, 0.000616, 0.00061693, 0.0006165, 0.0006165, 0.00061699, 0.00061685, 0.00061687, 0.00061691, 0.000617, 0.00061784, 0.00061899, 0.0006177, 0.000617, 0.00061732, 0.0006176, 0.0006174, 0.00061739, 0.00061739, 0.00061794, 0.0006185, 0.0006185, 0.00061785, 0.00061735, 0.00061743, 0.00061742, 0.00061429, 0.0006152, 0.00061451, 0.00061514, 0.0006143, 0.000614, 0.0006154, 0.0006148, 0.00061444, 0.00061572]) def relative_strength(prices, n=14): """ compute the n period relative strength indicator http://stockcharts.com/school/doku.php?id=chart_school:glossary_r#relativestrengthindex http://www.investopedia.com/terms/r/rsi.asp """ deltas = np.diff(prices) seed = deltas[:n + 1] up = seed[seed >= 0].sum() / n down = -seed[seed < 0].sum() / n rs = up / down rsi = np.zeros_like(prices) rsi[:n] = 100. - 100. / (1. + rs) for i in range(n, len(prices)): delta = deltas[i - 1] # cause the diff is 1 shorter if delta > 0: upval = delta downval = 0. else: upval = 0. downval = -delta up = (up * (n - 1) + upval) / n down = (down * (n - 1) + downval) / n rs = up / down rsi[i] = 100. - 100. / (1. + rs) return rsi rsi = relative_strength(prices) wins = 80 ### rsi plt.subplot2grid((8, 1), (5, 0)) plt.plot(rsi[-wins:], color='black', lw=1) plt.axhline(y=30, color='red', linestyle='-') plt.axhline(y=70, color='blue', linestyle='-') plt.show() Вот так как есть показывает RSI, пробовал заменить prices как выше закоментированно, то rsi всегда 0, на любых парах. Всю голову сломал почему когда price вручную прописан все показывает, когда берешь его через api то 0. Так же не понятно как реализовано что тут 14 дней, видно что n=14, тогда список price должен состоять из суточных данных? ))) Чувствую что должно быть не сложно, только запутался ))) По идеи грубо надо if rsi <=30 {можно покупать} if rsi >70 {можно продавать}
×
×
  • Создать...