Compare commits

...
31 Commits
Author SHA1 Message Date
Eric Harding 80e337c599 sparkcmd should respect '-configserver' 2019-04-22 16:45:36 -04:00
Eric Harding 5b71918a1f Revert "Make sure every sparkcmd command respects -configserver"
This reverts commit dab95d7e91.
2019-04-22 16:41:48 -04:00
Kevin Darby 16fee6e478 Merged in stunnel_win7 (pull request #217)
RTM: Stunnel Win7

Approved-by: Eric Harding <eric.harding@bluetradesys.com>
2019-04-22 17:57:27 +00:00
Kevin Darby 7838bdf04f too much whitespace for even me 2019-04-18 14:16:08 -04:00
Kevin Darby 546553406b PR comments 2019-04-18 14:13:09 -04:00
Kevin Darby 02d0f6191c -added a manifest to our csproj that we'd meant to add anyway for win7 subprocess creation
-added a fallback for stunnel if we can't create a windows job object
2019-04-18 14:06:44 -04:00
Eric Harding 7381088d6d Remove unnecessary error log 2019-04-11 11:07:49 -04:00
Eric Harding 5f9a421490 Additional logging for QueryServer::get_names error 2019-04-11 10:28:21 -04:00
Pedro Pinto 5b118d8fa0 Fixed build. 2019-04-08 09:56:46 -04:00
Pedro Pinto b570762054 Updated release notes. 2019-04-08 09:56:39 -04:00
Pedro Pinto a25c17306f Merge remote-tracking branch 'origin/stunnel' 2019-04-08 09:27:00 -04:00
Pedro Pinto b0c52f542a Updated release notes. 2019-04-08 09:23:21 -04:00
Pedro Pinto dabeb63eac Merge remote-tracking branch 'origin/SPARK-2179-spark-login' 2019-04-08 09:22:39 -04:00
Pedro Pinto f0d3cabd14 Updated release notes. 2019-04-08 09:19:50 -04:00
Pedro Pinto 418a1078c2 Updated release notes. 2019-04-08 09:17:20 -04:00
John Colvin 3d37dc481f SPARK-2192 NullRef when hitting enter in order ticket after typing in a qty then price 2019-04-06 14:39:39 -05:00
Pedro Pinto d24b7a3707 Possibly fixed SPARK-2225.
This bug is probably behind a number of different crashes.
2019-04-05 12:30:44 -04:00
Kevin Darby 12362d9719 Merge branch 'master' of bitbucket.org:bluetradesys/spark into stunnel 2019-04-04 13:06:10 -04:00
Kevin Darby 01128639ce improve error logging 2019-04-04 13:05:40 -04:00
Michael Harding 4cf9d544aa Update PnL test 2019-04-03 09:44:10 -04:00
Michael Harding 79f37f7130 Merge branch 'master' of bitbucket.org:bluetradesys/spark 2019-04-03 09:43:10 -04:00
Kevin Darby 19c0b94803 unsigned... 2019-04-02 18:13:31 -04:00
Kevin Darby 57fc50ce61 typo 2019-04-02 18:12:05 -04:00
Kevin Darby 3cff5343a3 PR review and support of -multiple 2019-04-02 18:10:53 -04:00
Kevin Darby a6ec93e87e Merge branch 'master' of bitbucket.org:bluetradesys/spark into stunnel 2019-04-02 16:08:36 -04:00
Kevin Darby 25acf771ab changes to conditionally start stunnel if the config file is present 2019-04-02 16:05:05 -04:00
Kevin Darby 22cc946f52 Merged in ice_clang (pull request #206)
changes to compile ice market data with clang
2019-04-02 20:04:09 +00:00
Kevin Darby 6d0eb62712 changes to compile ice work with clang 2019-04-02 15:55:29 -04:00
Eric Harding 369b89b3a7 Update default symbol list for compat with deployed config 2019-04-02 15:15:12 -04:00
Michael Harding 467dba98f8 Update Fills window test 2019-04-01 17:06:16 -04:00
Eric Harding 4d60376cb1 SPARK-2179 Spark login screen should show error message instead of blank 2019-03-20 10:43:46 -04:00
19 changed files with 205 additions and 83 deletions

No files matched your search

+6
View File
@@ -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)
+64 -4
View File
@@ -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 {
+2 -1
View File
@@ -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;
+6
View File
@@ -51,6 +51,12 @@ namespace mbts.config
reset();
initialize();
}
public static bool try_initialize(out string error)
{
reset();
return initialize(out error);
}
////////////
/// private
+1 -1
View File
@@ -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);
}
+67 -30
View File
@@ -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
}
}
}
}
+2 -2
View File
@@ -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
+1 -4
View File
@@ -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;
+25
View File
@@ -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
+2 -1
View File
@@ -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());
+1 -2
View File
@@ -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
+2 -4
View File
@@ -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