2012-07-11 195 views
4

我無法找出哪些人交易會話任何特定時間在不在。確定是否多時間之間當前的時間跨度

有四種可能的會議,顯示在這張照片從ForexFactory.com

採取enter image description here

我有這個方法,我需要檢查的是currentTime是在指定的交易時段。

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); 

謝謝

+1

.NET日期時間是非常困難的正確使用,尤其是在不同的時區。如果您可以影響使用標準日期時間的決定,請考慮查看http://code.google.com/p/noda-time/。 – 2012-07-11 03:06:45

+1

如果'currentTime'始終處於一致的時區,那麼UTC不是必需的;堅持當地時間爲了簡單不會傷害。 – 2012-07-11 03:58:06

+0

@Kirk Broadhurst是的,這是我的問題與dthorpe的答案,因爲我在我的評論中提到 – parliament 2012-07-11 03:59:52

回答

3

我會建議爲每個交易時段編寫一個簡單的函數,該函數需要一個DateTime並返回一個布爾值,指出當時是否打開。

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); 
+0

使用時間範圍對象sydneyStart ,sydneyEnd,tokyoStart ...等是我最初開始的,這個問題是d.TimeOfDay(可以說是8AM)在sydneyClose = new TimeSpan(2,0,0) – parliament 2012-07-11 04:06:56

+0

之前和之後爲什麼不是?if currentTime =新的DateTime(2012,7,10,8,00,00)then currentTime.TimeOfDay(8AM)是在2012年7月10日之後2AM sydneyClose和之前7/11/2012 2AM sydney關閉,沒有? – parliament 2012-07-11 04:17:29

+0

看着你的更新no w – parliament 2012-07-11 04:18:29

2

您可以比較> & <或比較蜱。

查看相關問題: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時間來消除時區問題。

0

您需要將當地時間標準化爲UTC。然後您可以比較不同地區的時間。

對於每個交易時段,您需要知道UTC的會話開始和結束時間。

您需要UTC的當前時間。例如,DateTime.UtcNow

然後,您可以執行範圍比較每個交易時段窗口:

if(tradingSession == TradingSession.Sydney) 
     return currentTimeUtc >= sydneyStartTimeUtc && currentTimeUtc <= sydneyEndTimeUtc; 

等等

如果你想驗證一個交易時間有效期爲在特定交易交易時段,這將工作正常。

如果您想要根據交易時間來確定交易所屬的交易時段,有時會因爲交易時段重疊而有多個答案。多個交易時段可能在給定時間內有效。

+1

我仍然沒有圍繞這個包裹我的頭。請忽略會議藍色框內的圖片時間,這可能會造成一些混淆。方法內部的所有時間都在本地時間ei CurrentTime,sessionStart,sessionEnd等都在當地時間(我編輯我的方法來反映這一點)。沒有看到它是多麼重要的比較是在什麼時區進行的,只要它在任何時候都是一致的比較。我想我仍然錯過了一些東西。 – parliament 2012-07-11 03:56:58

+0

也許我很困惑如何基於總體會話的開始和結束時間(下午5點 - 下一天下午5點)定義每個單獨會話的實際時間(sydneyStartTime,sydneyEndTime,tokyoStartTime,tokyoEndTime等),這可能是也可能不是不規則(對於一個晚上開放的凌晨3點 - 同一天下午5點將跳過整個悉尼會議和東京會議的一部分,只在倫敦會議開始時開放。 – parliament 2012-07-11 03:57:15

+0

您需要更好地定義您的問題。 – dthorpe 2012-07-11 07:15:24

相關問題