示例#1
0
        /// <summary>
        /// Инкрементальная синхронизация заявок
        /// </summary>
        /// <param name="sps">Провайдер синхронизации</param>
        /// <param name="localAccountID">Счет в локальной базе</param>
        /// <param name="remoteAccountID">Счет в базе Leech</param>
        /// <returns></returns>
        private async Task FastSyncOrders(ISyncPipeServer sps, int localAccountID, int remoteAccountID)
        {
            // активные заявки могут измениться
            // по всем активным заявкам составляем список соответствующих remoteID
            List <int> rids         = new List <int>();
            var        activeOrders = _accountDA.GetOrders(localAccountID, true);

            foreach (var so in activeOrders)
            {
                if (!_order_rid_lid.Values.Contains(so.OrderID))
                {
                    continue;
                }

                int rid = _order_rid_lid.First(r => r.Value == so.OrderID).Key;
                rids.Add(rid);
            }
            var rOrders = await sps.GetOrders(rids.ToArray()); // список заявок, которые могут измениться

            if (rOrders == null)
            {
                return;
            }

            foreach (var rord in rOrders)
            {
                var lord = activeOrders.FirstOrDefault(r => r.OrderID == _order_rid_lid[rord.OrderID]);
                if (lord == null)
                {
                    continue;
                }

                bool isUpdate = false;
                if (rord.BuySell != lord.BuySell)
                {
                    lord.BuySell = rord.BuySell; isUpdate = true;
                }
                if (rord.LotCount != lord.LotCount)
                {
                    lord.LotCount = rord.LotCount; isUpdate = true;
                }
                if (rord.Price != lord.Price)
                {
                    lord.Price = rord.Price; isUpdate = true;
                }
                if (rord.Status != lord.Status)
                {
                    lord.Status = rord.Status; isUpdate = true;
                }
                if (rord.OrderNo != lord.OrderNo)
                {
                    lord.OrderNo = rord.OrderNo; isUpdate = true;
                }
                if (rord.Time != lord.Time)
                {
                    lord.Time = rord.Time; isUpdate = true;
                }

                int?soID = null;
                if (rord.StopOrderID != null && _stoporder_rid_lid.ContainsKey(rord.StopOrderID.Value))
                {
                    soID = _stoporder_rid_lid[rord.StopOrderID.Value];
                }
                if (lord.StopOrderID != soID)
                {
                    lord.StopOrderID = soID; isUpdate = true;
                }

                if (isUpdate)
                {
                    _accountDA.UpdateOrder(lord);
                }
            }

            int maxRid = 0; // максимальный реплицированный номер

            if (_order_rid_lid.Keys.Any())
            {
                maxRid = _order_rid_lid.Keys.Max();
            }
            var newRemoteOrders = await sps.GetOrders(remoteAccountID, maxRid + 1); // новые записи, которые появились на сервере и еще не загружались

            if (newRemoteOrders == null)
            {
                return;
            }

            foreach (var rord in newRemoteOrders)
            {
                if (!_instrum_rid_lid.ContainsKey(rord.InsID))
                {
                    continue;                                            // не смогли установить соответствие инструментов
                }
                var ord = _accountDA.CreateOrder(localAccountID, rord.Time, _instrum_rid_lid[rord.InsID], rord.BuySell, rord.LotCount, rord.Price,
                                                 rord.Status, rord.StopOrderID, rord.OrderNo);
                _order_rid_lid.Add(rord.OrderID, ord.OrderID); // новое соответствие идентификаторов
            }
        }
示例#2
0
        /// <summary>
        /// Полная синхронизация заявок
        /// </summary>
        private async Task SyncOrdersFull(ISyncPipeServer sps, int localAccountID, int remoteAccountID)
        {
            var remOrders = await sps.GetOrders(remoteAccountID, 0);

            if (remOrders == null)
            {
                return;
            }

            var orders = _accountDA.GetOrders(localAccountID, false);

            foreach (var rOrd in remOrders)
            {
                int insID = 0; // пытаемся сопоставить инструмент
                if (_instrum_rid_lid.ContainsKey(rOrd.InsID))
                {
                    insID = _instrum_rid_lid[rOrd.InsID];
                }
                if (insID == 0)
                {
                    continue;             // если не смогли сопоставить инструмент, то ничего больше сделать не можем
                }
                // ссылка на стоп-заявку
                int?soID = null;
                if (rOrd.StopOrderID != null && _stoporder_rid_lid.ContainsKey(rOrd.StopOrderID.Value))
                {
                    soID = _stoporder_rid_lid[rOrd.StopOrderID.Value];
                }

                if (_order_rid_lid.ContainsKey(rOrd.OrderID))
                {
                    int lid   = _order_rid_lid[rOrd.OrderID];
                    var order = orders.FirstOrDefault(r => r.OrderID == lid);
                    if (order != null) // локальный найден
                    {
                        // сравниваем все по полной, хотя в реальности объект не может так сильно меняться
                        bool isUpdate = false;
                        if (order.InsID != insID)
                        {
                            order.InsID = insID; isUpdate = true;
                        }
                        if (order.BuySell != rOrd.BuySell)
                        {
                            order.BuySell = rOrd.BuySell; isUpdate = true;
                        }
                        if (order.LotCount != rOrd.LotCount)
                        {
                            order.LotCount = rOrd.LotCount; isUpdate = true;
                        }
                        if (order.Status != rOrd.Status)
                        {
                            order.Status = rOrd.Status; isUpdate = true;
                        }
                        if (order.OrderNo != rOrd.OrderNo)
                        {
                            order.OrderNo = rOrd.OrderNo; isUpdate = true;
                        }
                        if (order.Time != rOrd.Time)
                        {
                            order.Time = rOrd.Time; isUpdate = true;
                        }
                        if (order.Price != rOrd.Price)
                        {
                            order.Price = rOrd.Price; isUpdate = true;
                        }
                        if (order.StopOrderID != soID)
                        {
                            order.StopOrderID = soID; isUpdate = true;
                        }

                        if (isUpdate)
                        {
                            _accountDA.UpdateOrder(order);
                        }
                    }
                    else // соответствие есть, но локальный не найден, значит соответствие уже не действительно
                    {
                        _order_rid_lid.Remove(rOrd.OrderID); // удаляем старое соответствие
                        var ord = _accountDA.CreateOrder(localAccountID, rOrd.Time, insID, rOrd.BuySell, rOrd.LotCount, rOrd.Price, rOrd.Status, soID, rOrd.OrderNo);
                        _order_rid_lid.Add(rOrd.OrderID, ord.OrderID);
                    }
                }
                else // соответствие не найдено
                {
                    var ord = _accountDA.CreateOrder(localAccountID, rOrd.Time, insID, rOrd.BuySell, rOrd.LotCount, rOrd.Price, rOrd.Status, soID, rOrd.OrderNo);
                    _order_rid_lid.Add(rOrd.OrderID, ord.OrderID);
                }
            }
        }