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

конвертация текстового ордерлога в 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);
                   }


Теги:


Спасибо:


Mikhail Sukhov

Фотография
Дата: 18.01.2013
Ответить


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

Спасибо:

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

Фотография
Дата: 18.01.2013
Ответить


то есть без информации 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

Фотография
Дата: 18.01.2013
Ответить


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

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

Спасибо:

Garic

Фотография
Дата: 18.01.2013
Ответить


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

Спасибо:


Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy