Изменения в указателях не сделаны постоянными - PullRequest
0 голосов
/ 20 февраля 2011
struct Limit
    {
    float Price;
    int size;
    int Volume;
    struct Limit *Parent;
    struct Limit *ltChild;
    struct Limit *rtChild;
    struct list_head* Order;
    };
typedef struct Limit Limit;

struct Order
    {   
     double idNum;
     bool BuySell;
         int shares;
     float limitPrice;
         char* entryTime;
     char* eventTime;
         struct list_head ord_Queue;
    };
typedef struct Order Order;
void AddOrder(Order* newOrder,Limit* Limit,HXmap* OrderMap)
 {
    list_add_tail(&newOrder->ord_Queue,Limit->Order);
    HXmap_add(OrderMap,&newOrder->idNum,newOrder);
    Limit->size++;
    Limit->Volume +=newOrder->shares;

 }
void ModifyOrder(float oLimit, int oShares,float nLimit,int nShares,HXmap* LimitMap,HXmap* OrderMap, oBook* OrderBook)
{
    Limit* ParentLimit = (Limit*)HXmap_get(LimitMap,&oLimit);
    if(ParentLimit==NULL)
    {
        printf("ERRONEOUS ORDER\n");
        return;
    }
    struct list_head *pos;
    pos = ParentLimit->Order->next;
    Order* Ord= NULL;
        while(pos!=ParentLimit->Order)   
    {
        Ord = list_entry((pos),Order,ord_Queue);
        if(Ord->shares==oShares)         
        break;                               //found the order
        else pos = pos->next;
    }
    if(pos==ParentLimit->Order && Ord->shares!=oShares)
        {
            printf("ORDER NOT FOUND\n");
            return;
        }
    if(oLimit==nLimit)
    {
        ParentLimit->Volume  = (ParentLimit->Volume + nShares)-oShares;
        Ord->shares = nShares;
    }
    else
    {
               //delete from list
        Ord->ord_Queue.next->prev = Ord->ord_Queue.prev;
        Ord->ord_Queue.prev->next = Ord->ord_Queue.next;
          ParentLimit->size--;
        HXmap_del(OrderMap,&Ord->idNum);
        if(ParentLimit->Volume==Ord->shares)
        {
            if(Ord->BuySell==1)
            OrderBook->buyTree = RemoveLimit(OrderBook->buyTree,ParentLimit,LimitMap);
            else
            OrderBook->sellTree = RemoveLimit(OrderBook->sellTree,ParentLimit,LimitMap);
        }
        else
        ParentLimit->Volume-=Ord->shares;
            Ord->limitPrice = nLimit;
            Ord->shares = nShares;
            INIT_LIST_HEAD(&Ord->ord_Queue);            
            ParentLimit = HXmap_get(LimitMap,&nLimit);
            if(ParentLimit==NULL)
            {
                ParentLimit = Limit_init(nLimit);
                if(Ord->BuySell==1)
                OrderBook->buyTree= AddLimit(OrderBook->buyTree,ParentLimit,LimitMap);
                else
                OrderBook->sellTree = AddLimit(OrderBook->sellTree,ParentLimit,LimitMap);
            }
            AddOrder(Ord,ParentLimit,OrderMap);
    }

}

Хорошо, это длинный код, но большая часть его чисто интуитивно понятна. [Используется list.h Kernel Linked List и связанные с ним функции. Более подробную информацию о KLL можно найти здесь ] Идея заключается в том, когда появляется сообщение об изменении существующего ордера по определенной цене (это финансовый код ), удаляет ордер из предыдущей "очереди" своей старой цены (ParentLimit в ModifyOrder()) находит адрес новой структуры лимитной цены, запрашивая карту, если она не существует, создает новый лимит и добавляет ордер иначе он просто добавляет это.

Теперь я ввожу то же сообщение об изменении ордеров по определенной лимитной цене. Конфигурация перед передачей сообщений:

Limit Price : 181.25, two orders of 250 shares each.

Когда я передаю первое сообщение об изменении, чтобы изменить первый порядок 250 акций с 181.25 до 181.35 (предыдущего предела не существует, поэтому он создаст новый лимит и добавит его в дерево), элемент управления в конечном итоге переходит к AddOrder() следовательно, добавление заказов. Определение функции AddOrder() прилагается, хотя она очень упрощенная и вызывает list_add_tail(), чтобы добавить ее в список.

После первой модификации (и добавления порядка) DDD дает мне такую ​​ситуацию:

Address of ParentLimit: 0x804f1d0
Address of            ->Order: 804f710
Contents of                   ->next: 804dec4
Contents of                   ->prev: 804dec4

Address of Order->ord_Queue (just inserted): 0x804dec4
Contents  of Order->ord_Queue->prev: 0x804f710
Contents of Order->ord_Queue->next: 0x804f710

Показывает, что добавление заказа в очередь прошло успешно.

Когда я передаю второе сообщение, чтобы изменить другой заказ по той же старой цене (от 181,25 до 181,35) и запрашиваю карту, чтобы найти мне адрес новой предельной цены,

Ситуация такова:

Address of ParentLimit: 0x804f1d0
    Address of            ->Order: 804f710
    Contents of                   ->next: 804f710
    Contents of                   ->prev: 804f710

Что означает, что каким-то образом сделанные изменения не были сделаны постоянными. Я не знаю, почему это радует.

1 Ответ

1 голос
/ 24 февраля 2011

Это поведение, которое вы ожидаете, учитывая ваше описание того, куда вы запрашиваете.Эти строки будут удалять заказ из вашего связанного списка до того, как вы запросите карту, чтобы получить ParentLimit для новой цены:

    Ord->ord_Queue.next->prev = Ord->ord_Queue.prev;
    Ord->ord_Queue.prev->next = Ord->ord_Queue.next;

Чтобы уточнить: Limit.Order - указатель.Он будет следовать за заголовком вашего списка, даже если вы переместите его в другие списки.Таким образом, удаление из вашего старого списка заканчивается указателем на ваш новый список, если у вас только один заказ.Вам нужно будет либо сделать его встроенной структурой, либо оставить пустую головку, которая будет пустой как для новых, так и для старых списков.

...