Skip to content

Commit 47bcb50

Browse files
Check time range on daily bases for weekly session configuration
1 parent c4e8171 commit 47bcb50

File tree

3 files changed

+85
-6
lines changed

3 files changed

+85
-6
lines changed

QuickFIXn/SessionSchedule.cs

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ public class SessionSchedule
88
public System.TimeSpan EndTime { get; private set; }
99

1010
public bool WeeklySession { get; private set; }
11+
public bool UseDailyTimeCheck { get; private set; }
1112
public System.DayOfWeek StartDay { get; private set; }
1213
public System.DayOfWeek EndDay { get; private set; }
1314

@@ -73,7 +74,9 @@ public bool IsSessionTime(System.DateTime utc)
7374

7475
System.DateTime adjusted = AdjustUtcDateTime(utc);
7576

76-
if (WeeklySession)
77+
if (UseDailyTimeCheck && WeeklySession)
78+
return CheckDay(adjusted) && CheckTime(adjusted.TimeOfDay);
79+
else if (WeeklySession)
7780
return CheckDay(adjusted);
7881
else
7982
return CheckTime(adjusted.TimeOfDay);
@@ -95,19 +98,26 @@ public DateTime NextEndTime(DateTime utc)
9598
throw new ArgumentException("Only UTC time is supported", "time");
9699

97100
DateTime d = AdjustUtcDateTime(utc);
98-
DateTime end = DateTime.MinValue;
101+
DateTime end = new DateTime(d.Year, d.Month, d.Day, EndTime.Hours, EndTime.Minutes, EndTime.Seconds, d.Kind);
99102

100-
if (WeeklySession)
103+
if (UseDailyTimeCheck && WeeklySession)
104+
{
105+
if(DateTime.Compare(d, end) > 0) // d is later than end
106+
end = end.AddDays(1);
107+
while (!CheckDay(end))
108+
{
109+
end = end.AddDays(1);
110+
}
111+
}
112+
else if (WeeklySession)
101113
{
102-
end = new DateTime(d.Year, d.Month, d.Day, EndTime.Hours, EndTime.Minutes, EndTime.Seconds, d.Kind);
103114
while (end.DayOfWeek != EndDay)
104115
end = end.AddDays(1);
105116
if (DateTime.Compare(d, end) > 0) // d is later than end
106117
end = end.AddDays(7);
107118
}
108119
else
109120
{
110-
end = new DateTime(d.Year, d.Month, d.Day, EndTime.Hours, EndTime.Minutes, EndTime.Seconds, d.Kind);
111121
if (DateTime.Compare(d, end) > 0) // d is later than end
112122
end = end.AddDays(1);
113123
}
@@ -132,7 +142,16 @@ public DateTime LastEndTime(DateTime utc)
132142
throw new ArgumentException("Only UTC time is supported", "time");
133143

134144
DateTime n = NextEndTime(utc);
135-
if (WeeklySession)
145+
146+
if (UseDailyTimeCheck && WeeklySession)
147+
{
148+
n = n.AddDays(-1);
149+
while(!CheckDay(n))
150+
{
151+
n = n.AddDays(-1);
152+
}
153+
}
154+
else if (WeeklySession)
136155
n = n.AddDays(-7);
137156
else
138157
n = n.AddDays(-1);
@@ -251,6 +270,11 @@ public SessionSchedule(QuickFix.Dictionary settings)
251270
WeeklySession = true;
252271
}
253272

273+
if (WeeklySession && settings.Has(SessionSettings.USE_DAILY_TIME_CHECK) && settings.GetBool(SessionSettings.USE_DAILY_TIME_CHECK))
274+
{
275+
UseDailyTimeCheck = true;
276+
}
277+
254278
if (settings.Has(SessionSettings.USE_LOCAL_TIME))
255279
{
256280
UseLocalTime = settings.GetBool(SessionSettings.USE_LOCAL_TIME);

QuickFIXn/SessionSettings.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ public class SessionSettings
2424
public const string USE_DATA_DICTIONARY = "UseDataDictionary";
2525
public const string NON_STOP_SESSION = "NonStopSession";
2626
public const string USE_LOCAL_TIME = "UseLocalTime";
27+
public const string USE_DAILY_TIME_CHECK = "UseDailyTimeCheck";
2728
public const string TIME_ZONE = "TimeZone";
2829
public const string START_DAY = "StartDay";
2930
public const string END_DAY = "EndDay";

UnitTests/SessionScheduleTests.cs

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -714,5 +714,59 @@ public void testAdjustDateTime()
714714
Util.UtcDateTimeSerializerTests.AssertHackyDateTimeEquality(d5expected, d5actual);
715715
Assert.AreEqual(DateTimeKind.Local, d5actual.Kind);
716716
}
717+
718+
719+
720+
[Test]
721+
public void IsSessionTime_should_return_true_for_weekly_session_only_when_USE_DAILY_TIME_CHECK_is_true_and_date_and_time_in_range()
722+
{
723+
QuickFix.Dictionary settings = new QuickFix.Dictionary();
724+
settings.SetString(QuickFix.SessionSettings.START_TIME, "06:00:00");
725+
settings.SetString(QuickFix.SessionSettings.END_TIME, "17:30:00");
726+
settings.SetString(QuickFix.SessionSettings.USE_DAILY_TIME_CHECK, "Y");
727+
728+
settings.SetDay(QuickFix.SessionSettings.START_DAY, System.DayOfWeek.Monday);
729+
settings.SetDay(QuickFix.SessionSettings.END_DAY, System.DayOfWeek.Friday);
730+
QuickFix.SessionSchedule sched = new QuickFix.SessionSchedule(settings);
731+
732+
//a Sunday
733+
Assert.IsFalse(sched.IsSessionTime(new DateTime(2019, 06, 23, 06, 00, 00, DateTimeKind.Utc)));
734+
Assert.IsFalse(sched.IsSessionTime(new DateTime(2019, 06, 23, 17, 30, 00, DateTimeKind.Utc)));
735+
736+
737+
// Monday
738+
Assert.IsFalse(sched.IsSessionTime(new DateTime(2019, 06, 24, 05, 59, 59, 999, DateTimeKind.Utc)));
739+
Assert.IsTrue(sched.IsSessionTime(new DateTime(2019, 06, 24, 06, 00, 00, DateTimeKind.Utc)));
740+
Assert.IsTrue(sched.IsSessionTime(new DateTime(2019, 06, 24, 17, 30, 00, DateTimeKind.Utc)));
741+
Assert.IsFalse(sched.IsSessionTime(new DateTime(2019, 06, 24, 17, 30, 00, 001, DateTimeKind.Utc)));
742+
743+
// Tuesday
744+
Assert.IsFalse(sched.IsSessionTime(new DateTime(2019, 06, 25, 05, 59, 59, 999, DateTimeKind.Utc)));
745+
Assert.IsTrue(sched.IsSessionTime(new DateTime(2019, 06, 25, 06, 00, 00, DateTimeKind.Utc)));
746+
Assert.IsTrue(sched.IsSessionTime(new DateTime(2019, 06, 25, 17, 30, 00, DateTimeKind.Utc)));
747+
Assert.IsFalse(sched.IsSessionTime(new DateTime(2019, 06, 25, 17, 30, 00, 001, DateTimeKind.Utc)));
748+
749+
// Wednesday
750+
Assert.IsFalse(sched.IsSessionTime(new DateTime(2019, 06, 26, 05, 59, 59, 999, DateTimeKind.Utc)));
751+
Assert.IsTrue(sched.IsSessionTime(new DateTime(2019, 06, 26, 06, 00, 00, DateTimeKind.Utc)));
752+
Assert.IsTrue(sched.IsSessionTime(new DateTime(2019, 06, 26, 17, 30, 00, DateTimeKind.Utc)));
753+
Assert.IsFalse(sched.IsSessionTime(new DateTime(2019, 06, 26, 17, 30, 00, 001, DateTimeKind.Utc)));
754+
755+
// Thursday
756+
Assert.IsFalse(sched.IsSessionTime(new DateTime(2019, 06, 27, 05, 59, 59, 999, DateTimeKind.Utc)));
757+
Assert.IsTrue(sched.IsSessionTime(new DateTime(2019, 06, 27, 06, 00, 00, DateTimeKind.Utc)));
758+
Assert.IsTrue(sched.IsSessionTime(new DateTime(2019, 06, 27, 17, 30, 00, DateTimeKind.Utc)));
759+
Assert.IsFalse(sched.IsSessionTime(new DateTime(2019, 06, 27, 17, 30, 00, 001, DateTimeKind.Utc)));
760+
761+
// Friday
762+
Assert.IsFalse(sched.IsSessionTime(new DateTime(2019, 06, 28, 05, 59, 59, 999, DateTimeKind.Utc)));
763+
Assert.IsTrue(sched.IsSessionTime(new DateTime(2019, 06, 28, 06, 00, 00, DateTimeKind.Utc)));
764+
Assert.IsTrue(sched.IsSessionTime(new DateTime(2019, 06, 28, 17, 30, 00, DateTimeKind.Utc)));
765+
Assert.IsFalse(sched.IsSessionTime(new DateTime(2019, 06, 28, 17, 30, 00, 001, DateTimeKind.Utc)));
766+
767+
// Saturday
768+
Assert.IsFalse(sched.IsSessionTime(new DateTime(2019, 06, 23, 06, 00, 00, DateTimeKind.Utc)));
769+
Assert.IsFalse(sched.IsSessionTime(new DateTime(2019, 06, 23, 17, 30, 00, DateTimeKind.Utc)));
770+
}
717771
}
718772
}

0 commit comments

Comments
 (0)