我无法确定任何特定时间的交易时段。
有四个可能的会话,在此图片中显示来自ForexFactory.com
我有这个方法,我需要检查当前时间是在指定的交易时段。
public bool IsTradingSession(TradingSession tradingSession, DateTime currentTime)
{
//currentTime is in local time.
//Regular session is 5PM - next day 5PM, this is the session in the picture.
//Irregular sessions also occur for example late open (3AM - same day 5PM) or early close (5PM - next day 11AM)
DateTime sessionStart = Exchange.ToLocalTime(Exchange.CurrentSessionOpen);
DateTime sessionEnd = Exchange.ToLocalTime(Exchange.CurrentSessionClose);
if(tradingSession == TradingSession.Sydney)
return ....... ? true : false;
if(tradingSession == TradingSession.Tokyo)
return ....... ? true : false;
if(tradingSession == TradingSession.London)
return ....... ? true : false;
if (tradingSession == TradingSession.NewYork)
return ....... ? true : false;
return false;
}
使用:
bool isSydneySession = IsTradingSession(TradingSession.Sydney, CurrentTime);
bool isTokyoSession = IsTradingSession(TradingSession.Tokyo, CurrentTime);
bool isLondonSession = IsTradingSession(TradingSession.London, CurrentTime);
bool isNewYorkSession = IsTradingSession(TradingSession.NewYork, CurrentTime);
谢谢
答案 0 :(得分:3)
我建议为每个交易会话编写一个简单的函数,它接受一个DateTime并返回一个bool,指示它是否在那时打开。
var sydneyOpen = new TimeSpan(17, 0, 0);
var sydneyClose = new TimeSpan(2, 0, 0);
Func<DateTime, bool> isOpenInSydney = d =>
(d.TimeOfDay > sydneyOpen || d.TimeOfDay < sydneyClose);
// same for other markets, write a function to check against two times
然后将这些放入Dictionary<TradingSession, Func>
这样的通用检索......
var marketHours = new Dictionary<TradingSession, Func<DateTime, bool>>();
marketHours.Add(TradingSession.Sydney, isOpenInSydney);
// add other markets...
然后您现有的方法只是为给定的TradingSession
选择适当的函数并应用它
public bool IsTradingSession(TradingSession tradingSession, DateTime currentTime)
{
var functionForSession = marketHours[tradingSession];
return functionForSession(currentTime);
}
我认为只要您的应用程序在单个时区中运行,就不需要UTC时间,但夏令时可能会导致问题。
一个很好的方法来解决交易会话的问题,这个问题涉及两天,而不是仅仅一天,就是写一个帮助者,准确地考虑它是否是“跨日”交易时段并应用不同的规则你:
private bool IsBetween(DateTime now, TimeSpan open, TimeSpan close)
{
var nowTime = now.TimeOfDay;
return (open < close
// if open is before close, then now must be between them
? (nowTime > open && nowTime < close)
// otherwise now must be *either* after open or before close
: (nowTime > open || nowTime < close));
}
然后
var sydneyOpen = new TimeSpan(17, 0, 0);
var sydneyClose = new TimeSpan(2, 0, 0);
Func<DateTime, bool> isOpenInSydney = d => IsBetween(d, sydneyOpen, sydneyClose);
答案 1 :(得分:2)
您可以与&gt;进行比较&安培; &LT;或比较刻度。
查看相关问题:Check if datetime instance falls in between other two datetime objects
为了避免多个if语句,您还可以创建一个具有开始和结束时间的TradingSession对象,并定义一个属性/函数来检查是否在会话中。当我有大开关或块时,它通常表示错过了OO机会:)
TradingSession sydneySession = new TradingSession
{
StartTimeUtc = ...;
EndTimeUtc = ...;
}
交易会话对象可以具有属性IsInSession。
public bool IsInSession
{
get {
return DateTime.UTCNow >= StartTimeUtc && DateTime.UTCNow <= EndTimeUtc;
}
}
这使用UTC时间来消除时区问题。
答案 2 :(得分:0)
您需要将当地时间标准化为UTC。然后,您可以比较不同地区的时间。
对于每个交易时段,您需要知道UTC的会话开始和结束时间。
您需要UTC中的当前时间。例如DateTime.UtcNow
。
然后,您可以为每个交易会话窗口执行范围比较:
if(tradingSession == TradingSession.Sydney)
return currentTimeUtc >= sydneyStartTimeUtc && currentTimeUtc <= sydneyEndTimeUtc;
等...
如果您尝试验证交易时间对特定交易时段的交易有效,则可以正常工作。
但是,如果你想根据时间弄清楚交易所属的交易时段,有时会因为交易时段重叠而有多个答案。多个交易时段可能在给定时间内有效。