Увеличение указателя на динамический массив - PullRequest
0 голосов
/ 24 сентября 2019

Меня интересуют два класса: 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)
...