An Orderflow trade aggregator to deploy in the cloud that builds Footprint Candles by aggregating raw trades from Websockets. Supports Binance, Bybit, Okx, and Bitget for now.
-
Clone the repository:
git clone git@github.com:focus1691/orderflow.git
-
Set up a PostgreSQL TimescaleDB instance (Required):
docker run -d --name timescaledb -p 5433:5432 -e POSTGRES_PASSWORD=password timescale/timescaledb-ha:pg14-latest
-
Set up a RabbitMQ instance (optional) to listen for candle closes:
docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin rabbitmq:4.0-management
-
Configure environment variables:
DB_URL
USE_RABBITMQ
RABBITMQ_URL
BINANCE_DOCKER_PORT
BITGET_DOCKER_PORT
BYBIT_DOCKER_PORT
GATEIO_DOCKER_PORT
OKX_DOCKER_PORT
SYMBOLS
-
Build and Run the services:
yarn binance:docker
yarn bitget:docker
yarn gateio:docker
yarn bybit:docker
yarn okx:docker
For historical data processing:
-
Set the following environment variables:
SYMBOLS
: Trading pair(s) to backfill for. Comma-separated values.BACKFILL_START_AT
: Start timestamp (ms)BACKFILL_END_AT
: End timestamp (ms)
-
Run the Binance Backfill service:
yarn start:binance-backfill
The chart-patterns
library has indicators to use the FootPrint candles generated from this service. Below are examples of using the stackedImbalances
and highVolumeNodes
indicators.
A stacked imbalance occurs when there is a cluster of price levels where the volume difference between the bid and ask exceeds a defined threshold. This indicator helps identify aggressive buying or selling.
import { Orderflow } from 'chart-patterns';
const footprintCandlePrices = {
'98891': { volSumAsk: 0.002, volSumBid: 0.611 },
'98892': { volSumAsk: 0.002, volSumBid: 1.49 },
'98893': { volSumAsk: 0.005, volSumBid: 1.386 },
'98894': { volSumAsk: 0.022, volSumBid: 2.58 },
'98895': { volSumAsk: 0.018, volSumBid: 2.18 },
};
const stackedImbalance = Orderflow.detectStackedImbalances(footprintCandlePrices, {
threshold: 200, // Minimum volume imbalance percentage
stackCount: 3, // Number of consecutive imbalances
tickSize: 0.1, // Tick Size (e.g., 0.1 for BTCUSDT)
});
console.log(stackedImbalance);
/*
[
{
imbalanceStartAt: 98891,
imbalanceEndAt: 98895,
stackedCount: 5,
imbalanceSide: "buy"
}
]
*/
A high volume node identifies price levels where significant trading volume occurs, potentially marking areas of interest or support/resistance levels.
const highVolumeNodes = Orderflow.findHighVolumeNodes(footprintCandlePrices, {
threshold: 0.3, // Node Volume Percentage 30%
});
console.log(highVolumeNodes);
/*
[
{
nodePrice: 98894,
totalVolume: 8.305,
sellVolume: 0.022,
buyVolume: 2.58,
nodeVolumePercent: 0.31
}
]
*/