Skip to content

Commit 149b013

Browse files
author
dxcity
committed
tagging release 3.279
1 parent 842f633 commit 149b013

File tree

62 files changed

+662
-126
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

62 files changed

+662
-126
lines changed

ReleaseNotes.txt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,12 @@
1+
QDS 3.279:
2+
3+
* [QD-1182] [Schedule] Add ability to specify schedule for short days
4+
* [QD-1200] dxFeed API: Move OpenInterest field from DailyCandle to Candle
5+
* [QD-1199] dxFeed webservice: Migrate to cometd 4.0.4 and jetty 9.4.18
6+
* [QD-1196] SSLEngineImpl wrap/unwrap deadlock workaround
7+
- External synchronization is applied for internally used javax.net.ssl.SSLEnginge by default and can be controlled
8+
by JVM parameter "-Dcom.devexperts.connector.codec.ssl.synchronizeSSLEngine=true|false"
9+
* [QD-1193] Deadlock: Indexer vs IndexerFunction initialization circular dependencies
110

211
QDS 3.278:
312

auth/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
<parent>
1515
<artifactId>QD</artifactId>
1616
<groupId>com.devexperts.qd</groupId>
17-
<version>3.278</version>
17+
<version>3.279</version>
1818
<relativePath>../pom.xml</relativePath>
1919
</parent>
2020
<modelVersion>4.0.0</modelVersion>

dxfeed-api/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
<parent>
1515
<artifactId>QD</artifactId>
1616
<groupId>com.devexperts.qd</groupId>
17-
<version>3.278</version>
17+
<version>3.279</version>
1818
<relativePath>../pom.xml</relativePath>
1919
</parent>
2020
<modelVersion>4.0.0</modelVersion>

dxfeed-api/src/main/java/com/dxfeed/event/candle/Candle.java

Lines changed: 50 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,19 +11,26 @@
1111
*/
1212
package com.dxfeed.event.candle;
1313

14-
import javax.xml.bind.annotation.*;
15-
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
16-
1714
import com.devexperts.util.TimeFormat;
1815
import com.devexperts.util.TimeUtil;
1916
import com.dxfeed.api.DXFeedTimeSeriesSubscription;
2017
import com.dxfeed.api.osub.TimeSeriesSubscriptionSymbol;
21-
import com.dxfeed.event.*;
18+
import com.dxfeed.event.IndexedEvent;
19+
import com.dxfeed.event.IndexedEventSource;
20+
import com.dxfeed.event.LastingEvent;
21+
import com.dxfeed.event.TimeSeriesEvent;
2222
import com.dxfeed.impl.XmlCandleSymbolAdapter;
2323
import com.dxfeed.impl.XmlTimeAdapter;
2424
import com.dxfeed.model.AbstractIndexedEventModel;
2525
import com.dxfeed.model.TimeSeriesEventModel;
2626

27+
import javax.xml.bind.annotation.XmlElement;
28+
import javax.xml.bind.annotation.XmlRootElement;
29+
import javax.xml.bind.annotation.XmlSchemaType;
30+
import javax.xml.bind.annotation.XmlTransient;
31+
import javax.xml.bind.annotation.XmlType;
32+
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
33+
2734
/**
2835
* Candle event with open, high, low, close prices and other information for a specific period.
2936
* Candles are build with a specified {@link CandlePeriod} using a specified {@link CandlePrice} type
@@ -59,6 +66,8 @@
5966
* <li>{@link #getAskVolume() askVolume} - bid volume in this candle;
6067
* <li>{@link #getAskVolumeAsDouble() askVolumeAsDouble} - bid volume in this candle as floating number with fractions;
6168
* <li>{@link #getImpVolatility() impVolatility} - implied volatility;
69+
* <li>{@link #getOpenInterest() openInterest} - open interest;
70+
* <li>{@link #getOpenInterestAsDouble()} () openInterestAsDouble} - open interest as floating number with fractions;
6271
* </ul>
6372
*
6473
* <h3><a name="eventFlagsSection">Event flags, transactions and snapshots</a></h3>
@@ -91,7 +100,7 @@
91100
@XmlType(propOrder = {
92101
"eventSymbol", "eventTime", "eventFlags", "index", "time", "sequence",
93102
"count", "open", "high", "low", "close", "volumeAsDouble", "VWAP",
94-
"bidVolumeAsDouble", "askVolumeAsDouble", "impVolatility"
103+
"bidVolumeAsDouble", "askVolumeAsDouble", "impVolatility", "openInterestAsDouble"
95104
})
96105
public class Candle implements TimeSeriesEvent<CandleSymbol>, LastingEvent<CandleSymbol> {
97106
private static final long serialVersionUID = 3;
@@ -129,6 +138,7 @@ public class Candle implements TimeSeriesEvent<CandleSymbol>, LastingEvent<Candl
129138
private double bidVolume = Double.NaN;
130139
private double askVolume = Double.NaN;
131140
private double impVolatility = Double.NaN;
141+
private double openInterest = Double.NaN;
132142

133143
/**
134144
* Creates new candle with default values.
@@ -496,6 +506,40 @@ public void setImpVolatility(double impVolatility) {
496506
this.impVolatility = impVolatility;
497507
}
498508

509+
/**
510+
* Returns open interest.
511+
* @return open interest.
512+
*/
513+
@XmlTransient
514+
public long getOpenInterest() {
515+
return (long) openInterest;
516+
}
517+
518+
/**
519+
* Changes open interest.
520+
* @param openInterest open interest.
521+
*/
522+
public void setOpenInterest(long openInterest) {
523+
this.openInterest = openInterest;
524+
}
525+
526+
/**
527+
* Returns open interest as floating number with fractions.
528+
* @return open interest in this candle as floating number with fractions.
529+
*/
530+
@XmlElement(name = "openInterest")
531+
public double getOpenInterestAsDouble() {
532+
return openInterest;
533+
}
534+
535+
/**
536+
* Changes open interest as floating number with fractions.
537+
* @param openInterest open interest as floating number with fractions.
538+
*/
539+
public void setOpenInterestAsDouble(double openInterest) {
540+
this.openInterest = openInterest;
541+
}
542+
499543
/**
500544
* Returns string representation of this candle.
501545
* @return string representation of this candle.
@@ -521,6 +565,7 @@ String baseFieldsToString() {
521565
", bidVolume=" + bidVolume +
522566
", askVolume=" + askVolume +
523567
", impVolatility=" + impVolatility +
568+
", openInterest=" + openInterest +
524569
"";
525570
}
526571
}

dxfeed-api/src/main/java/com/dxfeed/event/candle/DailyCandle.java

Lines changed: 6 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -14,23 +14,17 @@
1414
import javax.xml.bind.annotation.XmlRootElement;
1515

1616
/**
17-
* Candle with an additional properties that are collected for optionable indices, stocks, and futures on a
18-
* daily basis. See {@link Candle}.
17+
* In previous versions this class has represented candle with an additional properties that are collected for
18+
* optionable indices, stocks, and futures on a daily basis, for example implied volatility or open interest.
19+
* All additional properties were moved to {@link Candle} class.
1920
*
20-
* <h3>Properties</h3>
21-
*
22-
* {@code DailyCandle} event has the following properties in addition to {@link Candle}
23-
*
24-
* <ul>
25-
* <li>{@link #getOpenInterest() openInterest} - open interest;
26-
* </ul>
21+
* @deprecated use {@link Candle} instead.
2722
*/
23+
@Deprecated
2824
@XmlRootElement(name = "DailyCandle")
2925
public class DailyCandle extends Candle {
3026
private static final long serialVersionUID = 0;
3127

32-
private long openInterest;
33-
3428
/**
3529
* Creates new daily candle with default values.
3630
*/
@@ -44,30 +38,12 @@ public DailyCandle(CandleSymbol eventSymbol) {
4438
super(eventSymbol);
4539
}
4640

47-
/**
48-
* Returns open interest.
49-
* @return open interest.
50-
*/
51-
public long getOpenInterest() {
52-
return openInterest;
53-
}
54-
55-
/**
56-
* Changes open interest.
57-
* @param openInterest open interest.
58-
*/
59-
public void setOpenInterest(long openInterest) {
60-
this.openInterest = openInterest;
61-
}
62-
6341
/**
6442
* Returns string representation of this daily candle.
6543
* @return string representation of this daily candle.
6644
*/
6745
@Override
6846
public String toString() {
69-
return "DailyCandle{" + baseFieldsToString() +
70-
", openInterest=" + openInterest +
71-
"}";
47+
return "DailyCandle{" + baseFieldsToString() + "}";
7248
}
7349
}

dxfeed-api/src/main/java/com/dxfeed/schedule/Schedule.java

Lines changed: 43 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -489,8 +489,12 @@ private static final class SessionDef {
489489
this.end = end;
490490
}
491491

492-
Session create(Day day, Calendar calendar, long time) {
493-
return new Session(day, type, start.get(calendar, time), end.get(calendar, time));
492+
Session create(Day day, Calendar calendar, long time, long startShift, long endShift) {
493+
long start = this.start.get(calendar, time) + startShift;
494+
long end = this.end.get(calendar, time) + endShift;
495+
if (end <= start)
496+
throw new IllegalArgumentException("start=" + start + " >= end=" + end);
497+
return new Session(day, type, start, end);
494498
}
495499

496500
public String toString() {
@@ -576,6 +580,8 @@ private static void fillGap(String scheduleDefinition, List<SessionDef> s, int i
576580
}
577581
}
578582

583+
private static final Pattern SDS_EC_PATTERN = Pattern.compile("ec[0-9]{4}");
584+
579585
final String def;
580586
private String name;
581587
private Calendar calendar;
@@ -584,6 +590,7 @@ private static void fillGap(String scheduleDefinition, List<SessionDef> s, int i
584590

585591
private LongHashSet holidays;
586592
private LongHashSet shortdays;
593+
private long earlyClose;
587594
private DayDef[] weekDays;
588595
private LongHashMap<DayDef> specialDays;
589596

@@ -616,6 +623,15 @@ private void init() {
616623
TimeZone timeZone = TimeZone.getTimeZone(tz);
617624
LongHashSet holidays = readDays(defaults.holidays, props.get("hd"));
618625
LongHashSet shortdays = readDays(defaults.shortdays, props.get("sd"));
626+
String sds = props.get("sds");
627+
long earlyClose;
628+
if (sds == null || sds.isEmpty()) {
629+
earlyClose = 0;
630+
} else if (SDS_EC_PATTERN.matcher(sds).matches()) {
631+
earlyClose = new TimeDef(def, sds.substring(2)).offset();
632+
} else {
633+
throw new IllegalArgumentException("unknown short day strategy for " + def);
634+
}
619635
String td = props.get("td");
620636
if (td == null)
621637
td = "12345";
@@ -656,6 +672,7 @@ private void init() {
656672
this.dayOffset = dayStart.offset();
657673
this.holidays = holidays;
658674
this.shortdays = shortdays;
675+
this.earlyClose = earlyClose;
659676
this.weekDays = weekDays;
660677
this.specialDays = specialDays;
661678

@@ -706,17 +723,37 @@ private Day createDay(int dayId) {
706723
Day day = new Day(this, dayId, yearMonthDay, holiday, shortday, def.resetTime.get(calendar, time));
707724
if (holiday)
708725
day.setSessions(Collections.singletonList(new Session(day, SessionType.NO_TRADING, def.dayStart.get(calendar, time), def.dayEnd.get(calendar, time))));
709-
else if (def.sessions.length == 1)
710-
day.setSessions(Collections.singletonList(def.sessions[0].create(day, calendar, time)));
711726
else {
712727
ArrayList<Session> sessions = new ArrayList<>(def.sessions.length);
713-
for (SessionDef s : def.sessions)
714-
sessions.add(s.create(day, calendar, time));
728+
int lastRegular = (shortday && earlyClose != 0) ? getLastRegularSessionIndex(def) : def.sessions.length;
729+
long shift = -1 * earlyClose;
730+
for (int i = 0; i < def.sessions.length; i++) {
731+
SessionDef session = def.sessions[i];
732+
if (i < lastRegular)
733+
sessions.add(session.create(day, calendar, time, 0, 0));
734+
else if (i == lastRegular)
735+
sessions.add(session.create(day, calendar, time, 0, shift));
736+
else if (i < def.sessions.length - 1)
737+
sessions.add(session.create(day, calendar, time, shift, shift));
738+
else
739+
sessions.add(session.create(day, calendar, time, shift, 0));
740+
}
741+
if (lastRegular == def.sessions.length - 1) {
742+
long endTime = sessions.get(sessions.size() - 1).getEndTime();
743+
sessions.add(new Session(day, SessionType.NO_TRADING, endTime, endTime - shift));
744+
}
715745
day.setSessions(Collections.unmodifiableList(sessions));
716746
}
717747
return day;
718748
}
719749

750+
private static int getLastRegularSessionIndex(DayDef def) {
751+
for (int i = def.sessions.length - 1; i >= 0; i--)
752+
if (def.sessions[i].type == SessionType.REGULAR)
753+
return i;
754+
return def.sessions.length;
755+
}
756+
720757
private static final LongHashSet EMPTY_SET = new LongHashSet();
721758
private static final LongHashMap<DayDef> EMPTY_MAP = new LongHashMap<>();
722759

dxfeed-api/src/main/resources/com/dxfeed/schedule/schedule.properties

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,20 +11,21 @@
1111
###
1212

1313
# Last modification date
14-
date=20190607-154000+0300
14+
date=20190828-171600+0300
1515

1616
# Default data for Schedule API
1717

1818
tv.NewYork=name=NewYork TimeZone;tz=America/New_York;td=12345;de=+0000
1919
tv.NewYorkUS=name=NewYork TimeZone with US Holidays;tz=America/New_York;hd=US;sd=US;td=12345;de=+0000
20-
tv.NewYorkRTH=name=US RTH;tz=America/New_York;hd=US;sd=US;td=12345;de=+0000;rt=0300;0=09301600
21-
tv.NewYorkETH=name=US ETH;tz=America/New_York;hd=US;sd=US;td=12345;de=+0000;rt=0300;0=p04000930r09301600a16002000
22-
tv.NewYorkOTC=name=US OTC;tz=America/New_York;hd=US;sd=US;td=12345;de=+0000;rt=0300;0=06001700
20+
tv.NewYorkRTH=name=US RTH;tz=America/New_York;hd=US;sd=US;sds=ec0300;td=12345;de=+0000;rt=0300;0=09301600
21+
tv.NewYorkETH=name=US ETH;tz=America/New_York;hd=US;sd=US;sds=ec0300;td=12345;de=+0000;rt=0300;0=p04000930r09301600a16002000
22+
tv.NewYorkOTC=name=US OTC;tz=America/New_York;hd=US;sd=US;sds=ec0300;td=12345;de=+0000;rt=0300;0=06001700
2323

24-
tv.XASE=name=AMEX;tz=America/New_York;hd=US;sd=US;td=12345;de=+0000;rt=0300;0=09301600
25-
tv.XNYS=name=NYSE;tz=America/New_York;hd=US;sd=US;td=12345;de=+0000;rt=0300;0=09301600
26-
tv.XNAS=name=NASDAQ;tz=America/New_York;hd=US;sd=US;td=12345;de=+0000;rt=0300;0=p04000930r09301600a16002000
27-
tv.XBOS=name=NASDAQ OMX BX;tz=America/New_York;hd=US;sd=US;td=12345;de=+0000;rt=0300;0=p07000930r09301600a16001900
24+
tv.XASE=name=AMEX;tz=America/New_York;hd=US;sd=US;sds=ec0300;td=12345;de=+0000;rt=0300;0=09301600
25+
tv.XNYS=name=NYSE;tz=America/New_York;hd=US;sd=US;sds=ec0300;td=12345;de=+0000;rt=0300;0=09301600
26+
tv.XNAS=name=NASDAQ;tz=America/New_York;hd=US;sd=US;sds=ec0300;td=12345;de=+0000;rt=0300;0=p04000930r09301600a16002000
27+
tv.XBOS=name=NASDAQ OMX BX;tz=America/New_York;hd=US;sd=US;sds=ec0300;td=12345;de=+0000;rt=0300;0=p07000930r09301600a16001900
28+
tv.XIEX=name=IEX;tz=America/New_York;hd=US;sd=US;sds=ec0300;td=12345;de=+0000;rt=0300;0=p08000930r09301600a16001700
2829

2930
tv.DJI=name=Dow Jones Indexes;tz=America/New_York;hd=US;sd=US;td=12345;de=1800
3031
tv.SPI=name=Standard & Poor's Indexes;tz=America/New_York;hd=US;sd=US;td=12345;de=1800
@@ -33,8 +34,8 @@ tv.dxFeedUS=name=dxFeed US Indicators;tz=America/New_York;hd=US;td=12345;de=+000
3334

3435
tv.EquityUS=name=US Equity;tz=America/New_York;hd=US;sd=US;td=12345;de=+0000;rt=0300;0=p04000930r09301600a16002000
3536

36-
tv.OPRA=name=US Options;tz=America/New_York;hd=US;sd=US;td=12345;de=+0000;rt=0300;0=09301600
37-
tv.OPRA15=name=US Options;tz=America/New_York;hd=US;sd=US;td=12345;de=+0000;rt=0300;0=09301615
37+
tv.OPRA=name=US Options;tz=America/New_York;hd=US;sd=US;sds=ec0300;td=12345;de=+0000;rt=0300;0=09301600
38+
tv.OPRA15=name=US Options;tz=America/New_York;hd=US;sd=US;sds=ec0300;td=12345;de=+0000;rt=0300;0=09301615
3839

3940
tv.GLBX=name=CME Globex;tz=America/Chicago;hd=US;td=12345;de=1630
4041
tv.XCME=name=CME Floor;tz=America/Chicago;hd=US;td=12345;de=1630
@@ -199,7 +200,9 @@ sd.US=\
199200
20161125,\
200201
20171124,\
201202
20180703,20181123,20181224,\
202-
20190703,20191129,20191224\
203+
20190703,20191129,20191224,\
204+
20201127,20201224,\
205+
20211126
203206

204207
sd.TR=\
205208
20120818,20121024,\

0 commit comments

Comments
 (0)