Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
80e337c599 | ||
|
|
5b71918a1f | ||
|
|
16fee6e478 | ||
|
|
7838bdf04f | ||
|
|
546553406b | ||
|
|
02d0f6191c | ||
|
|
7381088d6d | ||
|
|
5f9a421490 | ||
|
|
5b118d8fa0 | ||
|
|
b570762054 | ||
|
|
a25c17306f | ||
|
|
b0c52f542a | ||
|
|
dabeb63eac | ||
|
|
f0d3cabd14 | ||
|
|
418a1078c2 | ||
|
|
3d37dc481f | ||
|
|
d24b7a3707 | ||
|
|
12362d9719 | ||
|
|
01128639ce | ||
|
|
4cf9d544aa | ||
|
|
79f37f7130 | ||
|
|
19c0b94803 | ||
|
|
57fc50ce61 | ||
|
|
3cff5343a3 | ||
|
|
a6ec93e87e | ||
|
|
25acf771ab | ||
|
|
22cc946f52 | ||
|
|
6d0eb62712 | ||
|
|
369b89b3a7 | ||
|
|
467dba98f8 | ||
|
|
4d60376cb1 |
No files matched your search
@@ -4,6 +4,12 @@ weight = 3
|
||||
sort_by = "weight"
|
||||
insert_anchor_links = "right"
|
||||
+++
|
||||
## 1.5.8
|
||||
### User Visible Changes
|
||||
- Fixed a bug where it was possible to crash the UI by entering an order through the order ticket if Enter was used to dismiss the dialog.
|
||||
- Fixed a spreader reporting bug which could cause the server to crash if an algo was used to control certain types of synthetics
|
||||
- Improved user message when the UI fails to login
|
||||
- Integrated stunnel into UI to make VPN setup unnecessary in unsecured environments.
|
||||
## 1.5.7
|
||||
### User Visible Changes
|
||||
- New videos have been added to the manual describing the [Algo Studio](./bts_spark/Trading/index.md#algo-studio) and [Spreader](./bts_spark/Spreader/index.md)
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Diagnostics;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Linq;
|
||||
@@ -72,13 +74,71 @@ namespace mbts.ui.shell
|
||||
base.OnExit(e);
|
||||
Environment.Exit(0);
|
||||
}
|
||||
|
||||
void start_stunnel(string path, uint job_error)
|
||||
{
|
||||
string config_error;
|
||||
if (!mbts.config.Configuration.try_initialize(out config_error))
|
||||
{
|
||||
_stunnel_process = Process.Start(path + "bin\\stunnel.exe");
|
||||
if (_stunnel_process != null)
|
||||
{
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
if (mbts.config.Configuration.try_initialize(out config_error))
|
||||
break;
|
||||
System.Threading.Thread.Sleep(500);
|
||||
}
|
||||
}
|
||||
else
|
||||
stunnel_job_error = "Stunnel Job Error code: " + job_error +
|
||||
" could not start stunnel " + (config_error ?? string.Empty);
|
||||
}
|
||||
}
|
||||
|
||||
void kill_stunnel()
|
||||
{
|
||||
try
|
||||
{
|
||||
Process[] ps = Process.GetProcessesByName("stunnel");
|
||||
ps.ForEach(p =>
|
||||
{
|
||||
try { p.Kill(); }
|
||||
catch {}
|
||||
});
|
||||
}
|
||||
catch { }
|
||||
}
|
||||
|
||||
Process _stunnel_process;
|
||||
static internal string stunnel_job_error { get; private set;}
|
||||
void init_stunnel(string[] argv)
|
||||
{
|
||||
try
|
||||
{
|
||||
var path = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\BTS\\stunnel\\";
|
||||
if (File.Exists(path + "config\\stunnel.conf"))
|
||||
{
|
||||
uint job_error = BTSUINativeMethods.setup_process_job_object();
|
||||
//if we can't put this process and stunnel into a job, try to stop stunnel then restart
|
||||
if(job_error != 0)
|
||||
kill_stunnel();
|
||||
start_stunnel(path, job_error);
|
||||
}
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
stunnel_job_error = "Error starting stunnel: " + ex.Message;
|
||||
}
|
||||
}
|
||||
|
||||
public new int Run() {
|
||||
var argv = Environment.GetCommandLineArgs();
|
||||
try {
|
||||
if (argv.Contains("-multiple") ||
|
||||
_mutex == null ||
|
||||
_mutex.WaitOne(TimeSpan.Zero, true)) {
|
||||
try {
|
||||
if (argv.Contains("-multiple") || _mutex == null || _mutex.WaitOne(TimeSpan.Zero, true))
|
||||
{
|
||||
if(_mutex == null || _mutex.WaitOne(TimeSpan.Zero, true))
|
||||
init_stunnel(argv);
|
||||
return base.Run();
|
||||
}
|
||||
else {
|
||||
|
||||
@@ -4,7 +4,8 @@
|
||||
<Authors>Blue Trading Systems</Authors>
|
||||
<Company>Blue Trading Systems</Company>
|
||||
<Product>Spark</Product>
|
||||
<Description>The game has changed. Make your Move.</Description>
|
||||
<Description>Advanced Derivatives Trading</Description>
|
||||
<ApplicationManifest>spark.manifest</ApplicationManifest>
|
||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||
<Configurations>Debug;Release</Configurations>
|
||||
<Platforms>x64</Platforms>
|
||||
|
||||
@@ -11,6 +11,9 @@ namespace mbts.ui.native
|
||||
[DllImport("libspark")]
|
||||
public static extern void enable_limits();
|
||||
|
||||
[DllImport("libspark")]
|
||||
public static extern uint setup_process_job_object();
|
||||
|
||||
[DllImport("libspark", CharSet = CharSet.Unicode)]
|
||||
public static extern void set_window_app_id(IntPtr hwnd, string stack_id);
|
||||
}
|
||||
|
||||
@@ -103,10 +103,8 @@ namespace mbts.ui {
|
||||
}
|
||||
|
||||
static void tb_keydown(object sender, KeyEventArgs e) {
|
||||
if (e.Key == Key.Enter) {
|
||||
var binding = BindingOperations.GetBindingExpression(sender as DependencyObject, TextBox.TextProperty);
|
||||
binding.UpdateSource();
|
||||
}
|
||||
if (e.Key == Key.Enter)
|
||||
BindingOperations.GetBindingExpression(sender as DependencyObject, TextBox.TextProperty)?.UpdateSource();
|
||||
}
|
||||
|
||||
public static bool GetCommitOnEnter(DependencyObject obj) => (bool)obj.GetValue(CommitOnEnterProperty);
|
||||
|
||||
@@ -94,7 +94,7 @@ namespace mbts.ui.shell {
|
||||
Configuration.initialize();
|
||||
}
|
||||
catch (ApplicationException e) {
|
||||
ErrorMessage = e.Message;
|
||||
ErrorMessage = (e.Message ?? string.Empty) + " " + (App.stunnel_job_error ?? string.Empty);
|
||||
HasFatalError = true;
|
||||
return;
|
||||
}
|
||||
@@ -106,7 +106,13 @@ namespace mbts.ui.shell {
|
||||
var auth = _ctx.locate<AuthService>();
|
||||
var response = await auth.get_users_async(new GetUsersRequest());
|
||||
if (response.success) {
|
||||
Users = response.value.Users.Select(x => new User(x.Login,x.Id)).OrderBy(u => u.name).ToArray();
|
||||
if (!string.IsNullOrEmpty(response.value.Error)) {
|
||||
ErrorMessage = response.value.Error;
|
||||
HasFatalError = true;
|
||||
}
|
||||
else {
|
||||
Users = response.value.Users.Select(x => new User(x.Login,x.Id)).OrderBy(u => u.name).ToArray();
|
||||
}
|
||||
}
|
||||
else {
|
||||
ErrorMessage = "Logon: " + response.error_message;
|
||||
|
||||
@@ -51,6 +51,12 @@ namespace mbts.config
|
||||
reset();
|
||||
initialize();
|
||||
}
|
||||
|
||||
public static bool try_initialize(out string error)
|
||||
{
|
||||
reset();
|
||||
return initialize(out error);
|
||||
}
|
||||
|
||||
////////////
|
||||
/// private
|
||||
|
||||
@@ -9,7 +9,7 @@ using System.Linq;
|
||||
namespace sparkcmd {
|
||||
class Program {
|
||||
static int Main(string[] args) {
|
||||
mbts.config.Configuration.initialize();
|
||||
mbts.utils.BTSNativeMethods.provide_command_line(args, args.Length);
|
||||
var commands = ConsoleCommandDispatcher.FindCommandsInSameAssemblyAs(typeof(Program));
|
||||
return ConsoleCommandDispatcher.DispatchCommand(commands, args, Console.Out);
|
||||
}
|
||||
|
||||
@@ -1,11 +1,71 @@
|
||||
SymbolLists
|
||||
{
|
||||
value
|
||||
|
||||
SymbolList {
|
||||
value {
|
||||
# This key is here for backwards compatability ONLY.
|
||||
# If you need to update symbols you should update SymbolLists (plural)
|
||||
symbol: "6B"
|
||||
symbol: "6E"
|
||||
symbol: "6J"
|
||||
symbol: "6P"
|
||||
symbol: "ARE"
|
||||
symbol: "BK"
|
||||
symbol: "BOB"
|
||||
symbol: "BUB"
|
||||
symbol: "BZ"
|
||||
symbol: "CL"
|
||||
symbol: "EH"
|
||||
symbol: "ES"
|
||||
symbol: "FYT"
|
||||
symbol: "FOB"
|
||||
symbol: "GC"
|
||||
symbol: "GE"
|
||||
symbol: "GLI"
|
||||
symbol: "HE"
|
||||
symbol: "HG"
|
||||
symbol: "HO"
|
||||
symbol: "KE"
|
||||
symbol: "LE"
|
||||
symbol: "NB"
|
||||
symbol: "NBY"
|
||||
symbol: "NOB"
|
||||
symbol: "NON"
|
||||
symbol: "NG"
|
||||
symbol: "NQ"
|
||||
symbol: "NUB"
|
||||
symbol: "RB"
|
||||
symbol: "SI"
|
||||
symbol: "SOM"
|
||||
symbol: "SR1"
|
||||
symbol: "SR3"
|
||||
symbol: "TN"
|
||||
symbol: "TUF"
|
||||
symbol: "TUT"
|
||||
symbol: "UB"
|
||||
symbol: "XC"
|
||||
symbol: "XK"
|
||||
symbol: "YM"
|
||||
symbol: "ZB"
|
||||
symbol: "ZC"
|
||||
symbol: "ZCW"
|
||||
symbol: "ZF"
|
||||
symbol: "ZL"
|
||||
symbol: "ZM"
|
||||
symbol: "ZN"
|
||||
symbol: "ZO"
|
||||
symbol: "ZQ"
|
||||
symbol: "ZR"
|
||||
symbol: "ZS"
|
||||
symbol: "ZT"
|
||||
symbol: "ZW"
|
||||
}
|
||||
}
|
||||
SymbolLists
|
||||
{
|
||||
value
|
||||
{
|
||||
list
|
||||
{
|
||||
key: "ICE"
|
||||
|
||||
# symbol: "BRN"
|
||||
# symbol: "WBS"
|
||||
# symbol: "OJ"
|
||||
@@ -13,31 +73,8 @@ SymbolLists
|
||||
list
|
||||
{
|
||||
key: "GLBX"
|
||||
|
||||
symbol: "HE"
|
||||
symbol: "LE"
|
||||
symbol: "CL"
|
||||
symbol: "RB"
|
||||
symbol: "HO"
|
||||
symbol: "BZ"
|
||||
symbol: "NG"
|
||||
symbol: "GC"
|
||||
symbol: "SI"
|
||||
symbol: "HG"
|
||||
symbol: "ZW"
|
||||
symbol: "ZC"
|
||||
symbol: "ZS"
|
||||
symbol: "ZM"
|
||||
symbol: "ZL"
|
||||
symbol: "ZO"
|
||||
symbol: "ZR"
|
||||
symbol: "ZB"
|
||||
symbol: "ZN"
|
||||
symbol: "ZF"
|
||||
symbol: "ZT"
|
||||
symbol: "UB"
|
||||
symbol: "GE"
|
||||
}
|
||||
symbol: @SymbolList.symbol
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -74,6 +111,6 @@ Symbols {
|
||||
ice {
|
||||
future: @SymbolLists.list[ICE].symbol
|
||||
spread: @SymbolLists.list[ICE].symbol
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -26,7 +26,7 @@ std::string ICEChannel::to_string() const
|
||||
{
|
||||
std::string mt = name;
|
||||
for(const auto& x : market_types)
|
||||
mt += " " + x;
|
||||
mt += " " + std::to_string(x);
|
||||
return mt;
|
||||
}
|
||||
|
||||
@@ -123,4 +123,4 @@ const std::vector<ICEChannel> get_configured_ice_channels() {
|
||||
|
||||
|
||||
}}} //namespace
|
||||
#endif
|
||||
#endif
|
||||
@@ -380,10 +380,7 @@ public:
|
||||
google::protobuf::MapPair<uint32_t,std::string> v(h.handle.key(), security.ice().security_desc());
|
||||
x->insert(v);
|
||||
}
|
||||
else
|
||||
{
|
||||
LOG(md,Error, "Invalid ExchangeData_case {}", security.ExchangeData_case());
|
||||
}
|
||||
// There is currently no ExchangeData for synthetics
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -166,6 +166,8 @@ class OrderServices {
|
||||
void report_state(const api::orderman::OrderState &state,
|
||||
trace::CorID const &trace = trace::CorID()) {
|
||||
|
||||
bts_assert(state.status() != api::orderman::ORDER_STATUS_INACTIVE);
|
||||
|
||||
OrderStateUpdateEvent ev(_owner->key(), _owner->parent_key(),
|
||||
_owner->definition(), state, trace);
|
||||
_data->owner.publish(_data->report_order_state_pub, ev);
|
||||
|
||||
@@ -452,7 +452,7 @@ bts::api::orderman::OrderStatus SpreaderOrder::_get_order_status () const{
|
||||
bts::api::orderman::OrderStatus::ORDER_STATUS_COMPLETED;
|
||||
case SpreaderState::START:
|
||||
case SpreaderState::WAITING_FOR_INIT_DATA:
|
||||
return bts::api::orderman::OrderStatus::ORDER_STATUS_INACTIVE;
|
||||
return bts::api::orderman::OrderStatus::ORDER_STATUS_WORKING;
|
||||
default:
|
||||
bts_assert(false);
|
||||
return bts::api::orderman::OrderStatus::ORDER_STATUS_INACTIVE;
|
||||
|
||||
@@ -1000,6 +1000,31 @@ extern "C" BTS_EXPORT char *bts_data_path() {
|
||||
}
|
||||
|
||||
extern "C" BTS_EXPORT void free_bts_data_path(char *dp) { delete[] dp; }
|
||||
|
||||
extern "C" BTS_EXPORT unsigned int setup_process_job_object()
|
||||
{
|
||||
#ifdef _WIN32
|
||||
if (IsDebuggerPresent())
|
||||
return 0;
|
||||
HANDLE hjob = CreateJobObject(nullptr, nullptr);
|
||||
if (hjob == nullptr)
|
||||
return 100; //Failed to create JOB object.
|
||||
|
||||
JOBOBJECT_EXTENDED_LIMIT_INFORMATION jeli = {0};
|
||||
jeli.BasicLimitInformation.LimitFlags = JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE;
|
||||
|
||||
BOOL success = SetInformationJobObject(hjob, JobObjectExtendedLimitInformation, &jeli, sizeof(jeli));
|
||||
DWORD error = GetLastError();
|
||||
if(!success)
|
||||
return error;
|
||||
success = AssignProcessToJobObject(hjob, GetCurrentProcess());
|
||||
error = GetLastError();
|
||||
if(!success)
|
||||
return error;
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
} // end namespaces
|
||||
@@ -7,6 +7,7 @@ class IMDPlatform
|
||||
{
|
||||
public:
|
||||
virtual void send_heartbeats();
|
||||
virtual ~IMDPlatform() {}
|
||||
};
|
||||
|
||||
}}
|
||||
}}
|
||||
@@ -56,17 +56,14 @@ void ICEListener::onMarketStateChange(const onixs_ice::MarketStateChange& , cons
|
||||
void ICEListener::onError(const onixs_ice::Error& error)
|
||||
{
|
||||
std::string error_desc(error.description());
|
||||
tracepoint (bts_trace,trace_order,(char*) "onError", 0, (uint16_t) 0, 0);
|
||||
LOG(md,Warn, "OnixS ICE Error: {} - {}", error.toString(), error_desc );
|
||||
}
|
||||
void ICEListener::onFeedError(onixs_ice::FeedId feedid, onixs_ice::ErrorCode code, const std::string& desc)
|
||||
{
|
||||
tracepoint (bts_trace,trace_order,(char*) "onFeedError", 0, (uint16_t) 0, 0);
|
||||
LOG(md,Warn, "OnixS ICE FeedError: {} - {}", feedid, desc, code);
|
||||
}
|
||||
void ICEListener::onWarning(const onixs_ice::Warning& warning)
|
||||
{
|
||||
tracepoint (bts_trace,trace_order,(char*) "onWarning", 0, (uint16_t) 0, 0);
|
||||
LOG(md,Warn, "OnixS ICE Warn: {} - {}", warning.toString(), std::string(warning.description()) );
|
||||
}
|
||||
|
||||
@@ -74,31 +71,27 @@ void ICEListener::onWarning(const onixs_ice::Warning& warning)
|
||||
// Security discovery
|
||||
void ICEListener::onFuturesProductDefinition(const onixs_ice::FuturesProductDefinition& msg, bool& is_interested)
|
||||
{
|
||||
tracepoint (bts_trace,trace_order,(char*) "onFuturesProductDefinition", 0, (uint16_t) 0, 0);
|
||||
if(msg.isSpread)
|
||||
on_future_strip(msg, is_interested);
|
||||
else
|
||||
on_future(msg, is_interested);
|
||||
}
|
||||
|
||||
void ICEListener::onNewExpiry(const onixs_ice::NewExpiry& msg, bool& is_interested, const onixs_ice::MessageInfo& msg_info)
|
||||
void ICEListener::onNewExpiry(const onixs_ice::NewExpiry& msg, bool& is_interested, const onixs_ice::MessageInfo& )
|
||||
{
|
||||
tracepoint (bts_trace,trace_order,(char*) "onNewExpiry", (uint32_t)msg_info.sequenceNumber, (uint16_t) msg_info.sequenceNumber, 0);
|
||||
on_future(msg, is_interested);
|
||||
}
|
||||
|
||||
void ICEListener::onFuturesStrategyDefinition(const onixs_ice::FuturesStrategyDefinition& def, bool& is_interested)
|
||||
{
|
||||
tracepoint (bts_trace,trace_order,(char*) "onFuturesStrategyDefinition", 0, (uint16_t) 0, 0);
|
||||
//TODO need to find out how to produce data for testing
|
||||
//on_uds_future_spread(def, is_interested);
|
||||
UNUSED(def);
|
||||
UNUSED(is_interested);
|
||||
}
|
||||
//This is only for UDS
|
||||
void ICEListener::onNewFuturesStrategyDefinition(const onixs_ice::NewFuturesStrategyDefinition& msg, bool& is_interested, const onixs_ice::MessageInfo& msg_info)
|
||||
void ICEListener::onNewFuturesStrategyDefinition(const onixs_ice::NewFuturesStrategyDefinition& msg, bool& is_interested, const onixs_ice::MessageInfo& )
|
||||
{
|
||||
tracepoint (bts_trace,trace_order,(char*) "onFuturesStrategyDefinition", (uint32_t)msg_info.sequenceNumber, (uint16_t) msg_info.sequenceNumber, 0);
|
||||
//TODO need to find out how to produce data for testing
|
||||
//on_uds_future_spread(msg, is_interested);
|
||||
UNUSED(msg);
|
||||
@@ -152,7 +145,7 @@ void ICEListener::onMarketSnapshotPriceLevel(const onixs_ice::MarketSnapshotPric
|
||||
// Book
|
||||
void ICEListener::onOrderBookUpdated(const onixs_ice::OrderBook& onixs_book, const onixs_ice::MessageInfo& msg_info)
|
||||
{
|
||||
tracepoint (bts_trace,trace_order,(char*) "onBookUpdate", (uint32_t)msg_info.sequenceNumber, (uint16_t) msg_info.sequenceNumber, 0);
|
||||
//tracepoint (bts_trace,trace_order,(char*) "onBookUpdate", (uint32_t)msg_info.sequenceNumber, (uint16_t) msg_info.sequenceNumber, 0);
|
||||
|
||||
auto data = _index.get_security(onixs_book.marketId());
|
||||
if (data == nullptr)
|
||||
@@ -214,9 +207,8 @@ void on_trade(ICESecurityData* data, const onixs_ice::Price& price, int size, on
|
||||
data->handle.add_trade(ts, ps, date, map_aggressor(agside), size);
|
||||
}
|
||||
|
||||
void ICEListener::onTrade(const onixs_ice::Trade& msg, const onixs_ice::MessageInfo& msg_info)
|
||||
void ICEListener::onTrade(const onixs_ice::Trade& msg, const onixs_ice::MessageInfo& )
|
||||
{
|
||||
tracepoint (bts_trace,trace_order,(char*) "onTrade", (uint32_t)msg_info.sequenceNumber, (uint16_t) msg_info.sequenceNumber, 0);
|
||||
auto* data = _index.get_security(msg.marketId);
|
||||
if (data != NULL)
|
||||
{
|
||||
@@ -230,9 +222,8 @@ void ICEListener::onTrade(const onixs_ice::Trade& msg, const onixs_ice::MessageI
|
||||
|
||||
//
|
||||
// RFQ
|
||||
void ICEListener::onRfq(const onixs_ice::Rfq& msg, const onixs_ice::MessageInfo& msg_info)
|
||||
void ICEListener::onRfq(const onixs_ice::Rfq& msg, const onixs_ice::MessageInfo& )
|
||||
{
|
||||
tracepoint (bts_trace,trace_order,(char*) "onRfq", (uint32_t)msg_info.sequenceNumber, (uint16_t) msg_info.sequenceNumber, 0);
|
||||
auto* data = _index.get_security(msg.marketId);
|
||||
if (data != nullptr)
|
||||
{
|
||||
@@ -267,9 +258,8 @@ void ICEListener::onRfq(const onixs_ice::Rfq& msg, const onixs_ice::MessageInfo&
|
||||
|
||||
//
|
||||
// Misc
|
||||
void ICEListener::onSettlementPrice(const onixs_ice::SettlementPrice& msg, const onixs_ice::MessageInfo& msg_info)
|
||||
void ICEListener::onSettlementPrice(const onixs_ice::SettlementPrice& msg, const onixs_ice::MessageInfo& )
|
||||
{
|
||||
tracepoint (bts_trace,trace_order,(char*) "onSettlementPrice", (uint32_t)msg_info.sequenceNumber, (uint16_t) msg_info.sequenceNumber, 0);
|
||||
auto* data = _index.get_security(msg.marketId);
|
||||
if (data != nullptr)
|
||||
{
|
||||
@@ -287,9 +277,8 @@ void ICEListener::onOpenInterest(const onixs_ice::OpenInterest &msg, const onixs
|
||||
UNUSED(msg_info);
|
||||
}
|
||||
|
||||
void ICEListener::onOpenPrice(const onixs_ice::OpenPrice& msg, const onixs_ice::MessageInfo& msg_info)
|
||||
void ICEListener::onOpenPrice(const onixs_ice::OpenPrice& msg, const onixs_ice::MessageInfo& )
|
||||
{
|
||||
tracepoint (bts_trace,trace_order,(char*) "onOpenPrice", (uint32_t)msg_info.sequenceNumber, (uint16_t) msg_info.sequenceNumber, 0);
|
||||
auto* data = _index.get_security(msg.marketId);
|
||||
if (data != nullptr)
|
||||
{
|
||||
@@ -301,9 +290,8 @@ void ICEListener::onOpenPrice(const onixs_ice::OpenPrice& msg, const onixs_ice::
|
||||
}
|
||||
}
|
||||
|
||||
void ICEListener::onClosePrice(const onixs_ice::ClosePrice& msg, const onixs_ice::MessageInfo& msg_info)
|
||||
void ICEListener::onClosePrice(const onixs_ice::ClosePrice& msg, const onixs_ice::MessageInfo& )
|
||||
{
|
||||
tracepoint (bts_trace,trace_order,(char*) "onClosePrice", (uint32_t)msg_info.sequenceNumber, (uint16_t) msg_info.sequenceNumber, 0);
|
||||
auto* data = _index.get_security(msg.marketId);
|
||||
if (data != nullptr)
|
||||
{
|
||||
@@ -315,9 +303,8 @@ void ICEListener::onClosePrice(const onixs_ice::ClosePrice& msg, const onixs_ice
|
||||
}
|
||||
}
|
||||
|
||||
void ICEListener::onEndOfDayMarketSummary(const onixs_ice::EndOfDayMarketSummary& msg, const onixs_ice::MessageInfo& msg_info)
|
||||
void ICEListener::onEndOfDayMarketSummary(const onixs_ice::EndOfDayMarketSummary& msg, const onixs_ice::MessageInfo& )
|
||||
{
|
||||
tracepoint (bts_trace,trace_order,(char*) "onEndOfDayMarketSummary", (uint32_t)msg_info.sequenceNumber, (uint16_t) msg_info.sequenceNumber, 0);
|
||||
auto* data = _index.get_security(msg.marketId);
|
||||
if (data != nullptr)
|
||||
{
|
||||
@@ -333,18 +320,15 @@ void ICEListener::onEndOfDayMarketSummary(const onixs_ice::EndOfDayMarketSummary
|
||||
|
||||
//
|
||||
// Feed
|
||||
void ICEListener::onMulticastMessageBlockBegin(onixs_ice::FeedId feedId, const onixs_ice::MessageInfo& msg_info)
|
||||
void ICEListener::onMulticastMessageBlockBegin(onixs_ice::FeedId feedId, const onixs_ice::MessageInfo& )
|
||||
{
|
||||
UNUSED(feedId);
|
||||
tracepoint (bts_trace,trace_order,(char*) "onMulticastMessageBlockBegin", (uint32_t)msg_info.sequenceNumber, (uint16_t) msg_info.sequenceNumber, 0);
|
||||
}
|
||||
|
||||
void ICEListener::onMulticastMessageBlockEnd(onixs_ice::FeedId feedId, const onixs_ice::MarketIds& marketIds)
|
||||
{
|
||||
UNUSED(feedId);
|
||||
UNUSED(marketIds);
|
||||
tracepoint (bts_trace,trace_order,(char*) "onMulticastMessageBlockEnd.begin", 0, (uint16_t) 0, 0);
|
||||
tracepoint (bts_trace,trace_order,(char*) "onMulticastMessageBlockEnd.end", 0, (uint16_t) 0, 0);
|
||||
}
|
||||
|
||||
void ICEListener::onFeedStarted(onixs_ice::FeedId, const onixs_ice::MarketIds&)
|
||||
|
||||
@@ -217,7 +217,6 @@ unique_ptr<ICEListener> ICEMain::prepare_listener(onixs_ice::Handler& handler, c
|
||||
producer_channels.push_back(_producer.get_channel(symbol.symbol().c_str(), symbol.type(), symbol.exchange()));
|
||||
}
|
||||
|
||||
const auto& options = channel_settings_for(channel);
|
||||
unique_ptr<ICEListener> listener(new ICEListener(_index, _producer, /*_settlement_recorder,*/ producer_channels));
|
||||
for (auto& symbol : channel.symbols)
|
||||
listener->add_filter_symbol(symbol.symbol());
|
||||
|
||||
@@ -3,9 +3,8 @@ Fills UI Test
|
||||
|
||||
Start the form (Trading->Fills)
|
||||
|
||||
Make sure the following columns have filtered when the window starts:
|
||||
Make sure the following columns have filters when the window starts:
|
||||
Fill Time: Since Open
|
||||
Fill Kind: Standard, Leg
|
||||
|
||||
Cross an order, get a fill and make sure it shows up
|
||||
Test sorting and filtering
|
||||
@@ -17,12 +17,10 @@ and you may also want to clear your orders for a clean slate:
|
||||
Throughout the test we'll refer to accounts ACC A and ACC A1. These specific accounts aren't necessary, but rather that we have fills in multiple distinct accounts.
|
||||
|
||||
Bring up the pnl form (empty).
|
||||
Bring up a SIM:SI ladder form, pick your favorite expiration. It should be completely empty since we're controlling the md, and the ACC A account should be selected in the account drop down list.
|
||||
Bring up a SIM:SI ladder form, pick your favorite expiration. It should be completely empty (just prices, no sizes) since we're controlling the md, and the ACC A account should be selected in the account drop down list.
|
||||
Bring up an order ticket for your corresponding ladder
|
||||
place a buy order with price 14.000 and qty 10
|
||||
your ladder should populate now
|
||||
place a sell order with price 14.010 at qty 10
|
||||
this will give you a valid Midpoint for your PnL Price in the PnL
|
||||
place a sell order with price 14.010 at qty 10 this will give you a valid Midpoint for your PnL Price in the PnL
|
||||
Sell a 1 lot at your bid (14.000)
|
||||
The Start Net Pos should be 0
|
||||
Start Pnl should be 0
|
||||
|
||||
Reference in new issue
Block a user