Меня интересуют два класса: priceLevel и orderBook.
orderBook - это глобальная переменная, которая содержит указатель на динамический массив указателей priceLevel.priceLevel - это структура данных очереди, которая содержит третий класс с именем orderElement.
Я борюсь с функцией сопоставления ордеров.В частности, с ценовым уровнем.Заказы с тем же уровнем цен правильно сопоставляются с входящим заказом, но как только очередь orderElements для данного priceLevel исчерпана, я не могу перейти к следующему priceLevel.Это странно, потому что увеличение / уменьшение указателя во время первой половины моей функции работает нормально, но затем не работает при применении аналогичным образом позже (см. Ниже).
Моя цель состоит в том, чтобыпросто увеличьте указатель на ячейку памяти исчерпанного уровня цены, так что я приду к следующему уровню цены
Например,
priceLevel* plPointer;
plPointer = &OB.priceLevels[0][0]; // First price level, first orderElement
plPointer++ // Now on OB.priceLevels[1][0];
Классы
class priceLevel {
private:
int price;
int outstandingOrders{};
orderElement* priceHead{nullptr};
orderElement* priceTail{nullptr};
public:
priceLevel(int price);
};
class orderBook {
public:
priceLevel** priceLevels;
orderBook(int price);
};
Конструкторы
orderBook::orderBook(int price) {
priceLevels = new priceLevel*[MAX_OB_PRICE - MIN_OB_PRICE];
for (int i{MAX_OB_PRICE - MIN_OB_PRICE}; i >= 0; i--) {
priceLevels[i] = new priceLevel(price + i);
}
}
priceLevel::priceLevel(int p) : price{p} {
for (int i{ORDER_COUNT}; i >= 0; i--) {
orderSubmitted(randomCharacterGenerator()); //Queue orderElement
}
}
Моя функция placeOrder работает до тех пор, пока ей не понадобится перейти на следующий уровень цены.
Функция
void trader::placeOrder(char side, int quantity, int price) {
priceLevel* plPointer;
if (side == 'B') { // Buy order.
plPointer = &OB.priceLevels[0][0];
while(plPointer->getPrice() != bestAsk) {
plPointer--; // WORKS HERE PERFECTLY
}
do {
while(plPointer->getHead() != NULL && quantity > 0) {
if (plPointer->getHead()->quantity <= orderSize) {
plPointer->getHead()->status = tradeStatus::Filled;
orderSize -= plPointer->getHead()->quantity;
plPointer->removeHead();
} else {
plPointer->getHead()->status = tradeStatus::partiallyFilled;
plPointer->getHead()->quantity -= orderSize;
quantity = 0;
}
executionID++ // Static global variable.
}
if (plPointer->getHead() == NULL) {
bestAsk++; // Static global variable.
plPointer++; // BREAKS HERE!
}
} while (price >= bestAsk && quantity > 0);
Результаты
... // 10 orders per price level. Hits the tenth and dies.
[LIMIT ORDER] (B) Order submitted for 5000 contracts at 8990.
[EXECUTION] 0: Order filled against CPTGM-COXNU-TQRAN-QZLVG-VSEQW
[EXECUTION] 1: Order filled against ZAKAH-ZJEIY-XTEZG-KKWHN-JEGUJ
[EXECUTION] 2: Order filled against ZDNMK-BOMDA-ZHBYF-STVTY-ORFTJ
[EXECUTION] 3: Order filled against IJTWQ-BDJFJ-SDXXX-MJMFW-ZEFKP
[EXECUTION] 4: Order filled against FMDUA-SWOJK-UFPLC-IVQLB-JQNKO
[EXECUTION] 5: Order filled against GJUOV-ITJVT-UJKSS-DQEFY-ZIQSL
[EXECUTION] 6: Order filled against WKELY-OXFVF-MDXIV-FZLWE-TEFMC
[EXECUTION] 7: Order filled against WACJS-XYYCG-CVACG-YIMDB-GMYSR
[EXECUTION] 8: Order filled against JYIPK-PTYRF-XEEMA-YJDLG-LVVML
[EXECUTION] 9: Order filled against NSIRG-RSQAJ-RJNPI-SDNCF-XGUVC
Segmentation fault (core dumped)