Compare commits

..
12 Commits
8 changed files with 60 additions and 40 deletions

No files matched your search

+5
View File
@@ -6,9 +6,14 @@ insert_anchor_links = "right"
+++
## 2.14.0
### User Visible Changes
- All ladders can now be recentered by (shift or alt) + double clicking over the Price column in a ladder
- Added a Max Order Quantity setting to the Safety Checks tab on the Ladder settings. This setting allows for a user-defined maximum order quantity.
- Added a Price Display Format setting to the Market Price and Size Display tab on the Ladder settings. This setting allows for price levels in the ladder to be displayed without a decimal separator.
- Synthetic instrument creation with 3 legs no longer defaults to butterfly quantites
### Bug Fixes
- Fixed an issue where market transition were not observed by IAlgoOrder
- Fixed a bug in error reporting
- Fixed a bug in the PnL window where specifying a certain grouping order would lead to a UI failure
## 2.13.0
### User Visible Changes
@@ -467,6 +467,10 @@ namespace mbts.spark {
settings_invalidated?.Invoke();
}
public void recenter_all_ladders() {
_bus?.post(SparkTags.RequestRecenterLadder, null);
}
public Task send_order_async((double price, Side? side, MouseButton button) args) {
if (order_properties_vm != null && args.button != MouseButton.Middle) {
var size_from_alternate = args.button == MouseButton.Right;
@@ -490,8 +490,14 @@ namespace mbts.spark {
protected override void OnMouseDoubleClick(MouseButtonEventArgs e) {
var column = _column_for_point(e.GetPosition(this));
if (column.column_type == ColumnType.Price)
_scroll_to_center();
if (column.column_type == ColumnType.Price) {
if (Keyboard.IsKeyDown(Key.LeftShift) || Keyboard.IsKeyDown(Key.RightShift) ||
Keyboard.IsKeyDown(Key.LeftAlt) || Keyboard.IsKeyDown(Key.RightAlt)) {
_vm?.recenter_all_ladders();
} else {
_scroll_to_center();
}
}
}
#region Row Utility Methods
@@ -195,6 +195,10 @@ void ICEExecutionGateway::on_trader_login_timeout_expired()
const auto& ice = u.user_data().exchange_user_data().ice_data();
if(auth_traders.find(ice.authorized_trader()) == auth_traders.end())
{
if(ice.authorized_trader() == "")
continue;
if(ice.company_id() <= 0)
continue;
if(me->nusers == -1)
me->nusers = 0;
me->nusers++;
+10 -7
View File
@@ -12,19 +12,22 @@ env SDK_ROOT=/sdk \
SDK_VERSION=$SDK_VERSION \
SDK_BUILD_DATE=$SDK_BUILD_DATE
# copy sdk
COPY include/ /sdk/include/
COPY lib/ /sparkbin/
COPY externals /sdk/externals/
COPY spark.conf /sparkdata/conf/
COPY futures.coconut /sparkdata/data/replay/futures.coconut
# add user bts
RUN groupadd --gid 1000 $USERNAME && \
useradd -s /bin/bash --uid 1000 --gid 1000 -m $USERNAME && \
mkdir -p /sparkbin/plugins && \
mkdir /sparkdata && \
ln -s /sparkbin/ sdk/lib && \
echo $USERNAME ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/$USERNAME && \
chmod 0440 /etc/sudoers.d/$USERNAME && \
chown -R bts.bts /sparkbin/plugins && \
chown -R bts.bts /sparkdata
# copy sdk
COPY include/ /sdk/include/
COPY lib/ /sparkbin/
COPY externals /sdk/externals/
COPY spark.conf /sparkdata/conf/
COPY --chown=$USERNAME futures.coconut /sparkdata/data/replay/futures.coconut
@@ -212,30 +212,32 @@ void ICEListener::on_uds_future_spread(const Definition& def, bool& is_intereste
fsec.alt_symbol(def.strategySymbol);
const auto& legs = def.legs;
fsec.set_leg_count(legs.size());
for(size_t x = 0; x < fsec.leg_count(); ++x)
{
const auto& leg = legs[x];
if(leg.ratioPriceNumerator && leg.ratioPriceDenominator)
if (legs.size() > 0) {
fsec.set_leg_count(legs.size());
for(size_t x = 0; x < fsec.leg_count(); ++x)
{
auto num = *leg.ratioPriceNumerator;
auto denom = *leg.ratioPriceDenominator;
fsec.legs[x].leg_price = num / (double) denom;
const auto& leg = legs[x];
if(leg.ratioPriceNumerator && leg.ratioPriceDenominator)
{
auto num = *leg.ratioPriceNumerator;
auto denom = *leg.ratioPriceDenominator;
fsec.legs[x].leg_price = num / (double) denom;
}
if(leg.ratioQtyNumerator && leg.ratioQtyDenominator)
{
auto num = *leg.ratioQtyNumerator;
auto denom = *leg.ratioQtyDenominator;
fsec.legs[x].leg_delta = num / (double) denom;
}
fsec.legs[x].leg_quantity = leg.ratio;
fsec.legs[x].leg_side = leg.side == onixs_ice::Side::Bid ? api::SIDE_BUY : api::SIDE_SELL;
fsec.legs[x].exchange_key = ExchangeKey(leg.marketId);
fsec.legs[x].key = invalid_security_key;
}
if(leg.ratioQtyNumerator && leg.ratioQtyDenominator)
{
auto num = *leg.ratioQtyNumerator;
auto denom = *leg.ratioQtyDenominator;
fsec.legs[x].leg_delta = num / (double) denom;
}
fsec.legs[x].leg_quantity = leg.ratio;
fsec.legs[x].leg_side = leg.side == onixs_ice::Side::Bid ? api::SIDE_BUY : api::SIDE_SELL;
fsec.legs[x].exchange_key = ExchangeKey(leg.marketId);
fsec.legs[x].key = invalid_security_key;
add_security(fsec);
is_interested = true;
}
add_security(fsec);
is_interested = true;
}
@@ -0,0 +1,6 @@
1. Verify pressing the shift or alt key while double clicking in the Price column in a Ladder Window recenters ALL ladders
Launch 2 ladders
Scroll both ladders so they are no longer centered at mid market
Press the shift + double click while over the Price column
You should observe both scrolled ladders are now centered once again
The countdown timer is also reset via this spacebar action. This is more informational; I don't expect you to wait to verify that the timer is reset.
@@ -1,10 +0,0 @@
This isn't a setting exactly, but rather a test of keyboard functionality. Currently we are only testing the spacebar key.
1. Verify pressing the spacebar while in a Ladder Window recenters ALL ladders
Launch 2 ladders
Click one of the Ladder windows to make sure said window receives focus
Scroll both ladders so they are no longer centered at mid market
Press the spacebar
You should observe both scrolled ladders are now centered once again
The countdown timer is also reset via this spacebar action. This is more informational; I don't expect you to wait to verify that the timer is reset.