← 返回

конвертация текстового ордерлога в S#

Добрый день, извините за беспокойство. Задача следующая есть своя история full ордерлога в формате:

#SYMBOL,SYSTEM,TYPE,ID,ACTION,PRICE,VOLUME,ID_DEAL,PRICE_DEAL

сделки со шлюза поступают в формате:

RIH3,F,B,20130111190000261,9746301221,1,164960.00000,1,0,0 RIH3,F,B,20130111190000261,9746301221,2,164960.00000,1,682802371,157370.00000 RIH3,F,S,20130111190000261,9746300660,2,157370.00000,1,682802371,157370.00000

соответственно я хочу их добавить к той историии что пишет гидра. вопрос1. RIM1@RTS. RIM1@RTS - security.id, а security.UnderlyingSecurityId это что?

вопрос2. для строчек с action = 0 || 1 trade=null и вся информация пишется в ордер в частности: id,time,direction,state,security,price,volume. можно ли остальные поля оставлять непроинициализированные. на какие поля могут выбрасываться исключения при тестировании. например order.status? вопрос3. несмотря на то, что security.decimal=0


 order.Price = Decimal.Parse(Split[6], CultureInfo.InvariantCulture);

естественно пишет в это поле цену со всеми нулями. как этого избежать (если не хочется в ручную сплитить цену)?

вопрос4. самый важный для меня. что делать с order в orderlogitem когда проходит сделка? если его заполнять не будет ли дубляжа прихода заявок? я имею в виду что у нас уже есть заявка которая проинициализировала сделку от строчки RIH3,F,B,20130111190000261,9746301221,1,164960.00000,1,0,0 плюс заявка которая когда-то выставилась.

и две строчки (в случае если больше одной заявки мы не снесли) RIH3,F,B,20130111190000261,9746301221,2,164960.00000,1,682802371,157370.00000 RIH3,F,S,20130111190000261,9746300660,2,157370.00000,1,682802371,157370.00000

и что писать в trade.status. спасибо.

как мне кажется вид обработки одной строчки будет выглядеть примерно так:


string[] Split = CurrentLine.Split(',');
                   if (Split[0] == security.Id)
                   {
                       var orderlogItem = new OrderLogItem();
                       var order = new Order();
                       var trade = new Trade();
                       if (Split[5] == "2")
                       {
                           order=null;
                           trade.Time=DateTime.ParseExact(Split[3], "yyyyMMddHHmmssfff", CultureInfo.InvariantCulture, DateTimeStyles.None);
                           trade.OrderDirection=(Split[2] == "B" ? OrderDirections.Buy : OrderDirections.Sell);
                           trade.Security=security;
                           trade.Id=Int64.Parse(Split[8]);
                           trade.Price=Decimal.Parse(Split[9], CultureInfo.InvariantCulture);
                           trade.Volume=int.Parse(Split[7]);
                           
                       }
                       else
                       {
                           trade=null;
                           order.Time=DateTime.ParseExact(Split[3], "yyyyMMddHHmmssfff", CultureInfo.InvariantCulture, DateTimeStyles.None);
                           order.Direction=(Split[2] == "B" ? OrderDirections.Buy : OrderDirections.Sell);
                           order.Security=security;
                           order.Id=Int64.Parse(Split[4]);
                           order.Price=Decimal.Parse(Split[6], CultureInfo.InvariantCulture);
                           order.Volume=int.Parse(Split[7]);
                           order.State = (Split[5] == "1") ? OrderStates.Active : OrderStates.Done;
                      
                       }

                      
                       orderlogItem.Order = order;
                       orderlogItem.Trade = trade;
                       orderlogItems.Add(orderlogItem);
                   }

评论 (4)

登录创建账户, 登录或注册以发表评论

Mikhail Sukhov
Mikhail Sukhov

Без статуса грустно http://forum.rts.micex.ru/viewtopic.asp?t=24197 Стаканы не собрать правильно

Андрей Шабанов
Андрей Шабанов 作者

то есть без информации order.status ничего тестировать не удастся? необходимо писать гидрой? даже если я буду писать что=нибудь типа


order.Status=OrderStatus.Accepted

и


trade.Status=1;

еще на строчке. orderlogStorage.Save(orderlogItems); выкидывает NullReferenceException. c чем это может быть связано?


            var security = new Security
             {
                 Id = tbx_id.Text,
                 MinStepSize = decimal.Parse(tbx_MinStep.Text),
                 Decimals = int.Parse(tbx_Decimals.Text),
             };

            var orderlogItems = new List<OrderLogItem>();
            var storage = new StorageRegistry();
            var orderlogStorage = storage.GetOrderLogStorage(security);
            string file = filenames[0];

            StreamReader Sr = new StreamReader(path + @"\" + file);
            string CurrentLine = Sr.ReadLine();
            while ((CurrentLine = Sr.ReadLine()) != null)
            {
                string[] Split = CurrentLine.Split(',');
                if (Split[0] == security.Id.Split('@')[0])
                {
                    var orderlogItem = new OrderLogItem();
                    var order = new Order();
                    var trade = new Trade();
                    if (Split[5] == "2")
                    {
                        //order = null;
                        trade.Time = DateTime.ParseExact(Split[3], "yyyyMMddHHmmssfff", CultureInfo.InvariantCulture, DateTimeStyles.None);
                        trade.OrderDirection = (Split[2] == "B" ? OrderDirections.Buy : OrderDirections.Sell);
                        trade.Security = security;
                        trade.Id = Int64.Parse(Split[8]);
                        trade.Price = Decimal.Parse(Split[9], CultureInfo.InvariantCulture);
                        trade.Volume = int.Parse(Split[7]);
                        trade.Status = 1;
                        orderlogItem.Trade = trade;

                    }
                    else
                    {
                       //trader=null;
                        order.Time = DateTime.ParseExact(Split[3], "yyyyMMddHHmmssfff", CultureInfo.InvariantCulture, DateTimeStyles.None);
                        order.Direction = (Split[2] == "B" ? OrderDirections.Buy : OrderDirections.Sell);
                        order.Security = security;
                        order.Id = Int64.Parse(Split[4]);
                        order.Price = Decimal.Parse(Split[6], CultureInfo.InvariantCulture);
                        order.Volume = int.Parse(Split[7]);
                        order.State = (Split[5] == "1") ? OrderStates.Active : OrderStates.Done;
                        orderlogItem.Order = order;
                        order.Status = OrderStatus.Accepted;


                    }


                    //orderlogItem.Order = order;
                    //orderlogItem.Trade = trade;
                    orderlogItems.Add(orderlogItem);
                    if (orderlogItems.Count >= buff)
                    {
                        orderlogStorage.Save(orderlogItems);
                        orderlogItems.Clear();
                    }
                }

            }
            if(orderlogItems.Count!=0)
                orderlogStorage.Save(orderlogItems);
            orderlogItems.Clear();
            
            Sr.Close();

        }

Mikhail Sukhov
Mikhail Sukhov

Андрей Шабанов: то есть без информации order.status ничего тестировать не удастся?

Вы по ссылке пройдите. Там доходчиво сотрудник РТС написал про назначение этого поля.

Garic
Garic

Без статуса не получится ничего. Пример конвертации ОЛ