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

            foreach (var so in activeStopOrders)
            {
                if (!_stoporder_rid_lid.Values.Contains(so.StopOrderID))
                {
                    continue;
                }

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

            if (rStopOrders == null)
            {
                return;
            }

            foreach (var rso in rStopOrders)
            {
                var lso = activeStopOrders.FirstOrDefault(r => r.StopOrderID == _stoporder_rid_lid[rso.StopOrderID]);
                if (lso == null)
                {
                    continue;
                }

                bool isUpdate = false;
                if (rso.AlertPrice != lso.AlertPrice)
                {
                    lso.AlertPrice = rso.AlertPrice; isUpdate = true;
                }
                if (rso.BuySell != lso.BuySell)
                {
                    lso.BuySell = rso.BuySell; isUpdate = true;
                }
                if (rso.CompleteTime != lso.CompleteTime)
                {
                    lso.CompleteTime = rso.CompleteTime; isUpdate = true;
                }
                if (rso.EndTime != lso.EndTime)
                {
                    lso.EndTime = rso.EndTime; isUpdate = true;
                }
                if (rso.LotCount != lso.LotCount)
                {
                    lso.LotCount = rso.LotCount; isUpdate = true;
                }
                if (rso.Price != lso.Price)
                {
                    lso.Price = rso.Price; isUpdate = true;
                }
                if (rso.Status != lso.Status)
                {
                    lso.Status = rso.Status; isUpdate = true;
                }
                if (rso.StopOrderNo != lso.StopOrderNo)
                {
                    lso.StopOrderNo = rso.StopOrderNo; isUpdate = true;
                }
                if (rso.StopType != lso.StopType)
                {
                    lso.StopType = rso.StopType; isUpdate = true;
                }
                if (rso.Time != lso.Time)
                {
                    lso.Time = rso.Time; isUpdate = true;
                }

                if (isUpdate)
                {
                    _accountDA.UpdateStopOrder(lso);
                }
            }

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

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

            if (newRemoteStopOrders == null)
            {
                return;
            }

            foreach (var rso in newRemoteStopOrders)
            {
                if (!_instrum_rid_lid.ContainsKey(rso.InsID))
                {
                    continue;                                           // не смогли установить соответствие инструментов
                }
                var sOrd = _accountDA.CreateStopOrder(localAccountID, rso.Time, _instrum_rid_lid[rso.InsID], rso.BuySell, rso.StopType, rso.EndTime,
                                                      rso.AlertPrice, rso.Price, rso.LotCount, rso.Status, rso.CompleteTime, rso.StopOrderNo);
                _stoporder_rid_lid.Add(rso.StopOrderID, sOrd.StopOrderID); // новое соответствие идентификаторов
            }
        }
示例#2
0
        /// <summary>
        /// Полная синхронизация стоп-заявок
        /// </summary>
        private async Task SyncStopOrdersFull(ISyncPipeServer sps, int localAccountID, int remoteAccountID)
        {
            var remStopOrders = await sps.GetStopOrders(remoteAccountID, 0);

            if (remStopOrders == null)
            {
                return;
            }

            var stopOrders = _accountDA.GetStopOrders(localAccountID, false);

            foreach (var rso in remStopOrders)
            {
                int insID = 0; // пытаемся сопоставить инструмент
                if (_instrum_rid_lid.ContainsKey(rso.InsID))
                {
                    insID = _instrum_rid_lid[rso.InsID];
                }
                if (insID == 0)
                {
                    continue;             // если не смогли сопоставить инструмент, то ничего больше сделать не можем
                }
                if (_stoporder_rid_lid.ContainsKey(rso.StopOrderID))
                {
                    int lid       = _stoporder_rid_lid[rso.StopOrderID];
                    var stopOrder = stopOrders.FirstOrDefault(r => r.StopOrderID == lid);
                    if (stopOrder != null) // локальный найден
                    {
                        // сравниваем все по полной, хотя в реальности объект не может так сильно меняться
                        bool isUpdate = false;
                        if (stopOrder.InsID != insID)
                        {
                            stopOrder.InsID = insID; isUpdate = true;
                        }
                        if (stopOrder.AlertPrice != rso.AlertPrice)
                        {
                            stopOrder.AlertPrice = rso.AlertPrice; isUpdate = true;
                        }
                        if (stopOrder.BuySell != rso.BuySell)
                        {
                            stopOrder.BuySell = rso.BuySell; isUpdate = true;
                        }
                        if (stopOrder.LotCount != rso.LotCount)
                        {
                            stopOrder.LotCount = rso.LotCount; isUpdate = true;
                        }
                        if (stopOrder.Status != rso.Status)
                        {
                            stopOrder.Status = rso.Status; isUpdate = true;
                        }
                        if (stopOrder.StopOrderNo != rso.StopOrderNo)
                        {
                            stopOrder.StopOrderNo = rso.StopOrderNo; isUpdate = true;
                        }
                        if (stopOrder.StopType != rso.StopType)
                        {
                            stopOrder.StopType = rso.StopType; isUpdate = true;
                        }
                        if (stopOrder.Time != rso.Time)
                        {
                            stopOrder.Time = rso.Time; isUpdate = true;
                        }
                        if (stopOrder.Price != rso.Price)
                        {
                            stopOrder.Price = rso.Price; isUpdate = true;
                        }
                        if (stopOrder.EndTime != rso.EndTime)
                        {
                            stopOrder.EndTime = rso.EndTime; isUpdate = true;
                        }
                        if (stopOrder.CompleteTime != rso.CompleteTime)
                        {
                            stopOrder.CompleteTime = rso.CompleteTime; isUpdate = true;
                        }

                        if (isUpdate)
                        {
                            _accountDA.UpdateStopOrder(stopOrder);
                        }
                    }
                    else // соответствие есть, но локальный не найден, значит соответствие уже не действительно
                    {
                        _stoporder_rid_lid.Remove(rso.StopOrderID); // удаляем старое соответствие
                        var so = _accountDA.CreateStopOrder(localAccountID, rso.Time, insID, rso.BuySell, rso.StopType, rso.EndTime, rso.AlertPrice, rso.Price,
                                                            rso.LotCount, rso.Status, rso.CompleteTime, rso.StopOrderNo);
                        _stoporder_rid_lid.Add(rso.StopOrderID, so.StopOrderID);
                    }
                }
                else // соответствие не найдено
                {
                    var so = _accountDA.CreateStopOrder(localAccountID, rso.Time, insID, rso.BuySell, rso.StopType, rso.EndTime, rso.AlertPrice, rso.Price,
                                                        rso.LotCount, rso.Status, rso.CompleteTime, rso.StopOrderNo);
                    _stoporder_rid_lid.Add(rso.StopOrderID, so.StopOrderID);
                }
            }
        }