Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 查找属于6小时间隔的30分钟间隔值_C#_Linq - Fatal编程技术网

C# 查找属于6小时间隔的30分钟间隔值

C# 查找属于6小时间隔的30分钟间隔值,c#,linq,C#,Linq,我正在使用Binance.NETNuget包从Binance下载历史蜡烛数据。我会检查每6小时间隔上的蜡烛是否为绿色,如果是绿色,则会列举6小时间隔内的每30分钟间隔 下面的代码给出了一个工作示例。代码片段基本上可以工作,但问题是,与其使用GetKlines再次从Binance的REST下载蜡烛,不如改用\u30m数组,因为每次我们每隔6小时枚举一次GetKlines时,使用GetKlines下载数据会太慢,这就是为什么我一开始就立即提取数据,然后我可以存储它,重复使用它,等等 简单地说,我需要

我正在使用Binance.NETNuget包从Binance下载历史蜡烛数据。我会检查每6小时间隔上的蜡烛是否为绿色,如果是绿色,则会列举6小时间隔内的每30分钟间隔

下面的代码给出了一个工作示例。代码片段基本上可以工作,但问题是,与其使用
GetKlines
再次从Binance的REST下载蜡烛,不如改用
\u30m
数组,因为每次我们每隔6小时枚举一次GetKlines时,使用GetKlines下载数据会太慢,这就是为什么我一开始就立即提取数据,然后我可以存储它,重复使用它,等等

简单地说,我需要找到属于6小时间隔的30分钟间隔蜡烛

使用Binance.Net;
使用Binance.Net.enum;
使用Binance.Net.com接口;
使用Binance.Net.Objects.Spot;
使用Binance.Net.Objects.Spot.MarketData;
使用CryptoExchange.Net.Authentication;
使用Newtonsoft.Json;
使用制度;
使用System.Collections.Generic;
使用System.Linq;
命名空间回溯测试
{
公共类JsonEqualityComparer:IEqualityComparer
{
公共布尔等于(TX,TY)
{
返回字符串。等于
(
JsonConvert.SerializeObject(x),
JsonConvert.SerializeObject(y)
);
}
公共int GetHashCode(T obj)
{
返回JsonConvert.SerializeObject(obj.GetHashCode();
}
}
公共静态部分类LinqExtensions
{
公共静态IEnumerable,使用JSONCompare除外(此IEnumerable第一,IEnumerable第二)
=>第一个。除了(第二个,新的JsonEqualityComparer());
}
/// 
///这门课是最重要的。
/// 
公共类回溯测试
{
私有只读iBanceClient\u客户端;
公开回溯测试()
{
_client=newbinanceclient(newbinanceclientoptions()
{
ApiCredentials=新的ApiCredentials(“xxx”、“yyy”),
自动时间戳=真,
AutoTimestampRecalculationInterval=TimeSpan.FromMinutes(30)
});
}
private readonly DateTime StartDate=新日期时间(2020,1,1);
private readonly DateTime EndDate=new DateTime(2020,10,2);
私有列表GetCandlesByStartDateEndDate(字符串符号、KlineInterval间隔、日期时间开始日期、日期时间结束日期)
{
如果(endDate.Date>DateTime.UtcNow.Date)
抛出新ArgumentOutOfRangeException(“结束日期大于今天”);
var candicts=_client.Spot.Market.GetKlines(symbol,interval,startTime:startDate,endTime:endDate,limit:200)。Data.ToList();
while(endDate>cands.Last().OpenTime)
{
var morecards=_client.Spot.Market.GetKlines(symbol,interval,startTime:cands.Last().OpenTime,endTime:endDate,limit:1000).Data.ToList();
蜡烛。添加范围(更多蜡烛。使用JSONCompare(蜡烛)除外);
}
返回蜡烛.Cast().ToList();
}
二等兵布勒·伊斯坎德莱格林(伊班切克林蜡烛)
{
返回蜡烛。打开<蜡烛。关闭;
}
公开执行
{
var_30m=GetCandlesByStartDateEndDate(“TRXUSDT”,KlineInterval.Thirtimutes,StartDate,EndDate);
var_6h=GetCandlesByStartDateEndDate(“TRXUSDT”,KlineInterval.SixHour,StartDate,EndDate);
//日期匹配-工作正常
var_30m_first=_30m.first();
var_30m_last=_30m.last();
var_6h_first=_6h.first();
var_6h_last=_6h.last();
//列举6h蜡烛和
foreach(var烛光,单位为6h)
{
如果(IsCandleGreen(蜡烛))
{
//30m间隔的哪些蜡烛属于该6h间隔。下面给出了一个示例:
//1)第一次迭代-OpenTime={1/1/2020 12:00:00 AM}
//30米间隔蜡烛位于6小时间隔内
//开放时间={1/1/2020 12:00:00 AM}
//开放时间={1/1/2020 12:30:00 AM}
//开放时间={1/1/2020 1:00:00 AM}
//开放时间={1/1/2020 1:30:00 AM}
//开放时间={1/1/2020 2:00:00 AM}
//开放时间={1/1/2020 2:30:00 AM}
//开放时间={1/1/2020 3:00:00 AM}
//开放时间={1/1/2020 3:30:00 AM}
//开放时间={1/1/2020 4:00:00 AM}
//开放时间={1/1/2020 4:30:00 AM}
//开放时间={1/1/2020 5:00:00 AM}
//开放时间={1/1/2020 5:30:00 AM}
//2)第二次迭代-开放时间={1/1/2020 6:00:00 AM}
//30米间隔蜡烛位于6小时间隔内
//开放时间={1/1/2020 6:00:00 AM}
//开放时间={1/1/2020 6:30:00 AM}
//开放时间={1/1/2020 7:00:00 AM}
//开放时间={1/1/2020上午7:30:00}
//开放时间={1/1/2020上午8:00:00}
//开放时间={1/1/2020上午8:30:00}
//开放时间={1/1/2020上午9:00:00}
//开放时间={1/1/2020上午9:30:00}
//开放时间={1/1/2020 10:00:00 AM}
//开放时间={1/1/2020上午10:30:00}
//开放时间={1/1/2020 11:00:00 AM}
//开放时间={1/1/2020 11:30:00 AM}
var candles=_client.Spot.Market.GetKlines(“TRXUSDT”,KlineInterval.thirtimutes,startTime:candle.OpenTime,endTime:candle.OpenTime.AddHours(6),limit:1000)。Data.SkipLast(1.ToList();//TODO:必须从_30获取值
            const long TICKS_PER_SECOND = 10000000;  //tick = 100ns
            long SIX_HOUR = 6 * 3600 * TICKS_PER_SECOND;

            List<DateTime> dates = new List<DateTime>() {
                DateTime.Parse("1/1/2020 12:00:00 AM"),
                DateTime.Parse("1/1/2020 12:30:00 AM"),
                DateTime.Parse("1/1/2020 1:00:00 AM"),
                DateTime.Parse("1/1/2020 1:30:00 AM"),
                DateTime.Parse("1/1/2020 2:00:00 AM"),
                DateTime.Parse("1/1/2020 2:30:00 AM"),
                DateTime.Parse("1/1/2020 3:00:00 AM"),
                DateTime.Parse("1/1/2020 3:30:00 AM"),
                DateTime.Parse("1/1/2020 4:00:00 AM"),
                DateTime.Parse("1/1/2020 4:30:00 AM"),
                DateTime.Parse("1/1/2020 5:00:00 AM"),
                DateTime.Parse("1/1/2020 5:30:00 AM"),
                DateTime.Parse("1/1/2020 6:00:00 AM"),
                DateTime.Parse("1/1/2020 6:30:00 AM"),
                DateTime.Parse("1/1/2020 7:00:00 AM"),
                DateTime.Parse("1/1/2020 7:30:00 AM"),
                DateTime.Parse("1/1/2020 8:00:00 AM"),
                DateTime.Parse("1/1/2020 8:30:00 AM"),
                DateTime.Parse("1/1/2020 9:00:00 AM"),
                DateTime.Parse("1/1/2020 9:30:00 AM"),
                DateTime.Parse("1/1/2020 10:00:00 AM"),
                DateTime.Parse("1/1/2020 10:30:00 AM"),
                DateTime.Parse("1/1/2020 11:00:00 AM"),
                DateTime.Parse("1/1/2020 11:30:00 AM"),
            };

            var groups = dates.GroupBy(x => x.Ticks/SIX_HOUR).Select(x => x.ToList()).ToList();