Beispiel #1
0
        private async void OrderGridView_Timer(object sender, EventArgs e)
        {
            lock (orderListLock)
            {
                if (orderTimerLockFlg)
                {
                    return;
                }
                orderTimerLockFlg = true;
            }
            OrderCheckTimer.Stop();

            /**
             * DataGridに表示したいもの
             * 注文命令を出して、child_ochild_order_acceptance_idが発行されたが、注文一覧に未反映の物
             * 注文一覧に反映済みのもの
             * 注文処理が終わったものは消去
             **/
            var list = await BitFlyerApiModel.GetOrderList();

            if (list != null)
            {
                // 最新のchild_order_listを保存
                var orderRecodeSet = new HashSet <string>();

                list.ForEach(info =>
                {
                    // 注文情報を生成
                    var orderInfo = new OrderInfo()
                    {
                        //OrderDateTime
                        //ServerResponsedTime
                        //ElapsedTime
                        OrderType              = info.child_order_type,
                        OrderAcceptTime        = Util.FormatDateIsoToLocal(info.child_order_date, Util.DATETIME_FORMAT_MDHMS),
                        ExpireDate             = Util.FormatDateIsoToLocal(info.expire_date, Util.DATETIME_FORMAT_MDHMS),
                        Side                   = info.side,
                        OrderPrice             = info.price,
                        OrderSize              = info.size,
                        RemainingSize          = info.outstanding_size,
                        AveragePrice           = info.average_price,
                        Cancel                 = "×",
                        ChildOrderAcceptanceId = info.child_order_acceptance_id,
                        ChildOrderId           = info.child_order_id
                    };

                    orderRecodeSet.Add(info.child_order_acceptance_id);

                    lock (bsMap)
                    {
                        if (bsMap.ContainsKey(info.child_order_acceptance_id))
                        {
                            // 既にGridに追加されていれば上書きする
                            // 未承認データの場合は、その項目を追加してから上書きする
                            var index = orderBs.List.IndexOf(bsMap[info.child_order_acceptance_id]);
                            if (!orderInfo.Equals(orderBs.List[index]))
                            {
                                // このデータだけは注文時の物を利用するので引き継ぐ
                                orderInfo.OrderDateTime = ((OrderInfo)orderBs.List[index]).OrderDateTime;
                                orderBs.List[index]     = orderInfo;
                                bsMap[info.child_order_acceptance_id] = orderInfo;
                            }
                        }
                        else
                        {
                            // bsMapとGridに追加する
                            orderBs.Add(orderInfo);
                            bsMap.Add(info.child_order_acceptance_id, orderInfo);
                        }
                    }
                });

                lock (bsMap)
                {
                    // 保有済みのデータをチェックし古いデータを取り除く
                    foreach (var childId in bsMap.Keys.Reverse())
                    {
                        // 最新情報にあるのでスルー
                        if (orderRecodeSet.Contains(childId))
                        {
                            continue;
                        }

                        var orderInfo = bsMap[childId];
                        // 今回の確認リストにないが、既に承認済みのレコードは消去
                        // 注文確定待ち(childOrderIdが未発行の物は残したい)
                        if (orderInfo.ChildOrderId != null ||
                            orderInfo.CheckCounter++ > 30)
                        {
                            orderBs.List.Remove(bsMap[childId]);
                            bsMap.Remove(childId);
                        }
                    }
                    // タイミングが悪いと、orderBsだけ残る場合がある
                    // Lockを増やすより、上書きした方がコストがかからない
                    if (bsMap.Count() == 0)
                    {
                        orderBs.Clear();
                    }
                }
            }
            OrderCheckTimer.Start();
            lock (orderListLock) orderTimerLockFlg = false;
        }