4

特定の時間にどの取引セッションが行われているかを把握するのに問題があります。

ForexFactory.comから取られたこの写真に示されている4つの可能なセッションがあります

ここに画像の説明を入力してください

私はこのメソッドをチェックする必要があります。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);

ありがとうございました

4

3 に答える 3

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 時間が必要になるとは思いませんが、夏時間が問題を引き起こす可能性があります。


1 日ではなく 2 日間にわたる取引セッションの問題を説明する良い方法は、それが「クロスデイ」取引セッションであるかどうかを正確に考慮し、別のルールを適用するヘルパーを作成することです。

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);
于 2012-07-11T03:56:55.470 に答える
2

> & < で比較したり、ティックを比較したりできます。

関連する質問を参照してください: datetime インスタンスが他の 2 つの datetime オブジェクトの間にあるかどうかを確認してください

複数の if ステートメントを避けるために、開始時刻と終了時刻を指定して TradingSession オブジェクトを作成し、セッション中かどうかを確認するプロパティ/関数を定義することもできます。私が大きなスイッチを持っているかブロックしている場合、それは通常、オブジェクト指向の機会を逃したことを示しています:)

TradingSession sydneySession = new TradingSession 
{
    StartTimeUtc = ...;
    EndTimeUtc = ...;
}

取引セッション オブジェクトはプロパティ IsInSession を持つことができます。

public bool IsInSession
{
    get {
        return DateTime.UTCNow >= StartTimeUtc && DateTime.UTCNow <= EndTimeUtc;
    }
}

これは、UTC 時間を使用してタイム ゾーンの問題を排除します。

于 2012-07-11T03:21:09.840 に答える
0

現地時間を UTC に正規化する必要があります。その後、地域間で時間を比較できます。

各取引セッションについて、UTC でのセッションの開始時刻と終了時刻を知る必要があります。

UTC での現在の時刻が必要です。 DateTime.UtcNow、 例えば。

次に、各取引セッション ウィンドウの範囲比較を実行できます。

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

等...

トランザクション時間が特定の取引セッションのトランザクションに対して有効であることを検証しようとしている場合、これは問題なく機能します。

ただし、時間に基づいて取引が属する取引セッションを把握しようとしている場合、取引セッションが重複するため、複数の回答が得られることがあります。複数の取引セッションが一定時間有効な場合があります。

于 2012-07-11T03:21:31.210 に答える