private async void CancelAllButton_Click(object sender, EventArgs e) { OrderCheckTimer.Stop(); SetCancelResult("Waiting"); var result = await BitFlyerApiModel.CancelAllChildOrder(); SetCancelResult(result ? "SUCCESS" : "FAILED"); if (result) { OrderGridView_Timer(null, null); } OrderCheckTimer.Start(); }
private async void OrderGridView_CellClick(object sender, DataGridViewCellEventArgs e) { DataGridView grid = (DataGridView)sender; if (grid.Columns[e.ColumnIndex].Name == "Cancel") { OrderCheckTimer.Stop(); SetCancelResult("Waiting"); var id = grid["ChildOrderAcceptanceId", e.RowIndex].Value.ToString(); var result = await BitFlyerApiModel.CancelChildOrder(id); SetCancelResult(result ? "SUCCESS" : "FAILED"); // 成功時、リスト更新を呼んでおく if (result) { OrderGridView_Timer(null, null); } OrderCheckTimer.Start(); } }
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; }