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

Вот для Binance модифицировать.

Рекомендованные сообщения

Добрый день. Можно ли в боте внести изменения, чтобы бот не выставлял  лимитный ордер на покупку или продажу, а именно покупал по рыночной цене, когда цена подойдет к расчитанной ботом цене на покупку или продажу?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
21.03.2019 в 13:26, Alexus083 сказал:

Добрый день. Можно ли в боте внести изменения, чтобы бот не выставлял  лимитный ордер на покупку или продажу, а именно покупал по рыночной цене, когда цена подойдет к расчитанной ботом цене на покупку или продажу?

Я бы не советовал вам в боте использовать тип ордера "маркет мэйкер". Если планируете выставить ордер на покупку, может сложиться так, что цена коснется нужной вам и резко отскочит назад и бот купит по рынку, но тогда цена уже вам вряд ли понравится.

Используйте вид ордера "TAKE_PROFIT".

Например при выставлении ордера на покупку задавайте такие параметры:

symbol DASHBTC, side BUY ...

stopPrice 0.0227 - ЦЕНА АКТИВАЦИИ ЗАЯВКИ
price 0.02274 - максимальная цена, по которой боту разрешено будет купить.

п.с. В названии темы пишите или четко на англ. Bot или четко на русском: Бот, а не вперемешку, иначе звучит как "Вот" вместо бот.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Если нужно то конечно можно, вот так будет выглядеть непосредственно создание - нужно будет указать кол-во к покупке

res = bot.createOrder(
  symbol=settings['symbol'],
  recvWindow=15000,
  side='BUY',
  type='MARKET',
  quantity=settings['amount']
)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

При заказе истории сделок 'myTrades'

isBestMatch - за что отвечает этот параметр?

Остается догадываться, что тут идет речь о том - исполнен ли мой ордер полностью или нет. Так?

isMaker - надо полагать что если False, то это не мой ордер и в запросе get order даст ошибку.

***

Если в отношении isBestMatch  я думаю не верно, то как тогда узнать - исполнен ли ордер полностью?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

isMaker это значит что покупал не по рынку а по своей цене

isBestMatch - этот параметр всегда true и его можно игнорировать

Что бы узнать, исполнен ли ордер, нужно либо явно проверить его состояние, либо получить уведомление из сокетов, либо сравнить сумму сделки с суммой ордера

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Сокеты - это дополнительный запрос, пока с ними не разбирался.

Сравнить сумму сделки с суммой ордера наверно можно лишь в том случае, если сумма сделки прописана где-то в базе ордеров, сделаных ботом.

Иначе, кроме всего прочего, приходит еще один параметр - quoteQty, ну тут понятно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Эх эти сокеты )) Несколько дней мучаюсь как сделать структуру. Надо 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 не хватает )

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

macd, macdsignal, macdhist = talib.MACD(closeBar['close'], fastperiod=12, slowperiod=26, signalperiod=9)

Еще ни где не увидел, closeBar['close'] кол-во влияет на точность того что он вернет, если подсовываешь klines 5m? 100, 200, 500, 1000?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
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, он будет их запускать при вылетах.

 Я не знаю, какая у вас нагрузка намечается, но мне кажетс многопоточность в этом случае не даст желаемого результата, хотя можно и с ней все сделать

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
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 свечей будет брать и группировать, подсчитывая вторую скользящую и т.п.

В общем, данных должно хватать, и таймфреймы желательно брать помедленнее, но это только вопрос стратегии

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Второй день пристально наблюдаю за ночным режимом binance, пока на паре BNBUSDT.

Картина следующая:

Исполняется ордер, смотрю его по "get order" (статус и т.п.) - выдает: Order does not exist и конечно же с обработкой ордера теперь большие проблеммы.

Хорошо, выставляю ордер вручную, приходит ответ по api что все успешно лимитный ордер выставлен.

Не тут то было... Деньги с баланса сняты, запрос списка активных ордеров выдает пустоту, то есть получился ордер невидимка.

Курс пошел вверх, мою цену проскочили, ордер не исполнен и деньги на баланс не вернулись.

Может через пол часика где-то все образуется, но движуха потеряна.

Кто-нибудь может это пояснить?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

При попытке отправить ордер типа MARKET

получаю ответ:Mandatory parameter 'type' was not sent, was empty/null, or malformed.

Чё ему надо?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
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']
)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Здравствуйте.

Поясните, пожалуйста, что это за айсберг такой всё-таки?)

Создал лимит ордер, где: quantity = 1.01, а icebergQty = 1
Из описания понял что айсберг - это невидимая часть ордера. После исполнения ордера получилось только 1.01 монеты, хотя я расчитывал получить вместе с невидимой частью 2.01/

Сделал запрос по id ордера:
origQty: 1.01000000
icebergQty: 1.00000000
executedQty: 1.01000000
В чем подвох? Как понимать эту штуковину?)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

quantity =1.01, а icebergQty = 1

В книге ордеров должен был появиться ордер с 10% от 1.01 (т.е. 0,101)

Когда его кто-то выкупал, он пополнялся монетами, до тех пор, пока общее проданное кол-во не составило 1.01, цена при этом оставалась той же.

Вы как бы не создавали стенку, видимую для других, но скрывали от них общий объем, удерживая цену

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Подпитывает ордер, который вы создали

Для окружающих выглядит так, что выставлен лимитный ордер, но если его закрыть то выставится еще с такой же ценой и еще и еще

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

В продолжение по вебсоектам )))

Как правильно делать реконнект? Не пойму проблему, вроде работает и 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() то же заново не подключиться. Запутался уже как правильно рестарт сделать )))) То что написано выше, это последнее что придумал, но не уверен и не знаю как проверить правильно ли и одно соединение так получается хоть и работает больше суток.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Буржуи пишут что вроде и этого хватает )))

while True:
        try:
            ws.run_forever()
        except:
            pass 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

я так делал, работает, только убить процесс сложновато

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

ДОБРЫЙ ДЕНЬ,подскажите,пожалуйста,  в простом боте для Binance без индикаторов ..который  v1... как сделать ,чтобы он при покупке для расчета брал   не среднюю цену из стаканов, а  первую...крайнюю цену ? 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Возьмите код из бота для индикаторов, он там как раз покупает по рынку

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Спасибо что ответили ,но Вы не правильно поняли...не надо по рынку...

# Берем цены покупок (для цен продаж замените bids на asks)
                                prices = [float(bid[0]) for bid in offers['bids']]

                                try:
                                    # Рассчитываем среднюю цену из полученных цен
                                    avg_price = sum(prices) / len(prices)

как выделить цену покупки крайнюю в стакане...чтобы бот не высчитывал среднюю цену, а брал одну крайнюю цену...

Изменено пользователем Theankud

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.


×
×
  • Создать...