请教一下, 有些软件中的几日和的算法

ayun00 2015-09-01 11:04:57
最近玩股票,看到有的软件中有5日,10日涨跌幅的数据

我自己试着写了 一个 , 但是 算的很慢, 但是股票软件中还是即时数据, 怎么那么快呢?

我的算法如下


//历史价格集合
var list = dal.GetModelList(dal.SerialSafeSearchkey(mo)).OrderByDescending(x => x.PriceDateTime);
System.Diagnostics.Debug.WriteLine("GetModelList时间:"+ t.GetElapsedTime());
//股票集合
List<Model.stockcodelist> stlist = new List<Model.stockcodelist>();
foreach (var item in StockCodeList)
{
string code = item.Substring(2);
//当前股票价格集
var temp = list.Where(x => x.StockCode == code);
if (temp.Count() > 0)
{
Model.StockHistoryPrices_MD now = temp.ElementAt(0);
//三日数据集
var threeq = temp.Take(3);
//5日数据集
var fiveq = temp.Take(5);
//七日数据集
var sevenq = temp.Take(7);
//十日数据集
var tenq = temp.Take(10);

stlist.Add(new
Model.stockcodelist
{
stockcode = code,
data = now.PriceDateTime,
price = now.EndPrice,
ChangePrice = now.ChangePrice,
DailyVolume = now.DailyVolume,
TurnoverTotal = now.TurnoverTotal,
OfPrice = now.OfPrice
,
threeDailyVolume = threeq.Sum(x => x.DailyVolume),
threeTurnoverTotal =threeq.Sum(x => x.TurnoverTotal),
threeOfPrice = threeq.Last().EndPrice / now.EndPrice - 1,
threeprice = threeq.Last().EndPrice,
threeChangePrice = now.EndPrice - threeq.Last().EndPrice
,
fiveDailyVolume = fiveq.Sum(x => x.DailyVolume),
fiveTurnoverTotal = fiveq.Sum(x => x.TurnoverTotal),
fiveOfPrice = fiveq.Last().EndPrice / now.EndPrice - 1,
fiveprice = fiveq.Last().EndPrice,
fiveChangePrice = now.EndPrice - fiveq.Last().EndPrice
,
sevenDailyVolume = sevenq.Sum(x => x.DailyVolume),
sevenTurnoverTotal = sevenq.Sum(x => x.TurnoverTotal),
sevenOfPrice = sevenq.Last().EndPrice / now.EndPrice - 1,
sevenprice = sevenq.Last().EndPrice,
sevenChangePrice = now.EndPrice - sevenq.Last().EndPrice
,
tenDailyVolume = tenq.Sum(x => x.DailyVolume),
tenTurnoverTotal = tenq.Sum(x => x.TurnoverTotal),
tenOfPrice = tenq.Last().EndPrice / now.EndPrice - 1,
tenprice = tenq.Last().EndPrice,
tenChangePrice = now.EndPrice - tenq.Last().EndPrice
,
tenminprice = temp.Take(10).Min(x => x.MinimumPrice),
tenmaxprice = temp.Take(10).Max(x => x.MaximumPrice)

});
}
}
...全文
121 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuzuning 2015-09-01
  • 打赏
  • 举报
回复
不太清楚你的数据是怎么组织的,为什么会有求和(sum)? 5日涨跌幅不就是当日收盘价(即时交易价)减去5日前的收盘价吗?
ayun00 2015-09-01
  • 打赏
  • 举报
回复
引用 8 楼 wanghui0380 的回复:
问题给复杂了。 1.其实5,10和1天其实都一样,如果你把5天数据看成一天,那么他还是开盘价,收盘价(如果你只要计算涨幅滴话,有这两个就ok,即5前天前开盘价到现价(收盘价或现价)的涨幅就是5天的涨幅) 2.有关TOP n算法一般是桶排序(也有堆排),因为他无需计算其他的东西,他只需要计算这n个,比其他滴大就成
那我在循环外排好序后,在循环内不排序 为什么比在循环外不排序, 循环内排序 慢呢?
wanghui0380 2015-09-01
  • 打赏
  • 举报
回复
问题给复杂了。 1.其实5,10和1天其实都一样,如果你把5天数据看成一天,那么他还是开盘价,收盘价(如果你只要计算涨幅滴话,有这两个就ok,即5前天前开盘价到现价(收盘价或现价)的涨幅就是5天的涨幅) 2.有关TOP n算法一般是桶排序(也有堆排),因为他无需计算其他的东西,他只需要计算这n个,比其他滴大就成
  • 打赏
  • 举报
回复
其实我根本没看你的代码,我只是告诉你一般的做法而已……
  • 打赏
  • 举报
回复
就拿今天做例子 今天之前的数据都是已经汇总了的数据,假定就存在关系型数据库里,数据表为XXXHistory 然后当天实时的数据在XXX20150901表里,然后实际查时,就是并发同时插两张表的数据,XXX20150901需要进行实时汇总,XXXHistory就是简单的读取或者简单的汇总(因为每条数据都对应一天的数据,所以数据量很小,汇总起来也就很快了)
ayun00 2015-09-01
  • 打赏
  • 举报
回复
我还发现一个问题 我在循环外 var list = dal.GetModelList(dal.SerialSafeSearchkey(mo)); 不排序 在循环内 var temp = list.Where(x => x.StockCode == code).OrderByDescending(x => x.PriceDateTime); 排序 执行的时间大概是70秒 如果 我把OrderByDescending(x => x.PriceDateTime); 放在循环外 ,执行时间就变成了350多秒
ayun00 2015-09-01
  • 打赏
  • 举报
回复
引用 3 楼 starfd 的回复:
汇总数据慢有啥关系呢,一天也就一次……
但是我看别人的软件上面都是实时变的啊
  • 打赏
  • 举报
回复
汇总数据慢有啥关系呢,一天也就一次……
ayun00 2015-09-01
  • 打赏
  • 举报
回复
引用 1 楼 starfd 的回复:
这种都是汇总数据,怎么可能即时数据…… 就算要即时部分,也就是当天的是即时,过去的都是汇总数据
我现在就是算汇总数据慢啊 , 大概要运行一分多钟 所以我想 肯定是我算法那里有问题
  • 打赏
  • 举报
回复
这种都是汇总数据,怎么可能即时数据…… 就算要即时部分,也就是当天的是即时,过去的都是汇总数据
ayun00 2015-09-01
  • 打赏
  • 举报
回复
引用 10 楼 xuzuning 的回复:
不太清楚你的数据是怎么组织的,为什么会有求和(sum)? 5日涨跌幅不就是当日收盘价(即时交易价)减去5日前的收盘价吗?
还有这几天中的成交量啊

110,537

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧