Esempio n. 1
0
static int md_snapshot(struct fast_book *book, struct fast_message *msg)
{
	struct price_level *levels;
	struct fast_decimal price;
	struct fast_field *field;
	struct price_level level;
	char type;
	i64 size;
	u32 ind;

	field = fast_get_field(msg, "MDEntryType");
	if (!field || field_state_empty(field))
		goto fail;

	type = field->string_value[0];
	if (type == '0') {
		levels = book->ob.bids;
	} else if (type == '1') {
		levels = book->ob.asks;
	} else if (type == 'J') {
		book_add_flags(book, FAST_BOOK_EMPTY);
		goto exit;
	} else {
		goto fail;
	}

	field = fast_get_field(msg, "MDPriceLevel");
	if (!field || field_state_empty(field))
		goto fail;

	ind = field->uint_value - 1;

	field = fast_get_field(msg, "MDEntrySize");
	if (!field || field_state_empty(field))
		goto fail;

	size = field->int_value;

	field = fast_get_field(msg, "MDEntryPx");
	if (!field || field_state_empty(field))
		goto fail;

	price = field->decimal_value;
	if (price_align(&price, &book->tick))
		goto fail;

	level.price = price.mnt;
	level.size = size;

	if (set_price_level(levels, book->ob.depth, &level, ind))
		goto fail;

exit:
	return 0;

fail:
	return -1;
}
Esempio n. 2
0
static int md_increment(struct fast_book *book, struct fast_message *msg)
{
	struct fast_decimal price;
	struct fast_field *field;
	struct ob_order order;
	char type;
	i64 size;

	field = fast_get_field(msg, "MDEntryType");
	if (!field || field_state_empty(field))
		goto fail;

	type = field->string_value[0];
	if (type == '0') {
		order.buy = true;
	} else if (type == '1') {
		order.buy = false;
	} else if (type == 'J') {
		book_add_flags(book, FAST_BOOK_EMPTY);
		goto exit;
	} else {
		goto fail;
	}

	field = fast_get_field(msg, "MDEntrySize");
	if (!field || field_state_empty(field))
		goto fail;

	switch (field->type) {
	case FAST_TYPE_INT:
		size = field->int_value;
		break;
	case FAST_TYPE_DECIMAL:
		if (decimal_to_int(&field->decimal_value, &size))
			goto fail;
		break;
	case FAST_TYPE_UINT:
	case FAST_TYPE_STRING:
	case FAST_TYPE_VECTOR:
	case FAST_TYPE_SEQUENCE:
	default:
		goto fail;
	}

	field = fast_get_field(msg, "MDEntryPx");
	if (!field || field_state_empty(field))
		goto fail;

	price = field->decimal_value;
	if (price_align(&price, &book->tick))
		goto fail;

	order.seq_num = book->rptseq;
	order.price = price.mnt;
	order.size = size;

	field = fast_get_field(msg, "MDUpdateAction");
	if (!field || field_state_empty(field))
		goto fail;

	if (field->uint_value == 0) {
		if (ob_level_modify(&book->ob, &order))
			goto fail;
	} else if (field->uint_value == 1) {
		if (ob_level_modify(&book->ob, &order))
			goto fail;
	} else if (field->uint_value == 2) {
		if (book_has_flags(book, FAST_BOOK_ACTIVE)) {
			if (ob_level_delete(&book->ob, &order))
				goto fail;
		} else {
			order.size = 0;
			if (ob_level_modify(&book->ob, &order))
				goto fail;
		}
	} else {
		goto fail;
	}

exit:
	return 0;

fail:
	return -1;
}