• Как реализовать механизм выполнения ордеров на бирже?

    @rPman
    Для начала я говорю про ядро биржи, которое с высокой вероятностью напрямую недоступно, и клиенты работают с ним через некую прослойку с дополнительным интерфейсом.

    Есть 2 основных метода, зависит от того как именно будет вестись исполнение сделок.

    Первый, децентрализованный - вы не обслуживаете стакан (только как информационный сервис) и предлагаете участникам исполнение выбранных ордеров участников на нужный объем, выступая гарантом escrow и возможно местом хранения балансов (т.е. клиенты выбирают встречный ордер, называют свой объем и биржа на этот объем исполняет ордер), и не важно что там ордера пересекаются по цене (т.е. 'стакан' в виде буквы X) и скорее всего у вас будет свой аффинированный с биржей маркетмейкер, который на привилегированных условиях иметь приоритетное право блокировать ордера и брать их на исполнение. Т.е. это будет некий бот, который запускает на исполнение встречные заявки по пересекающимся ценам а разницу в суммах берет себе, грубый пример у вас есть ордера продажи 1 по $5.1 и покупки 1 по $5.0, очевидно что если оба этих ордера исполнятся то возникает избыток на балансе (грубо говоря вы сначала продаете 1 биткоин получив $5.1 а затем покупаете по $5.0, в остатке $0.1).

    Почему это имеет смысл, все участники биржи не могут знать оперативно о том что происходит у всех, все происходит с некоторым лагом, если в выше описанном примере вы как обычный клиент начнете такую сделку, после первой половины, вторая может обломиться, если ордер исчезает из списка (например его отменяют или меняют цену, если есть такой функционал).

    Биржа может сделать гадость, и дать специально выделенному участнику привилегированные права, например атомарно блокировать чужие ордера (запрет на отмену и исполнение другими на время исполнения), так кормят своего маркетмейкера (у такого еще и комиссии меньше или нулевые) в этом случае все пересекающиеся ордера будут моментально исполняться а без рисковый доход с них будет забирать этот 'трейдер'.

    Второй способ, централизованный - биржа сама обслуживает сделки, сама их исполняет, поэтому в момент размещения ордера она сама же проверяет наличие пересечений и забирает бонусную разницу с ордеров себе сразу, таким образом стакан похож на стакан V.

    Первый способ как это и ожидается, способен обрабатывать огромное количество сделок в секунду, так как сделки совершают сами клиенты а биржа только гарант их исполнения, за балансами можно следить, поставив 100500 серверов, но заметно сложна в реализации.

    Второй способ, очень просто в реализации. Пишется за несколько дней, я для прикола, изучая websocket ReactPHP, делал ядро биржи, которая на симуляциях доходила до 10к сделок в секунду, там зависело от количества лимитных ордеров, которые затрагивают сделки и почти линейно замедляло, полагаю на C++ можно было бы сделать на пару порядков быстрее. Но такой прямой способ обслуживания балансов в оперативной памяти очень опасен для продакшен, например нужно помнить о единичных сбоях в памяти.
    Ответ написан
    Комментировать
  • Есть легкий способ считать комиссию или размер bytes еще не сделанной raw транзакции?

    polym0rph
    @polym0rph
    Основатель Bits.media
    А какие проблемы размер транзакции в байтах прикинуть?
    Вот с комиссией да, там есть сюрпризы. То есть в целом тоже понятно сколько помещается в блок, сколько сейчас транзакций в мемпуле, какие у них комиссии, что в среднем блоки находятся раз в 10 минут, так что можно прикинуть сколько нужно выставить, чтобы по приоритету попасть в ближайший блок или два, например.

    Но это в теории. На практике "в среднем раз в 10 минут" может оказаться частностью, что вот сейчас сеть второй час не может блок найти, и твою транзакцию уже по приоритету опустили сильно вниз новые, с бОльшей комиссией. Тут как вариант только с RBF отправлять транзакцию и докидывать комиссию, в случае наступления подобных событий.

    С другой стороны не хочется сильно переплачивать, т.к. если попадаешь в блок, то совершенно не обязательно быть самым щедрым, тут или попадаешь или нет, никаких преференций за переплату дальше нет.
    Т.е. не остается особо вариантов, кроме как смотреть статистику, считать процентили, постоянно молотить мемпул, чтоб получать в реалтайме данные о транзакциях в нем. Мы для себя такую утилиту запилили, потом выложили в паблик, когда убедились, что оно более-менее нормально предсказывает. Как настраивать приоритеты тут все равно нет какого-то общего правила, кому-то надо в ближайший блок, а кого-то и в течение часа отправка устроит. Так что лучше в целом понимать, что в сети происходит, чтобы принимать решение.
    Ответ написан
    Комментировать
  • На сколько корректно ограничивать js - php кодом?

    ddv88
    @ddv88
    Binance Futures
    Эм...

    const google = document.getElementById("google");
    if (google) {
       google.addEventListener("click", function(event){
       event.preventDefault();
        alertSocket.emit('alertTEST');
      });
    }
    Ответ написан
    Комментировать