NOTA: Questo è in riferimento alla domanda I chiesto su Stack Overflow , ma è stato detto di postare questo qui
Sto costruendo un'applicazione di trading che corrisponde a compratori / venditori che possiedono un abbonamento. Gli abbonamenti hanno una certa quantità di quantità per un certo periodo di tempo. Ci sono 8 tipi di ordine che sono:
- Acquista / vendi abbonamento (può essere parzialmente compilato in relazione alla quantità o al tempo)
- Compra / vendi tutto l'abbonamento alla quantità (può essere riempito solo parzialmente in base al tempo)
- Acquista / vendi abbonamento a tempo indeterminato (può essere riempito solo parzialmente in relazione alla quantità)
- Compra / vendi tutto l'abbonamento per quantità e tempo (non può essere riempito parzialmente, tutto o niente)
Ogni utente che riempie il
Esempio 1
Supponendo che tutti gli ordini in questo esempio possano essere parzialmente riempiti per quanto riguarda la quantità e il tempo consenta di dire che l'utente A effettua un ordine di acquisto chiedendo 100 azioni tra 1/2/2014 - 1/3/2014 (gg / mm / aaaa) .
Al momento sono presenti 4 ordini di vendita nel book degli ordini
- L'utente B vende 25 azioni tra 1/1/2014 - 5/1/2014
- L'utente C vende 50 azioni tra 1/1/2014 - 15/2/2014
- L'utente D vende 70 azioni tra il 10/2/2014 e il 1/7/2014
- L'utente E vende 5 azioni tra il 15/2/2014 e il 25/2/2014
Quale apparirebbe
User A |--------------100-----------|
User B |----------------------------25-----------------------|
User C |-------------------50---|
User D |--------------70------------------|
User E |--5--|
Dopo aver eseguito la corrispondenza, ogni ordine degli utenti nel libro degli ordini sarà simile a
User A |-25--| |----5-----|
User B |------25----| |----25-----|
User C |------50----|
User D |----70-----|
User E has no open orders
Dopo tutto quello che è stato detto e fatto il libro degli ordini sarebbe stato:
- L'utente A acquista 25 azioni tra 1/2/2014 - 10/2/2014
- L'utente A acquista 5 azioni tra il 15/2/2014 e il 1/3/2014
- L'utente B vende 25 azioni tra 1/1/2014 - 1/2/2014
- L'utente B vende 25 azioni tra il 1/3/2014 e il 05/1/2014
- L'utente C sta vendendo 50 azioni tra 1/1/2014 - 1/2/2014
- L'utente D vende 70 azioni tra 1/3/2014 - 1/7/2014
- L'utente E non vende nulla
Esempio 2
Questo esempio è esattamente lo stesso eccetto che l'utente B è di vendere tutto il tipo di abbonamento di quantità e orario. In altre parole, l'utente B vuole vendere la sua intera posizione.
Dopo aver eseguito la corrispondenza, ogni ordine degli utenti nel libro degli ordini sarà simile a
User A |-50--| |--25-|----30----|
User B |----------------------------25-----------------------|
User C |------50----|
User D |-20--| |----70-----|
User E has no open orders
Dopo tutto quello che è stato detto e fatto il libro degli ordini sarebbe stato:
- L'utente A acquista 50 azioni tra 1/2/2014 - 10/2/2014
- L'utente A acquista 25 azioni tra il 15/2/2014 e il 25/3/2014
- L'utente A acquista 30 azioni tra il 25/2/2014 e il 1/3/2014
- L'utente B vende 25 azioni tra 1/1/2014 - 5/1/2014 (non corrisponde nemmeno perché questo ordine non consente il riempimento parziale)
- L'utente C sta vendendo 50 azioni tra 1/1/2014 - 1/2/2014
- L'utente D vende 70 azioni tra il 15/2/2014 e il 25/2/2014
- L'utente D vende 70 azioni tra 1/3/2014 - 1/7/2014
- L'utente E non vende nulla
Processo
Un altro requisito è che devo essere in grado di tenere traccia di come gli ordini sono compilati nel database. Quando entra in gioco l'ordine di acquisto dell'utente A, corrisponderà innanzitutto a quello dell'utente B, che risulterebbe in:
User A |--------------75------------|
User B |------25----| |----25-----|
Entrambi questi stati dovrebbero essere salvati nel database. Una volta completato, l'ordine dell'Utente C viene confrontato, che assomiglia a:
User A |-----25----|------75--------|
User B |------25----| |----25-----|
User C |------50----|
Continua:
User A |--25-| |-------5--------|
User B |------25----| |----25-----|
User C |------50----|
User D |----70-----|
Domanda
Esiste un algoritmo esistente per fare ciò che sto chiedendo?
EDIT : dopo alcune ricerche, sembra che io sia in cerca di un albero ad intervalli o di un segmento in cui posso riassumere ciò che c'è nell'albero per un determinato intervallo di tempo. Tuttavia, devo essere in grado di memorizzare le modifiche all'albero in un database con l'inizio e le date. Ci sono implementazioni là fuori di questo fatto con LINQ o SQL?
EDIT 2: nella mia prima modifica ho pensato che fosse un albero ad intervalli, ma ora sembra più algoritmo di compressione bin