Compare commits
2
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
742cc022f3 | ||
|
|
9ef557b808 |
No files matched your search
@@ -1 +1 @@
|
||||
set(sources /home/ppinto/Dropbox/bts/spark/doc/user/build.sh;content/_index.md;content/bts_spark/Algos/_index.md;content/bts_spark/Glossary/index.md;content/bts_spark/Help/about_spark.png;content/bts_spark/Help/image39.png;content/bts_spark/Help/image58.png;content/bts_spark/Help/index.md;content/bts_spark/Launcher/image38.png;content/bts_spark/Launcher/image68.png;content/bts_spark/Launcher/index.md;content/bts_spark/Logging-In-to-the-System/image3.png;content/bts_spark/Logging-In-to-the-System/image64.png;content/bts_spark/Logging-In-to-the-System/index.md;content/bts_spark/Market/change_securities.png;content/bts_spark/Market/image11.png;content/bts_spark/Market/image14.png;content/bts_spark/Market/image20.png;content/bts_spark/Market/image21.png;content/bts_spark/Market/image23.png;content/bts_spark/Market/image24.png;content/bts_spark/Market/image34.png;content/bts_spark/Market/image49.png;content/bts_spark/Market/image53.png;content/bts_spark/Market/image66.png;content/bts_spark/Market/image69.png;content/bts_spark/Market/index.md;content/bts_spark/Market/market_view.png;content/bts_spark/Market/settings_icon.png;content/bts_spark/Market/time_and_sales.png;content/bts_spark/My-Windows/image15.png;content/bts_spark/My-Windows/image16.png;content/bts_spark/My-Windows/image37.png;content/bts_spark/My-Windows/index.md;content/bts_spark/Settings/image51.png;content/bts_spark/Settings/image9.png;content/bts_spark/Settings/index.md;content/bts_spark/Spreader/image10.png;content/bts_spark/Spreader/image13.png;content/bts_spark/Spreader/image18.png;content/bts_spark/Spreader/image19.png;content/bts_spark/Spreader/image28.png;content/bts_spark/Spreader/image29.png;content/bts_spark/Spreader/image31.png;content/bts_spark/Spreader/image35.png;content/bts_spark/Spreader/image40.png;content/bts_spark/Spreader/image43.png;content/bts_spark/Spreader/image54.png;content/bts_spark/Spreader/image55.png;content/bts_spark/Spreader/image56.png;content/bts_spark/Spreader/image6.png;content/bts_spark/Spreader/image7.png;content/bts_spark/Spreader/image70.png;content/bts_spark/Spreader/image72.png;content/bts_spark/Spreader/image8.png;content/bts_spark/Spreader/index.md;content/bts_spark/Trading/algo_studio.png;content/bts_spark/Trading/collapse_all_icon.png;content/bts_spark/Trading/cover_algo_control.png;content/bts_spark/Trading/expand_all_icon.png;content/bts_spark/Trading/image1.png;content/bts_spark/Trading/image17.png;content/bts_spark/Trading/image2.png;content/bts_spark/Trading/image25.png;content/bts_spark/Trading/image27.png;content/bts_spark/Trading/image33.png;content/bts_spark/Trading/image42.png;content/bts_spark/Trading/image44.png;content/bts_spark/Trading/image47.png;content/bts_spark/Trading/image48.png;content/bts_spark/Trading/image5.png;content/bts_spark/Trading/image50.png;content/bts_spark/Trading/image52.png;content/bts_spark/Trading/image57.png;content/bts_spark/Trading/image59.png;content/bts_spark/Trading/image60.png;content/bts_spark/Trading/image61.png;content/bts_spark/Trading/image62.png;content/bts_spark/Trading/image73.png;content/bts_spark/Trading/image74.png;content/bts_spark/Trading/index.md;content/bts_spark/Trading/join_algo_control.png;content/bts_spark/Trading/ladder.png;content/bts_spark/Trading/ladder_badges.png;content/bts_spark/Trading/ladder_main_part.png;content/bts_spark/Trading/lean_algo_control.png;content/bts_spark/Trading/mini_orderbook.png;content/bts_spark/Trading/oco_algo_control.png;content/bts_spark/Trading/offset_algo_control.png;content/bts_spark/Trading/pnl_calculation.png;content/bts_spark/Trading/pnl_window.png;content/bts_spark/Trading/recreate_icon.png;content/bts_spark/Trading/settings_icon.png;content/bts_spark/Trading/spark_menu_order_book.png;content/bts_spark/Trading/top_algo_control.png;content/bts_spark/Trading/trigger_algo_control.png;content/bts_spark/_index.md;content/release_notes/_index.md;static/book.js;static/favicon.ico;static/image.js;templates/index.html;templates/page.html;templates/section.html;templates/shortcodes/back_button.html)
|
||||
set(sources /home/pfisher/bts/spark/doc/user/build.sh;content/_index.md;content/bts_spark/Algos/_index.md;content/bts_spark/Glossary/index.md;content/bts_spark/Help/about_spark.png;content/bts_spark/Help/image39.png;content/bts_spark/Help/image58.png;content/bts_spark/Help/index.md;content/bts_spark/Launcher/image38.png;content/bts_spark/Launcher/image68.png;content/bts_spark/Launcher/index.md;content/bts_spark/Logging-In-to-the-System/image3.png;content/bts_spark/Logging-In-to-the-System/image64.png;content/bts_spark/Logging-In-to-the-System/index.md;content/bts_spark/Market/change_securities.png;content/bts_spark/Market/image11.png;content/bts_spark/Market/image14.png;content/bts_spark/Market/image20.png;content/bts_spark/Market/image21.png;content/bts_spark/Market/image23.png;content/bts_spark/Market/image24.png;content/bts_spark/Market/image34.png;content/bts_spark/Market/image49.png;content/bts_spark/Market/image53.png;content/bts_spark/Market/image66.png;content/bts_spark/Market/image69.png;content/bts_spark/Market/index.md;content/bts_spark/Market/market_view.png;content/bts_spark/Market/settings_icon.png;content/bts_spark/Market/time_and_sales.png;content/bts_spark/My-Windows/image15.png;content/bts_spark/My-Windows/image16.png;content/bts_spark/My-Windows/image37.png;content/bts_spark/My-Windows/index.md;content/bts_spark/Settings/image51.png;content/bts_spark/Settings/image9.png;content/bts_spark/Settings/index.md;content/bts_spark/Spreader/image10.png;content/bts_spark/Spreader/image13.png;content/bts_spark/Spreader/image18.png;content/bts_spark/Spreader/image19.png;content/bts_spark/Spreader/image28.png;content/bts_spark/Spreader/image29.png;content/bts_spark/Spreader/image31.png;content/bts_spark/Spreader/image35.png;content/bts_spark/Spreader/image40.png;content/bts_spark/Spreader/image43.png;content/bts_spark/Spreader/image54.png;content/bts_spark/Spreader/image55.png;content/bts_spark/Spreader/image56.png;content/bts_spark/Spreader/image6.png;content/bts_spark/Spreader/image7.png;content/bts_spark/Spreader/image70.png;content/bts_spark/Spreader/image72.png;content/bts_spark/Spreader/image8.png;content/bts_spark/Spreader/index.md;content/bts_spark/Trading/algo_studio.png;content/bts_spark/Trading/collapse_all_icon.png;content/bts_spark/Trading/cover_algo_control.png;content/bts_spark/Trading/expand_all_icon.png;content/bts_spark/Trading/image1.png;content/bts_spark/Trading/image17.png;content/bts_spark/Trading/image2.png;content/bts_spark/Trading/image25.png;content/bts_spark/Trading/image27.png;content/bts_spark/Trading/image33.png;content/bts_spark/Trading/image42.png;content/bts_spark/Trading/image44.png;content/bts_spark/Trading/image47.png;content/bts_spark/Trading/image48.png;content/bts_spark/Trading/image5.png;content/bts_spark/Trading/image50.png;content/bts_spark/Trading/image52.png;content/bts_spark/Trading/image57.png;content/bts_spark/Trading/image59.png;content/bts_spark/Trading/image60.png;content/bts_spark/Trading/image61.png;content/bts_spark/Trading/image62.png;content/bts_spark/Trading/image73.png;content/bts_spark/Trading/image74.png;content/bts_spark/Trading/index.md;content/bts_spark/Trading/join_algo_control.png;content/bts_spark/Trading/ladder.png;content/bts_spark/Trading/ladder_badges.png;content/bts_spark/Trading/ladder_main_part.png;content/bts_spark/Trading/lean_algo_control.png;content/bts_spark/Trading/mini_orderbook.png;content/bts_spark/Trading/oco_algo_control.png;content/bts_spark/Trading/offset_algo_control.png;content/bts_spark/Trading/pnl_calculation.png;content/bts_spark/Trading/pnl_window.png;content/bts_spark/Trading/recreate_icon.png;content/bts_spark/Trading/settings_icon.png;content/bts_spark/Trading/spark_menu_order_book.png;content/bts_spark/Trading/top_algo_control.png;content/bts_spark/Trading/trigger_algo_control.png;content/bts_spark/_index.md;content/release_notes/_index.md;static/book.js;static/favicon.ico;static/image.js;templates/index.html;templates/page.html;templates/section.html;templates/shortcodes/back_button.html)
|
||||
@@ -4,19 +4,6 @@ weight = 3
|
||||
sort_by = "weight"
|
||||
insert_anchor_links = "right"
|
||||
+++
|
||||
## 2.0.4
|
||||
### User Visible Changes
|
||||
- Fixed performance regression in order manager
|
||||
|
||||
### Internal changes
|
||||
- Improved market data diagnostics for bad configurations
|
||||
- Changed market data default buffer size
|
||||
|
||||
## 2.0.3
|
||||
### Internal changes
|
||||
- Improved backwards compatibility in UI settings
|
||||
|
||||
|
||||
## 2.0.2
|
||||
### User Visible Changes
|
||||
- Middle click the ladder price column to show the orders for that price level
|
||||
|
||||
+1
-1
Submodule docker/linux updated: e13bb5d8df...ce08a5129f.
@@ -20,27 +20,6 @@ namespace bts.shell {
|
||||
readonly IBus _bus;
|
||||
readonly OrdersModel _orders_model;
|
||||
readonly UserSettingsHub _settings_hub;
|
||||
/// Fills 'sorting-criterion' settings were compromised a while back (mid-late 2018).
|
||||
/// The issue was that, when a column was sorted, its 'sort member path' was assigned to the SortingCriteria.col_name,
|
||||
/// rather than the <see cref="Columns"/> enum/id string.
|
||||
/// This dictionary serves as a reverse-lookup so the sort member path can be converted to the enum/id string.
|
||||
static readonly IReadOnlyDictionary<string, Columns> _sort_member_to_id =
|
||||
new Dictionary<string, Columns> {
|
||||
{ nameof(FillsVM.Row.account), Columns.Account },
|
||||
{ nameof(FillsVM.Row.exchange), Columns.Exchange },
|
||||
{ nameof(FillsVM.Row.fill_key), Columns.FillKey },
|
||||
{ nameof(FillsVM.Row.fill_kind), Columns.FillKind },
|
||||
{ nameof(FillsVM.Row.fill_time), Columns.FillTime },
|
||||
{ nameof(FillsVM.Row.order_key), Columns.OrderKey },
|
||||
{ nameof(FillsVM.Row.order_type), Columns.OrderType },
|
||||
{ nameof(FillsVM.Row.price), Columns.Price },
|
||||
{ nameof(FillsVM.Row.security), Columns.Security },
|
||||
{ nameof(FillsVM.Row.security_key), Columns.SecurityKey },
|
||||
{ nameof(FillsVM.Row.side), Columns.Side },
|
||||
{ nameof(FillsVM.Row.size), Columns.Size },
|
||||
{ nameof(FillsVM.Row.time_in_force), Columns.TimeInForce },
|
||||
{ nameof(FillsVM.Row.user), Columns.User }
|
||||
};
|
||||
|
||||
public FillsWindowFactory(TradingShellModule module, IBus bus, UserSettingsHub settings_hub, OrdersModel orders_model)
|
||||
: base(module, "Fills") {
|
||||
@@ -59,7 +38,6 @@ namespace bts.shell {
|
||||
_bus.post(SparkTags.ShowWindow, await load(state));
|
||||
|
||||
IShellWindow _create(StartupData state) {
|
||||
GridSettingsHelper.normalize_sorting_criterion(state.sorting_criterion, _sort_member_to_id);
|
||||
var settings_manager = new WindowSettingsManager<GridSettings>(_settings_hub,
|
||||
state.grid,
|
||||
get: us => us.fills_grid,
|
||||
|
||||
@@ -99,11 +99,8 @@ namespace bts.shell.orderbook {
|
||||
public OrderBookGridSettings grid_settings_wrapper() {
|
||||
if (use_defaults)
|
||||
return null;
|
||||
if (orderbook_grid == null) {
|
||||
if (grid == null)
|
||||
grid = _default_general_grid;
|
||||
orderbook_grid = new OrderBookGridSettings(grid.clone(), _predicate_animations);
|
||||
}
|
||||
if (orderbook_grid == null)
|
||||
orderbook_grid = new OrderBookGridSettings(grid.clone(), _predicate_animations);
|
||||
return orderbook_grid;
|
||||
}
|
||||
#pragma warning restore CS0612 // Type or member is obsolete
|
||||
|
||||
@@ -1,27 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
namespace mbts.ui.settings {
|
||||
static class GridSettingsHelper {
|
||||
public static TColKey? parse_col_id<TColKey>(string id) where TColKey : struct =>
|
||||
Enum.TryParse(id, true, out TColKey key) ? key : (TColKey?)null;
|
||||
|
||||
public static string fmt_col_id<TColKey>(TColKey key) where TColKey : struct =>
|
||||
key.ToString();
|
||||
|
||||
public static void normalize_sorting_criterion<TColKey>(IEnumerable<SortingCriteria> sorting_criterion, IReadOnlyDictionary<string, TColKey> sort_member_to_id) where TColKey : struct =>
|
||||
normalize_sorting_criterion(sorting_criterion, new Func<string, TColKey?>[] {
|
||||
parse_col_id<TColKey>,
|
||||
col_name => sort_member_to_id.TryGetValue(col_name, out var k) ? k : (TColKey?)null
|
||||
});
|
||||
|
||||
public static void normalize_sorting_criterion<TColKey>(IEnumerable<SortingCriteria> sorting_criterion, IEnumerable<Func<string, TColKey?>> conversion_dels) where TColKey : struct {
|
||||
foreach (var sc in sorting_criterion) {
|
||||
sc.col_name = conversion_dels
|
||||
.Select(del => del(sc.col_name))
|
||||
.FirstOrDefault(k => k.HasValue)?.ToString() ?? sc.col_name;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,8 +1,5 @@
|
||||
using bts;
|
||||
using bts.collections;
|
||||
using bts.utils;
|
||||
using bts.utils;
|
||||
using mbts.collections;
|
||||
using mbts.ui.settings;
|
||||
using mbts.ui.utility;
|
||||
using mbts.utils;
|
||||
using System;
|
||||
@@ -54,17 +51,8 @@ namespace mbts.ui.controls {
|
||||
).to_comparer();
|
||||
}
|
||||
|
||||
public void load_from(IEnumerable<SortingCriteria> sorting_criterion) {
|
||||
var sort_member_to_id = _map
|
||||
.Where(kv => !string.IsNullOrEmpty(kv.Value.col.sort_member_path))
|
||||
.Distinct()
|
||||
.ToDictionary(kv => kv.Value.col.sort_member_path, kv => kv.Key);
|
||||
GridSettingsHelper.normalize_sorting_criterion(sorting_criterion, sort_member_to_id);
|
||||
_on_settings(sorting_criterion
|
||||
.Select(sc => (GridSettingsHelper.parse_col_id<TColKey>(sc.col_name), sc.is_ascending ? ListSortDirection.Ascending : ListSortDirection.Descending))
|
||||
.Where(t => t.Item1.HasValue)
|
||||
.Select(t => (t.Item1.Value, t.Item2)));
|
||||
}
|
||||
public void load_from(IEnumerable<SortingCriteria> sorting_criterion) =>
|
||||
_on_settings(sorting_criterion.Select(sc => (EnumHelper.parse<TColKey>(sc.col_name), sc.is_ascending ? ListSortDirection.Ascending : ListSortDirection.Descending)));
|
||||
|
||||
public IEnumerable<SortingCriteria> create() =>
|
||||
_active_cols.AsCollection().Select(t => new SortingCriteria(t.col.id, t.direction == ListSortDirection.Ascending));
|
||||
|
||||
@@ -22,18 +22,15 @@ namespace bts.settings {
|
||||
|
||||
ConsoleEx.WriteLine("Workspace Descriptions", ConsoleColor.Cyan);
|
||||
foreach(var w in workspaces) {
|
||||
// if a workspace doesn't have any windows, we don't care about it
|
||||
if (w.value.windows != null) {
|
||||
var r = from ws in w.value.windows
|
||||
group ws by ws.owner into grouping
|
||||
select new { key = grouping.Key.Replace("bts.shell.", ""), window_count = grouping.Count() };
|
||||
string desc = string.Empty;
|
||||
foreach (var i in r) {
|
||||
desc += $"{Environment.NewLine}\t{i.window_count} - {i.key}";
|
||||
}
|
||||
ConsoleEx.Write($"{w.key}", ConsoleColor.Yellow);
|
||||
ConsoleEx.WriteLine($" - {w.value.windows?.Count} windows - {w.value.named_windows?.Count} named windows - {desc}");
|
||||
var r = from ws in w.value.windows
|
||||
group ws by ws.owner into grouping
|
||||
select new { key = grouping.Key.Replace("bts.shell.", ""), window_count = grouping.Count() };
|
||||
string desc = string.Empty;
|
||||
foreach(var i in r) {
|
||||
desc += $"{Environment.NewLine}\t{i.window_count} - {i.key}";
|
||||
}
|
||||
ConsoleEx.Write($"{w.key}", ConsoleColor.Yellow);
|
||||
ConsoleEx.WriteLine($" - {w.value.windows?.Count} windows - {w.value.named_windows?.Count} named windows - {desc}");
|
||||
}
|
||||
ConsoleEx.WriteLine("");
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ message ExchangeSim {
|
||||
optional bool merge_with_md = 1 [default=true];
|
||||
optional bool forward_implied = 2 [default = false];
|
||||
oneof source {
|
||||
string replay_url = 11 [default = "http://10.96.18.45/spark/futures.coconut"];
|
||||
string replay_url = 11 [default = "http://mdreplay.bluetradesys.local/spark/futures.coconut"];
|
||||
string replay_file = 12 [default = "futures.coconut"];
|
||||
bool local_relay = 13;
|
||||
}
|
||||
|
||||
@@ -98,7 +98,7 @@ message CMEOptions
|
||||
// Defines amount of time Feed Engine keeps cycling before going to sleep when no useful activity can be done
|
||||
optional uint32 spin_time = 4 [default = 1];
|
||||
optional uint32 channels_per_thread = 5 [default = 3];
|
||||
optional uint32 udp_socket_buffer_size = 11 [default = 268435456]; //256mb
|
||||
optional uint32 udp_socket_buffer_size = 11 [default = 33554432]; //32mb
|
||||
}
|
||||
message CMEChannel {
|
||||
repeated string id = 2;
|
||||
@@ -190,8 +190,7 @@ message RecordOptions {
|
||||
// Replay options
|
||||
//
|
||||
message ReplayOptions {
|
||||
// Tired of fighting with dns
|
||||
optional string url = 1 [default = "http://10.96.18.45/spark/futures.coconut"];
|
||||
optional string url = 1 [default = "http://mdreplay.bluetradesys.local/spark/futures.coconut"];
|
||||
|
||||
// 2.0 = double speed, 0.5 = half speed
|
||||
optional double speed = 11 [default = 1.0];
|
||||
|
||||
@@ -358,7 +358,7 @@ OrderManager::free_buffers(std::string const &session_name) {
|
||||
}
|
||||
|
||||
void OrderManager::init_order_services() {
|
||||
auto &log = me->services_data.log;
|
||||
auto& log = me->services_data.log;
|
||||
|
||||
for (auto &s : me->services_data.sessions) {
|
||||
auto gw_name = GatewayName(s->session);
|
||||
@@ -410,14 +410,13 @@ void OrderManager::init_order_services() {
|
||||
};
|
||||
s->exe_report_subs =
|
||||
std::make_unique<ContentSubscription<NewExecutionReportEvent>>(
|
||||
*this, gw_name, on_exe_r, log);
|
||||
*this, gw_name, on_exe_r,log);
|
||||
|
||||
s->cancel_reject_subs =
|
||||
std::make_unique<ContentSubscription<CancelRejectEvent>>(
|
||||
*this, gw_name, log);
|
||||
std::make_unique<ContentSubscription<CancelRejectEvent>>(*this,
|
||||
gw_name,log);
|
||||
s->gateway_status_subs = std::make_unique<
|
||||
ContentSubscription<GatewayStatusChangeEvent, NoKey>>(*this, gw_name,
|
||||
log);
|
||||
ContentSubscription<GatewayStatusChangeEvent, NoKey>>(*this, gw_name,log);
|
||||
|
||||
// publishers for execution reports, gateway status and cancel
|
||||
// reject evets
|
||||
@@ -495,18 +494,18 @@ void OrderManager::init_order_services() {
|
||||
me->services_data.cor_id = ev.trace;
|
||||
};
|
||||
me->services_data.md_subs =
|
||||
std::make_unique<ContentSubscription<BookUpdateEvent>>(
|
||||
*this, on_md_sub, on_book_update, log);
|
||||
std::make_unique<ContentSubscription<BookUpdateEvent>>(*this, on_md_sub,
|
||||
on_book_update,log);
|
||||
me->services_data.ticker_subs =
|
||||
std::make_unique<ContentSubscription<TickerUpdateEvent>>(
|
||||
*this, on_ticker_sub, log);
|
||||
std::make_unique<ContentSubscription<TickerUpdateEvent>>(*this,
|
||||
on_ticker_sub,log);
|
||||
me->services_data.settlement_subs =
|
||||
std::make_unique<ContentSubscription<SettlementUpdateEvent>>(
|
||||
*this, on_settlement_sub, log);
|
||||
*this, on_settlement_sub,log);
|
||||
me->services_data.time_subs =
|
||||
std::make_unique<ContentSubscription<TimerEvent, NoKey>>(*this, log);
|
||||
std::make_unique<ContentSubscription<TimerEvent, NoKey>>(*this,log);
|
||||
me->services_data.order_creation_subs =
|
||||
std::make_unique<ContentSubscription<CreateOrderReplyEvent>>(*this, log);
|
||||
std::make_unique<ContentSubscription<CreateOrderReplyEvent>>(*this,log);
|
||||
}
|
||||
|
||||
void OrderManager::after_event() {
|
||||
@@ -515,8 +514,7 @@ void OrderManager::after_event() {
|
||||
for (auto &osd : me->services_data.sessions) {
|
||||
auto &fix_stream = osd->current_buffer->first_stream();
|
||||
if (fix_stream.n_msgs()) {
|
||||
auto scoped_do_work = trace::log_scope(me->services_data.log, {},
|
||||
"OrderManager::after_event");
|
||||
auto scoped_do_work = trace::log_scope(me->services_data.log, {}, "OrderManager::after_event");
|
||||
fix_stream.close();
|
||||
osd->gw.send_fix(osd->current_buffer, osd->current_trace);
|
||||
reload_fix_buffer(*osd);
|
||||
@@ -538,10 +536,8 @@ void OrderManager::reload_fix_buffer(SessionServicesData &osd) {
|
||||
}
|
||||
}
|
||||
|
||||
void OrderManager::on_poll(trace::PerfLog &log) {
|
||||
auto scoped_do_work =
|
||||
trace::log_scope(log, {}, "OrderManager::dispatch_incoming_fix_messages",
|
||||
utils::TimeStamp::Interval::from_microseconds(2));
|
||||
void OrderManager::on_poll(trace::PerfLog&log) {
|
||||
auto scoped_do_work = trace::log_scope(log, {}, "OrderManager::dispatch_incoming_fix_messages");
|
||||
for (auto &osd : me->services_data.sessions)
|
||||
osd->gw.dispatch_incoming_fix_messages();
|
||||
}
|
||||
|
||||
@@ -316,12 +316,7 @@ unique_ptr<onixs::Handler> MDP3Main::prepare_handler(const string& channel_id, M
|
||||
|
||||
try {
|
||||
auto handler = unique_ptr<onixs::Handler>(new onixs::Handler(settings));
|
||||
auto iter = _engines.find(options.feed_engine());
|
||||
if (iter == _engines.end()) {
|
||||
LOG(md,Fatal, "Missing feed engine definition '{}' for channel id '{}'. Add a feed_engine entry with name:'{}' to the CMEOptions config key.", options.feed_engine(), channel_id, options.feed_engine());
|
||||
bts_assert_msg(iter != _engines.end(), "Missing feed engine definition.");
|
||||
}
|
||||
handler->bindFeedEngine(*(iter->second));
|
||||
handler->bindFeedEngine(*_engines.at(options.feed_engine()));
|
||||
if (recovery) {
|
||||
handler->bindTcpRecovery(*recovery);
|
||||
_recovery.push_back(std::move(recovery));
|
||||
|
||||
@@ -1,69 +0,0 @@
|
||||
Test Author: Pedro
|
||||
If it breaks: Pedro
|
||||
|
||||
Spreader Requote Performance test
|
||||
|
||||
Note: This test is fairly cumbersome to setup, because performance is
|
||||
very sensitive to a number of factors including compilation switches,
|
||||
hardware used, thread allocation and load on the machine. Pedro has
|
||||
the best handle on how do all this and should probably be the one
|
||||
doing this test.
|
||||
|
||||
|
||||
1) Make sure you are testing a release server build
|
||||
|
||||
2) Make sure you use real hardware, with hyper threading turned off
|
||||
and cstates disabled, for the server side
|
||||
|
||||
3) Make sure you isolate the CPU on which you are running the
|
||||
server. This is best done on Linux by editing /etc/default/grub like
|
||||
this:
|
||||
|
||||
# this isolates CPU's 0 to 5 for better performance testing
|
||||
GRUB_CMDLINE_LINUX="isolcpus=0-5"
|
||||
|
||||
4) Now make sure your configuration is set for the lowest latency,
|
||||
including dedicating a thread to the order manager on the isolated
|
||||
cores:
|
||||
|
||||
OrdermanCfg {
|
||||
value {
|
||||
executor {
|
||||
thread_name: "oman_orders"
|
||||
poll: true
|
||||
hosted_actor: "MDSource"
|
||||
hosted_actor: "OrderManager"
|
||||
}
|
||||
executor {
|
||||
thread_name: "oman_slow"
|
||||
poll: false
|
||||
hosted_actor: "*"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Threads {
|
||||
value {
|
||||
thread_group {name_rx: "mdp3feed" core: 0}
|
||||
thread_group {name_rx: "oman_orders" core: 1}
|
||||
thread_group {name_rx: "jf_ar_sim" core: 2}
|
||||
thread_group {name_rx: ".*" core:6 core:7 core:8 core:9 core:10 }
|
||||
}
|
||||
}
|
||||
|
||||
5) Now you are ready to start testing. Start a shell and create a new
|
||||
synthetic say with 2 CL futures. Use the near month (fast ticking)
|
||||
future as the non quoting leg, so that the other leg gets quoted
|
||||
often. Make sure to disable throtling in the synthetic definition
|
||||
dialog.
|
||||
|
||||
6) Place an order for this synthetic, away from the market.
|
||||
|
||||
7) Now run for say 3 minutes. Visit http://youserver:8000/perf_trace
|
||||
You should see a graph indicating the median requote times for the
|
||||
order you created in 5). Make sure you have at least 100 data points
|
||||
and data the median time is around 12us. If you get anything greater
|
||||
than 15us, the test has failed.
|
||||
|
||||
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
Test Author: Unknown
|
||||
If it breaks: John
|
||||
|
||||
User Settings Test (15 min)
|
||||
|
||||
NOTES:
|
||||
@@ -113,4 +116,4 @@ Reference-----------------------------------------------------------
|
||||
with the exception of "Session Range," which represents the fill-color between the session low/high lines
|
||||
- the rows are ordered in the way they [usually]appear in the actual ladder, with the exception of "Session Range"
|
||||
Note: "the way they appear" is qualified with "usually" because it is possible that the current best bid and/or ask are outside the range of the actual session low/high
|
||||
- if you check/uncheck the "show" cell in any row, the sample-grid should reflect this by showing/hiding the item
|
||||
- if you check/uncheck the "show" cell in any row, the sample-grid should reflect this by showing/hiding the item
|
||||
@@ -0,0 +1,18 @@
|
||||
set "ORIG_DIR=%cd%"
|
||||
set "RELEASE_DIR=%ORIG_DIR%\build"
|
||||
del *.7z
|
||||
|
||||
echo %time%
|
||||
|
||||
rmdir /s /q %RELEASE_DIR%
|
||||
call tools\jenkinsbuild.cmd
|
||||
echo %ERRORLEVEL%
|
||||
REM IF NOT ERRORLEVEL 0 GOTO :END
|
||||
echo %time%
|
||||
IF %ERRORLEVEL% NEQ 0 GOTO :ERROR_AND_END
|
||||
cd %ORIG_DIR%
|
||||
7z a -mmt=30 spark_client_%BUILD_NUMBER%.7z %RELEASE_DIR%\Release\bin\net471\* %RELEASE_DIR%\Release\bin\netcoreapp2.1\publish\
|
||||
echo %time%
|
||||
exit /b 0
|
||||
:ERROR_AND_END
|
||||
exit /b 1
|
||||
Reference in new issue
Block a user