Compare commits

..
114 Commits
Author SHA1 Message Date
Mohammad Arham f61907eefb fix timed start issue 2024-03-22 16:10:33 -04:00
Mohammad Arham e01a37e4cf added support for eth met and mbt 2024-03-22 16:10:07 -04:00
Mohammad Arham 64fd23f0ed fixed buy on first entry 2023-11-13 22:19:57 -05:00
Mohammad Arham 0220401011 another pnl patch THIS IS PROD NOW 2023-10-27 08:26:25 -04:00
Mohammad Arham af52c752f0 small fixes 2023-10-27 01:02:38 -04:00
Mohammad Arham dc86ebd92e removed market logger due to storage issues 2023-10-25 20:53:57 -04:00
Mohammad Arham 1ca23d7d8a fix missing comma in log 2023-10-25 20:29:33 -04:00
Mohammad Arham bf564eb918 fixed pnl issue 2023-10-25 19:52:36 -04:00
Mohammad Arham 10637db1eb fixed bug in sim, sec id changed 2023-10-25 01:06:18 -04:00
Mohammad Arham ea13bb31ec updated file runner 2023-10-24 23:59:56 -04:00
Mohammad Arham c20bd60ff7 fixed bug in file sim 2023-10-24 11:26:45 -04:00
Mohammad Arham 305dc62389 new pnl and algo now can multilot limit orders 2023-10-21 02:31:53 -04:00
Mohammad Arham f599c940b3 commented out code to reduce keycode error 2023-10-09 10:47:43 -05:00
Mohammad Arham 21477b90fe added assert for max reconnect attempts 2023-09-27 17:28:02 +00:00
John Colvin 582a442ae8 fix build: Copy libspark.dll to 'net471' dir
It was copying to 'net7.0', the correct dir in development branch, which
makes sense as that was the branch from which this change was originally
cherry-picked.
2023-09-22 10:45:42 -04:00
John Colvin b0bc03335d build: Remove redundant flags in CMakeLists.txt
They're already defined in CMakePresets.json
2023-09-22 10:45:42 -04:00
John Colvin 318db81ced build: Update Google.Protobuf 3.6.1 -> 3.24.3 2023-09-22 10:45:42 -04:00
John Colvin 454fa05692 build: Remove spark_excel.csproj from spark_client.sln
No one uses it, and it depends on the old .net 471 framework
2023-09-22 10:45:42 -04:00
John Colvin ebba07b994 build: Remove libspark from spark_client.sln
The libspark bins are now copied over to dotnet build dirs via a custom
cmake target
2023-09-22 09:44:48 -04:00
John Colvin e53b7713a4 build: Remove unnecessary CMakeDeps files
They're regenerated on every build, so no need to track them.
2023-09-21 22:16:03 -04:00
Mohammad Arham ad43b8535b undo cmake list changes 2023-09-21 15:35:31 +00:00
Mohammad Arham ba07a6cc8a big fix in md_Sec_id momentum algo 2023-09-21 05:17:53 +00:00
Mohammad Arham bb419cf048 changes for diff md source securiity 2023-09-20 03:50:00 +00:00
Mohammad Arham 7b74ff1525 Merge branch 'prod' of bitbucket.org:bluetradesys/spark into prod 2023-09-20 03:29:21 +00:00
Mohammad Arham 2974a04281 added logs to execution to get max reconectatemps 2023-09-20 03:17:34 +00:00
John Colvin 0089bafeaa build: Add 'spark' (client build) to CMakePresetes 2023-09-19 14:11:52 -05:00
Mohammad Arham 217d83e955 changed default retry attmt cnt 2023-09-19 15:35:06 +00:00
arhamGIT 8ea18cb74a Merge branch 'prod' of bitbucket.org:bluetradesys/spark into prod 2023-09-19 11:27:32 -04:00
John Colvin 1b836b24a8 fix build: Fix build in new docker
* Disable warnings via GCC diagnostic push
* Add a few sys includes
2023-09-19 05:51:33 +00:00
John Colvin bad703a847 fix: Replace 'auto' with 'auto &'
These variables were clearly being copied by accident
2023-09-19 05:51:33 +00:00
John Colvin 27dce596f5 refactor: Make cstring calls w/ platform agnostic
With 'ifdef WIN32' logic in alias functions defined in os.cpp
2023-09-19 05:51:33 +00:00
John Colvin bda097c754 fix build (cpp win): Use explicit void template arg in memcpy 2023-09-19 05:51:33 +00:00
John Colvin 09353b897b fix: Rebuild protobuf libs so they're compatible w/ new docker 2023-09-19 05:51:33 +00:00
John Colvin 31009e38bb build: Simplify CMakeLists by adding CMakePresets 2023-09-19 05:49:37 +00:00
John Colvin e1d66e9a0e chore (linux build): Add benign changes to satisfy clang13 2023-09-18 21:38:28 +00:00
John Colvin 616361eaf1 refactor: Remove unused config-fallback path
This seems to have been here since the dawn of Spark. It is only
initialized via the -ConfigFallback option in the sparkd cli, an option
that no one ever uses (the cli provides no documentation for it either).
2023-09-18 21:38:28 +00:00
John Colvin 67b70d2d8c Add pragma once to ConfigurationState.h 2023-09-18 21:38:28 +00:00
John Colvin 9f0a24f1ec fix build (client): Change 'WIN32' macros to '_WIN32'
Not sure exactly how this broke, but the WIN32 macro is no longer defined.
2023-09-18 21:38:28 +00:00
John Colvin 85ad072837 Add bts/api/domain to proto search path for config 2023-09-18 21:38:28 +00:00
John Colvin 6327bcc109 fix build: Comment out include line to fix prod build in new docker 2023-09-18 15:19:27 +00:00
Mohammad Arham 2e51aebc94 position flattener 2023-09-14 16:25:59 +00:00
Mohammad Arham 50ec2f14f7 removed authentication from auth session manager 2023-09-14 16:25:47 +00:00
Mohammad Arham 2457fe4e35 fixed error due to merge 2023-09-14 16:23:40 +00:00
Mohammad Arham 59240ae45f chgd cnvrt strng to utc tm to hndl asrt for empty 2023-09-14 16:23:20 +00:00
Mohammad Arham 04acb4f459 changes to malke ilink3 work 2023-09-14 16:20:26 +00:00
Mohammad Arham 23a1f65c5f Merge branch 'prod' of bitbucket.org:bluetradesys/spark into prod 2023-05-11 16:53:55 -05:00
Mohammad Arham c0de84c4ec to make prod work with old cmake 2023-05-11 16:53:50 -05:00
John Colvin 2ce99ddbd2 Update externals to get upgrades for old prod 2023-05-09 14:47:10 -05:00
John Colvin 301df9ca36 fix build: Add a couple sys includes, disable werrors
At last, old prod builds in the new docker (devcontainer)
2023-05-09 14:47:05 -05:00
John Colvin 3c58607fe1 fix build: Disable server sdk build 2023-05-09 14:30:53 -05:00
John Colvin 561d8d66d5 fix build: Fix more build errors in old prod
Patrick needs this branch for now, hopefully we'll retire it soon
2023-05-09 14:30:50 -05:00
John Colvin 14fc68f8e6 Fix build errors caused by big merge, externals upgrade
A lot of server-side changes were just merged as part of the Brandon
project (crypto).  Many of those changes were in libspark (a lib on
which both the client and server depend), and upgrades to its external
dependencies.  As a result, windows counterparts of several upgraded
external libs needed to be similarly upgraded (or added for the first
time).  These libs include: boost, btree, catch, curl, fmt, nlohmann json,
openssl, range, rxcpp, websocketpp

This change also makes protobuf generation compatible with python3, and thus
eliminates the build's dependency on python2
2023-05-09 14:30:48 -05:00
John Colvin f19391dac5 refactor: Replace refs to google/btree w/ Kronuz/btree
The former has been replaced with the latter in externals
2023-05-09 14:27:39 -05:00
Mohammad Arham 64226d3698 updated git ignore 2023-05-09 16:47:25 +00:00
Taha Afzal 65728df991 added try catch to capture parsing errors 2023-05-09 10:48:51 -05:00
Taha Afzal 897c9808d0 patched 2023-02-15 12:19:58 -05:00
Taha Afzal 022a489b18 added try catch and changed string parse 2023-02-14 09:26:25 -05:00
Taha Afzal 49e3ec2f05 added hull avg and independant hi/lo avg 2023-01-31 19:42:12 -05:00
Taha Afzal e8f98102d2 added different params from upr and lwr gan 2023-01-23 00:21:29 -05:00
Taha Afzal e6d845f970 patched early order 2022-12-20 12:22:24 -05:00
arhamGIT e3b3663a78 Merge branch 'prod' of bitbucket.org:bluetradesys/spark into prod 2022-12-13 01:02:30 -05:00
Taha Afzal afefaa36d1 added early entry 2022-12-13 00:58:32 -05:00
arhamGIT e934e28b43 Merge local 'prod' of into prod 2022-12-12 08:36:43 -05:00
arhamGIT eb55be6066 merging 2022-12-12 08:18:12 -05:00
Taha Afzal 27c410c485 filerunner runs one at a time 2022-11-22 14:41:53 -05:00
Taha Afzal cd8dc02487 Merge branch 'prod' of bitbucket.org:bluetradesys/spark into prod 2022-11-22 12:18:19 -05:00
Taha Afzal e31a4f7265 filerunner working 2022-11-22 12:18:08 -05:00
Taha Afzal 2e83868209 file loading 2022-10-28 11:48:20 -04:00
johncolvin-og 0cce94129b build: Use unix eol in build_sparkd, exec not eval 2022-10-03 01:49:03 -05:00
John Colvin 8c643d74c6 Update docker/linux
To get latest cmake (build_sparkd.sh needs v>=3.13 bc it uses the '-S' opt)
2022-10-01 20:55:33 -04:00
John Colvin 394f495bd1 Update docker/linux
To get python3-venv
2022-10-01 20:55:33 -04:00
John Colvin 68d5a28fd4 build: Ensure python virtual env is installed/up-to-date 2022-10-01 20:55:33 -04:00
johncolvin-og 4182b30d22 test 2022-09-30 18:08:14 -05:00
johncolvin-og 7f44233ae3 test 2022-09-30 16:22:00 -05:00
johncolvin-og a4510ebbd9 build: Port build/publish_spark scripts over from crypto branches 2022-09-30 16:06:58 -05:00
Taha Afzal 69d9e36b4e added momentumalgo 2022-09-30 00:30:30 -05:00
John Colvin c496a426ab build: Set CMAKE_INSTALL_PREFIX (for deployment)
Run 'cmake --build <path_to_build> --target install' to create a self-
contained executable sparkd in the 'install' dir at the root of the repo
2022-09-30 00:29:24 -04:00
John Colvin 1612ae7959 build: Set up cmake 'install' build target
The 'install' build target creates a self-contained (deployable) sparkd
package. It copies the sparkd executable and its dependencies into a
single directory (no symlinks), which can then be copied/deployed to
another machine.

Run `cmake --build . --target install` to install sparkd in the
directory defined by the CMAKE_INSTALL_PREFIX variable.
2022-09-30 00:28:54 -04:00
John Colvin 7c7aa727e2 fix build (linux): Port py3 build scripts over from spark_crypto.dev 2022-09-29 17:47:23 -04:00
johncolvin-og 45d6d0f673 fix build (win): Update build scripts to use VS 2022 & py venv
Clean scripts up a bit while we're at it
2022-09-29 14:42:34 -05:00
johncolvin-og 80a5ec5265 fix build (win partial): Copy venv from spark_crypto.dev
Might not need all of these pkgs, but seems sensible to use a common venv
2022-09-29 14:38:03 -05:00
johncolvin-og 09cc78914f fix build (win partial): Update plugin.py for py3 venv 2022-09-29 14:37:59 -05:00
johncolvin-og 546dbfbd54 fix build (win, partial): Update CSharp targets for vs 2022 2022-09-29 13:19:24 -05:00
John Colvin a9e5fb8f46 Add .venv dirs to .gitignore 2022-09-29 13:17:42 -05:00
johncolvin-og 7dd6efb477 Update externals to get new boost in windows 2022-09-29 13:09:18 -05:00
John Colvin 0c150e1caa Fix server build (linux compiler doesn't like pragma push) 2022-09-29 13:00:15 -05:00
John Colvin d2278e6b4a build: Update win compiler to Visual Studio 16 2019 2022-09-29 12:58:08 -05:00
John Colvin 1b81ad7638 Don't track .vscode files in source control 2022-09-29 12:57:25 -05:00
John Colvin bd21cf56fe Disable align related warning in vs 2019 build 2022-09-29 12:53:56 -05:00
John Colvin c37d4479b5 build (client cpp): Remove ZERO_CHECK.vcxproj from spark_client.sln
The new cmake generates ZERO_CHECK.proj instead, which doesn't need to be
included in the sln. I think this change was introduced in v 3.22.

Devs: This won't break the build for older versions of cmake, although you may
need to manually touch "CMakeLists.txt" when you add/remove build src files
2022-09-29 12:31:34 -05:00
John Colvin 3f7e7d38ff fix build: Copy a handful of files over from spark_crypto.dev
This fixes the last of the boost-related errors
2022-09-29 12:20:08 -04:00
John Colvin 591239b13e fix build (partial): Update externals to get new websocketpp
This fixes some of the boost errors related to the recent boost upgrade
2022-09-29 12:20:06 -04:00
John Colvin 08494728f0 fix build: Disable web build
That's one way to fix it!
2022-09-29 12:11:55 -04:00
Pedro Pinto ef833c5705 Made uuid in jetfix configurable. 2021-04-06 13:21:27 -04:00
Pedro Pinto 44216afd51 Added to .gitignore 2021-04-06 13:14:27 -04:00
Pete Fisher cad407827d new keycode 2021-03-25 11:25:20 -04:00
Pete Fisher 9714135b7d cme schema update to v7 2021-03-25 10:33:41 -04:00
Pete Fisher c82e598313 updating submodule to latest 2021-03-18 17:18:52 -04:00
Pedro Pinto e7806d2fec Merge branch 'master' into prod 2020-09-16 16:28:36 -04:00
Taha Afzal c30bab899f Changing TASCounter to use the new formula 2020-07-29 09:43:00 -04:00
Taha Afzal 46544f36f1 Pyramid Algo now sends hedges for fills while a cancel is in flight 2020-07-23 13:13:52 -04:00
John Colvin c7df3ac43c Merge remote-tracking branch 'origin/csv_export' into prod 2020-07-22 10:44:58 -05:00
Jake Norbut 9d1b03d1e2 fixing merge 2020-03-04 11:51:05 -06:00
Jake Norbut 9a677cf980 merging master into csv_export; taking master 2020-03-04 11:50:56 -06:00
Jake Norbut 25445d58d0 refactoring TaS CSV export 2019-12-18 13:48:14 -06:00
Jake Norbut 0b313a8aa8 refactoring Fills CSV export 2019-12-18 13:47:36 -06:00
Jake Norbut 54f954fd4b adding CSV export to order book 2019-12-18 13:47:03 -06:00
Jake Norbut 980f38ba03 using OrderedDictionary to CSVs are output with a predictable column order 2019-12-18 13:46:22 -06:00
Jake Norbut 9eada2724b Having the Command be on the Window rather than the VM; nice thinking John 2019-12-18 10:11:10 -06:00
Jake Norbut b5f53ee918 adding csv_properties to TimeAndSalesVM.Row 2019-12-18 10:10:04 -06:00
Jake Norbut efc175f654 adding export to csv command to Fills window 2019-12-17 10:32:58 -06:00
Jake Norbut 6074afd999 adding csv export command to fills vm 2019-12-17 10:32:15 -06:00
Jake Norbut 219dff4055 adding new export_csv IDialogCommand which just creates a new file 2019-12-17 10:28:57 -06:00
Jake Norbut 9a3b07b622 adding ToCsv IEnumerable ext method in a new util namespace 2019-12-17 10:21:38 -06:00
4231 changed files with 148915 additions and 768051 deletions

No files matched your search

-9
View File
@@ -1,10 +1 @@
IndentWidth: 3
BinPackArguments: true
BinPackParameters: false
AlignAfterOpenBracket: AlwaysBreak
AlwaysBreakTemplateDeclarations: true
PenaltyReturnTypeOnItsOwnLine: 140
---
Language: Proto
IndentWidth: 2
AllowShortFunctionsOnASingleLine: None
-30
View File
@@ -1,30 +0,0 @@
{
"version": 1,
"isRoot": true,
"tools": {
"dotnet-format": {
"version": "5.1.225507",
"commands": [
"dotnet-format"
]
},
"fable": {
"version": "4.0.0-theta-018",
"commands": [
"fable"
]
},
"fantomas": {
"version": "5.2.2",
"commands": [
"fantomas"
]
},
"fake-cli": {
"version": "6.0.0",
"commands": [
"fake"
]
}
}
}
-251
View File
@@ -1,251 +0,0 @@
# Remove the line below if you want to inherit .editorconfig settings from higher directories
root = true
# C# files
[*.cs]
#### Core EditorConfig Options ####
# Indentation and spacing
indent_size = 3
indent_style = space
tab_width = 3
# New line preferences
end_of_line = crlf
insert_final_newline = true
#### .NET Coding Conventions ####
# Organize usings
dotnet_separate_import_directive_groups = true
dotnet_sort_system_directives_first = false
file_header_template = unset
# this. and Me. preferences
dotnet_style_qualification_for_event = false:silent
dotnet_style_qualification_for_field = false:silent
dotnet_style_qualification_for_method = false:silent
dotnet_style_qualification_for_property = false:silent
# Language keywords vs BCL types preferences
dotnet_style_predefined_type_for_locals_parameters_members = true:silent
dotnet_style_predefined_type_for_member_access = true:silent
# Parentheses preferences
dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity:silent
dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:silent
dotnet_style_parentheses_in_other_operators = never_if_unnecessary:silent
dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:silent
# Modifier preferences
dotnet_style_require_accessibility_modifiers = for_non_interface_members:silent
# Expression-level preferences
dotnet_style_coalesce_expression = true:suggestion
dotnet_style_collection_initializer = true:suggestion
dotnet_style_explicit_tuple_names = true:suggestion
dotnet_style_null_propagation = true:suggestion
dotnet_style_object_initializer = true:suggestion
dotnet_style_operator_placement_when_wrapping = beginning_of_line
dotnet_style_prefer_auto_properties = true:silent
dotnet_style_prefer_compound_assignment = true:suggestion
dotnet_style_prefer_conditional_expression_over_assignment = true:silent
dotnet_style_prefer_conditional_expression_over_return = true:silent
dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion
dotnet_style_prefer_inferred_tuple_names = true:suggestion
dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion
dotnet_style_prefer_simplified_boolean_expressions = true:suggestion
dotnet_style_prefer_simplified_interpolation = true:suggestion
# Field preferences
dotnet_style_readonly_field = true:suggestion
# Parameter preferences
dotnet_code_quality_unused_parameters = all:suggestion
# Suppression preferences
dotnet_remove_unnecessary_suppression_exclusions = none
#### C# Coding Conventions ####
# var preferences
csharp_style_var_elsewhere = false:silent
csharp_style_var_for_built_in_types = false:silent
csharp_style_var_when_type_is_apparent = false:silent
# Expression-bodied members
csharp_style_expression_bodied_accessors = true:silent
csharp_style_expression_bodied_constructors = false:silent
csharp_style_expression_bodied_indexers = true:silent
csharp_style_expression_bodied_lambdas = true:silent
csharp_style_expression_bodied_local_functions = false:silent
csharp_style_expression_bodied_methods = false:silent
csharp_style_expression_bodied_operators = false:silent
csharp_style_expression_bodied_properties = true:silent
# Pattern matching preferences
csharp_style_pattern_matching_over_as_with_null_check = true:suggestion
csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion
csharp_style_prefer_not_pattern = true:suggestion
csharp_style_prefer_pattern_matching = true:silent
csharp_style_prefer_switch_expression = true:suggestion
# Null-checking preferences
csharp_style_conditional_delegate_call = true:suggestion
# Modifier preferences
csharp_prefer_static_local_function = true:suggestion
csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:silent
# Code-block preferences
csharp_prefer_braces = true:silent
csharp_prefer_simple_using_statement = true:suggestion
# Expression-level preferences
csharp_prefer_simple_default_expression = true:suggestion
csharp_style_deconstructed_variable_declaration = true:suggestion
csharp_style_inlined_variable_declaration = true:suggestion
csharp_style_pattern_local_over_anonymous_function = true:suggestion
csharp_style_prefer_index_operator = true:suggestion
csharp_style_prefer_range_operator = true:suggestion
csharp_style_throw_expression = true:suggestion
csharp_style_unused_value_assignment_preference = discard_variable:suggestion
csharp_style_unused_value_expression_statement_preference = discard_variable:silent
# 'using' directive preferences
csharp_using_directive_placement = inside_namespace:silent
#### C# Formatting Rules ####
# New line preferences
csharp_new_line_before_catch = false
csharp_new_line_before_else = false
csharp_new_line_before_finally = false
csharp_new_line_before_members_in_anonymous_types = true
csharp_new_line_before_members_in_object_initializers = true
csharp_new_line_before_open_brace = none
csharp_new_line_between_query_expression_clauses = true
# Indentation preferences
csharp_indent_block_contents = true
csharp_indent_braces = false
csharp_indent_case_contents = true
csharp_indent_case_contents_when_block = true
csharp_indent_labels = one_less_than_current
csharp_indent_switch_labels = true
# Space preferences
csharp_space_after_cast = false
csharp_space_after_colon_in_inheritance_clause = true
csharp_space_after_comma = true
csharp_space_after_dot = false
csharp_space_after_keywords_in_control_flow_statements = true
csharp_space_after_semicolon_in_for_statement = true
csharp_space_around_binary_operators = before_and_after
csharp_space_around_declaration_statements = false
csharp_space_before_colon_in_inheritance_clause = true
csharp_space_before_comma = false
csharp_space_before_dot = false
csharp_space_before_open_square_brackets = false
csharp_space_before_semicolon_in_for_statement = false
csharp_space_between_empty_square_brackets = false
csharp_space_between_method_call_empty_parameter_list_parentheses = false
csharp_space_between_method_call_name_and_opening_parenthesis = false
csharp_space_between_method_call_parameter_list_parentheses = false
csharp_space_between_method_declaration_empty_parameter_list_parentheses = false
csharp_space_between_method_declaration_name_and_open_parenthesis = false
csharp_space_between_method_declaration_parameter_list_parentheses = false
csharp_space_between_parentheses = false
csharp_space_between_square_brackets = false
# Wrapping preferences
csharp_preserve_single_line_blocks = true
csharp_preserve_single_line_statements = true
#### Naming styles ####
# Naming rules
dotnet_naming_rule.interface_should_be_begins_with_i.severity = suggestion
dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface
dotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i
dotnet_naming_rule.types_should_be_pascal_case.severity = suggestion
dotnet_naming_rule.types_should_be_pascal_case.symbols = types
dotnet_naming_rule.types_should_be_pascal_case.style = pascal_case
dotnet_naming_rule.non_field_members_should_be_pascal_case.severity = suggestion
dotnet_naming_rule.non_field_members_should_be_pascal_case.symbols = non_field_members
dotnet_naming_rule.non_field_members_should_be_pascal_case.style = pascal_case
# Symbol specifications
dotnet_naming_symbols.interface.applicable_kinds = interface
dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
dotnet_naming_symbols.interface.required_modifiers =
# user types
dotnet_naming_symbols.user_types.applicable_kinds = class, struct, interface, enum
dotnet_naming_symbols.user_types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
dotnet_naming_symbols.user_types.required_modifiers =
# non_field_members
dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method
dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
dotnet_naming_symbols.non_field_members.required_modifiers =
# public symbols
dotnet_naming_symbols.public_symbols.applicable_kinds = property,method,field,event,delegate
dotnet_naming_symbols.public_symbols.applicable_accessibilities = public,internal
# parameters
dotnet_naming_symbols.parameters.applicable_kinds = parameter
dotnet_naming_symbols.parameters.applicable_accessibilities = public,internal,protected,private,protected_internal,private_internal
# private symbols
dotnet_naming_symbols.private_symbols.applicable_kinds = property,method,field,event,delegate
dotnet_naming_symbols.private_symbols.applicable_accessibilities = protected,private
# Naming styles
dotnet_naming_style.snake_case.required_prefix =
dotnet_naming_style.snake_case.required_suffix =
dotnet_naming_style.snake_case.word_separator = _
dotnet_naming_style.snake_case.capitalization = all_lower
dotnet_naming_style.private_snake_case.required_prefix = _
dotnet_naming_style.private_snake_case.required_suffix =
dotnet_naming_style.private_snake_case.word_separator = _
dotnet_naming_style.private_snake_case.capitalization = all_lower
dotnet_naming_style.user_types.required_prefix =
dotnet_naming_style.user_types.required_suffix =
dotnet_naming_style.user_types.word_separator =
dotnet_naming_style.user_types.capitalization = pascal_case
dotnet_naming_style.interface.required_prefix = I
dotnet_naming_style.interface.required_suffix =
dotnet_naming_style.interface.word_separator =
dotnet_naming_style.interface.capitalization = pascal_case
# rules
dotnet_naming_rule.user_types.symbols = user_types
dotnet_naming_rule.user_types.style = user_types
dotnet_naming_rule.user_types.severity = suggestion
dotnet_naming_rule.interfaces.symbols = interface
dotnet_naming_rule.interfaces.style = interface_style
dotnet_naming_rule.interfaces.severity = suggestion
dotnet_naming_rule.public_members_snake_case.symbols = public_symbols
dotnet_naming_rule.public_members_snake_case.style = snake_case
dotnet_naming_rule.public_members_snake_case.severity = suggestion
dotnet_naming_rule.private_members_snake_case.symbols = private_symbols
dotnet_naming_rule.private_members_snake_case.style = private_snake_case
dotnet_naming_rule.private_members_snake_case.severity = suggestion
dotnet_naming_rule.parameters.symbols = parameters
dotnet_naming_rule.parameters.style = snake_case
dotnet_naming_rule.parameters.severity = suggestion
+8 -18
View File
@@ -1,14 +1,10 @@
nohup.out
build/**
install/**
.build_proxy/
build/
cmake-build-debug/
.cache/
.ipynb_checkpoints/
.idea/
.dir-locals.el
*.pyc
**.vscode
*.vscode/*
.vs
obj/
*.csproj.user
@@ -20,13 +16,10 @@ vcxproj.user
src/client/spark/Properties/launchSettings.json
compile_commands.json
.cquery_cached_index/
.cache/*
.clangd/*
src/client/sparkcmd/Properties/launchSettings.json
node_modules
paket-files
project.lock.json
src/.clang-format
src/server/sparkd/orderman/perf_analysis/data
src/server/sparkd/orderman/perf_analysis/logs/
src/server/sparkd/orderman/perf_analysis/trace_data/
@@ -41,13 +34,10 @@ trace_data/
.ionide/*
/.ignore
*.rej
/build
.clangd/
*CMakeDeps.cmake
/sniper.ipynb
/src/.clang-format
/src/server/sparkd/cmds/spartan/analysis/.ipynb_checkpoints
/src/server/sparkd/cmds/spartan/analysis/data
*.tmp/*
/.venv*/*
.cache/
src/web/api/tsconfig.*.g.json
/.cache/
.venv/**
install/**
.devcontainer/**
/src/Spark.Admin.WebApp/src/bin/
+21 -85
View File
@@ -1,113 +1,49 @@
cmake_minimum_required(VERSION 3.12)
cmake_minimum_required(VERSION 3.5)
project(spark)
if(WIN32)
set(platform "windows")
else()
set(platform "linux")
endif()
if (WIN32)
set (platform "windows")
else ()
set (platform "linux")
endif ()
set(
EXTERNALS_ROOT
"${CMAKE_SOURCE_DIR}/externals/${platform}"
CACHE
STRING
"External dependencies root folder (should contain folders: lib, bin, include")
set(SPARK_PYTHON "${EXTERNALS_ROOT}/python")
set(SPARK_BIN "${EXTERNALS_ROOT}/bin")
set(SPARK_INCLUDE "${EXTERNALS_ROOT}/include")
set(SPARK_LIB "${EXTERNALS_ROOT}/lib/${CMAKE_BUILD_TYPE}")
set(BUILD_SDK OFF CACHE BOOL "Build the sdk")
set(BUILD_WEB ON CACHE BOOL "Build the web server")
set (EXTERNALS_ROOT "${CMAKE_SOURCE_DIR}/externals/${platform}")
set (SPARK_PYTHON "${EXTERNALS_ROOT}/python")
set (SPARK_BIN "${EXTERNALS_ROOT}/bin")
set (SPARK_INCLUDE "${EXTERNALS_ROOT}/include")
set (SPARK_LIB "${EXTERNALS_ROOT}/lib/${CMAKE_BUILD_TYPE}")
set (BUILD_SDK OFF CACHE BOOL "Build the sdk")
include_directories(BEFORE SYSTEM ${SPARK_INCLUDE} ${EXTERNALS_ROOT}/include/zlib)
link_directories(${SPARK_LIB})
include_directories (BEFORE SYSTEM ${SPARK_INCLUDE} ${EXTERNALS_ROOT}/include/zlib)
link_directories (${SPARK_LIB})
if(WIN32)
# flags
set(
CMAKE_CXX_FLAGS
"${CMAKE_CXX_FLAGS} \
/MP \
/WX /wd4251 /wd4250 /wd4251 /wd4244 /wd4267 /wd4355 /wd4275 /wd4345 \
/bigobj \
/DCURL_STATICLIB \
/D_WINSOCK_DEPRECATED_NO_WARNINGS \
/D__TBB_NO_IMPLICIT_LINKAGE \
/DBOOST_ALL_NO_LIB \
/std:c++17 \
/D_SCL_SECURE_NO_WARNINGS /D_CRT_SECURE_NO_WARNINGS /D_WIN32_WINNT=0x0600")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_DEBUG} /MT")
set(
CMAKE_SHARED_LINKER_FLAGS_RELEASE
"${CMAKE_SHARED_LINKER_FLAGS_RELEASE} \
/DEBUG \
/OPT:REF \
/OPT:ICF \
/LTCG")
# subdirs
if (WIN32)
add_subdirectory(src/lib)
else()
# make sparkd look for libspark.so in its directory
set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
set(CMAKE_INSTALL_RPATH ".")
set(CMAKE_INSTALL_PREFIX "${CMAKE_SOURCE_DIR}/install/${CMAKE_BUILD_TYPE}/sparkd")
add_compile_definitions(SPARK_ENABLE_CCAPI)
add_compile_definitions(CCAPI_ENABLE_SERVICE_MARKET_DATA)
add_compile_definitions(CCAPI_ENABLE_EXCHANGE_FTX)
add_compile_definitions(CCAPI_ENABLE_EXCHANGE_BINANCE)
add_compile_definitions(CCAPI_ENABLE_LOG_WARN)
# flags
set(
CMAKE_CXX_FLAGS_DEBUG
"${CMAKE_CXX_FLAGS_DEBUG} \
-fPIC \
-Wall \
-pedantic \
-Wextra \
-Werror \
-Wno-missing-braces \
-Wno-ignored-qualifiers \
--std=c++17 -fdiagnostics-color")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_DEBUG} -fno-omit-frame-pointer -DNDEBUG -O3")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DDEBUG")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wno-undef")
# subdirs
else ()
# so that sparkd looks for libspark.so in its directory
add_subdirectory(src/server/sparkd)
add_subdirectory(src/lib)
if (BUILD_WEB)
add_subdirectory(src/web)
endif()
# add_subdirectory(src/web)
add_subdirectory(doc/user)
if(BUILD_SDK)
add_subdirectory(src/sdk)
endif()
add_subdirectory(src/data_files)
add_custom_command(
OUTPUT ${CMAKE_BINARY_DIR}/server
add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/server
COMMAND mkdir -p ${CMAKE_BINARY_DIR}/server
COMMAND ln ARGS -sf ${CMAKE_BINARY_DIR}/src/server/sparkd/sparkd ${CMAKE_BINARY_DIR}/server
COMMAND ln ARGS -sf ${CMAKE_BINARY_DIR}/web ${CMAKE_BINARY_DIR}/server
COMMAND ln ARGS -sf ${CMAKE_BINARY_DIR}/data_files ${CMAKE_BINARY_DIR}/server
COMMAND ln ARGS -sf ${CMAKE_BINARY_DIR}/src/lib/libspark.so ${CMAKE_BINARY_DIR}/server
COMMAND
ln ARGS -sf
${EXTERNALS_ROOT}/lib/Release/libOnixS.IceImpactMulticastPriceFeedHandlerCpp.so.3.16.0.0
${CMAKE_BINARY_DIR}/server
COMMAND ln ARGS -sf ${EXTERNALS_ROOT}/lib/Release/libOnixS.IceImpactMulticastPriceFeedHandlerCpp.so.3.16.0.0 ${CMAKE_BINARY_DIR}/server
COMMAND ln ARGS -sf ${EXTERNALS_ROOT}/lib/Release/libACE-5.7.5.so ${CMAKE_BINARY_DIR}/server
COMMAND mkdir ARGS -p ${CMAKE_BINARY_DIR}/server/plugins
COMMENT "Creating server runtime layout"
DEPENDS sparkd data_files_dir)
DEPENDS sparkd data_files_dir)
add_custom_target(server_layout ALL DEPENDS ${CMAKE_BINARY_DIR}/server)
install(DIRECTORY "${CMAKE_BINARY_DIR}/server/plugins" DESTINATION bin)
install(FILES "${CMAKE_SOURCE_DIR}/externals/linux/lib/${CMAKE_BUILD_TYPE}/libACE-5.7.5.so" DESTINATION bin)
install(FILES "${CMAKE_SOURCE_DIR}/externals/linux/lib/${CMAKE_BUILD_TYPE}/libOnixS.IceImpactMulticastPriceFeedHandlerCpp.so.3.16.0.0" DESTINATION bin)
install(FILES "${CMAKE_SOURCE_DIR}/externals/src/emumba/sparkd.lic" DESTINATION bin)
endif()
+179
View File
@@ -0,0 +1,179 @@
{
"version": 3,
"configurePresets": [
{
"name": "spark",
"condition": {
"type": "equals",
"lhs": "${hostSystemName}",
"rhs": "Windows"
},
"generator": "Visual Studio 17 2022",
"binaryDir": "${sourceDir}/build",
"environment": {
"SPARK_CMAKE_CXX_FLAGS": "/MP /WX /wd4250 /wd4251 /wd4244 /wd4267 /wd4355 /wd4275 /wd4345 /bigobj /EHsc /DCURL_STATICLIB /D_WINSOCK_DEPRECATED_NO_WARNINGS /D__TBB_NO_IMPLICIT_LINKAGE /DBOOST_ALL_NO_LIB /std:c++17 /D_SCL_SECURE_NO_WARNINGS /D_CRT_SECURE_NO_WARNINGS /D_WIN32_WINNT=0x0600",
"DOTNET_TARGET_FRAMEWORK": "net471"
},
"cacheVariables": {
"CMAKE_CXX_FLAGS": "$env{SPARK_CMAKE_CXX_FLAGS}",
"CMAKE_CXX_FLAGS_DEBUG": "$env{SPARK_CMAKE_CXX_FLAGS} /MTd",
"CMAKE_CXX_FLAGS_RELEASE": "$env{SPARK_CMAKE_CXX_FLAGS} /MT",
"CMAKE_CXX_STANDARD": "17",
"CMAKE_SHARED_LINKER_FLAGS_DEBUG": "/DEBUG",
"CMAKE_SHARED_LINKER_FLAGS_RELEASE": "/OPT:REF /OPT:ICF /LTCG",
"DOTNET_BINARY_DIR": "${sourceDir}/build/$<CONFIG>/bin/$env{DOTNET_TARGET_FRAMEWORK}",
"EXTERNALS_ROOT": "${sourceDir}/externals/windows",
"SPARK_BIN": "${sourceDir}/externals/windows/bin",
"SPARK_INCLUDE": "${sourceDir}/externals/windows/include",
"SPARK_LIB": "${sourceDir}/externals/windows/lib/$<CONFIG>"
}
},
{
"name": "sparkd",
"hidden": true,
"description": "Sparkd common config",
"binaryDir": "${sourceDir}/build/${presetName}",
"generator": "Ninja",
"condition": {
"type": "equals",
"lhs": "${hostSystemName}",
"rhs": "Linux"
},
"cacheVariables": {
"CMAKE_BUILD_WITH_INSTALL_RPATH": {
"type": "BOOL",
"value": true
},
"CMAKE_CXX_STANDARD": "17",
"CMAKE_EXE_LINKER_FLAGS": "-Wno-undef",
"CMAKE_INSTALL_PREFIX": "${sourceDir}/install/${presetName}",
"CMAKE_INSTALL_RPATH": ".",
"EXTERNALS_ROOT": "${sourceDir}/externals/linux",
"SPARK_BIN": "${sourceDir}/externals/linux/bin",
"SPARK_INCLUDE": "${sourceDir}/externals/linux/include"
}
},
{
"name": "sparkd-debug-clang",
"displayName": "Debug (clang)",
"description": "Debug build compiled w/ clang",
"inherits": "sparkd",
"binaryDir": "${sourceDir}/build/clang/debug",
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Debug",
"CMAKE_C_COMPILER": "clang",
"CMAKE_CXX_COMPILER": "clang++",
"CMAKE_CXX_FLAGS_DEBUG": "-g -fPIC -Wall -pedantic -Wextra -Werror -Wno-missing-braces -Wno-ignored-qualifiers -Wno-deprecated-copy -Wno-unused-but-set-variable -Wno-c++17-extensions --std=c++17 -fdiagnostics-color -DDEBUG",
"CMAKE_EXPORT_COMPILE_COMMANDS": {
"type": "BOOL",
"value": true
},
"SPARK_LIB": "${sourceDir}/externals/linux/lib/Debug"
}
},
{
"name": "sparkd-release-clang",
"displayName": "Release (clang)",
"description": "Release build compiled w/ clang",
"binaryDir": "${sourceDir}/build/clang/release",
"inherits": "sparkd",
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Release",
"CMAKE_C_COMPILER": "clang",
"CMAKE_CXX_COMPILER": "clang++",
"CMAKE_CXX_FLAGS_RELEASE": "-fPIC -Wall -pedantic -Wextra -Werror -Wno-missing-braces -Wno-ignored-qualifiers -Wno-deprecated-copy -Wno-c++17-extensions --std=c++17 -fdiagnostics-color -fno-omit-frame-pointer -DNDEBUG -O3",
"SPARK_LIB": "${sourceDir}/externals/linux/lib/Release"
}
},
{
"name": "sparkd-debug-gcc",
"displayName": "Debug (gcc)",
"description": "Debug build compiled w/ gcc",
"inherits": "sparkd",
"binaryDir": "${sourceDir}/build/gcc/debug",
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Debug",
"CMAKE_C_COMPILER": "gcc",
"CMAKE_CXX_COMPILER": "g++",
"CMAKE_CXX_FLAGS_DEBUG": "-g -fPIC -Wall -pedantic -Wextra -Werror -Wno-missing-braces -Wno-ignored-qualifiers -Wno-deprecated-copy -Wno-catch-value --std=c++17 -fdiagnostics-color -DDEBUG",
"CMAKE_EXPORT_COMPILE_COMMANDS": {
"type": "BOOL",
"value": true
},
"SPARK_LIB": "${sourceDir}/externals/linux/lib/Debug"
}
},
{
"name": "sparkd-release-gcc",
"displayName": "Release (gcc)",
"description": "Release build compiled w/ gcc",
"inherits": "sparkd",
"binaryDir": "${sourceDir}/build/gcc/release",
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Release",
"CMAKE_C_COMPILER": "/usr/local/bin/gcc",
"CMAKE_CXX_COMPILER": "/usr/local/bin/g++",
"CMAKE_CXX_FLAGS_RELEASE": "-fPIC -Wall -pedantic -Wextra -Werror -Wno-missing-braces -Wno-ignored-qualifiers -Wno-deprecated-copy -Wno-catch-value --std=c++17 -fdiagnostics-color -fno-omit-frame-pointer -DNDEBUG -O3",
"SPARK_LIB": "${sourceDir}/externals/linux/lib/Release"
}
}
],
"buildPresets": [
{
"name": "spark",
"condition": {
"type": "equals",
"lhs": "${hostSystemName}",
"rhs": "Windows"
},
"hidden": true
},
{
"name": "spark-debug",
"displayName": "Debug",
"inherits": "spark",
"configurePreset": "spark",
"configuration": "Debug"
},
{
"name": "spark-release",
"displayName": "Release",
"inherits": "spark",
"configurePreset": "spark",
"configuration": "Release"
},
{
"name": "sparkd",
"condition": {
"type": "equals",
"lhs": "${hostSystemName}",
"rhs": "Linux"
},
"hidden": true
},
{
"name": "sparkd-debug-clang",
"configurePreset": "sparkd-debug-clang",
"displayName": "Debug (clang)",
"inherits": "sparkd"
},
{
"name": "sparkd-debug-gcc",
"configurePreset": "sparkd-debug-gcc",
"displayName": "Debug (gcc)",
"inherits": "sparkd"
},
{
"name": "sparkd-release-clang",
"configurePreset": "sparkd-release-clang",
"displayName": "Release (clang)",
"inherits": "sparkd"
},
{
"name": "sparkd-release-gcc",
"configurePreset": "sparkd-release-gcc",
"displayName": "Release (gcc)",
"inherits": "sparkd"
}
]
}
-147
View File
@@ -1,147 +0,0 @@
set(Protobuf_PROTOC_EXECUTABLE "${SPARK_BIN}/protoc")
set(PROTOBUF_INCLUDE_DIRS "${SPARK_INCLUDE}")
set(PROTOBUF_STATIC_LIB "libprotobuf")
function(Protobuf_Generate_Cpp SRCS HDRS)
set(${SRCS})
set(${HDRS})
foreach(FIL ${ARGN})
get_filename_component(ABS_FIL ${FIL} ABSOLUTE)
get_filename_component(FIL_WE ${FIL} NAME_WE)
get_filename_component(FIL_DIR ${FIL} DIRECTORY)
if(FIL_DIR)
set(FIL_WE "${FIL_DIR}/${FIL_WE}")
endif()
list(APPEND ${SRCS} "${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.pb.cc")
list(APPEND ${HDRS} "${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.pb.h")
add_custom_command(
OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.pb.cc"
"${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.pb.h"
COMMAND
${Protobuf_PROTOC_EXECUTABLE} ARGS --cpp_out=${CMAKE_BINARY_DIR}/src -I
${PROTOBUF_INCLUDE_DIRS} -I ${CMAKE_SOURCE_DIR}/src ${ABS_FIL}
DEPENDS ${ABS_FIL}
COMMENT "Running C++ protocol buffer compiler on ${FIL}"
VERBATIM)
endforeach()
set_source_files_properties(${${SRCS}} ${${HDRS}} PROPERTIES GENERATED TRUE)
# remove some warnings from protobuf generated files
if(WIN32)
set_source_files_properties(${${SRCS}} PROPERTIES COMPILE_FLAGS
"/wd4309 /wd4838")
else()
set_source_files_properties(
${${SRCS}}
PROPERTIES
COMPILE_FLAGS
"-Wno-unused-parameter -Wno-effc++ -Wno-pedantic -Wno-sign-compare -Wno-uninitialized"
)
endif()
set(${SRCS}
${${SRCS}}
PARENT_SCOPE)
set(${HDRS}
${${HDRS}}
PARENT_SCOPE)
endfunction()
function(Service_Compiler_Generate_Cpp SRCS HDRS)
set(${SRCS})
set(${HDRS})
foreach(FIL ${ARGN})
get_filename_component(ABS_FIL ${FIL} ABSOLUTE)
get_filename_component(FIL_WE ${FIL} NAME_WE)
get_filename_component(FIL_DIR ${FIL} DIRECTORY)
if(FIL_DIR)
set(FIL_WE "${FIL_DIR}/${FIL_WE}")
endif()
list(APPEND ${SRCS} "${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.pb.cc")
list(APPEND ${HDRS} "${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.pb.h")
list(APPEND ${SRCS} "${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.client.pb.cc")
list(APPEND ${HDRS} "${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.client.pb.h")
list(APPEND ${SRCS} "${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.server.pb.cc")
list(APPEND ${HDRS} "${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.server.pb.h")
set(TEMPLATES
${CMAKE_CURRENT_SOURCE_DIR}/api/service_compiler/templates/cpp/client.pb.cc
${CMAKE_CURRENT_SOURCE_DIR}/api/service_compiler/templates/cpp/client.pb.h
${CMAKE_CURRENT_SOURCE_DIR}/api/service_compiler/templates/cpp/server.pb.cc
${CMAKE_CURRENT_SOURCE_DIR}/api/service_compiler/templates/cpp/server.pb.h
)
if(WIN32)
add_custom_command(
OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.pb.cc"
"${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.pb.h"
"${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.client.pb.cc"
"${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.client.pb.h"
"${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.server.pb.cc"
"${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.server.pb.h"
COMMAND SET PYTHONPATH=${SPARK_PYTHON}
COMMAND ${CMAKE_SOURCE_DIR}/.venv/Scripts/activate.bat
COMMAND
${Protobuf_PROTOC_EXECUTABLE} ARGS --cpp_out=${CMAKE_BINARY_DIR}/src
--plugin=protoc-gen-service=${CMAKE_SOURCE_DIR}/src/lib/api/service_compiler/plugin.cmd
--service_out=lang=cpp:${CMAKE_BINARY_DIR}/src -I
${PROTOBUF_INCLUDE_DIRS} -I ${CMAKE_SOURCE_DIR}/src ${ABS_FIL}
DEPENDS ${ABS_FIL} ${TEMPLATES}
${CMAKE_CURRENT_SOURCE_DIR}/api/service_compiler/plugin.py
COMMENT "Running C++ service compiler on ${FIL}"
VERBATIM)
else()
add_custom_command(
OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.pb.cc"
"${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.pb.h"
"${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.client.pb.cc"
"${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.client.pb.h"
"${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.server.pb.cc"
"${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.server.pb.h"
COMMAND ${CMAKE_SOURCE_DIR}/tools/venv_exec.sh
ARGS
${Protobuf_PROTOC_EXECUTABLE}
--cpp_out=${CMAKE_BINARY_DIR}/src
--plugin=protoc-gen-service=${CMAKE_SOURCE_DIR}/src/lib/api/service_compiler/plugin.py
--service_out=lang=cpp,make_file_name=${ABS_FIL}:${CMAKE_BINARY_DIR}/src
-I ${PROTOBUF_INCLUDE_DIRS} -I ${CMAKE_SOURCE_DIR}/src ${ABS_FIL}
DEPENDS ${ABS_FIL} ${TEMPLATES}
${CMAKE_CURRENT_SOURCE_DIR}/api/service_compiler/plugin.py
COMMENT "Running C++ service compiler on ${FIL}"
VERBATIM)
endif()
endforeach()
set_source_files_properties(${${SRCS}} ${${HDRS}} PROPERTIES GENERATED TRUE)
# remove some warnings from protobuf generated files
if(WIN32)
set_source_files_properties(${${SRCS}} PROPERTIES COMPILE_FLAGS
"/wd4309 /wd4838")
else()
set_source_files_properties(
${${SRCS}}
PROPERTIES
COMPILE_FLAGS
"-Wno-unused-parameter -Wno-effc++ -Wno-pedantic -Wno-sign-compare -Wno-uninitialized"
)
endif()
set(${SRCS}
${${SRCS}}
PARENT_SCOPE)
set(${HDRS}
${${HDRS}}
PARENT_SCOPE)
endfunction()
-32
View File
@@ -1,32 +0,0 @@
# inspired by https://stackoverflow.com/questions/1027247/specify-source-files-globally-with-glob
# Compare the new contents with the existing file, if it exists and is the same we don't want to
# trigger a make by changing its timestamp.
function(update_file path content)
set(old_content "")
if(EXISTS "${path}")
file(READ "${path}" old_content)
endif()
if(NOT old_content STREQUAL content)
file(WRITE "${path}" "${content}")
endif()
endfunction(update_file)
# Creates a file called CMakeDeps.cmake next to your CMakeLists.txt with the list of dependencies in
# it - this file should be treated as part of CMakeLists.txt (source controlled, etc.).
function(update_deps_file deps)
if(WIN32)
set(deps_file "CMakeDeps_win.cmake")
else()
set(deps_file "CMakeDeps.cmake")
endif()
# Normalize the list so it's the same on every machine
list(REMOVE_DUPLICATES deps)
list(SORT deps)
# Update the deps file
set(content "set(sources ${deps})")
update_file(${deps_file} "${content}")
# Include the file so it's tracked as a generation dependency we don't need the content.
include(${deps_file})
endfunction(update_deps_file)
-54
View File
@@ -1,54 +0,0 @@
{
"FormattingOptions": {
"NewLine": "\n",
"UseTabs": false,
"TabSize": 3,
"IndentationSize": 3,
"SpacingAfterMethodDeclarationName": false,
"SpaceWithinMethodDeclarationParenthesis": false,
"SpaceBetweenEmptyMethodDeclarationParentheses": false,
"SpaceAfterMethodCallName": false,
"SpaceWithinMethodCallParentheses": false,
"SpaceBetweenEmptyMethodCallParentheses": false,
"SpaceAfterControlFlowStatementKeyword": true,
"SpaceWithinExpressionParentheses": false,
"SpaceWithinCastParentheses": false,
"SpaceWithinOtherParentheses": false,
"SpaceAfterCast": false,
"SpacesIgnoreAroundVariableDeclaration": false,
"SpaceBeforeOpenSquareBracket": false,
"SpaceBetweenEmptySquareBrackets": false,
"SpaceWithinSquareBrackets": false,
"SpaceAfterColonInBaseTypeDeclaration": true,
"SpaceAfterComma": true,
"SpaceAfterDot": false,
"SpaceAfterSemicolonsInForStatement": true,
"SpaceBeforeColonInBaseTypeDeclaration": true,
"SpaceBeforeComma": false,
"SpaceBeforeDot": false,
"SpaceBeforeSemicolonsInForStatement": false,
"SpacingAroundBinaryOperator": "single",
"IndentBraces": false,
"IndentBlock": true,
"IndentSwitchSection": true,
"IndentSwitchCaseSection": true,
"LabelPositioning": "oneLess",
"WrappingPreserveSingleLine": true,
"WrappingKeepStatementsOnSingleLine": true,
"NewLinesForBracesInTypes": false,
"NewLinesForBracesInMethods": false,
"NewLinesForBracesInProperties": false,
"NewLinesForBracesInAccessors": false,
"NewLinesForBracesInAnonymousMethods": false,
"NewLinesForBracesInControlBlocks": false,
"NewLinesForBracesInAnonymousTypes": false,
"NewLinesForBracesInObjectCollectionArrayInitializers": false,
"NewLinesForBracesInLambdaExpressionBody": false,
"NewLineForElse": false,
"NewLineForCatch": false,
"NewLineForFinally": false,
"NewLineForMembersInObjectInit": true,
"NewLineForMembersInAnonymousTypes": true,
"NewLineForClausesInQuery": true
}
}
-120
View File
@@ -1,120 +0,0 @@
FROM spark-crypto_18.04
RUN \
DEBIAN_FRONTEND=noninteractive apt-get update \
&& apt-get install -y \
htop \
locales \
source-highlight \
powerline \
fonts-powerline
# Hide these in the .docker directory to avoid conflicts with existing repos on
# this computer (in case a parent dir, such as $HOME, is mounted inside a
# container)
ARG repo_root="/home/john/Documents/repos/.docker"
# Create dirs for public/private repos
USER john
RUN \
mkdir -p $repo_root/public \
&& mkdir -p $repo_root/private
## Get latest fish (build from source)
# 1) get build deps
USER root
RUN \
DEBIAN_FRONTEND=noninteractive apt-get update \
&& apt-get install -y software-properties-common
RUN \
apt-add-repository ppa:fish-shell/release-3 \
&& sed -i "s/^# deb/deb/g" /etc/apt/sources.list
RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get build-dep -y fish
# 2) Clone repo
USER john
RUN \
cd $repo_root/public \
&& git clone https://github.com/fish-shell/fish-shell.git
RUN \
cd $repo_root/public/fish-shell \
&& mkdir build \
&& cd build \
&& cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_DOCS=0 .. \
&& cmake --build .
# Switch to root, rather than running inline w/ sudo cmd, to avoid having to
# enter a password
USER root
RUN \
cd $repo_root/public/fish-shell/build \
&& make install
USER john
## Get oh-my-fish
RUN \
cd $repo_root/public \
&& git clone https://github.com/oh-my-fish/oh-my-fish.git
RUN \
cd $repo_root/public/oh-my-fish \
&& ./bin/install --noninteractive --yes
## Get my fish config
RUN \
cd $repo_root/private \
&& git clone https://github.com/johncolvin-og/myfishconfig
RUN \
cd $repo_root/private/myfishconfig \
&& cp src/config.fish /home/john/.config/fish/ \
&& cp src/aliases.fish /home/john/.config/fish/ \
&& cp -r src/functions /home/john/.config/fish/ \
&& cp -r src/themes/johncolvin /home/john/.local/share/omf/themes/ \
&& fish --command "omf theme johncolvin"
## Get my bash config (back up existing)
RUN \
cd $repo_root/private \
&& git clone https://github.com/johncolvin-og/mybashconfig \
&& cd mybashconfig \
&& cp src/* /home/john/
# Get vim files/tools
USER root
RUN \
DEBIAN_FRONTEND=noninteractive apt-get update \
&& apt-get install -y curl
USER john
RUN curl -fLo home/john/.vim/autoload/plug.vim --create-dirs \
https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
# Some fonts look sketchy if the language isn't set to english:
# * The powerline git glyphs in the fish prompt are all displayed as question
# marks.
#
# * The shell confuses the position of the cursor, so characters are left
# around when they should have been cleared, and the cursor's home position
# is pushed one or two places to the right.
#
# * Most likely, the bad cursor position is caused by some dependencies the
# interpretation of escape sequences have on the language setting. At this
# point I don't even care anymore (literally took 8 hours to figure this
# out). I just know this shit is needed to make the prompt work correctly.
USER root
RUN locale-gen "en_US.UTF-8"
USER john
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US:en
ENV LC_ALL en_US.UTF-8
RUN fc-cache -vf
-16
View File
@@ -1,16 +0,0 @@
#!/usr/bin/env fish
set this_dir (realpath (dirname (status -f)))
set image_working_dir (realpath "$this_dir/../..")
set image_name $argv[1]
if test (count $argv) -eq 0
set image_name_cmd "$this_dir/docker_image_name.fish"
set image_name (eval $image_name_cmd)
end
docker build \
-f "$this_dir/Dockerfile" \
-t "$image_name" \
"$image_working_dir"
-11
View File
@@ -1,11 +0,0 @@
#!/usr/bin/env fish
if test (count $argv) -gt 0
echo $argv
exit 0
end
set image_name_cmd (realpath (dirname (status -f)))"/docker_image_name.fish"
set image_name (eval $image_name_cmd)
echo $image_name
-4
View File
@@ -1,4 +0,0 @@
#!/usr/bin/env fish
echo "$USER""s_"(basename (git rev-parse --show-toplevel))"-dev"
-12
View File
@@ -1,12 +0,0 @@
#!/usr/bin/env fish
set inst_name $argv[1]
if test (count $argv) -eq 0
set script_dir (realpath (dirname (status -f)))
set inst_name (eval $script_dir"/docker_container_name.fish")
end
set working_dir (realpath (pwd))
echo $inst_name
docker exec -w $working_dir -it "$inst_name" bash
-148
View File
@@ -1,148 +0,0 @@
#!/usr/bin/env fish
function print_help_and_exit
echo "\
Usage: setup_builds.sh [OPTIONS] compiler build-type
Positionals:
gcc Compile with gcc
clang Compile with clang
debug Build debug
release Build release
Options:
--compiler <clang|gcc> Specify the compiler
--type <debug|release> Specify the type of build
-f,--force Overwrite existing build directories
-h,--help Print this help message and exit
"
exit $argv[1]
end
function assert_dir
if test ! -d "$argv[1]"
if test -n "$argv[2]"
echo "Invalid variable "$argv[2]": '"$argv[1]"' is not a directory"
else
echo "'"$argv[1]"' is not a directory"
end
exit 1
end
end
# common variables
set tools_path (realpath (dirname (status -f)))
set spartan_path_cmd $tools_path/spartan_path.fish
set repo_root (eval $spartan_path_cmd "repo-root")
set build_root "$repo_root"/"build"
mkdir -p "$build_root"
# Initialize the build directory. Expected arguments: <compiler>, <build_type>
# Note: this method assumes the variables 'repot_root' and 'build_root' have
# already been properly initialized
function setup_build
assert_dir $repo_root
assert_dir $build_root
set compiler "$argv[1]"
set c_compiler (which cc)
set build_type "$argv[2]"
if test \( -z "$build_type" \) -o \( \( "$build_type" != debug \) -a \( "$build_type" != release \) \)
print_help_and_exit 1
end
if test "$build_type" = debug
set build_type_arg Debug
if test "$compiler" = gcc
set compiler_arg "/usr/lib/ccache/g++"
else
# set compiler_arg "/usr/lib/ccache/clang++"
set compiler_arg "clang++"
set c_compiler (which clang)
end
else if test "$build_type" = release
set build_type_arg Release
if test "$compiler" = gcc
set compiler_arg "g++"
else
set compiler_arg "clang++"
end
end
if test \( -z "$compiler" \) -o \( \( "$compiler" != gcc \) -a \( "$compiler" != clang \) \)
print_help_and_exit 1
end
set build_dest $build_root"/"$compiler"/"$build_type
echo "Set up build: "$compiler" "$build_type
if test \( -z "$force" \) -a \( -d $build_dest \)
echo "The build directory '"$build_dest"' already exists (use -f to overwrite)"
return 1
end
rm -rf "$build_dest"
mkdir -p "$build_dest"
cd "$build_dest"
cmake -G Ninja -DCMAKE_BUILD_TYPE=$build_type_arg -DCMAKE_EXPORT_COMPILE_COMMANDS=1 -DCMAKE_C_COMPILER=$c_compiler -DCMAKE_CXX_COMPILER=$compiler_arg $repo_root
end
# The while loop below removes arguments (via shift) as it parses them.
# Additional information that needs to be extracted from the arguments must be
# done so before the loop is executed.
set i 1
while test $i -le (count $argv)
switch $argv[$i]
case --compiler
set i (math "$i + 1")
set compiler $argv[$i]
case clang
set compiler clang
case gcc
set compiler gcc
case --type
set i (math "$i + 1")
set build_type $argv[$i]
case release
set build_type release
case debug
set build_type debug
case -f
set force 1
case --force
set force 1
case -h
print_help_and_exit 0
case --help
print_help_and_exit 0
case '*'
print_help_and_exit 1
end
set i (math "$i + 1")
end
echo "compiler in "$compiler
echo "build type in "$build_type
if test -n "$compiler"
if test -n "$build_type"
setup_build $compiler $build_type
else
# all builds for the specified compiler
setup_build $compiler debug
setup_build $compiler release
end
else if test -n "$build_type"
# all builds for the specified build type
setup_build gcc $build_type
setup_build clang $build_type
else
# all builds
setup_build gcc debug
setup_build gcc release
setup_build clang debug
setup_build clang release
end
-153
View File
@@ -1,153 +0,0 @@
#!/usr/bin/env fish
function print_help_and_exit
echo "\
Usage: setup_builds.sh [OPTIONS] compiler build-type
Positionals:
gcc Compile with gcc
clang Compile with clang
debug Build debug
release Build release
Options:
--compiler <clang|gcc> Specify the compiler
--type <debug|release> Specify the type of build
-f,--force Overwrite existing build directories
-h,--help Print this help message and exit
"
exit $argv[1]
end
function assert_dir
if test ! -d "$argv[1]"
if test -n "$argv[2]"
echo "Invalid variable "$argv[2]": '"$argv[1]"' is not a directory"
else
echo "'"$argv[1]"' is not a directory"
end
exit 1
end
end
# common variables
#set tools_path (readlink -f (pwd))
#set tools_path (cd (dirname (status --current-filename)); and pwd)
set tools_path (realpath (dirname (status -f)))
set spartan_path_cmd $tools_path/spartan_path.fish
set repo_root (eval $spartan_path_cmd "repo-root")
# Don't call 'spartan_path_cmd "build"' bc it returns specific build path
# (i.e., for a particular compiler/build type), not the root build path
# set build_root (eval $spartan_path_cmd "build")
set build_root "$repo_root"/"build"
mkdir -p "$build_root"
# Initialize the build directory. Expected arguments: <compiler>, <build_type>
# Note: this method assumes the variables 'repot_root' and 'build_root' have
# already been properly initialized
function setup_build
assert_dir $repo_root
assert_dir $build_root
set compiler "$argv[1]"
set build_type "$argv[2]"
if test \( -z "$build_type" \) -o \( \( "$build_type" != "debug" \) -a \( "$build_type" != "release" \) \)
print_help_and_exit 1
end
if test "$build_type" = "debug"
set build_type_arg "Debug"
if test "$compiler" = "gcc"
set compiler_arg "/usr/lib/ccache/g++"
else
set compiler_arg "/usr/lib/ccache/clang++"
end
else if test "$build_type" = "release"
set build_type_arg "Release"
if test "$compiler" = "gcc"
set compiler_arg "g++"
else
set compiler_arg "clang++"
end
end
if test \( -z "$compiler" \) -o \( \( "$compiler" != "gcc" \) -a \( "$compiler" != "clang" \) \)
print_help_and_exit 1
end
set build_dest $build_root"/"$compiler"/"$build_type
set conan_dest $repo_root"/conan/"$compiler"_"$build_type
echo "Set up build: "$compiler" "$build_type
if test \( -z "$force" \) -a \( -d $build_dest \)
echo "The build directory '"$build_dest"' already exists (use -f to overwrite)"
return 1
end
rm -rf "$build_dest"
mkdir -p "$build_dest"
mkdir -p "$conan_dest"
cd "$build_dest"
conan install --build missing --profile $conan_dest $repo_root
cmake -G Ninja -DCMAKE_BUILD_TYPE=$build_type_arg -DCMAKE_EXPORT_COMPILE_COMMANDS=1 -DCMAKE_CXX_COMPILER=$compiler_arg $repo_root
end
# The while loop below removes arguments (via shift) as it parses them.
# Additional information that needs to be extracted from the arguments must be
# done so before the loop is executed.
set i 1
while test $i -le (count $argv)
switch $argv[$i]
case '--compiler'
set i (math "$i + 1")
set compiler $argv[$i]
case 'clang'
set compiler 'clang'
case 'gcc'
set compiler 'gcc'
case '--type'
set i (math "$i + 1")
set build_type $argv[$i]
case 'release'
set build_type 'release'
case 'debug'
set build_type 'debug'
case '-f'
set force 1
case '--force'
set force 1
case '-h'
print_help_and_exit 0
case '--help'
print_help_and_exit 0
case '*'
print_help_and_exit 1
end
set i (math "$i + 1")
end
echo "compiler in "$compiler
echo "build type in "$build_type
if test -n "$compiler"
if test -n "$build_type"
setup_build $compiler $build_type
else
# all builds for the specified compiler
setup_build $compiler "debug"
setup_build $compiler "release"
end
else if test -n "$build_type"
# all builds for the specified build type
setup_build "gcc" $build_type
setup_build "clang" $build_type
else
# all builds
setup_build "gcc" "debug"
setup_build "gcc" "release"
setup_build "clang" "debug"
setup_build "clang" "release"
end
-92
View File
@@ -1,92 +0,0 @@
#!/usr/bin/env fish
#basename (git rev-parse --show-toplevel)
function print_help_and_exit
echo "\
Print paths to core parts of the repository
Usage: sparkd_path.sh SUBCOMMAND
Subcommands:
build Print build path
repo-root Print repo root path
"
exit $argv[1]
end
function print_build_help_and_exit
echo "\
Print build path
Usage: sparkd_path.sh build [OPTIONS] compiler build-type
Positionals:
gcc Print gcc build path
clang Print clang build path
debug Print debug build path
release Print release build path
Options:
--compiler <clang|gcc> Specify the compiler
--type <debug|release> Specify the type of build
-h,--help Print this help message and exit
"
exit $argv[1]
end
function print_repo_root
git rev-parse --show-toplevel
end
function run_repo_root
print_repo_root
end
function run_build
set compiler "gcc"
set build_type "release"
set i 1
while test $i -lt (count $argv)
switch $argv[$i]
case '--compiler'
set i (math "$i + 1")
set compiler $argv[$i]
case 'clang'
set compiler 'clang'
case 'gcc'
set compiler 'gcc'
case '--type'
set i (math "$i + 1")
set build_type $argv[$i]
case 'release'
set build_type 'release'
case 'debug'
set build_type 'debug'
'-h'
print_build_help_and_exit 0
'--help'
print_build_help_and_exit 0
'*'
print_build_help_and_exit 1
end
set i (math "$i + 1")
end
if test \( $compiler = "clang" \) -o \( $compiler = "gcc" \)
set comp_path $compiler
else
print_build_help_and_exit 1
end
set src_root (print_repo_root)
set build_root (readlink -f "$src_root""/build")
set build_dest $build_root"/"$compiler"/"$build_type
echo $build_dest
end
if test "$argv[1]" = "repo-root"
print_repo_root $argv[2..-1]
else if test "$argv[1]" = "build"
run_build $argv[2..-1]
else
print_help_and_exit 1
end
-43
View File
@@ -1,43 +0,0 @@
#!/usr/bin/env fish
set image_name $argv[1]
set cont_name $argv[2]
if test (count $argv) -lt 2
if test (count $argv) -lt 1
set image_name_cmd (realpath (dirname (status -f)))"/docker_image_name.fish"
set image_name (eval $image_name_cmd)
end
set cont_name_cmd (realpath (dirname (status -f)))"/docker_container_name.fish "$image_name
set cont_name (eval $cont_name_cmd)
end
set working_dir (realpath (pwd))
set home_path /home/john
set repo_path (git rev-parse --show-toplevel)
set repo_path_out /home/john/Documents/repos/bts/(basename $repo_path)
set working_dir $repo_path_out
echo "starting docker instance '"$cont_name"' (image '"$image_name"')"
echo "working dir "$working_dir
docker run \
--rm \
--net host \
-h (hostname) \
-e "TZ=America/New_York" \
--cap-add=SYS_PTRACE \
--security-opt seccomp=unconfined \
--name $cont_name \
-v $repo_path:$repo_path_out \
-u (id -u $USER) \
-w $working_dir \
--shm-size=4024m \
-t \
-i \
-d \
-e DISPLAY="$DISPLAY" \
"$image_name" \
bash
-107
View File
@@ -1,107 +0,0 @@
{
"configurations": [
{
"name": "Linux",
"includePath": [
"/usr/include",
"/usr/local/include",
"${workspaceRoot}",
"${workspaceFolder}/src",
"${workspaceRoot}/externals/linux/include"
],
"defines": [],
"intelliSenseMode": "clang-x64",
"browse": {
"path": [
"/usr/include",
"/usr/local/include",
"${workspaceRoot}",
"${workspaceFolder}/src",
"${workspaceRoot}/externals/linux/include"
],
"limitSymbolsToIncludedHeaders": true,
"databaseFilename": ""
},
"cStandard": "c11",
"cppStandard": "c++17",
"compileCommands": "${workspaceFolder}/build/ninja_debug/compile_commands.json"
},
{
"name": "Windows",
"intelliSenseMode": "clang-x64",
"includePath": [
"${workspaceRoot}/src",
"${workspaceRoot}/build/src",
"${workspaceRoot}/build/ninja_debug/src",
"${workspaceRoot}/externals/windows/include",
"${workspaceRoot}/externals/linux/include",
"${workspaceRoot}/externals/windows/vscode/usr/include/c++/6",
"${workspaceRoot}/externals/windows/vscode/usr/include/x86_64-linux-gnu/c++/6",
"${workspaceRoot}/externals/windows/vscode/usr/include/c++/6/backward",
"${workspaceRoot}/externals/windows/vscode/usr/lib/gcc/x86_64-linux-gnu/6/include",
"${workspaceRoot}/externals/windows/vscode/usr/local/include",
"${workspaceRoot}/externals/windows/vscode/usr/lib/gcc/x86_64-linux-gnu/6/include-fixed",
"${workspaceRoot}/externals/windows/vscode/usr/include/x86_64-linux-gnu",
"${workspaceRoot}/externals/windows/vscode/usr/include"
],
"defines": [
"__linux__",
"__x86_64__"
],
"browse": {
"path": [
"${workspaceRoot}/src",
"${workspaceRoot}/build/src",
"${workspaceRoot}/build/ninja_debug/src",
"${workspaceRoot}/externals/windows/include",
"${workspaceRoot}/externals/linux/include",
"${workspaceRoot}/externals/windows/vscode/usr/include/c++/6",
"${workspaceRoot}/externals/windows/vscode/usr/include/x86_64-linux-gnu/c++/6",
"${workspaceRoot}/externals/windows/vscode/usr/include/c++/6/backward",
"${workspaceRoot}/externals/windows/vscode/usr/lib/gcc/x86_64-linux-gnu/6/include",
"${workspaceRoot}/externals/windows/vscode/usr/local/include",
"${workspaceRoot}/externals/windows/vscode/usr/lib/gcc/x86_64-linux-gnu/6/include-fixed",
"${workspaceRoot}/externals/windows/vscode/usr/include/x86_64-linux-gnu",
"${workspaceRoot}/externals/windows/vscode/usr/include/*"
],
"limitSymbolsToIncludedHeaders": true,
"databaseFilename": ""
},
"cStandard": "c11",
"cppStandard": "c++17"
},
{
"name": "WindowsQuick",
"intelliSenseMode": "clang-x64",
"includePath": [
"${workspaceRoot}/src",
"${workspaceRoot}/build/src",
"${workspaceRoot}/build/ninja_debug/src",
"${workspaceRoot}/externals/windows/include",
"${workspaceRoot}/externals/linux/include",
"${workspaceRoot}/externals/windows/vscode/usr/include/c++/6",
"${workspaceRoot}/externals/windows/vscode/usr/include/x86_64-linux-gnu/c++/6",
"${workspaceRoot}/externals/windows/vscode/usr/include/c++/6/backward",
"${workspaceRoot}/externals/windows/vscode/usr/lib/gcc/x86_64-linux-gnu/6/include",
"${workspaceRoot}/externals/windows/vscode/usr/local/include",
"${workspaceRoot}/externals/windows/vscode/usr/lib/gcc/x86_64-linux-gnu/6/include-fixed",
"${workspaceRoot}/externals/windows/vscode/usr/include/x86_64-linux-gnu",
"${workspaceRoot}/externals/windows/vscode/usr/include"
],
"defines": [
"__linux__",
"__x86_64__"
],
"browse": {
"path": [
"${workspaceRoot}/src"
],
"limitSymbolsToIncludedHeaders": true,
"databaseFilename": "${workspaceRoot}/.vscode/browse.vc.db"
},
"cStandard": "c11",
"cppStandard": "c++17"
}
],
"version": 4
}
-513
View File
@@ -1,513 +0,0 @@
{
"version": "0.2.0",
"configurations": [
{
"name": "Spark Local",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceRoot}/build/gcc/debug/server/sparkd",
"args": [
"run",
"test",
"-a",
"OutrightVanillaOrder"
],
"stopAtEntry": false,
"cwd": "${workspaceRoot}/build/gcc/debug/server/",
"environment": [
{
"name": "TZ",
"value": "America/Chicago"
}
],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
},
{
"name": "SparkVM Launch",
"type": "cppdbg",
"request": "launch",
"program": "/home/bts/spark/build/gcc/debug/server/sparkd",
"args": [
"test",
"-a",
"[ilink3]"
],
"stopAtEntry": false,
"cwd": "/home/bts/spark/build/gcc/debug/server/",
"environment": [],
"externalConsole": true,
"MIMode": "gdb",
"preLaunchTask": "",
"logging": {
"engineLogging": false
},
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "enable pretty-printer",
"ignoreFailures": true
},
{
"description": "Skip STL",
"text": "skip -gfi /usr/include/c++/7/bits/*.h",
"ignoreFailures": true
},
{
"description": "LD LIBRARY",
"text": "set env LD_LIBRARY_PATH=.",
"ignoreFailures": false
}
],
"pipeTransport": {
"pipeCwd": "${workspaceRoot}",
"pipeProgram": "c:\\program files\\git\\usr\\bin\\ssh.exe",
"pipeArgs": [
"bts@sparkvm"
],
"debuggerPath": "/usr/bin/gdb"
},
"sourceFileMap": {
"/home/bts/spark/": "${workspaceRoot}"
}
},
{
"name": "(gdb) Launch",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceRoot}/build/gcc/debug/server/sparkd/sparkd",
"args": [
"run"
],
"stopAtEntry": false,
"cwd": "${workspaceRoot}/build/gcc/debug/src/server/sparkd",
"environment": [],
"externalConsole": true,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
},
{
"name": "Client Launch",
"type": "clr",
"request": "launch",
"program": "${workspaceRoot}/build/Debug/bin/net471/spark.exe",
"args": [],
"cwd": "${workspaceRoot}",
"stopAtEntry": false,
"externalConsole": true,
"requireExactSource": false
},
{
"name": "SDK Launch",
"type": "clr",
"request": "launch",
"program": "${workspaceRoot}/build/Debug/bin/net471/spark_sdk.exe",
"args": [
"md",
"GLBX",
"Future",
"CL",
"CLZ9",
"--user=bts",
"--pass="
],
"cwd": "${workspaceRoot}",
"stopAtEntry": false,
"externalConsole": true,
"requireExactSource": false
},
{
"name": "Excel Launch",
"type": "clr",
"request": "launch",
"program": "C:/Program Files/Microsoft Office/Office14/EXCEL.EXE",
"args": [
"${workspaceRoot}/build/Debug/bin/net471/spark_excel-addin64-packed.xll"
],
"cwd": "${workspaceRoot}",
"stopAtEntry": false,
"externalConsole": true,
"requireExactSource": false
},
{
"name": "Client Tests",
"type": "clr",
"request": "launch",
"program": "${workspaceRoot}/build/Debug/bin/net471/sparkcmd.exe",
"args": [
"test",
"ApiUpdateTests"
],
"cwd": "${workspaceRoot}",
"stopAtEntry": false,
"externalConsole": true,
"requireExactSource": false
},
{
"name": "Client Attach",
"type": "clr",
"request": "attach",
"processId": "${command:pickProcess}"
},
{
"name": "Spreader Tests",
"type": "cppdbg",
"request": "launch",
"program": "/home/bts/spark/build/gcc/debug/server/sparkd",
"args": [
"test",
"[spreader]"
],
"stopAtEntry": false,
"cwd": "/home/bts/spark/build/gcc/debug/server/",
"environment": [],
"externalConsole": true,
"MIMode": "gdb",
"preLaunchTask": "",
"logging": {
"engineLogging": false
},
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "enable pretty-printer",
"ignoreFailures": true
}
],
"pipeTransport": {
"pipeCwd": "${workspaceRoot}",
"pipeProgram": "c:\\program files\\git\\usr\\bin\\ssh.exe",
"pipeArgs": [
"bts@sparkvm"
],
"debuggerPath": "/usr/bin/gdb"
},
"sourceFileMap": {
"/home/bts/spark/": "${workspaceRoot}"
}
},
{
"name": "MD Synthetic Tests",
"type": "cppdbg",
"request": "launch",
"program": "/home/bts/spark/build/gcc/debug/server/sparkd",
"args": [
"test",
"[md][synthetic]"
],
"stopAtEntry": false,
"cwd": "/home/bts/spark/build/gcc/debug/server/",
"environment": [],
"externalConsole": true,
"MIMode": "gdb",
"preLaunchTask": "",
"logging": {
"engineLogging": false
},
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "enable pretty-printer",
"ignoreFailures": true
}
],
"pipeTransport": {
"pipeCwd": "${workspaceRoot}",
"pipeProgram": "c:\\program files\\git\\usr\\bin\\ssh.exe",
"pipeArgs": [
"bts@sparkvm"
],
"debuggerPath": "/usr/bin/gdb"
},
"sourceFileMap": {
"/home/bts/spark/": "${workspaceRoot}"
}
},
{
"name": "Spartan Tests",
"type": "cppdbg",
"request": "launch",
"program": "/home/bts/spark/build/gcc/debug/server/sparkd",
"args": [
"test",
"[spartan_md]"
],
"stopAtEntry": false,
"cwd": "/home/bts/spark/build/gcc/debug/server/",
"environment": [],
"externalConsole": true,
"MIMode": "gdb",
"preLaunchTask": "",
"logging": {
"engineLogging": false
},
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "enable pretty-printer",
"ignoreFailures": true
}
],
"pipeTransport": {
"pipeCwd": "${workspaceRoot}",
"pipeProgram": "c:\\program files\\git\\usr\\bin\\ssh.exe",
"pipeArgs": [
"bts@sparkvm"
],
"debuggerPath": "/usr/bin/gdb"
},
"sourceFileMap": {
"/home/bts/spark/": "${workspaceRoot}"
}
},
{
"name": "Matcher Tests",
"type": "cppdbg",
"request": "launch",
"program": "/home/bts/spark/build/gcc/debug/server/sparkd",
"args": [
"test",
"[matcher]"
],
"stopAtEntry": false,
"cwd": "/home/bts/spark/build/gcc/debug/server/",
"environment": [],
"externalConsole": true,
"MIMode": "gdb",
"preLaunchTask": "",
"logging": {
"engineLogging": false
},
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "enable pretty-printer",
"ignoreFailures": true
}
],
"pipeTransport": {
"pipeCwd": "${workspaceRoot}",
"pipeProgram": "c:\\program files\\git\\usr\\bin\\ssh.exe",
"pipeArgs": [
"bts@sparkvm"
],
"debuggerPath": "/usr/bin/gdb"
},
"sourceFileMap": {
"/home/bts/spark/": "${workspaceRoot}"
}
},
{
"name": "Admin Service Tests",
"type": "cppdbg",
"request": "launch",
"program": "/home/bts/spark/build/gcc/debug/src/server/sparkd/sparkd",
"args": [
"test",
"[admin_service]"
],
"stopAtEntry": false,
"cwd": "/home/bts/spark/build/gcc/debug/src/server/sparkd/",
"environment": [],
"externalConsole": true,
"MIMode": "gdb",
"preLaunchTask": "",
"logging": {
"engineLogging": false
},
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "enable pretty-printer",
"ignoreFailures": true
}
],
"pipeTransport": {
"pipeCwd": "${workspaceRoot}",
"pipeProgram": "c:\\program files\\git\\usr\\bin\\ssh.exe",
"pipeArgs": [
"bts@sparkvm"
],
"debuggerPath": "/usr/bin/gdb"
},
"sourceFileMap": {
"/home/bts/spark/": "${workspaceRoot}"
}
},
{
"name": "Limiter Tests",
"type": "cppdbg",
"request": "launch",
"program": "/home/bts/spark/build/gcc/debug/src/server/sparkd/sparkd",
"args": [
"test",
"[limiter]"
],
"stopAtEntry": false,
"cwd": "/home/bts/spark/build/gcc/debug/src/server/sparkd/",
"environment": [],
"externalConsole": true,
"MIMode": "gdb",
"preLaunchTask": "",
"logging": {
"engineLogging": false
},
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "enable pretty-printer",
"ignoreFailures": true
}
],
"pipeTransport": {
"pipeCwd": "${workspaceRoot}",
"pipeProgram": "c:\\program files\\git\\usr\\bin\\ssh.exe",
"pipeArgs": [
"bts@sparkvm"
],
"debuggerPath": "/usr/bin/gdb"
},
"sourceFileMap": {
"/home/bts/spark/": "${workspaceRoot}"
}
},
{
"name": "MD Tests",
"type": "cppdbg",
"request": "launch",
"program": "/home/bts/spark/build/gcc/debug/server/sparkd",
"args": [
"test",
"[algo]"
],
"stopAtEntry": false,
"cwd": "/home/bts/spark/build/gcc/debug/server/",
"environment": [],
"externalConsole": true,
"MIMode": "gdb",
"preLaunchTask": "",
"logging": {
"engineLogging": false
},
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{
"description": "Skip STL",
"text": "skip -gfi /usr/include/c++/7/bits/*.h",
"ignoreFailures": true
}
],
"pipeTransport": {
"pipeCwd": "${workspaceRoot}",
"pipeProgram": "c:\\program files\\git\\usr\\bin\\ssh.exe",
"pipeArgs": [
"bts@sparkvm"
],
"debuggerPath": "/usr/bin/gdb"
},
"sourceFileMap": {
"/home/bts/spark/": "${workspaceRoot}"
}
},
{
"name": "SparkVM attach",
"type": "cppdbg",
"request": "attach",
"program": "/home/bts/spark/build/gcc/debug/src/server/sparkd/sparkd",
"processId": "${command:pickRemoteProcess}",
"MIMode": "gdb",
"pipeTransport": {
"pipeCwd": "${workspaceRoot}",
"pipeProgram": "c:\\program files\\git\\usr\\bin\\ssh.exe",
"pipeArgs": [
"bts@sparkvm"
],
"debuggerPath": "/usr/bin/gdb"
},
"sourceFileMap": {
"/home/bts/spark/": "${workspaceRoot}"
}
},
{
"name": "Python",
"type": "python",
"request": "launch",
"stopOnEntry": false,
"python": "${command:python.interpreterPath}",
"program": "${file}",
"cwd": "${workspaceRoot}",
"env": {},
"envFile": "${workspaceRoot}/.env",
"args": [
"DEBUG"
],
"debugOptions": [
"WaitOnAbnormalExit",
"WaitOnNormalExit",
"RedirectOutput"
]
},
{
"name": ".NET Core Remote Attach",
"type": "coreclr",
"request": "attach",
"processId": "${command:pickRemoteProcess}",
"pipeTransport": {
"pipeProgram": "c:\\program files\\git\\usr\\bin\\ssh.exe",
"pipeArgs": [
"bts@sparkvm"
],
"debuggerPath": "/home/bts/vsdbg/vsdbg",
"pipeCwd": "${workspaceRoot}",
"quoteArgs": true
},
"sourceFileMap": {
"/home/bts/spark/": "${workspaceRoot}"
},
"justMyCode": true
},
{
"name": ".NET Core Remote Launch",
"type": "coreclr",
"request": "launch",
"program": "/usr/bin/dotnet",
"args": [
"sparkcmd.dll",
"test",
"test_join_create_and_takeout_market"
],
"stopAtEntry": false,
"cwd": "/home/bts/spark/build/gcc/debug/server",
"pipeTransport": {
"pipeProgram": "c:\\program files\\git\\usr\\bin\\ssh.exe",
"pipeArgs": [
"bts@sparkvm"
],
"debuggerPath": "/home/bts/vsdbg/vsdbg",
"pipeCwd": "${workspaceRoot}",
"quoteArgs": true
},
"sourceFileMap": {
"/home/bts/spark/": "${workspaceRoot}"
},
"justMyCode": false
},
]
}
@@ -1,941 +0,0 @@
{
"$schema": "vscode://schemas/color-theme",
"type": "dark",
"colors": {
"activityBar.background": "#111111",
"activityBar.border": "#111111",
"activityBar.foreground": "#888888",
"activityBarBadge.background": "#88cc44",
"activityBarBadge.foreground": "#222222",
"badge.background": "#88cc44",
"badge.foreground": "#222222",
"button.background": "#333333",
"button.foreground": "#888888",
"button.hoverBackground": "#222222",
"debugExceptionWidget.background": "#333333",
"debugExceptionWidget.border": "#222222",
"debugToolBar.background": "#111111",
"diffEditor.insertedTextBackground": "#ffdd440c",
"diffEditor.insertedTextBorder": "#ffdd44",
"diffEditor.removedTextBackground": "#88bbff0c",
"diffEditor.removedTextBorder": "#88bbff",
"dropdown.background": "#222222",
"dropdown.border": "#222222",
"dropdown.foreground": "#888888",
"editor.background": "#222222",
"editor.findMatchBackground": "#44446655",
"editor.findMatchHighlightBackground": "#444466aa",
"editor.foreground": "#ffffff",
"editor.hoverHighlightBackground": "#44446655",
"editor.inactiveSelectionBackground": "#44446655",
"editor.lineHighlightBackground": "#00000066",
"editor.lineHighlightBorder": "#00000000",
"editor.rangeHighlightBackground": "#333333",
"editor.selectionBackground": "#444466",
"editor.selectionHighlightBackground": "#44446655",
"editor.wordHighlightBackground": "#44446655",
"editor.wordHighlightStrongBackground": "#44446655",
"editorBracketMatch.background": "#222222",
"editorBracketMatch.border": "#666666",
"editorCodeLens.foreground": "#666666",
"editorCursor.foreground": "#ffffff",
"editorError.foreground": "#ee5500",
"editorGroup.border": "#111111",
"editorGroup.dropBackground": "#111111bb",
"editorGroupHeader.noTabsBackground": "#111111",
"editorGroupHeader.tabsBackground": "#111111",
"editorGroupHeader.tabsBorder": "#222222",
"editorGutter.addedBackground": "#ffdd44",
"editorGutter.background": "#222222",
"editorGutter.deletedBackground": "#88bbff",
"editorGutter.modifiedBackground": "#88bbff",
"editorHoverWidget.background": "#333333",
"editorHoverWidget.border": "#222222",
"editorIndentGuide.background": "#333333",
"editorLineNumber.foreground": "#555555",
"editorLink.activeForeground": "#bba0ff",
"editorMarkerNavigation.background": "#333333",
"editorMarkerNavigationError.background": "#88bbff",
"editorMarkerNavigationWarning.background": "#88bbff",
"editorOverviewRuler.addedForeground": "#ffdd44",
"editorOverviewRuler.border": "#222222",
"editorOverviewRuler.currentContentForeground": "#333333",
"editorOverviewRuler.deletedForeground": "#88bbff",
"editorOverviewRuler.errorForeground": "#88bbff",
"editorOverviewRuler.findMatchForeground": "#555555",
"editorOverviewRuler.incomingContentForeground": "#333333",
"editorOverviewRuler.infoForeground": "#bba0ff",
"editorOverviewRuler.modifiedForeground": "#88bbff",
"editorOverviewRuler.rangeHighlightForeground": "#333333",
"editorOverviewRuler.selectionHighlightForeground": "#555555",
"editorOverviewRuler.warningForeground": "#88bbff",
"editorOverviewRuler.wordHighlightForeground": "#333333",
"editorOverviewRuler.wordHighlightStrongForeground": "#555555",
"editorRuler.foreground": "#ffffff",
"editorSuggestWidget.background": "#333333",
"editorSuggestWidget.border": "#333333",
"editorSuggestWidget.foreground": "#888888",
"editorSuggestWidget.highlightForeground": "#ffffff",
"editorSuggestWidget.selectedBackground": "#666666",
"editorWarning.border": "#00000000",
"editorWarning.foreground": "#88bbff",
"editorWhitespace.foreground": "#333333",
"editorWidget.background": "#333333",
"editorWidget.border": "#333333",
"errorForeground": "#88bbff",
"extensionButton.prominentBackground": "#333333",
"extensionButton.prominentForeground": "#ffffff",
"extensionButton.prominentHoverBackground": "#555555",
"focusBorder": "#666666",
"foreground": "#ffffff",
"gitDecoration.modifiedResourceForeground": "#cccccc",
"gitDecoration.untrackedResourceForeground": "#cccccc",
"input.background": "#333333",
"input.border": "#333333",
"input.foreground": "#ffffff",
"input.placeholderForeground": "#555555",
"inputOption.activeBorder": "#555555",
"inputValidation.errorBackground": "#333333",
"inputValidation.errorBorder": "#88bbff",
"inputValidation.infoBackground": "#333333",
"inputValidation.infoBorder": "#bba0ff",
"inputValidation.warningBackground": "#333333",
"inputValidation.warningBorder": "#88bbff",
"list.activeSelectionBackground": "#111111",
"list.activeSelectionForeground": "#ffffff",
"list.dropBackground": "#111111bf",
"list.focusBackground": "#222222",
"list.focusForeground": "#ffffff",
"list.highlightForeground": "#ffffff",
"list.hoverBackground": "#333333",
"list.hoverForeground": "#ffffff",
"list.inactiveSelectionBackground": "#000000",
"list.inactiveSelectionForeground": "#ffffff",
"menu.background": "#333333",
"menu.foreground": "#ffffff",
"merge.border": "#222222",
"merge.currentContentBackground": "#333333",
"merge.currentHeaderBackground": "#555555",
"merge.incomingContentBackground": "#555555",
"merge.incomingHeaderBackground": "#666666",
"panel.background": "#111111",
"panel.border": "#111111",
"panelTitle.activeBorder": "#ffffff",
"panelTitle.activeForeground": "#ffffff",
"panelTitle.inactiveForeground": "#888888",
"peekView.border": "#222222",
"peekViewEditor.background": "#333333",
"peekViewEditor.matchHighlightBackground": "#555555",
"peekViewEditorGutter.background": "#333333",
"peekViewResult.background": "#333333",
"peekViewResult.fileForeground": "#888888",
"peekViewResult.lineForeground": "#888888",
"peekViewResult.matchHighlightBackground": "#555555",
"peekViewResult.selectionBackground": "#333333",
"peekViewResult.selectionForeground": "#ffffff",
"peekViewTitle.background": "#333333",
"peekViewTitleDescription.foreground": "#888888",
"peekViewTitleLabel.foreground": "#ffffff",
"pickerGroup.border": "#222222",
"pickerGroup.foreground": "#555555",
"progressBar.background": "#333333",
"scrollbar.shadow": "#191919",
"scrollbarSlider.activeBackground": "#ffffff12",
"scrollbarSlider.background": "#ffffff12",
"scrollbarSlider.hoverBackground": "#ffffff12",
"selection.background": "#2255aa",
"sideBar.background": "#111111",
"sideBar.border": "#111111",
"sideBar.foreground": "#888888",
"sideBarSectionHeader.background": "#111111",
"sideBarSectionHeader.foreground": "#666666",
"sideBarTitle.foreground": "#555555",
"statusBar.background": "#111111",
"statusBar.border": "#111111",
"statusBar.debuggingBackground": "#666666",
"statusBar.debuggingForeground": "#ffffff",
"statusBar.foreground": "#666666",
"statusBar.noFolderBackground": "#111111",
"statusBar.noFolderForeground": "#666666",
"statusBarItem.activeBackground": "#222222",
"statusBarItem.hoverBackground": "#222222",
"statusBarItem.prominentBackground": "#333333",
"statusBarItem.prominentHoverBackground": "#444444",
"tab.activeBackground": "#222222",
"tab.border": "#111111",
"tab.inactiveBackground": "#111111",
"tab.inactiveForeground": "#888888",
"tab.unfocusedActiveBorder": "#888888",
"tab.unfocusedActiveForeground": "#888888",
"tab.unfocusedInactiveForeground": "#888888",
"terminal.ansiBlack": "#333333",
"terminal.ansiBlue": "#88bbff",
"terminal.ansiBrightBlack": "#666666",
"terminal.ansiBrightBlue": "#88bbff",
"terminal.ansiBrightCyan": "#bba0ff",
"terminal.ansiBrightGreen": "#ffdd44",
"terminal.ansiBrightMagenta": "#88bbff",
"terminal.ansiBrightRed": "#88bbff",
"terminal.ansiBrightWhite": "#ffffff",
"terminal.ansiBrightYellow": "#88cc44",
"terminal.ansiCyan": "#bba0ff",
"terminal.ansiGreen": "#ffdd44",
"terminal.ansiMagenta": "#88bbff",
"terminal.ansiRed": "#88bbff",
"terminal.ansiWhite": "#ffffff",
"terminal.ansiYellow": "#88cc44",
"terminal.background": "#151515",
"terminal.foreground": "#ffffff",
"titleBar.activeBackground": "#111111",
"titleBar.activeForeground": "#888888",
"titleBar.inactiveBackground": "#111111",
"titleBar.inactiveForeground": "#555555",
"walkThrough.embeddedEditorBackground": "#111111",
"widget.shadow": "#111111",
//"activityBar.activeBorder": "#888888",
//"activityBar.dropBorder": "#888888",
//"activityBar.inactiveForeground": "#88888866",
//"banner.background": "#111111",
//"banner.foreground": "#ffffff",
//"banner.iconForeground": "#3794ff",
//"bookmarks.lineBackground": "#00000000",
//"bookmarks.lineBorder": "#00000000",
//"bookmarks.overviewRuler": "#157efb88",
//"breadcrumb.activeSelectionForeground": "#ffffff",
//"breadcrumb.background": "#222222",
//"breadcrumb.focusForeground": "#ffffff",
//"breadcrumb.foreground": "#ffffffcc",
//"breadcrumbPicker.background": "#333333",
//"button.secondaryBackground": "#3a3d41",
//"button.secondaryForeground": "#ffffff",
//"button.secondaryHoverBackground": "#45494e",
//"charts.blue": "#3794ff",
//"charts.foreground": "#ffffff",
//"charts.green": "#89d185",
//"charts.lines": "#ffffff80",
//"charts.orange": "#d18616",
//"charts.purple": "#b180d7",
//"charts.red": "#ee5500",
//"charts.yellow": "#88bbff",
//"checkbox.background": "#222222",
//"checkbox.border": "#222222",
//"checkbox.foreground": "#888888",
//"debugConsole.errorForeground": "#88bbff",
//"debugConsole.infoForeground": "#3794ff",
//"debugConsole.sourceForeground": "#ffffff",
//"debugConsole.warningForeground": "#88bbff",
//"debugConsoleInputIcon.foreground": "#ffffff",
//"debugIcon.breakpointCurrentStackframeForeground": "#ffcc00",
//"debugIcon.breakpointDisabledForeground": "#848484",
//"debugIcon.breakpointForeground": "#e51400",
//"debugIcon.breakpointStackframeForeground": "#89d185",
//"debugIcon.breakpointUnverifiedForeground": "#848484",
//"debugIcon.continueForeground": "#75beff",
//"debugIcon.disconnectForeground": "#f48771",
//"debugIcon.pauseForeground": "#75beff",
//"debugIcon.restartForeground": "#89d185",
//"debugIcon.startForeground": "#89d185",
//"debugIcon.stepBackForeground": "#75beff",
//"debugIcon.stepIntoForeground": "#75beff",
//"debugIcon.stepOutForeground": "#75beff",
//"debugIcon.stepOverForeground": "#75beff",
//"debugIcon.stopForeground": "#f48771",
//"debugTokenExpression.boolean": "#4e94ce",
//"debugTokenExpression.error": "#f48771",
//"debugTokenExpression.name": "#c586c0",
//"debugTokenExpression.number": "#b5cea8",
//"debugTokenExpression.string": "#ce9178",
//"debugTokenExpression.value": "#cccccc99",
//"debugView.exceptionLabelBackground": "#6c2022",
//"debugView.exceptionLabelForeground": "#ffffff",
//"debugView.stateLabelBackground": "#88888844",
//"debugView.stateLabelForeground": "#ffffff",
//"debugView.valueChangedHighlight": "#569cd6",
//"descriptionForeground": "#ffffffb3",
//"diffEditor.diagonalFill": "#cccccc33",
//"editor.findRangeHighlightBackground": "#3a3d4166",
//"editor.focusedStackFrameHighlightBackground": "#7abd7a4d",
//"editor.foldBackground": "#4444664d",
//"editor.inlineValuesBackground": "#ffc80033",
//"editor.inlineValuesForeground": "#ffffff80",
//"editor.linkedEditingBackground": "#ff00004d",
//"editor.snippetFinalTabstopHighlightBorder": "#525252",
//"editor.snippetTabstopHighlightBackground": "#7c7c7c4d",
//"editor.stackFrameHighlightBackground": "#ffff0033",
//"editor.symbolHighlightBackground": "#444466aa",
//"editorActiveLineNumber.foreground": "#c6c6c6",
//"editorBracketHighlight.foreground1": "#ffd700",
//"editorBracketHighlight.foreground2": "#da70d6",
//"editorBracketHighlight.foreground3": "#179fff",
//"editorBracketHighlight.foreground4": "#00000000",
//"editorBracketHighlight.foreground5": "#00000000",
//"editorBracketHighlight.foreground6": "#00000000",
//"editorBracketHighlight.unexpectedBracket.foreground": "#ff1212cc",
//"editorBracketPairGuide.activeBackground1": "#00000000",
//"editorBracketPairGuide.activeBackground2": "#00000000",
//"editorBracketPairGuide.activeBackground3": "#00000000",
//"editorBracketPairGuide.activeBackground4": "#00000000",
//"editorBracketPairGuide.activeBackground5": "#00000000",
//"editorBracketPairGuide.activeBackground6": "#00000000",
//"editorBracketPairGuide.background1": "#00000000",
//"editorBracketPairGuide.background2": "#00000000",
//"editorBracketPairGuide.background3": "#00000000",
//"editorBracketPairGuide.background4": "#00000000",
//"editorBracketPairGuide.background5": "#00000000",
//"editorBracketPairGuide.background6": "#00000000",
//"editorGhostText.foreground": "#ffffff56",
//"editorGutter.commentRangeForeground": "#c5c5c5",
//"editorGutter.foldingControlForeground": "#c5c5c5",
//"editorHint.foreground": "#eeeeeeb3",
//"editorHoverWidget.foreground": "#ffffff",
//"editorHoverWidget.highlightForeground": "#ffffff",
//"editorHoverWidget.statusBarBackground": "#3d3d3d",
//"editorIndentGuide.activeBackground": "#333333",
//"editorInfo.foreground": "#3794ff",
//"editorInlayHint.background": "#88cc4499",
//"editorInlayHint.foreground": "#222222cc",
//"editorInlayHint.parameterBackground": "#88cc4499",
//"editorInlayHint.parameterForeground": "#222222cc",
//"editorInlayHint.typeBackground": "#88cc4499",
//"editorInlayHint.typeForeground": "#222222cc",
//"editorLightBulb.foreground": "#ffcc00",
//"editorLightBulbAutoFix.foreground": "#75beff",
//"editorLineNumber.activeForeground": "#c6c6c6",
//"editorMarkerNavigationError.headerBackground": "#88bbff1a",
//"editorMarkerNavigationInfo.background": "#3794ff",
//"editorMarkerNavigationInfo.headerBackground": "#3794ff1a",
//"editorMarkerNavigationWarning.headerBackground": "#88bbff1a",
//"editorOverviewRuler.bracketMatchForeground": "#a0a0a0",
//"editorOverviewRuler.commonContentForeground": "#60606066",
//"editorOverviewRuler.unicodeForeground": "#d186167e",
//"editorPane.background": "#222222",
//"editorSuggestWidget.focusHighlightForeground": "#ffffff",
//"editorSuggestWidget.selectedForeground": "#ffffff",
//"editorSuggestWidgetStatus.foreground": "#88888880",
//"editorUnicodeHighlight.border": "#bd9b03",
//"editorUnnecessaryCode.opacity": "#000000aa",
//"editorWidget.foreground": "#ffffff",
//"extensionBadge.remoteBackground": "#88cc44",
//"extensionBadge.remoteForeground": "#222222",
//"extensionIcon.preReleaseForeground": "#1d9271",
//"extensionIcon.starForeground": "#ff8e00",
//"extensionIcon.verifiedForeground": "#3794ff",
//"gitDecoration.addedResourceForeground": "#81b88b",
//"gitDecoration.conflictingResourceForeground": "#e4676b",
//"gitDecoration.deletedResourceForeground": "#c74e39",
//"gitDecoration.ignoredResourceForeground": "#8c8c8c",
//"gitDecoration.renamedResourceForeground": "#73c991",
//"gitDecoration.stageDeletedResourceForeground": "#c74e39",
//"gitDecoration.stageModifiedResourceForeground": "#e2c08d",
//"gitDecoration.submoduleResourceForeground": "#8db9e2",
//"gitlens.closedAutolinkedIssueIconColor": "#a371f7",
//"gitlens.closedPullRequestIconColor": "#f85149",
//"gitlens.decorations.addedForegroundColor": "#81b88b",
//"gitlens.decorations.branchAheadForegroundColor": "#35b15e",
//"gitlens.decorations.branchBehindForegroundColor": "#b15e35",
//"gitlens.decorations.branchDivergedForegroundColor": "#d8af1b",
//"gitlens.decorations.branchMissingUpstreamForegroundColor": "#c74e39",
//"gitlens.decorations.branchUnpublishedForegroundColor": "#35b15e",
//"gitlens.decorations.branchUpToDateForegroundColor": "#888888",
//"gitlens.decorations.copiedForegroundColor": "#73c991",
//"gitlens.decorations.deletedForegroundColor": "#c74e39",
//"gitlens.decorations.ignoredForegroundColor": "#8c8c8c",
//"gitlens.decorations.modifiedForegroundColor": "#cccccc",
//"gitlens.decorations.renamedForegroundColor": "#73c991",
//"gitlens.decorations.untrackedForegroundColor": "#cccccc",
//"gitlens.gutterBackgroundColor": "#ffffff13",
//"gitlens.gutterForegroundColor": "#bebebe",
//"gitlens.gutterUncommittedForegroundColor": "#00bcf299",
//"gitlens.lineHighlightBackgroundColor": "#00bcf233",
//"gitlens.lineHighlightOverviewRulerColor": "#00bcf299",
//"gitlens.mergedPullRequestIconColor": "#a371f7",
//"gitlens.openAutolinkedIssueIconColor": "#3fb950",
//"gitlens.openPullRequestIconColor": "#3fb950",
//"gitlens.trailingLineBackgroundColor": "#00000000",
//"gitlens.trailingLineForegroundColor": "#99999959",
//"gitlens.unpublishedCommitIconColor": "#35b15e",
//"gitlens.unpulledChangesIconColor": "#b15e35",
//"gitlens.unpushlishedChangesIconColor": "#35b15e",
//"icon.foreground": "#c5c5c5",
//"inputOption.activeBackground": "#66666666",
//"inputOption.activeForeground": "#ffffff",
//"inputOption.hoverBackground": "#5a5d5e80",
//"interactive.activeCodeBorder": "#222222",
//"interactive.inactiveCodeBorder": "#000000",
//"keybindingLabel.background": "#8080802b",
//"keybindingLabel.border": "#33333399",
//"keybindingLabel.bottomBorder": "#44444499",
//"keybindingLabel.foreground": "#cccccc",
//"keybindingTable.headerBackground": "#ffffff0a",
//"keybindingTable.rowsBackground": "#ffffff0a",
//"list.deemphasizedForeground": "#8c8c8c",
//"list.errorForeground": "#f88070",
//"list.filterMatchBackground": "#444466aa",
//"list.focusHighlightForeground": "#ffffff",
//"list.focusOutline": "#666666",
//"list.invalidItemForeground": "#b89500",
//"list.warningForeground": "#cca700",
//"listFilterWidget.background": "#653723",
//"listFilterWidget.noMatchesOutline": "#be1100",
//"listFilterWidget.outline": "#00000000",
//"menu.selectionBackground": "#111111",
//"menu.selectionForeground": "#ffffff",
//"menu.separatorBackground": "#bbbbbb",
//"menubar.selectionBackground": "#ffffff1a",
//"menubar.selectionForeground": "#888888",
//"merge.commonContentBackground": "#60606029",
//"merge.commonHeaderBackground": "#60606066",
//"minimap.errorHighlight": "#ff1212b3",
//"minimap.findMatchHighlight": "#d18616",
//"minimap.foregroundOpacity": "#000000",
//"minimap.selectionHighlight": "#264f78",
//"minimap.selectionOccurrenceHighlight": "#676767",
//"minimap.unicodeHighlight": "#d18616",
//"minimap.warningHighlight": "#88bbff",
//"minimapGutter.addedBackground": "#587c0c",
//"minimapGutter.deletedBackground": "#94151b",
//"minimapGutter.modifiedBackground": "#0c7d9d",
//"minimapSlider.activeBackground": "#ffffff09",
//"minimapSlider.background": "#ffffff09",
//"minimapSlider.hoverBackground": "#ffffff09",
//"notebook.cellBorderColor": "#000000",
//"notebook.cellEditorBackground": "#111111",
//"notebook.cellInsertionIndicator": "#666666",
//"notebook.cellStatusBarItemHoverBackground": "#ffffff26",
//"notebook.cellToolbarSeparator": "#80808059",
//"notebook.focusedCellBorder": "#666666",
//"notebook.focusedEditorBorder": "#666666",
//"notebook.inactiveFocusedCellBorder": "#000000",
//"notebook.selectedCellBackground": "#000000",
//"notebook.selectedCellBorder": "#000000",
//"notebook.symbolHighlightBackground": "#ffffff0b",
//"notebookScrollbarSlider.activeBackground": "#ffffff12",
//"notebookScrollbarSlider.background": "#ffffff12",
//"notebookScrollbarSlider.hoverBackground": "#ffffff12",
//"notebookStatusErrorIcon.foreground": "#88bbff",
//"notebookStatusRunningIcon.foreground": "#ffffff",
//"notebookStatusSuccessIcon.foreground": "#89d185",
//"notificationCenterHeader.background": "#424242",
//"notificationLink.foreground": "#3794ff",
//"notifications.background": "#333333",
//"notifications.border": "#424242",
//"notifications.foreground": "#ffffff",
//"notificationsErrorIcon.foreground": "#ee5500",
//"notificationsInfoIcon.foreground": "#3794ff",
//"notificationsWarningIcon.foreground": "#88bbff",
//"panel.dropBorder": "#ffffff",
//"panelSection.border": "#111111",
//"panelSection.dropBackground": "#111111bb",
//"panelSectionHeader.background": "#80808033",
//"ports.iconRunningProcessForeground": "#88cc44",
//"problemsErrorIcon.foreground": "#ee5500",
//"problemsInfoIcon.foreground": "#3794ff",
//"problemsWarningIcon.foreground": "#88bbff",
//"quickInput.background": "#333333",
//"quickInput.foreground": "#ffffff",
//"quickInputList.focusBackground": "#111111",
//"quickInputList.focusForeground": "#ffffff",
//"quickInputTitle.background": "#ffffff1b",
//"sash.hoverBorder": "#666666",
//"scm.providerBorder": "#454545",
//"searchEditor.findMatchBackground": "#44446670",
//"searchEditor.textInputBorder": "#333333",
//"settings.checkboxBackground": "#222222",
//"settings.checkboxBorder": "#222222",
//"settings.checkboxForeground": "#888888",
//"settings.dropdownBackground": "#222222",
//"settings.dropdownBorder": "#222222",
//"settings.dropdownForeground": "#888888",
//"settings.dropdownListBorder": "#333333",
//"settings.focusedRowBackground": "#80808024",
//"settings.focusedRowBorder": "#ffffff1f",
//"settings.headerForeground": "#e7e7e7",
//"settings.modifiedItemIndicator": "#0c7d9d",
//"settings.numberInputBackground": "#333333",
//"settings.numberInputBorder": "#333333",
//"settings.numberInputForeground": "#ffffff",
//"settings.rowHoverBackground": "#80808012",
//"settings.textInputBackground": "#333333",
//"settings.textInputBorder": "#333333",
//"settings.textInputForeground": "#ffffff",
//"sideBar.dropBackground": "#111111bb",
//"sideBySideEditor.horizontalBorder": "#111111",
//"sideBySideEditor.verticalBorder": "#111111",
//"statusBar.debuggingBorder": "#111111",
//"statusBar.noFolderBorder": "#111111",
//"statusBarItem.compactHoverBackground": "#ffffff33",
//"statusBarItem.errorBackground": "#0066eb",
//"statusBarItem.errorForeground": "#ffffff",
//"statusBarItem.prominentForeground": "#666666",
//"statusBarItem.remoteBackground": "#88cc44",
//"statusBarItem.remoteForeground": "#222222",
//"statusBarItem.warningBackground": "#0066eb",
//"statusBarItem.warningForeground": "#ffffff",
//"symbolIcon.arrayForeground": "#ffffff",
//"symbolIcon.booleanForeground": "#ffffff",
//"symbolIcon.classForeground": "#ee9d28",
//"symbolIcon.colorForeground": "#ffffff",
//"symbolIcon.constantForeground": "#ffffff",
//"symbolIcon.constructorForeground": "#b180d7",
//"symbolIcon.enumeratorForeground": "#ee9d28",
//"symbolIcon.enumeratorMemberForeground": "#75beff",
//"symbolIcon.eventForeground": "#ee9d28",
//"symbolIcon.fieldForeground": "#75beff",
//"symbolIcon.fileForeground": "#ffffff",
//"symbolIcon.folderForeground": "#ffffff",
//"symbolIcon.functionForeground": "#b180d7",
//"symbolIcon.interfaceForeground": "#75beff",
//"symbolIcon.keyForeground": "#ffffff",
//"symbolIcon.keywordForeground": "#ffffff",
//"symbolIcon.methodForeground": "#b180d7",
//"symbolIcon.moduleForeground": "#ffffff",
//"symbolIcon.namespaceForeground": "#ffffff",
//"symbolIcon.nullForeground": "#ffffff",
//"symbolIcon.numberForeground": "#ffffff",
//"symbolIcon.objectForeground": "#ffffff",
//"symbolIcon.operatorForeground": "#ffffff",
//"symbolIcon.packageForeground": "#ffffff",
//"symbolIcon.propertyForeground": "#ffffff",
//"symbolIcon.referenceForeground": "#ffffff",
//"symbolIcon.snippetForeground": "#ffffff",
//"symbolIcon.stringForeground": "#ffffff",
//"symbolIcon.structForeground": "#ffffff",
//"symbolIcon.textForeground": "#ffffff",
//"symbolIcon.typeParameterForeground": "#ffffff",
//"symbolIcon.unitForeground": "#ffffff",
//"symbolIcon.variableForeground": "#75beff",
//"tab.activeForeground": "#ffffff",
//"tab.activeModifiedBorder": "#3399cc",
//"tab.inactiveModifiedBorder": "#3399cc80",
//"tab.lastPinnedBorder": "#585858",
//"tab.unfocusedActiveBackground": "#222222",
//"tab.unfocusedActiveModifiedBorder": "#3399cc80",
//"tab.unfocusedInactiveBackground": "#111111",
//"tab.unfocusedInactiveModifiedBorder": "#3399cc40",
//"terminal.border": "#111111",
//"terminal.dropBackground": "#111111bb",
//"terminal.selectionBackground": "#ffffff40",
//"testing.iconErrored": "#f14c4c",
//"testing.iconFailed": "#f14c4c",
//"testing.iconPassed": "#73c991",
//"testing.iconQueued": "#cca700",
//"testing.iconSkipped": "#848484",
//"testing.iconUnset": "#848484",
//"testing.message.error.decorationForeground": "#ee5500",
//"testing.message.error.lineBackground": "#ff000033",
//"testing.message.info.decorationForeground": "#ffffff80",
//"testing.peekBorder": "#ee5500",
//"testing.peekHeaderBackground": "#ee55001a",
//"testing.runAction": "#73c991",
//"textBlockQuote.background": "#7f7f7f1a",
//"textBlockQuote.border": "#007acc80",
//"textCodeBlock.background": "#0a0a0a66",
//"textLink.activeForeground": "#3794ff",
//"textLink.foreground": "#3794ff",
//"textPreformat.foreground": "#d7ba7d",
//"textSeparator.foreground": "#ffffff2e",
//"toolbar.activeBackground": "#63666750",
//"toolbar.hoverBackground": "#5a5d5e50",
//"tree.indentGuidesStroke": "#585858",
//"tree.tableColumnsBorder": "#cccccc20",
//"tree.tableOddRowsBackground": "#ffffff0a",
//"welcomePage.progress.background": "#333333",
//"welcomePage.progress.foreground": "#3794ff",
//"welcomePage.tileBackground": "#333333",
//"welcomePage.tileHoverBackground": "#3d3d3d",
//"welcomePage.tileShadow": "#111111",
//"activityBar.activeBackground": null,
//"activityBar.activeFocusBorder": null,
//"button.border": null,
//"contrastActiveBorder": null,
//"contrastBorder": null,
//"debugToolBar.border": null,
//"diffEditor.border": null,
//"dropdown.listBackground": null,
//"editor.findMatchBorder": null,
//"editor.findMatchHighlightBorder": null,
//"editor.findRangeHighlightBorder": null,
//"editor.rangeHighlightBorder": null,
//"editor.selectionForeground": null,
//"editor.selectionHighlightBorder": null,
//"editor.snippetFinalTabstopHighlightBackground": null,
//"editor.snippetTabstopHighlightBorder": null,
//"editor.symbolHighlightBorder": null,
//"editor.wordHighlightBorder": null,
//"editor.wordHighlightStrongBorder": null,
//"editorCursor.background": null,
//"editorError.background": null,
//"editorError.border": null,
//"editorGhostText.background": null,
//"editorGhostText.border": null,
//"editorGroup.emptyBackground": null,
//"editorGroup.focusedEmptyBorder": null,
//"editorGroupHeader.border": null,
//"editorHint.border": null,
//"editorInfo.background": null,
//"editorInfo.border": null,
//"editorOverviewRuler.background": null,
//"editorSuggestWidget.selectedIconForeground": null,
//"editorUnnecessaryCode.border": null,
//"editorWarning.background": null,
//"editorWidget.resizeBorder": null,
//"inputValidation.errorForeground": null,
//"inputValidation.infoForeground": null,
//"inputValidation.warningForeground": null,
//"list.activeSelectionIconForeground": null,
//"list.filterMatchBorder": null,
//"list.inactiveFocusBackground": null,
//"list.inactiveFocusOutline": null,
//"list.inactiveSelectionIconForeground": null,
//"menu.border": null,
//"menu.selectionBorder": null,
//"menubar.selectionBorder": null,
//"minimap.background": null,
//"notebook.cellHoverBackground": null,
//"notebook.focusedCellBackground": null,
//"notebook.inactiveSelectedCellBorder": null,
//"notebook.outputContainerBackgroundColor": null,
//"notebook.outputContainerBorderColor": null,
//"notificationCenter.border": null,
//"notificationCenterHeader.foreground": null,
//"notificationToast.border": null,
//"panelInput.border": null,
//"panelSectionHeader.border": null,
//"panelSectionHeader.foreground": null,
//"peekViewEditor.matchHighlightBorder": null,
//"quickInput.list.focusBackground": null,
//"quickInputList.focusIconForeground": null,
//"searchEditor.findMatchBorder": null,
//"sideBarSectionHeader.border": null,
//"tab.activeBorder": null,
//"tab.activeBorderTop": null,
//"tab.hoverBackground": null,
//"tab.hoverBorder": null,
//"tab.hoverForeground": null,
//"tab.unfocusedActiveBorderTop": null,
//"tab.unfocusedHoverBackground": null,
//"tab.unfocusedHoverBorder": null,
//"tab.unfocusedHoverForeground": null,
//"terminal.tab.activeBorder": null,
//"terminalCursor.background": null,
//"terminalCursor.foreground": null,
//"testing.message.info.lineBackground": null,
//"titleBar.border": null,
//"toolbar.hoverOutline": null,
//"welcomePage.background": null,
//"window.activeBorder": null,
//"window.inactiveBorder": null
},
"tokenColors": [
{
"scope": [
"variable.language.this"
],
"settings": {
"fontStyle": ""
}
},
{
"scope": "markup.bold",
"settings": {
"fontStyle": "bold"
}
},
{
"scope": [
"invalid",
"markup.italic",
"markup.quote"
],
"settings": {
"fontStyle": "italic"
}
},
{
"scope": "markup.underline",
"settings": {
"fontStyle": "underline"
}
},
{
"scope": [
"source.js.jsx punctuation.section.embedded",
"entity.name.tag",
"string.other.link.description.title",
"support.constant",
"support.variable",
"support.type",
"variable.other.class",
"support.class.builtin.js",
"support.class.console.js",
"meta.property-value",
"variable.parameter.keyframe-list",
"meta.at-rule.keyframes entity.name.function",
"expression.embedded.vue punctuation.definition"
],
"settings": {
"foreground": "#BBA0FF",
"fontStyle": ""
}
},
{
"scope": [
"entity.other.attribute-name.pseudo-class.css",
"entity.name.type.object.console",
"variable.language",
"variable.parameter.function.language.special.self.python",
"storage.type",
"entity.other.attribute-name.pseudo-element.css"
],
"settings": {
"foreground": "#BBA0FF",
"fontStyle": "italic"
}
},
{
"scope": [
"punctuation.definition.string.template"
],
"settings": {
"foreground": "#BBA0FF",
"fontStyle": "bold"
}
},
{
"scope": [
"entity.other.attribute-name.class.css",
"entity.other.attribute-name.parent-selector-suffix.css",
"entity.other.attribute-name.parent-selector-suffix.css punctuation.definition.entity.css",
"meta.definition.function",
"markup.underline.link",
"markup.inserted",
"meta.function-call",
"meta.instance.constructor",
"meta.attribute-with-value.class string",
"string.other.ref",
"string.other.restructuredtext.ref",
"variable.function",
"entity.name.type",
"entity.name.function",
"variable.other.object.property",
"punctuation.separator.key-value",
"meta.definition.function.js",
"support.class.component.js",
"entity.other.inherited-class",
"support.class",
"support.function.misc",
"support.function",
"entity.other.attribute-name.id.css",
"entity.other.attribute-name.id.css punctuation",
"entity.other.attribute-name.class.css punctuation",
"meta.function-call support.function.construct",
"entity.other.attribute-name"
],
"settings": {
"foreground": "#FFDD44"
}
},
{
"scope": "storage.type.function.arrow",
"settings": {
"foreground": "#FFDD44",
"fontStyle": ""
}
},
{
"scope": [
"entity.name.section",
"constant.numeric.line-number.match.find-in-files",
"markup.heading",
"markup.changed",
"meta.attribute-with-value.id string",
"string",
"punctuation.definition.string.begin",
"punctuation.definition.string.end",
"meta.attribute-selector"
],
"settings": {
"foreground": "#88CC44"
}
},
{
"scope": [
"keyword",
"keyword.control",
"constant",
"constant.numeric",
"constant.language",
"constant.other.property",
"constant.character.escape",
"comment keyword.codetag.notation",
"keyword.other.template.begin",
"keyword.other.template.end",
"markup.raw",
"markup.deleted",
"meta.property-list.css variable.other",
"entity.name.constant.preprocessor",
"meta.preprocessor",
"punctuation.section.embedded",
"punctuation.template-string.element.begin",
"punctuation.template-string.element.end",
"string.quoted.template punctuation.definition.string.begin",
"string.quoted.template punctuation.definition.string.end",
"meta.paragraph.markdown meta.dummy.line-break",
"meta.paragraph.markdown meta.hard-line-break.markdown",
"storage",
"storage.class.restructuredtext.ref",
"string.other.link.title",
"string.other.link.description",
"string.regexp punctuation.definition.string.begin",
"string.regexp punctuation.definition.string.end",
"variable.language.arguments",
"storage.modifier",
"keyword.operator.new",
"keyword.operator",
"keyword.operator.spread",
"punctuation.section.embedded.end.php source.php",
"support.function.construct",
"meta.at-rule.keyframes",
"meta.at-rule.keyframes entity.other.attribute-name"
],
"settings": {
"foreground": "#88BBFF"
}
},
{
"scope": [
"variable.other.substitution"
],
"settings": {
"foreground": "#88BBFF",
"fontStyle": "bold"
}
},
{
"scope": [
"meta.function-call meta.function-call.arguments",
"meta.function-call meta.arguments",
"meta.function-call meta.group",
"source.json meta.structure.dictionary",
"meta.object.member",
"punctuation.definition.group",
"string.unquoted.label",
"variable.other.member",
"entity.name.class",
"entity.name.namespace",
"constant.other",
"variable",
"variable.other",
"variable.other.constant.js",
"text.find-in-files",
"source",
"entity.name.type.module",
"source.sql support.function",
"support.other.namespace.php"
],
"settings": {
"foreground": "#FFFFFF",
"fontStyle": ""
}
},
{
"scope": [
"variable.parameter",
"parameters variable.function"
],
"settings": {
"foreground": "#FFFFFF",
"fontStyle": "italic"
}
},
{
"scope": [
"variable.other.property",
"support.variable.property",
"punctuation.separator.key-value",
"meta.object-literal.key",
"variable.other.object.property",
"variable.object.property",
"text.html.basic",
"text.html.vue-html",
"text.html.php",
"text.html.derivative",
"punctuation.definition.variable",
"punctuation.definition.keyword.scss",
"meta.jsx.children.js",
"meta.tag.attributes keyword.operator.assignment",
"support.type.vendored.property-name.css",
"support.type.property-name.json",
"variable.other.constant.property"
],
"settings": {
"foreground": "#BBBBCC"
}
},
{
"scope": "meta.property-name support.type",
"settings": {
"foreground": "#BBBBCC",
"fontStyle": ""
}
},
{
"scope": [
"keyword.other.substitution",
"keyword.operator.heading.restructuredtext",
"keyword.operator.table.row.restructuredtext",
"keyword.operator.table.data.restructuredtext",
"punctuation",
"markup.ignored",
"markup.untracked",
"meta.brace.round",
"meta.brace.square",
"meta.brace.curly",
"meta.delimiter.comma.js",
"meta.function-call.without-arguments.js",
"meta.function-call.method.without-arguments.js",
"source.scss",
"string source punctuation.section.embedded",
"punctuation.definition.tag.begin source",
"source.php"
],
"settings": {
"foreground": "#9999AA"
}
},
{
"scope": [
"comment",
"comment punctuation"
],
"settings": {
"foreground": "#888899",
"fontStyle": "italic"
}
},
{
"scope": "token.info-token",
"settings": {
"foreground": "#6796E6"
}
},
{
"scope": "token.warn-token",
"settings": {
"foreground": "#CD9731"
}
},
{
"scope": "token.error-token",
"settings": {
"foreground": "#F44747"
}
},
{
"scope": "token.debug-token",
"settings": {
"foreground": "#B267E6"
}
}
]
}
-16
View File
@@ -1,16 +0,0 @@
{
"files.associations": {
"utility": "cpp",
"initializer_list": "cpp",
"list": "cpp",
"type_traits": "cpp",
"vector": "cpp",
"xhash": "cpp",
"xstring": "cpp",
"system_error": "cpp",
"array": "cpp",
"string_view": "cpp",
"xutility": "cpp",
"*.ipp": "cpp"
}
}
-41
View File
@@ -1,41 +0,0 @@
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "Touch CMakeLists.txt",
"type": "process",
"promptOnClose": false,
"isBackground": true,
"command": "touch",
"args": ["${workspaceRoot}/CMakeLists.txt"],
"problemMatcher": [],
"presentation": {
"echo": false,
"revealProblems": "onProblem",
"reveal": "silent",
"focus": false,
"panel": "shared",
"showReuseMessage": false,
"clear": true
}
}
],
"inputs": [
{
"id": "build_configuration",
"type": "pickString",
"default": "debug",
"description": "Configuration:",
"options": ["debug", "release"]
},
{
"id": "compiler",
"type": "pickString",
"default": "gcc",
"description": "Compiler",
"options": ["clang", "gcc"]
}
]
}
-41
View File
@@ -1,41 +0,0 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Spark Client",
"type": "coreclr",
"request": "launch",
"program": "${workspaceFolder}/build/Debug/bin/net6.0-windows/Spark.exe",
"cwd": "${workspaceFolder}/build/Debug/bin/net6.0-windows",
"enableStepFiltering": false,
"console": "internalConsole",
"stopAtEntry": false
},
{
"name": "Spark Test",
"type": "coreclr",
"request": "launch",
"program": "${workspaceFolder}/build/Debug/bin/net6.0/sparkcmd.exe",
"args": ["test", "${input:test}"],
"cwd": "${workspaceFolder}/build/Debug/bin/net6.0-windows",
"enableStepFiltering": false,
"console": "internalConsole",
"stopAtEntry": false
},
{
"name": "Attach (.NET Core)",
"type": "coreclr",
"request": "attach"
}
],
"inputs": [
{
"id": "test",
"description": "The test(s) to run",
"type": "promptString"
}
]
}
-37
View File
@@ -1,37 +0,0 @@
{
"cmake.configureOnOpen": false,
"workbench.colorTheme": "Default Dark+",
"C_Cpp.intelliSenseEngine": "Disabled",
"files.associations": {
"*.js": "javascript",
"*.conf": "jsonc",
"array": "cpp",
"xtree": "cpp",
"chrono": "cpp",
"*.ipp": "cpp",
"optional": "cpp",
"regex": "cpp",
"system_error": "cpp",
"format": "cpp",
"future": "cpp",
"istream": "cpp",
"memory": "cpp",
"tuple": "cpp",
"type_traits": "cpp",
"utility": "cpp",
"variant": "cpp",
"xlocmes": "cpp",
"xlocmon": "cpp",
"xlocnum": "cpp",
"xloctime": "cpp",
"xutility": "cpp",
"xstring": "cpp",
"string": "cpp",
"cstdint": "cpp"
},
"files.exclude": {
"**/.g.cs": true,
"**/.g.i.cs": true
}
}
-44
View File
@@ -1,44 +0,0 @@
{
"version": "2.0.0",
"tasks": [
{
"label": "Build Spark Client",
"type": "process",
"command": "C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\Common7\\Tools\\VsDevCmd.bat",
"args": [
"-arch=x64",
"-host_arch=x64",
"&&",
"${workspaceRoot}\\tools\\buildspark.cmd"
],
"group": {
"kind": "build",
"isDefault": true
},
"presentation": {
"echo": true,
"reveal": "always",
"focus": false,
"panel": "new",
"showReuseMessage": false,
"clear": false,
"close": false
}
},
{
"label": "Run Spark Client",
"type": "process",
"command": "${workspaceRoot}\\build\\Debug\\bin\\net6.0-windows\\Spark.exe",
"presentation": {
"echo": true,
"reveal": "always",
"focus": false,
"panel": "shared",
"showReuseMessage": true,
"clear": false
},
"problemMatcher": []
}
]
}
-107
View File
@@ -1,107 +0,0 @@
{
"configurations": [
{
"name": "Linux",
"includePath": [
"/usr/include",
"/usr/local/include",
"${workspaceRoot}",
"${workspaceFolder}/src",
"${workspaceRoot}/externals/linux/include"
],
"defines": [],
"intelliSenseMode": "clang-x64",
"browse": {
"path": [
"/usr/include",
"/usr/local/include",
"${workspaceRoot}",
"${workspaceFolder}/src",
"${workspaceRoot}/externals/linux/include"
],
"limitSymbolsToIncludedHeaders": true,
"databaseFilename": ""
},
"cStandard": "c11",
"cppStandard": "c++17",
"compileCommands": "${workspaceFolder}/build/ninja_debug/compile_commands.json"
},
{
"name": "Windows",
"intelliSenseMode": "clang-x64",
"includePath": [
"${workspaceRoot}/src",
"${workspaceRoot}/build/src",
"${workspaceRoot}/build/ninja_debug/src",
"${workspaceRoot}/externals/windows/include",
"${workspaceRoot}/externals/linux/include",
"${workspaceRoot}/externals/windows/vscode/usr/include/c++/6",
"${workspaceRoot}/externals/windows/vscode/usr/include/x86_64-linux-gnu/c++/6",
"${workspaceRoot}/externals/windows/vscode/usr/include/c++/6/backward",
"${workspaceRoot}/externals/windows/vscode/usr/lib/gcc/x86_64-linux-gnu/6/include",
"${workspaceRoot}/externals/windows/vscode/usr/local/include",
"${workspaceRoot}/externals/windows/vscode/usr/lib/gcc/x86_64-linux-gnu/6/include-fixed",
"${workspaceRoot}/externals/windows/vscode/usr/include/x86_64-linux-gnu",
"${workspaceRoot}/externals/windows/vscode/usr/include"
],
"defines": [
"__linux__",
"__x86_64__"
],
"browse": {
"path": [
"${workspaceRoot}/src",
"${workspaceRoot}/build/src",
"${workspaceRoot}/build/ninja_debug/src",
"${workspaceRoot}/externals/windows/include",
"${workspaceRoot}/externals/linux/include",
"${workspaceRoot}/externals/windows/vscode/usr/include/c++/6",
"${workspaceRoot}/externals/windows/vscode/usr/include/x86_64-linux-gnu/c++/6",
"${workspaceRoot}/externals/windows/vscode/usr/include/c++/6/backward",
"${workspaceRoot}/externals/windows/vscode/usr/lib/gcc/x86_64-linux-gnu/6/include",
"${workspaceRoot}/externals/windows/vscode/usr/local/include",
"${workspaceRoot}/externals/windows/vscode/usr/lib/gcc/x86_64-linux-gnu/6/include-fixed",
"${workspaceRoot}/externals/windows/vscode/usr/include/x86_64-linux-gnu",
"${workspaceRoot}/externals/windows/vscode/usr/include/*"
],
"limitSymbolsToIncludedHeaders": true,
"databaseFilename": ""
},
"cStandard": "c11",
"cppStandard": "c++17"
},
{
"name": "WindowsQuick",
"intelliSenseMode": "clang-x64",
"includePath": [
"${workspaceRoot}/src",
"${workspaceRoot}/build/src",
"${workspaceRoot}/build/ninja_debug/src",
"${workspaceRoot}/externals/windows/include",
"${workspaceRoot}/externals/linux/include",
"${workspaceRoot}/externals/windows/vscode/usr/include/c++/6",
"${workspaceRoot}/externals/windows/vscode/usr/include/x86_64-linux-gnu/c++/6",
"${workspaceRoot}/externals/windows/vscode/usr/include/c++/6/backward",
"${workspaceRoot}/externals/windows/vscode/usr/lib/gcc/x86_64-linux-gnu/6/include",
"${workspaceRoot}/externals/windows/vscode/usr/local/include",
"${workspaceRoot}/externals/windows/vscode/usr/lib/gcc/x86_64-linux-gnu/6/include-fixed",
"${workspaceRoot}/externals/windows/vscode/usr/include/x86_64-linux-gnu",
"${workspaceRoot}/externals/windows/vscode/usr/include"
],
"defines": [
"__linux__",
"__x86_64__"
],
"browse": {
"path": [
"${workspaceRoot}/src"
],
"limitSymbolsToIncludedHeaders": true,
"databaseFilename": "${workspaceRoot}/.vscode/browse.vc.db"
},
"cStandard": "c11",
"cppStandard": "c++17"
}
],
"version": 4
}
-402
View File
@@ -1,402 +0,0 @@
{
"version": "0.2.0",
"configurations": [
{
"name": "Spark Local",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceRoot}/build/gcc/debug/server/sparkd",
"args": [
"run",
"test",
"-a",
"OutrightVanillaOrder"
],
"stopAtEntry": false,
"cwd": "${workspaceRoot}/build/gcc/debug/server/",
"environment": [
{
"name": "TZ",
"value": "America/Chicago"
}
],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
},
{
"name": "SparkVM Launch",
"type": "cppdbg",
"request": "launch",
"program": "/home/bts/spark/build/gcc/debug/server/sparkd",
"args": [
"test",
"-a",
"[ilink3]"
],
"stopAtEntry": false,
"cwd": "/home/bts/spark/build/gcc/debug/server/",
"environment": [],
"externalConsole": true,
"MIMode": "gdb",
"preLaunchTask": "",
"logging": {
"engineLogging": false
},
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "enable pretty-printer",
"ignoreFailures": true
},
{
"description": "Skip STL",
"text": "skip -gfi /usr/include/c++/7/bits/*.h",
"ignoreFailures": true
},
{
"description": "LD LIBRARY",
"text": "set env LD_LIBRARY_PATH=.",
"ignoreFailures": false
}
],
"pipeTransport": {
"pipeCwd": "${workspaceRoot}",
"pipeProgram": "c:\\program files\\git\\usr\\bin\\ssh.exe",
"pipeArgs": [
"bts@sparkvm"
],
"debuggerPath": "/usr/bin/gdb"
},
"sourceFileMap": {
"/home/bts/spark/": "${workspaceRoot}"
}
},
{
"name": "(gdb) Launch",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceRoot}/build/gcc/debug/server/sparkd/sparkd",
"args": [
"run"
],
"stopAtEntry": false,
"cwd": "${workspaceRoot}/build/ninja_debug/src/server/sparkd",
"environment": [],
"externalConsole": true,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
},
{
"name": "Client Launch",
"type": "clr",
"request": "launch",
"program": "${workspaceRoot}/build/Debug/bin/net471/spark.exe",
"args": [],
"cwd": "${workspaceRoot}",
"stopAtEntry": false,
"externalConsole": true,
"requireExactSource": false
},
{
"name": "SDK Launch",
"type": "clr",
"request": "launch",
"program": "${workspaceRoot}/build/Debug/bin/net471/spark_sdk.exe",
"args": [
"md",
"GLBX",
"Future",
"CL",
"CLZ9",
"--user=bts",
"--pass="
],
"cwd": "${workspaceRoot}",
"stopAtEntry": false,
"externalConsole": true,
"requireExactSource": false
},
{
"name": "Excel Launch",
"type": "clr",
"request": "launch",
"program": "C:/Program Files/Microsoft Office/Office14/EXCEL.EXE",
"args": [
"${workspaceRoot}/build/Debug/bin/net471/spark_excel-addin64-packed.xll"
],
"cwd": "${workspaceRoot}",
"stopAtEntry": false,
"externalConsole": true,
"requireExactSource": false
},
{
"name": "Client Tests",
"type": "clr",
"request": "launch",
"program": "${workspaceRoot}/build/Debug/bin/net471/sparkcmd.exe",
"args": [
"test",
"ApiUpdateTests"
],
"cwd": "${workspaceRoot}",
"stopAtEntry": false,
"externalConsole": true,
"requireExactSource": false
},
{
"name": "Client Attach",
"type": "clr",
"request": "attach",
"processId": "${command:pickProcess}"
},
{
"name": "Spreader Tests",
"type": "cppdbg",
"request": "launch",
"program": "/home/bts/spark/build/gcc/debug/server/sparkd",
"args": [
"test",
"[spreader]"
],
"stopAtEntry": false,
"cwd": "/home/bts/spark/build/gcc/debug/server/",
"environment": [],
"externalConsole": true,
"MIMode": "gdb",
"preLaunchTask": "",
"logging": {
"engineLogging": false
},
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "enable pretty-printer",
"ignoreFailures": true
}
],
"pipeTransport": {
"pipeCwd": "${workspaceRoot}",
"pipeProgram": "c:\\program files\\git\\usr\\bin\\ssh.exe",
"pipeArgs": [
"bts@sparkvm"
],
"debuggerPath": "/usr/bin/gdb"
},
"sourceFileMap": {
"/home/bts/spark/": "${workspaceRoot}"
}
},
{
"name": "Admin Service Tests",
"type": "cppdbg",
"request": "launch",
"program": "/home/bts/spark/build/ninja_debug/src/server/sparkd/sparkd",
"args": [
"test",
"[admin_service]"
],
"stopAtEntry": false,
"cwd": "/home/bts/spark/build/ninja_debug/src/server/sparkd/",
"environment": [],
"externalConsole": true,
"MIMode": "gdb",
"preLaunchTask": "",
"logging": {
"engineLogging": false
},
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "enable pretty-printer",
"ignoreFailures": true
}
],
"pipeTransport": {
"pipeCwd": "${workspaceRoot}",
"pipeProgram": "c:\\program files\\git\\usr\\bin\\ssh.exe",
"pipeArgs": [
"bts@sparkvm"
],
"debuggerPath": "/usr/bin/gdb"
},
"sourceFileMap": {
"/home/bts/spark/": "${workspaceRoot}"
}
},
{
"name": "Limiter Tests",
"type": "cppdbg",
"request": "launch",
"program": "/home/bts/spark/build/ninja_debug/src/server/sparkd/sparkd",
"args": [
"test",
"[limiter]"
],
"stopAtEntry": false,
"cwd": "/home/bts/spark/build/ninja_debug/src/server/sparkd/",
"environment": [],
"externalConsole": true,
"MIMode": "gdb",
"preLaunchTask": "",
"logging": {
"engineLogging": false
},
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "enable pretty-printer",
"ignoreFailures": true
}
],
"pipeTransport": {
"pipeCwd": "${workspaceRoot}",
"pipeProgram": "c:\\program files\\git\\usr\\bin\\ssh.exe",
"pipeArgs": [
"bts@sparkvm"
],
"debuggerPath": "/usr/bin/gdb"
},
"sourceFileMap": {
"/home/bts/spark/": "${workspaceRoot}"
}
},
{
"name": "MD Tests",
"type": "cppdbg",
"request": "launch",
"program": "/home/bts/spark/build/gcc/debug/server/sparkd",
"args": [
"test",
"[algo]"
],
"stopAtEntry": false,
"cwd": "/home/bts/spark/build/gcc/debug/server/",
"environment": [],
"externalConsole": true,
"MIMode": "gdb",
"preLaunchTask": "",
"logging": {
"engineLogging": false
},
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{
"description": "Skip STL",
"text": "skip -gfi /usr/include/c++/7/bits/*.h",
"ignoreFailures": true
}
],
"pipeTransport": {
"pipeCwd": "${workspaceRoot}",
"pipeProgram": "c:\\program files\\git\\usr\\bin\\ssh.exe",
"pipeArgs": [
"bts@sparkvm"
],
"debuggerPath": "/usr/bin/gdb"
},
"sourceFileMap": {
"/home/bts/spark/": "${workspaceRoot}"
}
},
{
"name": "SparkVM attach",
"type": "cppdbg",
"request": "attach",
"program": "/home/bts/spark/build/ninja_debug/src/server/sparkd/sparkd",
"processId": "${command:pickRemoteProcess}",
"MIMode": "gdb",
"pipeTransport": {
"pipeCwd": "${workspaceRoot}",
"pipeProgram": "c:\\program files\\git\\usr\\bin\\ssh.exe",
"pipeArgs": [
"bts@sparkvm"
],
"debuggerPath": "/usr/bin/gdb"
},
"sourceFileMap": {
"/home/bts/spark/": "${workspaceRoot}"
}
},
{
"name": "Python",
"type": "python",
"request": "launch",
"stopOnEntry": false,
"pythonPath": "${config:python.pythonPath}",
"program": "${file}",
"cwd": "${workspaceRoot}",
"env": {},
"envFile": "${workspaceRoot}/.env",
"args": [
"DEBUG"
],
"debugOptions": [
"WaitOnAbnormalExit",
"WaitOnNormalExit",
"RedirectOutput"
]
},
{
"name": ".NET Core Remote Attach",
"type": "coreclr",
"request": "attach",
"processId": "${command:pickRemoteProcess}",
"pipeTransport": {
"pipeProgram": "c:\\program files\\git\\usr\\bin\\ssh.exe",
"pipeArgs": [
"bts@sparkvm"
],
"debuggerPath": "/home/bts/vsdbg/vsdbg",
"pipeCwd": "${workspaceRoot}",
"quoteArgs": true
},
"sourceFileMap": {
"/home/bts/spark/": "${workspaceRoot}"
},
"justMyCode": true
},
{
"name": ".NET Core Remote Launch",
"type": "coreclr",
"request": "launch",
"program": "/usr/bin/dotnet",
"args": [
"sparkcmd.dll",
"test",
"test_join_create_and_takeout_market"
],
"stopAtEntry": false,
"cwd": "/home/bts/spark/build/gcc/debug/server",
"pipeTransport": {
"pipeProgram": "c:\\program files\\git\\usr\\bin\\ssh.exe",
"pipeArgs": [
"bts@sparkvm"
],
"debuggerPath": "/home/bts/vsdbg/vsdbg",
"pipeCwd": "${workspaceRoot}",
"quoteArgs": true
},
"sourceFileMap": {
"/home/bts/spark/": "${workspaceRoot}"
},
"justMyCode": false
}
]
}
-16
View File
@@ -1,16 +0,0 @@
{
"files.associations": {
"utility": "cpp",
"initializer_list": "cpp",
"list": "cpp",
"type_traits": "cpp",
"vector": "cpp",
"xhash": "cpp",
"xstring": "cpp",
"system_error": "cpp",
"array": "cpp",
"string_view": "cpp"
"xutility": "cpp",
"*.ipp": "cpp"
}
}
-63
View File
@@ -1,63 +0,0 @@
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "client_build",
"type": "shell",
"command": ".\\tools\\buildspark.cmd",
"problemMatcher":"$msCompile",
"presentation": {
"echo": true,
"reveal": "always",
"focus": false,
"panel": "shared"
},
"group": "build"
},
{
"label": "server_build",
"type": "shell",
"command": ".\\tools\\buildsparkd.cmd",
"problemMatcher": {
"base": "$gcc",
"owner": "cpp",
"fileLocation": [
"relative",
"${workspaceFolder}"
],
"pattern": {
"regexp": "(.?)(home)(.?)(bts)(.?)(spark)(.?)(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)",
"file": 8,
"line": 9,
"column": 10,
"severity": 11,
"message": 12
}
},
"presentation": {
"echo": true,
"reveal": "always",
"focus": false,
"panel": "new"
},
"group": {
"kind": "build",
"isDefault": true
}
},
{
"label": "linux build (Debug)",
"type": "shell",
"command": "cd build/ninja_debug; time ninja",
"group": {
"kind": "build",
"isDefault": true
},
"problemMatcher": [
"$gcc"
]
}
]
}
-1
View File
@@ -1 +0,0 @@
set(sources /home/taha/spark/doc/user/build.sh;content/_index.md;content/bts_spark/Glossary/_index.md;content/bts_spark/Help/_index.md;content/bts_spark/Help/about_spark.png;content/bts_spark/Help/image39.png;content/bts_spark/Help/image58.png;content/bts_spark/Launcher/_index.md;content/bts_spark/Launcher/image38.png;content/bts_spark/Launcher/image68.png;content/bts_spark/Logging-In-to-the-System/_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/Market/_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/market_view.png;content/bts_spark/Market/settings_icon.png;content/bts_spark/Market/time_and_sales.png;content/bts_spark/My-Windows/_index.md;content/bts_spark/My-Windows/image15.png;content/bts_spark/My-Windows/image16.png;content/bts_spark/My-Windows/image37.png;content/bts_spark/Settings/_index.md;content/bts_spark/Settings/image51.png;content/bts_spark/Settings/image9.png;content/bts_spark/Spreader/_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/Trading/OrderTypes/index.md;content/bts_spark/Trading/_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/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;content/system_requirements/_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)
+2 -2
View File
@@ -1,8 +1,8 @@
cmake_minimum_required(VERSION 3.5)
project(doc)
include(${CMAKE_SOURCE_DIR}/cmake/safe_dep_glob.cmake)
include(${CMAKE_SOURCE_DIR}/cmake/Protobuf.cmake)
include(${CMAKE_SOURCE_DIR}/tools/safe_dep_glob.cmake)
include(${CMAKE_SOURCE_DIR}/tools/Protobuf.cmake)
# DEPENDENCIES
set(DOC_GLOBS
+1 -1
View File
@@ -1,6 +1,6 @@
{
"sdk": {
"version": "6.0.200",
"version": "2.1.508",
"rollForward": "latestMajor"
}
}
-20
View File
@@ -1,20 +0,0 @@
{
"FormattingOptions": {
"NewLineForCatch": false,
"NewLineForClausesInQuery": true,
"NewLineForElse": false,
"NewLineForFinally": false,
"NewLineForMembersInAnonymousTypes": true,
"NewLineForMembersInObjectInit": true,
"NewLinesForBracesInAccessors": false,
"NewLinesForBracesInAnonymousMethods": false,
"NewLinesForBracesInAnonymousTypes": false,
"NewLinesForBracesInControlBlocks": false,
"NewLinesForBracesInLambdaExpressionBody": false,
"NewLinesForBracesInMethods": false,
"NewLinesForBracesInObjectCollectionArrayInitializers": false,
"NewLinesForBracesInProperties": false,
"NewLinesForBracesInTypes": false,
"TabSize": 3
}
}
-1
View File
@@ -12,7 +12,6 @@ pycodestyle==2.7.0
pycparser==2.20
pylint==2.10.2
PyMeta3==0.5.1
termcolor==1.1.0
toml==0.10.2
wrapt==1.12.1
yapf==0.31.0
+168 -116
View File
@@ -1,116 +1,168 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.3.32922.545
MinimumVisualStudioVersion = 15.0.26124.0
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "spark_api", "src\client\spark_api\spark_api.csproj", "{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libspark", "build\src\lib\libspark.vcxproj", "{FDC3A021-386E-3A2C-A7EB-CBE94A95BE25}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Spark", "src\client\spark\Spark.csproj", "{9A4D4D07-1AB6-4B2B-B111-A4F34D6C267E}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "sparkcmd", "src\client\sparkcmd\sparkcmd.csproj", "{387566C6-C6F6-412C-A30C-9855BBCB4816}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "spark_core", "src\client\spark_core\spark_core.csproj", "{6E449EB6-20AC-4FA6-B8D9-10F4BB7E1FEE}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "spark_sdk", "src\client\spark_sdk\spark_sdk.csproj", "{6963C314-83C4-4667-B0D0-C2F7AE208C29}"
ProjectSection(ProjectDependencies) = postProject
{FDC3A021-386E-3A2C-A7EB-CBE94A95BE25} = {FDC3A021-386E-3A2C-A7EB-CBE94A95BE25}
EndProjectSection
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "spark_test", "src\client\spark_test\spark_test.csproj", "{ECD78CC5-138F-4809-A764-2358C2AC2E82}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "spark_websocket", "src\client\spark_websocket\spark_websocket.csproj", "{3201359D-C071-4089-9EDE-B04D759F1508}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "spark_api_server", "src\client\spark_api_server\spark_api_server.csproj", "{2B8C5D01-FF78-4BFA-B332-5E430586DAF9}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x64 = Debug|x64
MinSizeRel|x64 = MinSizeRel|x64
Release|x64 = Release|x64
RelWithDebInfo|x64 = RelWithDebInfo|x64
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}.Debug|x64.ActiveCfg = Debug|x64
{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}.Debug|x64.Build.0 = Debug|x64
{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}.MinSizeRel|x64.ActiveCfg = Release|x64
{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}.MinSizeRel|x64.Build.0 = Release|x64
{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}.Release|x64.ActiveCfg = Release|x64
{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}.Release|x64.Build.0 = Release|x64
{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}.RelWithDebInfo|x64.ActiveCfg = Release|x64
{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}.RelWithDebInfo|x64.Build.0 = Release|x64
{FDC3A021-386E-3A2C-A7EB-CBE94A95BE25}.Debug|x64.ActiveCfg = Debug|x64
{FDC3A021-386E-3A2C-A7EB-CBE94A95BE25}.Debug|x64.Build.0 = Debug|x64
{FDC3A021-386E-3A2C-A7EB-CBE94A95BE25}.MinSizeRel|x64.ActiveCfg = MinSizeRel|x64
{FDC3A021-386E-3A2C-A7EB-CBE94A95BE25}.MinSizeRel|x64.Build.0 = MinSizeRel|x64
{FDC3A021-386E-3A2C-A7EB-CBE94A95BE25}.Release|x64.ActiveCfg = Release|x64
{FDC3A021-386E-3A2C-A7EB-CBE94A95BE25}.Release|x64.Build.0 = Release|x64
{FDC3A021-386E-3A2C-A7EB-CBE94A95BE25}.RelWithDebInfo|x64.ActiveCfg = RelWithDebInfo|x64
{FDC3A021-386E-3A2C-A7EB-CBE94A95BE25}.RelWithDebInfo|x64.Build.0 = RelWithDebInfo|x64
{9A4D4D07-1AB6-4B2B-B111-A4F34D6C267E}.Debug|x64.ActiveCfg = Debug|x64
{9A4D4D07-1AB6-4B2B-B111-A4F34D6C267E}.Debug|x64.Build.0 = Debug|x64
{9A4D4D07-1AB6-4B2B-B111-A4F34D6C267E}.MinSizeRel|x64.ActiveCfg = Release|x64
{9A4D4D07-1AB6-4B2B-B111-A4F34D6C267E}.MinSizeRel|x64.Build.0 = Release|x64
{9A4D4D07-1AB6-4B2B-B111-A4F34D6C267E}.Release|x64.ActiveCfg = Release|x64
{9A4D4D07-1AB6-4B2B-B111-A4F34D6C267E}.Release|x64.Build.0 = Release|x64
{9A4D4D07-1AB6-4B2B-B111-A4F34D6C267E}.RelWithDebInfo|x64.ActiveCfg = Release|x64
{9A4D4D07-1AB6-4B2B-B111-A4F34D6C267E}.RelWithDebInfo|x64.Build.0 = Release|x64
{387566C6-C6F6-412C-A30C-9855BBCB4816}.Debug|x64.ActiveCfg = Debug|x64
{387566C6-C6F6-412C-A30C-9855BBCB4816}.Debug|x64.Build.0 = Debug|x64
{387566C6-C6F6-412C-A30C-9855BBCB4816}.MinSizeRel|x64.ActiveCfg = Debug|x64
{387566C6-C6F6-412C-A30C-9855BBCB4816}.MinSizeRel|x64.Build.0 = Debug|x64
{387566C6-C6F6-412C-A30C-9855BBCB4816}.Release|x64.ActiveCfg = Release|x64
{387566C6-C6F6-412C-A30C-9855BBCB4816}.Release|x64.Build.0 = Release|x64
{387566C6-C6F6-412C-A30C-9855BBCB4816}.RelWithDebInfo|x64.ActiveCfg = Release|x64
{387566C6-C6F6-412C-A30C-9855BBCB4816}.RelWithDebInfo|x64.Build.0 = Release|x64
{6E449EB6-20AC-4FA6-B8D9-10F4BB7E1FEE}.Debug|x64.ActiveCfg = Debug|x64
{6E449EB6-20AC-4FA6-B8D9-10F4BB7E1FEE}.Debug|x64.Build.0 = Debug|x64
{6E449EB6-20AC-4FA6-B8D9-10F4BB7E1FEE}.MinSizeRel|x64.ActiveCfg = Release|x64
{6E449EB6-20AC-4FA6-B8D9-10F4BB7E1FEE}.MinSizeRel|x64.Build.0 = Release|x64
{6E449EB6-20AC-4FA6-B8D9-10F4BB7E1FEE}.Release|x64.ActiveCfg = Release|x64
{6E449EB6-20AC-4FA6-B8D9-10F4BB7E1FEE}.Release|x64.Build.0 = Release|x64
{6E449EB6-20AC-4FA6-B8D9-10F4BB7E1FEE}.RelWithDebInfo|x64.ActiveCfg = Release|x64
{6E449EB6-20AC-4FA6-B8D9-10F4BB7E1FEE}.RelWithDebInfo|x64.Build.0 = Release|x64
{6963C314-83C4-4667-B0D0-C2F7AE208C29}.Debug|x64.ActiveCfg = Debug|x64
{6963C314-83C4-4667-B0D0-C2F7AE208C29}.Debug|x64.Build.0 = Debug|x64
{6963C314-83C4-4667-B0D0-C2F7AE208C29}.MinSizeRel|x64.ActiveCfg = Release|x64
{6963C314-83C4-4667-B0D0-C2F7AE208C29}.MinSizeRel|x64.Build.0 = Release|x64
{6963C314-83C4-4667-B0D0-C2F7AE208C29}.Release|x64.ActiveCfg = Release|x64
{6963C314-83C4-4667-B0D0-C2F7AE208C29}.Release|x64.Build.0 = Release|x64
{6963C314-83C4-4667-B0D0-C2F7AE208C29}.RelWithDebInfo|x64.ActiveCfg = Release|x64
{6963C314-83C4-4667-B0D0-C2F7AE208C29}.RelWithDebInfo|x64.Build.0 = Release|x64
{ECD78CC5-138F-4809-A764-2358C2AC2E82}.Debug|x64.ActiveCfg = Debug|x64
{ECD78CC5-138F-4809-A764-2358C2AC2E82}.Debug|x64.Build.0 = Debug|x64
{ECD78CC5-138F-4809-A764-2358C2AC2E82}.MinSizeRel|x64.ActiveCfg = Debug|x64
{ECD78CC5-138F-4809-A764-2358C2AC2E82}.MinSizeRel|x64.Build.0 = Debug|x64
{ECD78CC5-138F-4809-A764-2358C2AC2E82}.Release|x64.ActiveCfg = Release|x64
{ECD78CC5-138F-4809-A764-2358C2AC2E82}.Release|x64.Build.0 = Release|x64
{ECD78CC5-138F-4809-A764-2358C2AC2E82}.RelWithDebInfo|x64.ActiveCfg = Release|x64
{ECD78CC5-138F-4809-A764-2358C2AC2E82}.RelWithDebInfo|x64.Build.0 = Release|x64
{3201359D-C071-4089-9EDE-B04D759F1508}.Debug|x64.ActiveCfg = Debug|x64
{3201359D-C071-4089-9EDE-B04D759F1508}.Debug|x64.Build.0 = Debug|x64
{3201359D-C071-4089-9EDE-B04D759F1508}.MinSizeRel|x64.ActiveCfg = Debug|x64
{3201359D-C071-4089-9EDE-B04D759F1508}.MinSizeRel|x64.Build.0 = Debug|x64
{3201359D-C071-4089-9EDE-B04D759F1508}.Release|x64.ActiveCfg = Release|x64
{3201359D-C071-4089-9EDE-B04D759F1508}.Release|x64.Build.0 = Release|x64
{3201359D-C071-4089-9EDE-B04D759F1508}.RelWithDebInfo|x64.ActiveCfg = Release|x64
{3201359D-C071-4089-9EDE-B04D759F1508}.RelWithDebInfo|x64.Build.0 = Release|x64
{2B8C5D01-FF78-4BFA-B332-5E430586DAF9}.Debug|x64.ActiveCfg = Debug|x64
{2B8C5D01-FF78-4BFA-B332-5E430586DAF9}.Debug|x64.Build.0 = Debug|x64
{2B8C5D01-FF78-4BFA-B332-5E430586DAF9}.MinSizeRel|x64.ActiveCfg = Debug|x64
{2B8C5D01-FF78-4BFA-B332-5E430586DAF9}.MinSizeRel|x64.Build.0 = Debug|x64
{2B8C5D01-FF78-4BFA-B332-5E430586DAF9}.Release|x64.ActiveCfg = Release|x64
{2B8C5D01-FF78-4BFA-B332-5E430586DAF9}.Release|x64.Build.0 = Release|x64
{2B8C5D01-FF78-4BFA-B332-5E430586DAF9}.RelWithDebInfo|x64.ActiveCfg = Release|x64
{2B8C5D01-FF78-4BFA-B332-5E430586DAF9}.RelWithDebInfo|x64.Build.0 = Release|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {422D1620-0166-4C26-9A81-CA8A2EB1AB58}
EndGlobalSection
GlobalSection(Performance) = preSolution
HasPerformanceSessions = true
EndGlobalSection
EndGlobal
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.27130.2024
MinimumVisualStudioVersion = 15.0.26124.0
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "spark_api", "src\client\spark_api\spark_api.csproj", "{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Spark", "src\client\spark\Spark.csproj", "{9A4D4D07-1AB6-4B2B-B111-A4F34D6C267E}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "sparkcmd", "src\client\sparkcmd\sparkcmd.csproj", "{387566C6-C6F6-412C-A30C-9855BBCB4816}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "spark_core", "src\client\spark_core\spark_core.csproj", "{6E449EB6-20AC-4FA6-B8D9-10F4BB7E1FEE}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "spark_sdk", "src\client\spark_sdk\spark_sdk.csproj", "{6963C314-83C4-4667-B0D0-C2F7AE208C29}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "spark_test", "src\client\spark_test\spark_test.csproj", "{ECD78CC5-138F-4809-A764-2358C2AC2E82}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
MinSizeRel|Any CPU = MinSizeRel|Any CPU
MinSizeRel|x64 = MinSizeRel|x64
MinSizeRel|x86 = MinSizeRel|x86
Release|Any CPU = Release|Any CPU
Release|x64 = Release|x64
Release|x86 = Release|x86
RelWithDebInfo|Any CPU = RelWithDebInfo|Any CPU
RelWithDebInfo|x64 = RelWithDebInfo|x64
RelWithDebInfo|x86 = RelWithDebInfo|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}.Debug|Any CPU.ActiveCfg = Debug|x64
{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}.Debug|x64.ActiveCfg = Debug|x64
{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}.Debug|x64.Build.0 = Debug|x64
{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}.Debug|x86.ActiveCfg = Debug|x64
{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}.MinSizeRel|Any CPU.ActiveCfg = Release|x64
{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}.MinSizeRel|Any CPU.Build.0 = Release|x64
{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}.MinSizeRel|x64.ActiveCfg = Release|x64
{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}.MinSizeRel|x64.Build.0 = Release|x64
{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}.MinSizeRel|x86.ActiveCfg = Release|x64
{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}.MinSizeRel|x86.Build.0 = Release|x64
{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}.Release|Any CPU.ActiveCfg = Release|x64
{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}.Release|x64.ActiveCfg = Release|x64
{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}.Release|x64.Build.0 = Release|x64
{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}.Release|x86.ActiveCfg = Release|x64
{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}.RelWithDebInfo|Any CPU.ActiveCfg = Release|x64
{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}.RelWithDebInfo|Any CPU.Build.0 = Release|x64
{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}.RelWithDebInfo|x64.ActiveCfg = Release|x64
{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}.RelWithDebInfo|x64.Build.0 = Release|x64
{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}.RelWithDebInfo|x86.ActiveCfg = Release|x64
{DC9A8975-8211-4FC9-A9BA-C8B9D26AD481}.RelWithDebInfo|x86.Build.0 = Release|x64
{9A4D4D07-1AB6-4B2B-B111-A4F34D6C267E}.Debug|Any CPU.ActiveCfg = Debug|x64
{9A4D4D07-1AB6-4B2B-B111-A4F34D6C267E}.Debug|x64.ActiveCfg = Debug|x64
{9A4D4D07-1AB6-4B2B-B111-A4F34D6C267E}.Debug|x64.Build.0 = Debug|x64
{9A4D4D07-1AB6-4B2B-B111-A4F34D6C267E}.Debug|x86.ActiveCfg = Debug|x64
{9A4D4D07-1AB6-4B2B-B111-A4F34D6C267E}.MinSizeRel|Any CPU.ActiveCfg = Release|x64
{9A4D4D07-1AB6-4B2B-B111-A4F34D6C267E}.MinSizeRel|Any CPU.Build.0 = Release|x64
{9A4D4D07-1AB6-4B2B-B111-A4F34D6C267E}.MinSizeRel|x64.ActiveCfg = Release|x64
{9A4D4D07-1AB6-4B2B-B111-A4F34D6C267E}.MinSizeRel|x64.Build.0 = Release|x64
{9A4D4D07-1AB6-4B2B-B111-A4F34D6C267E}.MinSizeRel|x86.ActiveCfg = Release|x64
{9A4D4D07-1AB6-4B2B-B111-A4F34D6C267E}.MinSizeRel|x86.Build.0 = Release|x64
{9A4D4D07-1AB6-4B2B-B111-A4F34D6C267E}.Release|Any CPU.ActiveCfg = Release|x64
{9A4D4D07-1AB6-4B2B-B111-A4F34D6C267E}.Release|x64.ActiveCfg = Release|x64
{9A4D4D07-1AB6-4B2B-B111-A4F34D6C267E}.Release|x64.Build.0 = Release|x64
{9A4D4D07-1AB6-4B2B-B111-A4F34D6C267E}.Release|x86.ActiveCfg = Release|x64
{9A4D4D07-1AB6-4B2B-B111-A4F34D6C267E}.RelWithDebInfo|Any CPU.ActiveCfg = Release|x64
{9A4D4D07-1AB6-4B2B-B111-A4F34D6C267E}.RelWithDebInfo|Any CPU.Build.0 = Release|x64
{9A4D4D07-1AB6-4B2B-B111-A4F34D6C267E}.RelWithDebInfo|x64.ActiveCfg = Release|x64
{9A4D4D07-1AB6-4B2B-B111-A4F34D6C267E}.RelWithDebInfo|x64.Build.0 = Release|x64
{9A4D4D07-1AB6-4B2B-B111-A4F34D6C267E}.RelWithDebInfo|x86.ActiveCfg = Release|x64
{9A4D4D07-1AB6-4B2B-B111-A4F34D6C267E}.RelWithDebInfo|x86.Build.0 = Release|x64
{387566C6-C6F6-412C-A30C-9855BBCB4816}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{387566C6-C6F6-412C-A30C-9855BBCB4816}.Debug|Any CPU.Build.0 = Debug|Any CPU
{387566C6-C6F6-412C-A30C-9855BBCB4816}.Debug|x64.ActiveCfg = Debug|Any CPU
{387566C6-C6F6-412C-A30C-9855BBCB4816}.Debug|x64.Build.0 = Debug|Any CPU
{387566C6-C6F6-412C-A30C-9855BBCB4816}.Debug|x86.ActiveCfg = Debug|Any CPU
{387566C6-C6F6-412C-A30C-9855BBCB4816}.Debug|x86.Build.0 = Debug|Any CPU
{387566C6-C6F6-412C-A30C-9855BBCB4816}.MinSizeRel|Any CPU.ActiveCfg = Debug|Any CPU
{387566C6-C6F6-412C-A30C-9855BBCB4816}.MinSizeRel|Any CPU.Build.0 = Debug|Any CPU
{387566C6-C6F6-412C-A30C-9855BBCB4816}.MinSizeRel|x64.ActiveCfg = Debug|Any CPU
{387566C6-C6F6-412C-A30C-9855BBCB4816}.MinSizeRel|x64.Build.0 = Debug|Any CPU
{387566C6-C6F6-412C-A30C-9855BBCB4816}.MinSizeRel|x86.ActiveCfg = Debug|Any CPU
{387566C6-C6F6-412C-A30C-9855BBCB4816}.MinSizeRel|x86.Build.0 = Debug|Any CPU
{387566C6-C6F6-412C-A30C-9855BBCB4816}.Release|Any CPU.ActiveCfg = Release|Any CPU
{387566C6-C6F6-412C-A30C-9855BBCB4816}.Release|Any CPU.Build.0 = Release|Any CPU
{387566C6-C6F6-412C-A30C-9855BBCB4816}.Release|x64.ActiveCfg = Release|Any CPU
{387566C6-C6F6-412C-A30C-9855BBCB4816}.Release|x64.Build.0 = Release|Any CPU
{387566C6-C6F6-412C-A30C-9855BBCB4816}.Release|x86.ActiveCfg = Release|Any CPU
{387566C6-C6F6-412C-A30C-9855BBCB4816}.Release|x86.Build.0 = Release|Any CPU
{387566C6-C6F6-412C-A30C-9855BBCB4816}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Any CPU
{387566C6-C6F6-412C-A30C-9855BBCB4816}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU
{387566C6-C6F6-412C-A30C-9855BBCB4816}.RelWithDebInfo|x64.ActiveCfg = Release|Any CPU
{387566C6-C6F6-412C-A30C-9855BBCB4816}.RelWithDebInfo|x64.Build.0 = Release|Any CPU
{387566C6-C6F6-412C-A30C-9855BBCB4816}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU
{387566C6-C6F6-412C-A30C-9855BBCB4816}.RelWithDebInfo|x86.Build.0 = Release|Any CPU
{6E449EB6-20AC-4FA6-B8D9-10F4BB7E1FEE}.Debug|Any CPU.ActiveCfg = Debug|x64
{6E449EB6-20AC-4FA6-B8D9-10F4BB7E1FEE}.Debug|x64.ActiveCfg = Debug|x64
{6E449EB6-20AC-4FA6-B8D9-10F4BB7E1FEE}.Debug|x64.Build.0 = Debug|x64
{6E449EB6-20AC-4FA6-B8D9-10F4BB7E1FEE}.Debug|x86.ActiveCfg = Debug|x64
{6E449EB6-20AC-4FA6-B8D9-10F4BB7E1FEE}.MinSizeRel|Any CPU.ActiveCfg = Release|x64
{6E449EB6-20AC-4FA6-B8D9-10F4BB7E1FEE}.MinSizeRel|Any CPU.Build.0 = Release|x64
{6E449EB6-20AC-4FA6-B8D9-10F4BB7E1FEE}.MinSizeRel|x64.ActiveCfg = Release|x64
{6E449EB6-20AC-4FA6-B8D9-10F4BB7E1FEE}.MinSizeRel|x64.Build.0 = Release|x64
{6E449EB6-20AC-4FA6-B8D9-10F4BB7E1FEE}.MinSizeRel|x86.ActiveCfg = Release|x64
{6E449EB6-20AC-4FA6-B8D9-10F4BB7E1FEE}.MinSizeRel|x86.Build.0 = Release|x64
{6E449EB6-20AC-4FA6-B8D9-10F4BB7E1FEE}.Release|Any CPU.ActiveCfg = Release|x64
{6E449EB6-20AC-4FA6-B8D9-10F4BB7E1FEE}.Release|x64.ActiveCfg = Release|x64
{6E449EB6-20AC-4FA6-B8D9-10F4BB7E1FEE}.Release|x64.Build.0 = Release|x64
{6E449EB6-20AC-4FA6-B8D9-10F4BB7E1FEE}.Release|x86.ActiveCfg = Release|x64
{6E449EB6-20AC-4FA6-B8D9-10F4BB7E1FEE}.RelWithDebInfo|Any CPU.ActiveCfg = Release|x64
{6E449EB6-20AC-4FA6-B8D9-10F4BB7E1FEE}.RelWithDebInfo|Any CPU.Build.0 = Release|x64
{6E449EB6-20AC-4FA6-B8D9-10F4BB7E1FEE}.RelWithDebInfo|x64.ActiveCfg = Release|x64
{6E449EB6-20AC-4FA6-B8D9-10F4BB7E1FEE}.RelWithDebInfo|x64.Build.0 = Release|x64
{6963C314-83C4-4667-B0D0-C2F7AE208C29}.Debug|x64.ActiveCfg = Debug|x64
{6963C314-83C4-4667-B0D0-C2F7AE208C29}.Debug|x64.Build.0 = Debug|x64
{6963C314-83C4-4667-B0D0-C2F7AE208C29}.Debug|x86.ActiveCfg = Debug|x64
{6963C314-83C4-4667-B0D0-C2F7AE208C29}.MinSizeRel|Any CPU.ActiveCfg = Release|x64
{6963C314-83C4-4667-B0D0-C2F7AE208C29}.MinSizeRel|Any CPU.Build.0 = Release|x64
{6963C314-83C4-4667-B0D0-C2F7AE208C29}.MinSizeRel|x64.ActiveCfg = Release|x64
{6963C314-83C4-4667-B0D0-C2F7AE208C29}.MinSizeRel|x64.Build.0 = Release|x64
{6963C314-83C4-4667-B0D0-C2F7AE208C29}.MinSizeRel|x86.ActiveCfg = Release|x64
{6963C314-83C4-4667-B0D0-C2F7AE208C29}.MinSizeRel|x86.Build.0 = Release|x64
{6963C314-83C4-4667-B0D0-C2F7AE208C29}.Release|Any CPU.ActiveCfg = Release|x64
{6963C314-83C4-4667-B0D0-C2F7AE208C29}.Release|x64.ActiveCfg = Release|x64
{6963C314-83C4-4667-B0D0-C2F7AE208C29}.Release|x64.Build.0 = Release|x64
{6963C314-83C4-4667-B0D0-C2F7AE208C29}.Release|x86.ActiveCfg = Release|x64
{6963C314-83C4-4667-B0D0-C2F7AE208C29}.RelWithDebInfo|Any CPU.ActiveCfg = Release|x64
{6963C314-83C4-4667-B0D0-C2F7AE208C29}.RelWithDebInfo|Any CPU.Build.0 = Release|x64
{6963C314-83C4-4667-B0D0-C2F7AE208C29}.RelWithDebInfo|x64.ActiveCfg = Release|x64
{6963C314-83C4-4667-B0D0-C2F7AE208C29}.RelWithDebInfo|x64.Build.0 = Release|x64
{6963C314-83C4-4667-B0D0-C2F7AE208C29}.RelWithDebInfo|x86.ActiveCfg = Release|x64
{6963C314-83C4-4667-B0D0-C2F7AE208C29}.RelWithDebInfo|x86.Build.0 = Release|x64
{ECD78CC5-138F-4809-A764-2358C2AC2E82}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{ECD78CC5-138F-4809-A764-2358C2AC2E82}.Debug|Any CPU.Build.0 = Debug|Any CPU
{ECD78CC5-138F-4809-A764-2358C2AC2E82}.Debug|x64.ActiveCfg = Debug|Any CPU
{ECD78CC5-138F-4809-A764-2358C2AC2E82}.Debug|x64.Build.0 = Debug|Any CPU
{ECD78CC5-138F-4809-A764-2358C2AC2E82}.Debug|x86.ActiveCfg = Debug|Any CPU
{ECD78CC5-138F-4809-A764-2358C2AC2E82}.Debug|x86.Build.0 = Debug|Any CPU
{ECD78CC5-138F-4809-A764-2358C2AC2E82}.MinSizeRel|Any CPU.ActiveCfg = Debug|Any CPU
{ECD78CC5-138F-4809-A764-2358C2AC2E82}.MinSizeRel|Any CPU.Build.0 = Debug|Any CPU
{ECD78CC5-138F-4809-A764-2358C2AC2E82}.MinSizeRel|x64.ActiveCfg = Debug|Any CPU
{ECD78CC5-138F-4809-A764-2358C2AC2E82}.MinSizeRel|x64.Build.0 = Debug|Any CPU
{ECD78CC5-138F-4809-A764-2358C2AC2E82}.MinSizeRel|x86.ActiveCfg = Debug|Any CPU
{ECD78CC5-138F-4809-A764-2358C2AC2E82}.MinSizeRel|x86.Build.0 = Debug|Any CPU
{ECD78CC5-138F-4809-A764-2358C2AC2E82}.Release|Any CPU.ActiveCfg = Release|Any CPU
{ECD78CC5-138F-4809-A764-2358C2AC2E82}.Release|Any CPU.Build.0 = Release|Any CPU
{ECD78CC5-138F-4809-A764-2358C2AC2E82}.Release|x64.ActiveCfg = Release|Any CPU
{ECD78CC5-138F-4809-A764-2358C2AC2E82}.Release|x64.Build.0 = Release|Any CPU
{ECD78CC5-138F-4809-A764-2358C2AC2E82}.Release|x86.ActiveCfg = Release|Any CPU
{ECD78CC5-138F-4809-A764-2358C2AC2E82}.Release|x86.Build.0 = Release|Any CPU
{ECD78CC5-138F-4809-A764-2358C2AC2E82}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Any CPU
{ECD78CC5-138F-4809-A764-2358C2AC2E82}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU
{ECD78CC5-138F-4809-A764-2358C2AC2E82}.RelWithDebInfo|x64.ActiveCfg = Release|Any CPU
{ECD78CC5-138F-4809-A764-2358C2AC2E82}.RelWithDebInfo|x64.Build.0 = Release|Any CPU
{ECD78CC5-138F-4809-A764-2358C2AC2E82}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU
{ECD78CC5-138F-4809-A764-2358C2AC2E82}.RelWithDebInfo|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {422D1620-0166-4C26-9A81-CA8A2EB1AB58}
EndGlobalSection
GlobalSection(Performance) = preSolution
HasPerformanceSessions = true
EndGlobalSection
EndGlobal
@@ -1,41 +1,41 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.26730.10
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sparkd", "src\server\sparkd\sparkd.vcxproj", "{BBBAFD38-312D-4A8D-9AF0-F2BDEE72CE6F}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libspark", "build\src\lib\libspark.vcxproj", "{502FD050-679A-3B50-B438-098500700919}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x64 = Debug|x64
MinSizeRel|x64 = MinSizeRel|x64
Release|x64 = Release|x64
RelWithDebInfo|x64 = RelWithDebInfo|x64
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{BBBAFD38-312D-4A8D-9AF0-F2BDEE72CE6F}.Debug|x64.ActiveCfg = Debug|x64
{BBBAFD38-312D-4A8D-9AF0-F2BDEE72CE6F}.Debug|x64.Build.0 = Debug|x64
{BBBAFD38-312D-4A8D-9AF0-F2BDEE72CE6F}.MinSizeRel|x64.ActiveCfg = Release|x64
{BBBAFD38-312D-4A8D-9AF0-F2BDEE72CE6F}.MinSizeRel|x64.Build.0 = Release|x64
{BBBAFD38-312D-4A8D-9AF0-F2BDEE72CE6F}.Release|x64.ActiveCfg = Release|x64
{BBBAFD38-312D-4A8D-9AF0-F2BDEE72CE6F}.Release|x64.Build.0 = Release|x64
{BBBAFD38-312D-4A8D-9AF0-F2BDEE72CE6F}.RelWithDebInfo|x64.ActiveCfg = Release|x64
{BBBAFD38-312D-4A8D-9AF0-F2BDEE72CE6F}.RelWithDebInfo|x64.Build.0 = Release|x64
{502FD050-679A-3B50-B438-098500700919}.Debug|x64.ActiveCfg = Debug|x64
{502FD050-679A-3B50-B438-098500700919}.Debug|x64.Build.0 = Debug|x64
{502FD050-679A-3B50-B438-098500700919}.MinSizeRel|x64.ActiveCfg = MinSizeRel|x64
{502FD050-679A-3B50-B438-098500700919}.MinSizeRel|x64.Build.0 = MinSizeRel|x64
{502FD050-679A-3B50-B438-098500700919}.Release|x64.ActiveCfg = Release|x64
{502FD050-679A-3B50-B438-098500700919}.Release|x64.Build.0 = Release|x64
{502FD050-679A-3B50-B438-098500700919}.RelWithDebInfo|x64.ActiveCfg = RelWithDebInfo|x64
{502FD050-679A-3B50-B438-098500700919}.RelWithDebInfo|x64.Build.0 = RelWithDebInfo|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {6A7249D7-B40C-4656-9347-60072D0B8FDB}
EndGlobalSection
EndGlobal
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.26730.10
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sparkd", "src\server\sparkd\sparkd.vcxproj", "{BBBAFD38-312D-4A8D-9AF0-F2BDEE72CE6F}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libspark", "build\src\lib\libspark.vcxproj", "{502FD050-679A-3B50-B438-098500700919}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x64 = Debug|x64
MinSizeRel|x64 = MinSizeRel|x64
Release|x64 = Release|x64
RelWithDebInfo|x64 = RelWithDebInfo|x64
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{BBBAFD38-312D-4A8D-9AF0-F2BDEE72CE6F}.Debug|x64.ActiveCfg = Debug|x64
{BBBAFD38-312D-4A8D-9AF0-F2BDEE72CE6F}.Debug|x64.Build.0 = Debug|x64
{BBBAFD38-312D-4A8D-9AF0-F2BDEE72CE6F}.MinSizeRel|x64.ActiveCfg = Release|x64
{BBBAFD38-312D-4A8D-9AF0-F2BDEE72CE6F}.MinSizeRel|x64.Build.0 = Release|x64
{BBBAFD38-312D-4A8D-9AF0-F2BDEE72CE6F}.Release|x64.ActiveCfg = Release|x64
{BBBAFD38-312D-4A8D-9AF0-F2BDEE72CE6F}.Release|x64.Build.0 = Release|x64
{BBBAFD38-312D-4A8D-9AF0-F2BDEE72CE6F}.RelWithDebInfo|x64.ActiveCfg = Release|x64
{BBBAFD38-312D-4A8D-9AF0-F2BDEE72CE6F}.RelWithDebInfo|x64.Build.0 = Release|x64
{502FD050-679A-3B50-B438-098500700919}.Debug|x64.ActiveCfg = Debug|x64
{502FD050-679A-3B50-B438-098500700919}.Debug|x64.Build.0 = Debug|x64
{502FD050-679A-3B50-B438-098500700919}.MinSizeRel|x64.ActiveCfg = MinSizeRel|x64
{502FD050-679A-3B50-B438-098500700919}.MinSizeRel|x64.Build.0 = MinSizeRel|x64
{502FD050-679A-3B50-B438-098500700919}.Release|x64.ActiveCfg = Release|x64
{502FD050-679A-3B50-B438-098500700919}.Release|x64.Build.0 = Release|x64
{502FD050-679A-3B50-B438-098500700919}.RelWithDebInfo|x64.ActiveCfg = RelWithDebInfo|x64
{502FD050-679A-3B50-B438-098500700919}.RelWithDebInfo|x64.Build.0 = RelWithDebInfo|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {6A7249D7-B40C-4656-9347-60072D0B8FDB}
EndGlobalSection
EndGlobal
+17
View File
@@ -0,0 +1,17 @@
{
"files.associations": {
"chrono": "cpp",
"future": "cpp",
"system_error": "cpp",
"ios": "cpp",
"utility": "cpp",
"iosfwd": "cpp",
"xhash": "cpp",
"xstring": "cpp",
"xtree": "cpp",
"xutility": "cpp",
"exception": "cpp",
"bitset": "cpp",
"xlocale": "cpp"
}
}
+68 -55
View File
@@ -1,55 +1,68 @@
<Project>
<PropertyGroup>
<ComputerSpecificConfig>..\..\tools\override\$(computername).props</ComputerSpecificConfig>
<SparkRoot>$([System.IO.Path]::GetFullPath($(MSBuildThisFileDirectory)\..\..))</SparkRoot>
<SourceRoot>$([System.IO.Path]::GetFullPath($(SparkRoot)\src))</SourceRoot>
<Externals>$(SparkRoot)\externals\windows</Externals>
<DepotName>$([System.IO.Path]::GetFileName($([System.IO.Path]::GetFullPath($(SparkRoot)))))</DepotName>
<ErrorReport>None</ErrorReport>
<Prefer32Bit>False</Prefer32Bit>
<Deterministic>true</Deterministic>
<EnableDefaultContentItems>False</EnableDefaultContentItems>
<ShowMissingItemTypes>false</ShowMissingItemTypes>
<Configuration Condition="'$(configuration)'==''">Debug</Configuration>
<EnablePreviewFeatures>true</EnablePreviewFeatures>
<LangVersion>11</LangVersion>
</PropertyGroup>
<PropertyGroup Label="Output">
<BaseOutputPath>$(SparkRoot)\build\$(Configuration)</BaseOutputPath>
<OutputPath>$(BaseOutputPath)\bin</OutputPath>
<BaseIntermediateOutputPath>$(BaseOutputPath)\obj\$(MSBuildProjectName)</BaseIntermediateOutputPath>
<IntermediateOutputPath>$(BaseOutputPath)\obj\$(MSBuildProjectName)</IntermediateOutputPath>
<ProtoOutputPath>$(BaseOutputPath)\obj\$(MSBuildProjectName)</ProtoOutputPath>
<GenDir>$(BaseOutputPath)\gen\$(MSBuildProjectName)</GenDir>
</PropertyGroup>
<Import
Project="$(ComputerSpecificConfig)"
Condition="Exists($(ComputerSpecificConfig))" />
<PropertyGroup Label="ProtoBuf">
<ProtocPluginBase>$(SparkRoot)\src\lib\api\service_compiler</ProtocPluginBase>
<protoc>$(Externals)\bin\protoc.exe</protoc>
<protogen>$(Externals)\bin\protogen.exe</protogen>
</PropertyGroup>
<ItemDefinitionGroup>
<Proto2></Proto2>
<Proto3>
<OutBase>$(IntermediateOutputPath)\gen\%(relativedir)</OutBase>
<OutCS>%(OutBase)%(FileName).cs</OutCS>
<OutCSClient>%(OutBase)%(FileName).client.pb.cs</OutCSClient>
<OutCSServer>%(OutBase)%(FileName).server.pb.cs</OutCSServer>
<OutCSImmutable>%(OutBase)%(FileName).immutable.pb.cs</OutCSImmutable>
<CompileOptions></CompileOptions>
</Proto3>
<Proto3Excel>
<OutBase>$(IntermediateOutputPath)\gen\%(relativedir)</OutBase>
<OutCSExcel>%(OutBase)%(FileName).excel.pb.cs</OutCSExcel>
<CompileOptions></CompileOptions>
</Proto3Excel>
</ItemDefinitionGroup>
</Project>
<Project>
<PropertyGroup>
<ComputerSpecificConfig>..\..\tools\override\$(computername).props</ComputerSpecificConfig>
<SparkRoot>$([System.IO.Path]::GetFullPath($(MSBuildThisFileDirectory)\..\..))</SparkRoot>
<SourceRoot>$([System.IO.Path]::GetFullPath($(SparkRoot)\src))</SourceRoot>
<Externals>$(SparkRoot)\externals\windows</Externals>
<DepotName>$([System.IO.Path]::GetFileName($([System.IO.Path]::GetFullPath($(SparkRoot)))))</DepotName>
<ErrorReport>None</ErrorReport>
<Prefer32Bit>False</Prefer32Bit>
<Deterministic>true</Deterministic>
<EnableDefaultContentItems>False</EnableDefaultContentItems>
<ShowMissingItemTypes>false</ShowMissingItemTypes>
<Configuration Condition="'$(configuration)'==''">Debug</Configuration>
</PropertyGroup>
<PropertyGroup Label="Output">
<BaseOutputPath>$(SparkRoot)\build\$(Configuration)</BaseOutputPath>
<OutputPath>$(BaseOutputPath)\bin</OutputPath>
<BaseIntermediateOutputPath>$(BaseOutputPath)\obj\$(MSBuildProjectName)</BaseIntermediateOutputPath>
<IntermediateOutputPath>$(BaseOutputPath)\obj\$(MSBuildProjectName)</IntermediateOutputPath>
<GenDir>$(BaseOutputPath)\gen\$(MSBuildProjectName)</GenDir>
</PropertyGroup>
<PropertyGroup Condition="'$(VCTargetsPath)'==''">
<VCTargetsPath>C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\VC\VCTargets</VCTargetsPath>
</PropertyGroup>
<Import Project="$(ComputerSpecificConfig)" Condition="Exists($(ComputerSpecificConfig))" />
<ItemGroup>
<AvailableItemName Include="Proto2">
<Targets>CompileProto3</Targets>
</AvailableItemName>
<AvailableItemName Include="Proto3">
<Targets>CompileProto3</Targets>
</AvailableItemName>
<AvailableItemName Include="Proto3Excel">
<Targets>CompileProto3Excel</Targets>
</AvailableItemName>
</ItemGroup>
<PropertyGroup Label="ProtoBuf">
<ProtocPluginBase>$(SparkRoot)\src\lib\api\service_compiler</ProtocPluginBase>
<ProtoInclude>$(Externals)\include</ProtoInclude>
<protoc>$(Externals)\bin\protoc.exe</protoc>
<protogen>$(Externals)\bin\protogen.exe</protogen>
</PropertyGroup>
<ItemDefinitionGroup>
<Proto2>
</Proto2>
<Proto3>
<OutBase>$(IntermediateOutputPath)\gen\%(relativedir)</OutBase>
<OutCS>%(OutBase)%(FileName).cs</OutCS>
<OutCSClient>%(OutBase)%(FileName).client.pb.cs</OutCSClient>
<OutCSServer>%(OutBase)%(FileName).server.pb.cs</OutCSServer>
<OutCSImmutable>%(OutBase)%(FileName).immutable.pb.cs</OutCSImmutable>
<CompileOptions></CompileOptions>
</Proto3>
<Proto3Excel>
<OutBase>$(IntermediateOutputPath)\gen\%(relativedir)</OutBase>
<OutCSExcel>%(OutBase)%(FileName).excel.pb.cs</OutCSExcel>
<CompileOptions></CompileOptions>
</Proto3Excel>
</ItemDefinitionGroup>
</Project>
+97 -94
View File
@@ -1,94 +1,97 @@
<Project>
<Target
Name="CompileProto2"
Condition="'@(Proto2)'!=''"
Inputs="$(MSBuildProjectFile);$(protogen);%(Proto2.FullPath)"
Outputs="$(GenDir)\proto2\%(Proto2.filename).cs"
AfterTargets="PreBuildEvent">
<PropertyGroup>
<SourceRelativeFile>$([System.String]::Copy('%(proto2.fullpath)').Replace($(SourceRoot), ''))</SourceRelativeFile>
<SourceRelativeDir>$([System.IO.Path]::GetDirectoryName($(SourceRelativeFile)))</SourceRelativeDir>
<WorkingDirectory>$(GenDir)\proto2</WorkingDirectory>
</PropertyGroup>
<MakeDir Directories="$(WorkingDirectory)" />
<Copy
SourceFiles="%(Proto2.FullPath)"
DestinationFolder="$(WorkingDirectory)"
SkipUnchangedFiles="True"
UseHardLinksIfPossible="True" />
<Error
Text="protogen.exe does not exist. If you forgot to clone with externals try: git submodule update --init --recursive"
Condition="!Exists($(protogen))" />
<Exec
Command="$(Protogen) %(Proto2.filename)%(proto2.extension) --csharp_out=. -I. -I$(SourceRoot) -I$(Externals)\include"
WorkingDirectory="$(WorkingDirectory)" />
<ItemGroup>
<Compile Include="$(WorkingDirectory)\%(Proto2.filename).cs" />
</ItemGroup>
</Target>
<!--
Run this after GetAssemblyVersion because it happens after the Xaml compiler
and exists in both xaml and non-xaml projects. One of the (many) xaml compile
passes wipes out the additional compile includes that we add.
-->
<Target
Name="CompileProto3"
AfterTargets="GetAssemblyVersion"
Condition="'@(Proto3)'!=''"
Inputs="$(protoc);
%(Proto3.Identity);$(ProtocPluginBase)\plugin.py;
$(ProtocPluginBase)\templates\c#\client.pb.cs;
$(ProtocPluginBase)\templates\c#\server.pb.cs;
$(ProtocPluginBase)\templates\c#\immutable.pb.cs;"
Outputs="%(Proto3.OutCS);%(Proto3.OutCSServer);%(Proto3.OutCSClient);%(Proto3.OutCSImmutable)">
<MakeDir Directories="%(Proto3.OutBase)" />
<Message
Importance="High"
Text="Generating service %(Proto3.FileName)" />
<Exec Command="$(SparkRoot)\.venv\Scripts\activate.bat" />
<Exec Command="set PYTHONPATH=$(SparkRoot)\.venv\Scripts\python" />
<Exec
Command="
$(protoc) %* %(Proto3.FullPath) ^
--error_format=msvs ^
--proto_path=$(SourceRoot) ^
--plugin=&quot;protoc-gen-service=$(ProtocPluginBase)\plugin.cmd&quot; ^
--service_out=lang=c#,strip_out_path=1:%(Proto3.OutBase) ^
--csharp_out=%(CompileOptions)%(Proto3.OutBase)"
WorkingDirectory="%(relativedir)" />
<ItemGroup>
<Compile Include="%(Proto3.OutCS)" />
<Compile Include="%(Proto3.OutCSClient)" />
<Compile Include="%(Proto3.OutCSServer)" />
<Compile Include="%(Proto3.OutCSImmutable)" />
</ItemGroup>
</Target>
<Target Name="RemoveSystemRuntimeFromRefPack"
BeforeTargets="_HandlePackageFileConflicts"
Condition="'@(Reference -> WithMetadataValue('NugetPackageId', 'System.Runtime.Experimental'))' != ''">
<ItemGroup>
<Reference Remove="@(Reference)"
Condition="$([System.String]::Copy(%(Reference.Identity)).Contains('System.Runtime.dll')) and
'%(Reference.NuGetPackageId)' == 'Microsoft.NETCore.App.Ref'" />
</ItemGroup>
</Target>
<Target
Name="AfterClean"
AfterTargets="Clean">
<Delete Files="%(Proto3.OutCS)" />
<Delete Files="%(Proto3.OutCSClient)" />
<Delete Files="%(Proto3.OutCSServer)" />
<Delete Files="%(Proto3.OutCSImmutable)" />
<Delete Files="$(GenDir)\proto2\*" />
</Target>
<Target
Name="Test"
DependsOnTargets="Build"></Target>
</Project>
<Project>
<Target Name="CompileProto2"
Condition="'@(Proto2)'!=''"
Inputs="$(MSBuildProjectFile);$(protogen);%(Proto2.FullPath)"
Outputs="$(GenDir)\proto2\%(Proto2.filename).cs"
AfterTargets="PreBuildEvent">
<PropertyGroup>
<SourceRelativeFile>$([System.String]::Copy('%(proto2.fullpath)').Replace($(SourceRoot), ''))</SourceRelativeFile>
<SourceRelativeDir>$([System.IO.Path]::GetDirectoryName($(SourceRelativeFile)))</SourceRelativeDir>
<WorkingDirectory>$(GenDir)\proto2</WorkingDirectory>
</PropertyGroup>
<MakeDir Directories="$(WorkingDirectory)" />
<Copy SourceFiles="%(Proto2.FullPath)" DestinationFolder="$(WorkingDirectory)" SkipUnchangedFiles="True" UseHardLinksIfPossible="True" />
<Error Text="protogen.exe does not exist. If you forgot to clone with externals try: git submodule update --init --recursive" Condition="!Exists($(protogen))" />
<Exec Command="$(Protogen) %(Proto2.filename)%(proto2.extension) --csharp_out=. -I. -I$(SourceRoot) -I$(Externals)\include"
WorkingDirectory="$(WorkingDirectory)" />
<ItemGroup>
<Compile Include="$(WorkingDirectory)\%(Proto2.filename).cs" />
</ItemGroup>
</Target>
<!--
Run this after GetAssemblyVersion because it happens after the Xaml compiler
and exists in both xaml and non-xaml projects. One of the (many) xaml compile
passes wipes out the additional compile includes that we add.
-->
<Target Name="CompileProto3" AfterTargets="GetAssemblyVersion"
Condition="'@(Proto3)'!=''"
Inputs="$(protoc);
%(Proto3.Identity);$(ProtocPluginBase)\plugin.py;
$(ProtocPluginBase)\templates\c#\client.pb.cs;
$(ProtocPluginBase)\templates\c#\server.pb.cs;
$(ProtocPluginBase)\templates\c#\immutable.pb.cs;"
Outputs="%(Proto3.OutCS);%(Proto3.OutCSServer);%(Proto3.OutCSClient);%(Proto3.OutCSImmutable)">
<MakeDir Directories="%(Proto3.OutBase)" />
<Message Importance="High" Text="Generating service %(Proto3.FileName)" />
<Exec Command="
set PATH=$(spark_build_python_path);%path% &amp;
set PYTHONPATH=$(Externals)\python &amp;
$(protoc) ^
%(Proto3.FullPath) ^
--error_format=msvs ^
--proto_path=$(protoinc);$(SourceRoot) ^
--plugin=&quot;protoc-gen-service=$(ProtocPluginBase)\plugin.cmd&quot; ^
--service_out=lang=c#,strip_out_path=1:%(Proto3.OutBase) ^
--csharp_out=%(CompileOptions)%(Proto3.OutBase)"
WorkingDirectory="%(relativedir)" />
<ItemGroup>
<Compile Include="%(Proto3.OutCS)" />
<Compile Include="%(Proto3.OutCSClient)" />
<Compile Include="%(Proto3.OutCSServer)" />
<Compile Include="%(Proto3.OutCSImmutable)" />
</ItemGroup>
</Target>
<Target Name="CompileProto3Excel" AfterTargets="GetAssemblyVersion"
Condition="'@(Proto3Excel)'!=''"
Inputs="$(protoc);
%(Proto3Excel.Identity);$(ProtocPluginBase)\plugin.py;
$(ProtocPluginBase)\templates\excel\excel.pb.cs;"
Outputs="%(Proto3Excel.OutCSExcel)">
<MakeDir Directories="%(Proto3Excel.OutBase)" />
<Message Importance="High" Text="Generating excel service %(Proto3Excel.FileName)" />
<Exec Command="
set PATH=$(spark_build_python_path);%path% &amp;
set PYTHONPATH=$(Externals)\python &amp;
$(protoc) ^
%(Proto3Excel.FullPath) ^
--error_format=msvs ^
--proto_path=$(protoinc);$(SourceRoot) ^
--plugin=&quot;protoc-gen-service=$(ProtocPluginBase)\plugin.cmd&quot; ^
--service_out=lang=excel,strip_out_path=1:%(Proto3Excel.OutBase) ^
"
WorkingDirectory="%(relativedir)" />
<ItemGroup>
<Compile Include="%(Proto3Excel.OutCSExcel)" />
</ItemGroup>
</Target>
<Target Name="AfterClean" AfterTargets="Clean">
<Delete Files="%(Proto3.OutCS)" />
<Delete Files="%(Proto3.OutCSClient)" />
<Delete Files="%(Proto3.OutCSServer)" />
<Delete Files="%(Proto3.OutCSImmutable)" />
<Delete Files="$(GenDir)\proto2\*" />
<Delete Files="%(Proto3Excel.OutCSExcel)" />
</Target>
<Target Name="Test" DependsOnTargets="Build">
</Target>
</Project>
@@ -1,159 +0,0 @@
#nullable enable
namespace mbts.spark {
using bts.api.analytics;
using mbts.analytics;
using mbts.ui;
using mbts.ui.shell;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reactive.Linq;
class AnalyticsExpirationParametersRowVM : DisposableViewModelBase, ISelectable, IEquatable<AnalyticsExpirationParametersRowVM> {
readonly AnalyticsExpirationParameters _committed_value;
readonly Property<bool> _is_selected;
readonly Property<ExpirationDriverImmutable?> _driver;
readonly Property<SecurityExpiration?> _deliverable;
readonly Property<SecurityExpiration?> _roll_schedule;
readonly Property<double> _roll_target;
readonly Property<double> _riskless_rate;
readonly Property<double> _settlement_price;
readonly Property<double> _delta_beta;
readonly Property<double> _vega_beta;
readonly Property<bool> _is_driver_dirty;
readonly Property<bool> _is_deliverable_dirty;
readonly Property<bool> _is_roll_schedule_dirty;
readonly Property<bool> _is_roll_target_dirty;
readonly Property<bool> _is_riskless_rate_dirty;
readonly Property<bool> _is_settlement_price_dirty;
readonly Property<bool> _is_delta_beta_dirty;
readonly Property<bool> _is_vega_beta_dirty;
readonly Property<bool> _is_dirty;
bool _is_last_row_of_month_group;
public AnalyticsExpirationParametersRowVM(
AnalyticsExpirationParametersVM owner, AnalyticsExpirationParameters committed_value) {
this.owner = owner;
_committed_value = committed_value;
security = committed_value.security ?? throw new ArgumentException("security must be non-null", nameof(committed_value));
_is_selected = backing(nameof(is_selected), false);
_is_selected.Changed += (oldval, newval) => is_selected_changed?.Invoke(newval);
var is_dirty_srcs = new List<IObservable<bool>>();
(_driver, _is_driver_dirty) = mk_cell_props<ExpirationDriverImmutable?>(nameof(driver), committed_value.driver);
(_deliverable, _is_deliverable_dirty) = mk_cell_props<SecurityExpiration?>(nameof(deliverable), committed_value.deliverable_security);
(_roll_schedule, _is_roll_schedule_dirty) = mk_cell_props<SecurityExpiration?>(nameof(roll_schedule), committed_value.roll_schedule_expiration);
(_roll_target, _is_roll_target_dirty) = mk_cell_props(nameof(roll_target), committed_value.roll_target);
(_riskless_rate, _is_riskless_rate_dirty) = mk_cell_props(nameof(riskless_rate), committed_value.riskless_rate);
(_settlement_price, _is_settlement_price_dirty) = mk_cell_props(nameof(settlement_price), committed_value.settlement_price);
(_delta_beta, _is_delta_beta_dirty) = mk_cell_props(nameof(delta_beta), committed_value.delta_beta);
(_vega_beta, _is_vega_beta_dirty) = mk_cell_props(nameof(vega_beta), committed_value.vega_beta);
_is_dirty = backing(
nameof(is_dirty),
Observable.CombineLatest(is_dirty_srcs).Select(dirties => dirties.Any()).OnDispatcher());
(Property<T> prop, Property<bool> dirty_prop) mk_cell_props<T>(string name, T orig_val) {
var prop = backing(name, orig_val);
var dirty_src = prop.observe_current(true).Select(new_val => !Equals(new_val, orig_val));
is_dirty_srcs.Add(dirty_src);
var dirty_prop = backing($"is_{prop.name}_dirty", dirty_src);
return (prop, dirty_prop);
}
}
public event Action<bool>? is_selected_changed;
public AnalyticsExpirationParametersVM owner { get; }
public SecurityExpiration security { get; }
public ExpirationDriverImmutable? driver {
get => _driver.Value;
set => _driver.set(value);
}
public SecurityExpiration? deliverable {
get => _deliverable.Value;
set => _deliverable.set(value);
}
public SecurityExpiration? roll_schedule {
get => _roll_schedule.Value;
set => _roll_schedule.set(value);
}
public AnalyticsExpirationParameters original_params => _committed_value;
public double roll_target { get => _roll_target.Value; set => _roll_target.set(value); }
public double riskless_rate { get => _riskless_rate.Value; set => _riskless_rate.set(value); }
public double settlement_price { get => _settlement_price.Value; set => _settlement_price.set(value); }
public double delta_beta { get => _delta_beta.Value; set => _delta_beta.set(value); }
public double vega_beta { get => _vega_beta.Value; set => _vega_beta.set(value); }
public bool is_driver_dirty => _is_driver_dirty.Value;
public bool is_deliverable_dirty => _is_deliverable_dirty.Value;
public bool is_roll_schedule_dirty => _is_roll_schedule_dirty.Value;
public bool is_roll_target_dirty => _is_roll_target_dirty.Value;
public bool is_riskless_rate_dirty => _is_riskless_rate_dirty.Value;
public bool is_settlement_price_dirty => _is_settlement_price_dirty.Value;
public bool is_delta_beta_dirty => _is_delta_beta_dirty.Value;
public bool is_vega_beta_dirty => _is_vega_beta_dirty.Value;
public bool is_dirty => _is_dirty.Value;
public bool is_selected {
get => _is_selected.Value;
set => _is_selected.set(value);
}
public bool is_last_row_of_month_group {
get => _is_last_row_of_month_group;
set => Set(ref _is_last_row_of_month_group, value);
}
public AnalyticsExpirationParameters candidate_value => new(
security,
driver,
deliverable?.is_empty() ?? false ? null : deliverable,
roll_schedule?.is_empty() ?? false ? null : roll_schedule,
roll_target,
riskless_rate,
settlement_price,
delta_beta,
vega_beta);
public IObservable<SecurityExpiration?> observe_roll_schedule() =>
_roll_schedule.observe_current(true);
public IObservable<bool> observe_roll_schedule_dirty() =>
_is_roll_schedule_dirty.observe_current(true);
public IObservable<bool> observe_is_dirty() =>
_is_dirty.observe_current(true);
public void revert() {
driver = _committed_value.driver;
deliverable = _committed_value.deliverable_security;
roll_schedule = _committed_value.roll_schedule_expiration;
roll_target = _committed_value.roll_target;
riskless_rate = _committed_value.riskless_rate;
settlement_price = _committed_value.settlement_price;
delta_beta = _committed_value.delta_beta;
vega_beta = _committed_value.vega_beta;
}
public override string ToString() =>
$"sec: {security}; drv: {driver}; dlv: {deliverable}; roll: {roll_schedule} @ {roll_target}";
public bool Equals(AnalyticsExpirationParametersRowVM? other) =>
other is not null &&
security.Equals(other.security);
public override bool Equals(object? obj) =>
Equals(obj as AnalyticsExpirationParametersRowVM);
public override int GetHashCode() =>
security.GetHashCode();
}
}
@@ -1,19 +0,0 @@
namespace mbts.spark {
using ProtoBuf;
[ProtoContract]
class AnalyticsExpirationParametersSettings {
public const int VERSION = 1;
public static AnalyticsExpirationParametersSettings Default => new();
[ProtoMember(10)]
public string[] selected_symbols {get;set;}
[ProtoMember(20)]
public bool auto_copy_rates_is_checked {get;set;}
[ProtoMember(30)]
public bool auto_copy_rolls_is_checked {get;set;}
}
}
@@ -1,307 +0,0 @@
#nullable enable
namespace mbts.spark {
using bts.api;
using bts.api.analytics;
using bts.collections;
using bts.reactive;
using bts.utils;
using mbts;
using mbts.analytics;
using mbts.collections;
using mbts.ui;
using mbts.ui.controls;
using mbts.ui.shell;
using mbts.ui.utility;
using mbts.utils;
using Spark.Core;
using Spark.Core.Collections;
using Spark.Core.Disposables;
using Spark.ViewModel.Commands;
using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Reactive;
using System.Reactive.Linq;
using System.Windows.Controls;
using System.Windows.Input;
class AnalyticsExpirationParametersVM : DisposableViewModelBase, IHandleRowSelection {
readonly IBus _bus;
readonly ObservableCollection<AnalyticsExpirationParameters> _parameters = new();
readonly DeferrableAction _sync_visible_rows;
readonly Property<AnalyticsExpirationParametersRowVM?> _copy_row_source;
readonly Property<bool> _auto_copy_rolls_is_checked;
readonly Property<bool> _auto_copy_rates_is_checked;
readonly DelegateProperty<bool> _is_dirty;
readonly ObservableHashSet<AnalyticsExpirationParametersRowVM> _selected_rows = new();
readonly DeferrableAction _raise_selected_rows_changed;
readonly IRaiseCanExecuteChangedCommand _set_driver_to_nearest_exp_cmd;
IList<string>? _pending_selected_symbols;
AnalyticsExpirationParametersMap? _parameter_map;
(ICommand cmd, IDisposable can_exe_sub)? _smart_copy_roll_target_to_selection_cmd;
(ICommand cmd, IDisposable can_exe_sub)? _smart_copy_riskless_rate_to_selection_cmd;
public AnalyticsExpirationParametersVM(
IBus bus, AnalyticsExpirationParametersSettings startup_data) {
_bus = bus;
_auto_copy_rates_is_checked = backing(nameof(auto_copy_rates_is_checked), false);
_auto_copy_rolls_is_checked = backing(nameof(auto_copy_rolls_is_checked), false);
_raise_selected_rows_changed = new(() => selected_rows_changed?.Invoke(_selected_rows));
var selected_symbol_ref_count = new RefCountMap<string>();
_sync_visible_rows = new(() =>
visible_rows.sync_with(
rows.Where(x => selected_symbol_ref_count.ContainsKey(x.security.symbol))));
non_options_with_empty = new ObservableAggregateCollection<SecurityExpiration>(
new() { SecurityExpiration.empty }, non_options);
_copy_row_source = backing<AnalyticsExpirationParametersRowVM?>(nameof(copy_row_source));
_is_dirty = backing(nameof(is_dirty), () => rows.Any(r => r.is_dirty));
if (startup_data is not null) {
_pending_selected_symbols = startup_data.selected_symbols;
auto_copy_rolls_is_checked = startup_data.auto_copy_rolls_is_checked;
auto_copy_rates_is_checked = startup_data.auto_copy_rates_is_checked;
}
var explicit_drivers = new ObservableCollection<ExpirationDriverImmutable>();
drivers = ObservableAggregateCollection.create(
new() { new ExpirationDriverImmutable(new() { TimeWeightedInterpolated = new() }) },
explicit_drivers);
_set_driver_to_nearest_exp_cmd = new Command(
() => _set_driver_to_nearest_exp(_selected_rows), () => _selected_rows.Count > 0);
commit_cmd = ObservantCommand.create(_commit, out var can_commit_observer);
revert_cmd = ObservantCommand.create(_revert, out var can_revert_observer);
selected_rows_changed += _ => _set_driver_to_nearest_exp_cmd.RaiseCanExecuteChanged();
_dispose = Disposable.Create(
_selected_rows.Subscribe((s, e) => _raise_selected_rows_changed.Invoke()),
ObservableAutoWrapper.connect(_parameters, rows, p => new(this, p), r => r.Dispose()),
ObservableAutoWrapper.connect(
non_options,
explicit_drivers,
sec => new ExpirationDriverImmutable(new() { Security = sec.to_api_sec_exp() })),
rows.Subscribe((s, e) => _sync_visible_rows.Invoke()),
_bus.subscribe(SparkTags.ExpirationParametersInputTag).OnDispatcher().Subscribe(
CompositeObserver.create(
Observer.Create<AnalyticsExpirationParametersMap>(_on_parameter_map),
can_commit_observer.wrap<bool, AnalyticsExpirationParametersMap>(m => m is not null))),
ObservableAutoWrapper.connect_item_hooks(selected_symbols, sym => {
if (selected_symbol_ref_count.increment_adds_key(sym)) {
_sync_visible_rows.Invoke();
}
return Disposable.Create(() => {
if (selected_symbol_ref_count.decrement_removes_key(sym)) {
_sync_visible_rows.Invoke();
}
});
}),
ObservableAutoWrapper.connect_item_hooks(
rows, r => r.observe_is_dirty().Subscribe(_ => _is_dirty.refresh())),
_is_dirty.observe_current(true).OnDispatcher().Subscribe(can_revert_observer),
Disposable.Create(() => {
rows.DisposeAll();
_smart_copy_roll_target_to_selection_cmd?.can_exe_sub?.Dispose();
_smart_copy_riskless_rate_to_selection_cmd?.can_exe_sub?.Dispose();
}));
}
public event Action<IReadOnlySet<AnalyticsExpirationParametersRowVM>>? selected_rows_changed;
public ObservableCollection<SecurityExpiration> non_options { get; } = new();
public IReadOnlyObservableCollection<ExpirationDriverImmutable> drivers { get; }
public ObservableCollection<SecurityExpiration> non_options_with_empty { get; } = new();
public ObservableCollection<AnalyticsExpirationParametersRowVM> rows { get; } = new();
public ObservableCollection<AnalyticsExpirationParametersRowVM> visible_rows { get; } = new();
public AnalyticsExpirationParametersRowVM? copy_row_source {
get => _copy_row_source.Value;
set => _copy_row_source.set(value);
}
public ObservableCollection<string> symbols { get; } = new();
public ObservableCollection<string> selected_symbols { get; } = new();
public bool is_dirty => _is_dirty.Value;
public bool auto_copy_rolls_is_checked {
get => _auto_copy_rolls_is_checked.Value;
set => _auto_copy_rolls_is_checked.set(value);
}
public IObservable<bool> observe_auto_copy_rolls() =>
_auto_copy_rolls_is_checked.observe_current(true);
public bool auto_copy_rates_is_checked {
get => _auto_copy_rates_is_checked.Value;
set => _auto_copy_rates_is_checked.set(value);
}
public IObservable<bool> observe_auto_copy_rates() =>
_auto_copy_rates_is_checked.observe_current(true);
public ICommand toggle_auto_copy_rates_cmd =>
new Command(() => auto_copy_rates_is_checked = !auto_copy_rates_is_checked);
public ICommand toggle_auto_copy_rolls_cmd =>
new Command(() => auto_copy_rolls_is_checked = !auto_copy_rolls_is_checked);
public ICommand commit_cmd { get; }
public ICommand revert_cmd { get; }
public ICommand set_driver_to_nearest_exp_cmd => _set_driver_to_nearest_exp_cmd;
public ICommand copy_driver_to_selection_cmd => _copy_to_selection_cmd((f, t) => t.driver = f.driver);
public ICommand copy_deliverable_to_selection_cmd => _copy_to_selection_cmd((f, t) => t.deliverable = f.deliverable);
public ICommand copy_roll_schedule_to_selection_cmd => _copy_to_selection_cmd((f, t) => t.roll_schedule = f.roll_schedule);
public ICommand copy_roll_target_to_selection_cmd => _copy_to_selection_cmd((f, t) => t.roll_target = f.roll_target);
public ICommand copy_riskless_rate_to_selection_cmd => _copy_to_selection_cmd((f, t) => t.riskless_rate = f.riskless_rate);
public ICommand copy_settlement_price_to_selection_cmd => _copy_to_selection_cmd((f, t) => t.settlement_price = f.settlement_price);
public ICommand copy_delta_beta_to_selection_cmd => _copy_to_selection_cmd((f, t) => t.delta_beta = f.delta_beta);
public ICommand copy_vega_beta_to_selection_cmd => _copy_to_selection_cmd((f, t) => t.vega_beta = f.vega_beta);
public ICommand smart_copy_roll_target_to_selection_cmd =>
(_smart_copy_roll_target_to_selection_cmd ??= _smart_copy_to_selection_cmd(
(f, t) => t.roll_target = f.roll_target)).cmd;
public ICommand smart_copy_riskless_rate_to_selection_cmd =>
(_smart_copy_riskless_rate_to_selection_cmd ??= _smart_copy_to_selection_cmd(
(f, t) => t.riskless_rate = f.riskless_rate)).cmd;
public void commit(IEnumerable<AnalyticsExpirationParameters> data) =>
_bus.post(SparkTags.ExpirationParametersCommitTag, data);
public IEnumerable<SecurityExpiration> get_smart_copy_roll_exps(
AnalyticsExpirationParameters source) =>
get_smart_copy_roll_exps(source.roll_schedule_expiration);
public IEnumerable<SecurityExpiration> get_smart_copy_roll_exps(
SecurityExpiration roll_schedule_expiration) {
foreach (var (exp, exp_params) in (_parameter_map?.exp_map).empty_if_null()) {
if (exp_params.roll_schedule_expiration.Equals(roll_schedule_expiration)) {
yield return exp;
}
}
}
public AnalyticsExpirationParametersSettings get_state() =>
new() {
selected_symbols = selected_symbols.Cast<string>().ToArray(),
auto_copy_rates_is_checked = auto_copy_rates_is_checked,
auto_copy_rolls_is_checked = auto_copy_rolls_is_checked
};
void _set_driver_to_nearest_exp(IEnumerable<AnalyticsExpirationParametersRowVM> rows) {
Func<ExpirationDriverImmutable, bool> is_unexpired = (d) => {
var st = d.Security.to_sec_exp().security_tuple.to_api_sec_tuple();
var exp = d.Security.Expiration.date_time();
return SecurityExpirationHelper.is_unexpired(st, exp);
};
foreach (var r in rows) {
if (drivers
.Where(d => d.HasSecurity && d.Security.Symbol == r.security.symbol)
.Where(d => is_unexpired(d))
.TryGetMinElement(
d => (r.security.expiration - d.Security.Expiration.date_time()).Ticks.abs(),
out var nearest_exp)) {
r.driver = nearest_exp;
}
}
}
Action<AnalyticsExpirationParametersRowVM> _copy_to_selection(
Action<AnalyticsExpirationParametersRowVM, AnalyticsExpirationParametersRowVM> copy_to_row) =>
from_row => {
foreach (var to_row in _selected_rows) {
copy_to_row(from_row, to_row);
}
};
ICommand _copy_to_selection_cmd(
Action<AnalyticsExpirationParametersRowVM, AnalyticsExpirationParametersRowVM> copy_to_row) =>
Command.create(_copy_to_selection(copy_to_row));
Action<AnalyticsExpirationParametersRowVM> _smart_copy_to_selection(
Action<AnalyticsExpirationParametersRowVM, AnalyticsExpirationParametersRowVM> copy_to_row) =>
from_row => {
foreach (var to_row in _get_smart_copy_roll_target_rows(from_row)) {
copy_to_row(from_row, to_row);
}
};
(ICommand cmd, IDisposable can_exe_sub) _smart_copy_to_selection_cmd(
Action<AnalyticsExpirationParametersRowVM, AnalyticsExpirationParametersRowVM> copy_to_row) {
var copy_fn = _smart_copy_to_selection(copy_to_row);
var cmd = ObservantCommand.create<AnalyticsExpirationParametersRowVM?>(
r => copy_fn(r ?? throw new InvalidOperationException()),
observe_can_execute,
out var can_exe_observer);
var can_exe_sub = _copy_row_source.observe_current(true).OnDispatcher()
.Subscribe(can_exe_observer);
return (cmd, can_exe_sub);
static IObservable<bool> observe_can_execute(AnalyticsExpirationParametersRowVM? row) =>
row is null ?
Observable.Return(false) :
row.observe_roll_schedule()
.CombineLatest(row.observe_roll_schedule_dirty(), (rs, rs_dirty) => (rs, rs_dirty))
.Select(tup => !tup.rs?.is_empty() ?? false && !tup.rs_dirty)
.OnDispatcher();
}
IEnumerable<AnalyticsExpirationParametersRowVM> _get_smart_copy_roll_target_rows(
AnalyticsExpirationParametersRowVM row) {
var target_exps = get_smart_copy_roll_exps(
row.original_params.roll_schedule_expiration)
.ToHashSet();
return rows.Where(r => target_exps.Contains(r.security));
}
void _commit() {
if (_parameter_map is null) {
// Don't commit before [any] data has been received from the server
return;
}
var new_params = rows.Select(r => r.candidate_value).ToImmutableList();
_bus.post(SparkTags.ExpirationParametersCommitTag, new_params);
}
void _revert() {
foreach (var r in rows) {
r.revert();
}
}
[MemberNotNull(nameof(_parameter_map))]
void _on_parameter_map(AnalyticsExpirationParametersMap parameter_map) {
bool is_first_update = _parameter_map is null;
_parameter_map = parameter_map;
_parameters.sync_with(parameter_map.get_sorted_exps().Select(parameter_map.get_parameter));
non_options.sync_with(
parameter_map.get_sorted_exps().Where(exp => exp.security_type != SecurityType.Option));
// Set `is_last_row_of_month_group` for each row
foreach (var exp_rows in rows.GroupBy(r => r.security.expiration.Month)) {
var sorted_exp_rows = exp_rows.OrderBy(r => r.security.expiration).ToList();
foreach (var row in sorted_exp_rows.Take(sorted_exp_rows.Count - 1)) {
row.is_last_row_of_month_group = false;
}
sorted_exp_rows.Last().is_last_row_of_month_group = true;
}
symbols.sync_with(_parameters.Select(p => p.security.symbol).Distinct().Ordered());
using var _ = _sync_visible_rows.defer();
if (is_first_update) {
selected_symbols.sync_with(_pending_selected_symbols?.Intersect(symbols) ?? symbols);
_pending_selected_symbols = null;
}
}
public void row_selection_changed(SelectionChangedEventArgs e) =>
RowSelectionHelper.apply_changes(_selected_rows, e);
}
}
@@ -1,563 +0,0 @@
<UserControl
x:Class="mbts.ui.shell.AnalyticsExpirationParametersView"
x:ClassModifier="internal"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:c="clr-namespace:mbts.ui.controls"
xmlns:u="clr-namespace:mbts.ui"
xmlns:cv="clr-namespace:mbts.ui.converters"
xmlns:shell="clr-namespace:mbts.ui.shell"
Background="{u:BTSBrush UI.common_background}">
<UserControl.Resources>
<cv:DoubleTextConverter x:Key="DoubleTextConverter" />
<cv:DoubleTextConverter
x:Key="RisklessRateConverter"
Multiplier="100" />
<CollectionViewSource x:Key="Drivers" Source="{Binding drivers}" />
<CollectionViewSource x:Key="NonOptionsWithEmpty" Source="{Binding non_options_with_empty}" />
<DataTemplate x:Key="DriverTemplate">
<TextBlock Text="{Binding Converter={x:Static shell:AnalyticsExpirationParametersView.driver_display_text_converter}}">
<TextBlock.Style>
<Style TargetType="TextBlock">
<Style.Triggers>
<Trigger
Property="Text"
Value="None">
<Setter
Property="FontStyle"
Value="Italic" />
</Trigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</DataTemplate>
<DataTemplate x:Key="ExpirationTemplate">
<TextBlock Text="{Binding Converter={x:Static shell:AnalyticsExpirationParametersView.expiration_text_converter}}">
<TextBlock.Style>
<Style TargetType="TextBlock">
<Style.Triggers>
<Trigger
Property="Text"
Value="None">
<Setter
Property="FontStyle"
Value="Italic" />
</Trigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</DataTemplate>
<ContextMenu x:Key="DriverContextMenu">
<MenuItem
Header="Copy Driver to Selection"
Command="{Binding owner.copy_driver_to_selection_cmd}"
CommandParameter="{Binding}"
/>
</ContextMenu>
<ContextMenu x:Key="DeliverableContextMenu">
<MenuItem
Header="Copy Deliverable to Selection"
Command="{Binding owner.copy_deliverable_to_selection_cmd}"
CommandParameter="{Binding}"
/>
</ContextMenu>
<ContextMenu x:Key="RollScheduleContextMenu">
<MenuItem
Header="Copy Roll Schedule to Selection"
Command="{Binding owner.copy_roll_schedule_to_selection_cmd}"
CommandParameter="{Binding}"
/>
</ContextMenu>
<ContextMenu x:Key="RollTargetContextMenu">
<MenuItem
Header="Copy Roll Target to Selection"
Command="{Binding owner.copy_roll_target_to_selection_cmd}"
CommandParameter="{Binding}"
/>
<MenuItem
Header="Smart Copy Roll Target"
Command="{Binding owner.smart_copy_roll_target_cmd}"
CommandParameter="{Binding}"
/>
</ContextMenu>
<ContextMenu x:Key="RisklessRateContextMenu">
<MenuItem
Header="Copy Riskless Rate to Selection"
Command="{Binding owner.copy_riskless_rate_to_selection_cmd}"
CommandParameter="{Binding}"
/>
</ContextMenu>
<ContextMenu x:Key="SettlementPriceContextMenu">
<MenuItem
Header="{Binding security}"
HeaderStringFormat="Copy '{0}' Settlement to Selection"
Command="{Binding owner.copy_settlement_price_to_selection_cmd}"
CommandParameter="{Binding}"
/>
</ContextMenu>
<ContextMenu x:Key="DeltaBetaContextMenu">
<MenuItem
Header="Copy Delta Beta to Selection"
Command="{Binding owner.copy_delta_beta_to_selection_cmd}"
CommandParameter="{Binding}"
/>
</ContextMenu>
<ContextMenu x:Key="VegaBetaContextMenu">
<MenuItem
Header="Copy Vega Beta to Selection"
Command="{Binding owner.copy_vega_beta_to_selection_cmd}"
CommandParameter="{Binding}"
/>
</ContextMenu>
<Style x:Key="TextBlockCellElement" TargetType="TextBlock">
<Setter
Property="Foreground"
Value="{Binding Foreground, RelativeSource={RelativeSource AncestorType=DataGridCell}}" />
</Style>
<Style x:Key="ComboBoxCellElement" TargetType="ComboBox" BasedOn="{StaticResource {x:Type ComboBox}}">
<Setter
Property="Foreground"
Value="{Binding Foreground, RelativeSource={RelativeSource AncestorType=DataGridCell}}" />
<Setter Property="Margin" Value="2" />
<Setter Property="IsSynchronizedWithCurrentItem" Value="False" />
</Style>
</UserControl.Resources>
<Grid>
<Grid.Resources>
<cv:BooleanToVisibilityConverter x:Key="TrueVisibilityConverter" />
<cv:BooleanToVisibilityConverter x:Key="FalseVisibilityConverter" VisibilityForFalse="Visible" VisibilityForTrue="Collapsed" />
</Grid.Resources>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<StackPanel
Grid.Row="0"
Orientation="Horizontal"
Margin="0,5,0,5">
<c:ComboCheckBox
ItemsSource="{Binding symbols}"
SelectedItems="{Binding selected_symbols}"
HorizontalAlignment="Left"
Margin="5,2,2,2"
HeaderContent="Symbols"
ShowSelectAll="True">
<c:ComboCheckBox.HeaderContentTemplate>
<DataTemplate>
<TextBlock Text="{Binding}" Foreground="{u:BTSColor UI.default_text}" />
</DataTemplate>
</c:ComboCheckBox.HeaderContentTemplate>
</c:ComboCheckBox>
<WrapPanel>
<TextBlock
Margin="5,5,0,0" Foreground="{u:BTSBrush UI.default_text}" Text="Auto copy rolls:" />
<CheckBox Margin="5,5,10,0" IsChecked="{Binding auto_copy_rolls_is_checked}" />
</WrapPanel>
<WrapPanel>
<TextBlock
Margin='0,5,0,0' Foreground="{u:BTSBrush UI.default_text}" Text="Auto copy rates:" />
<CheckBox Margin="5,5,0,0" IsChecked="{Binding auto_copy_rates_is_checked}" />
</WrapPanel>
</StackPanel>
<c:DataGridEx
x:Name="_grid"
Grid.Row="1"
ItemsSource="{Binding visible_rows}"
Background="Transparent"
VerticalGridLinesBrush="{u:BTSColor Grid.grid_line}"
EnableRowVirtualization="True"
EnableColumnVirtualization="True"
CanUserAddRows="False"
AutoGenerateColumns="False"
CanUserReorderColumns="False"
CanUserSortColumns="False"
CanUserDeleteRows="False"
RowHeaderWidth="0"
GridLinesVisibility="Vertical"
SelectionUnit="FullRow"
SelectedUnits="{Binding selected_rows}"
PreviewMouseRightButtonUp="_grid_PreviewMouseRightButtonUp">
<c:DataGridEx.RowStyle>
<Style TargetType="DataGridRow" BasedOn="{StaticResource {x:Type DataGridRow}}">
<Setter Property="IsSelected" Value="{Binding is_selected, Mode=TwoWay}"/>
<Style.Triggers>
<DataTrigger
Binding="{Binding is_last_row_of_month_group}"
Value="True">
<Setter
Property="BorderThickness"
Value="0,0,0,1" />
<Setter
Property="BorderBrush"
Value="Black" />
</DataTrigger>
</Style.Triggers>
</Style>
</c:DataGridEx.RowStyle>
<DataGrid.ColumnHeaderStyle>
<Style TargetType="DataGridColumnHeader">
<Setter
Property="Background"
Value="{u:BTSColor Name=header}" />
<Setter
Property="Foreground"
Value="{u:BTSColor Name=header_text}" />
<Setter
Property="HorizontalContentAlignment"
Value="Center" />
<Setter
Property="BorderBrush"
Value="Black" />
<Setter
Property="Padding"
Value="3" />
<Setter
Property="MinWidth"
Value="80" />
</Style>
</DataGrid.ColumnHeaderStyle>
<DataGrid.Columns>
<DataGridTextColumn
Header="Security"
Binding="{Binding security, Converter={x:Static shell:AnalyticsExpirationParametersView.expiration_text_converter}}"
IsReadOnly="True">
<DataGridTextColumn.CellStyle>
<Style
TargetType="DataGridCell"
BasedOn="{StaticResource {x:Type DataGridCell}}">
<Setter
Property="Background"
Value="{u:BTSColor Name=header}" />
<Setter
Property="Foreground"
Value="{u:BTSColor Name=header_text}" />
<Setter
Property="VerticalContentAlignment"
Value="Center" />
<Setter
Property="Padding"
Value="3" />
<Style.Triggers>
<DataTrigger
Binding="{Binding security.security_type}"
Value="OPTION">
<Setter
Property="Foreground"
Value="{u:BTSColor Name=header_text}" />
</DataTrigger>
<DataTrigger
Binding="{Binding security.security_type}"
Value="FUTURE">
<Setter
Property="Foreground"
Value="Gold" />
</DataTrigger>
<DataTrigger
Binding="{Binding security.security_type}"
Value="UNSET">
<Setter
Property="Foreground"
Value="PaleGreen" />
</DataTrigger>
</Style.Triggers>
</Style>
</DataGridTextColumn.CellStyle>
</DataGridTextColumn>
<DataGridTemplateColumn
Header="Driver"
MinWidth="105">
<DataGridTemplateColumn.CellStyle>
<Style
TargetType="DataGridCell"
BasedOn="{StaticResource {x:Type DataGridCell}}">
<Setter
Property="ContextMenu"
Value="{StaticResource DriverContextMenu}" />
<Style.Triggers>
<DataTrigger
Binding="{Binding is_driver_dirty}"
Value="True">
<Setter Property="Foreground" Value="{u:BTSColor UI.input_dirty_foreground}" />
</DataTrigger>
</Style.Triggers>
</Style>
</DataGridTemplateColumn.CellStyle>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox
ItemsSource="{Binding Source={StaticResource Drivers}}"
ItemTemplate="{StaticResource DriverTemplate}"
SelectedItem="{Binding driver, UpdateSourceTrigger=PropertyChanged}"
Style="{StaticResource ComboBoxCellElement}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn
Header="Deliverable"
MinWidth="105">
<DataGridTemplateColumn.CellStyle>
<Style
TargetType="DataGridCell"
BasedOn="{StaticResource {x:Type DataGridCell}}">
<Setter
Property="ContextMenu"
Value="{StaticResource DeliverableContextMenu}" />
<Style.Triggers>
<DataTrigger
Binding="{Binding is_deliverable_dirty}"
Value="True">
<Setter Property="Foreground" Value="{u:BTSColor UI.input_dirty_foreground}" />
</DataTrigger>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding is_deliverable_dirty}" Value="False" />
<Condition Binding="{Binding
deliverable,
Converter={x:Static shell:AnalyticsExpirationParametersView.expiration_is_defined_converter}}"
Value="False" />
</MultiDataTrigger.Conditions>
<Setter Property="Foreground" Value="{u:BTSColor UI.default_foreground_dark}" />
</MultiDataTrigger>
</Style.Triggers>
</Style>
</DataGridTemplateColumn.CellStyle>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox
ItemsSource="{Binding Source={StaticResource NonOptionsWithEmpty}}"
ItemTemplate="{StaticResource ExpirationTemplate}"
SelectedItem="{Binding deliverable, UpdateSourceTrigger=PropertyChanged}"
Style="{StaticResource ComboBoxCellElement}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn
Header="Roll Schedule"
MinWidth="105">
<DataGridTemplateColumn.CellStyle>
<Style
TargetType="DataGridCell"
BasedOn="{StaticResource {x:Type DataGridCell}}">
<Setter
Property="ContextMenu"
Value="{StaticResource RollScheduleContextMenu}" />
<Style.Triggers>
<DataTrigger
Binding="{Binding is_roll_schedule_dirty}"
Value="True">
<Setter Property="Foreground" Value="{u:BTSColor UI.input_dirty_foreground}" />
</DataTrigger>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding is_roll_schedule_dirty}" Value="False" />
<Condition Binding="{Binding
roll_schedule,
Converter={x:Static shell:AnalyticsExpirationParametersView.expiration_is_defined_converter}}"
Value="False" />
</MultiDataTrigger.Conditions>
<Setter Property="Foreground" Value="{u:BTSColor UI.default_foreground_dark}" />
</MultiDataTrigger>
</Style.Triggers>
</Style>
</DataGridTemplateColumn.CellStyle>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox
ItemsSource="{Binding Source={StaticResource NonOptionsWithEmpty}}"
ItemTemplate="{StaticResource ExpirationTemplate}"
SelectedItem="{Binding roll_schedule, UpdateSourceTrigger=PropertyChanged}"
Style="{StaticResource ComboBoxCellElement}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Roll Target $">
<DataGridTemplateColumn.CellStyle>
<Style
TargetType="DataGridCell"
BasedOn="{StaticResource {x:Type DataGridCell}}">
<Setter
Property="ContextMenu"
Value="{StaticResource RollTargetContextMenu}" />
<Style.Triggers>
<DataTrigger
Binding="{Binding is_roll_target_dirty}"
Value="True">
<Setter Property="Foreground" Value="{u:BTSColor UI.input_dirty_foreground}" />
</DataTrigger>
</Style.Triggers>
</Style>
</DataGridTemplateColumn.CellStyle>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock
Text="{Binding roll_target, Converter={StaticResource DoubleTextConverter}}"
VerticalAlignment="Center"
Margin="2,0,2,0"
ContextMenu="{StaticResource RollTargetContextMenu}"
Style="{StaticResource TextBlockCellElement}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<TextBox
Text="{Binding roll_target, Converter={StaticResource DoubleTextConverter}}"
Margin="2" />
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Riskless Rate %">
<DataGridTemplateColumn.CellStyle>
<Style
TargetType="DataGridCell"
BasedOn="{StaticResource {x:Type DataGridCell}}">
<Setter
Property="ContextMenu"
Value="{StaticResource RisklessRateContextMenu}" />
<Style.Triggers>
<DataTrigger
Binding="{Binding is_riskless_rate_dirty}"
Value="True">
<Setter Property="Foreground" Value="{u:BTSColor UI.input_dirty_foreground}" />
</DataTrigger>
</Style.Triggers>
</Style>
</DataGridTemplateColumn.CellStyle>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock
Text="{Binding riskless_rate, Converter={StaticResource RisklessRateConverter}}"
VerticalAlignment="Center"
Margin="2,0,2,0"
ContextMenu="{StaticResource RisklessRateContextMenu}"
Style="{StaticResource TextBlockCellElement}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<TextBox
Text="{Binding riskless_rate, Converter={StaticResource RisklessRateConverter}}" />
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Settlement Price $">
<DataGridTemplateColumn.CellStyle>
<Style
TargetType="DataGridCell"
BasedOn="{StaticResource {x:Type DataGridCell}}">
<Setter
Property="ContextMenu"
Value="{StaticResource SettlementPriceContextMenu}" />
<Style.Triggers>
<DataTrigger
Binding="{Binding is_settlement_price_dirty}"
Value="True">
<Setter Property="Foreground" Value="{u:BTSColor UI.input_dirty_foreground}" />
</DataTrigger>
</Style.Triggers>
</Style>
</DataGridTemplateColumn.CellStyle>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock
Text="{Binding settlement_price, Converter={StaticResource DoubleTextConverter}}"
VerticalAlignment="Center"
Margin="2,0,2,0"
ContextMenu="{StaticResource SettlementPriceContextMenu}"
Style="{StaticResource TextBlockCellElement}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<TextBox
Text="{Binding settlement_price, Converter={StaticResource DoubleTextConverter}}" />
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Delta Beta">
<DataGridTemplateColumn.CellStyle>
<Style
TargetType="DataGridCell"
BasedOn="{StaticResource {x:Type DataGridCell}}">
<Setter
Property="ContextMenu"
Value="{StaticResource DeltaBetaContextMenu}" />
<Style.Triggers>
<DataTrigger
Binding="{Binding is_delta_beta_dirty}"
Value="True">
<Setter Property="Foreground" Value="{u:BTSColor UI.input_dirty_foreground}" />
</DataTrigger>
</Style.Triggers>
</Style>
</DataGridTemplateColumn.CellStyle>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock
Text="{Binding delta_beta, Converter={StaticResource DoubleTextConverter}}"
VerticalAlignment="Center"
Margin="2,0,2,0"
ContextMenu="{StaticResource DeltaBetaContextMenu}"
Style="{StaticResource TextBlockCellElement}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<TextBox
Text="{Binding delta_beta, Converter={StaticResource DoubleTextConverter}}" />
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Vega Beta">
<DataGridTemplateColumn.CellStyle>
<Style
TargetType="DataGridCell"
BasedOn="{StaticResource {x:Type DataGridCell}}">
<Setter
Property="ContextMenu"
Value="{StaticResource VegaBetaContextMenu}" />
<Style.Triggers>
<DataTrigger
Binding="{Binding is_vega_beta_dirty}"
Value="True">
<Setter Property="Foreground" Value="{u:BTSColor UI.input_dirty_foreground}" />
</DataTrigger>
</Style.Triggers>
</Style>
</DataGridTemplateColumn.CellStyle>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock
Text="{Binding vega_beta, Converter={StaticResource DoubleTextConverter}}"
VerticalAlignment="Center"
Margin="2,0,2,0"
ContextMenu="{StaticResource VegaBetaContextMenu}"
Style="{StaticResource TextBlockCellElement}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<TextBox Text="{Binding vega_beta, Converter={StaticResource DoubleTextConverter}}" />
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</c:DataGridEx>
</Grid>
</UserControl>
@@ -1,76 +0,0 @@
#nullable enable
namespace mbts.ui.shell {
using bts.api.analytics;
using mbts.spark;
using mbts.ui.controls;
using mbts.ui.converters;
using mbts.ui.extensions;
using Spark.Core.Disposables;
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Data;
using System.Windows.Input;
/// <summary>
/// Interaction logic for AnalyticsExpirationParametersView.xaml
/// </summary>
partial class AnalyticsExpirationParametersView : UserControl {
IDisposable? _context_menu_op;
IDisposable? _data_context_hooks;
public AnalyticsExpirationParametersView() {
InitializeComponent();
DataContextChanged += on_data_context_changed;
void on_data_context_changed(object sender, DependencyPropertyChangedEventArgs e) {
Disposable.dispose(ref _data_context_hooks);
if (e.NewValue is IHandleRowSelection hrs) {
hrs.row_selection_changed(new(Selector.SelectionChangedEvent, Array.Empty<object>(), _grid.SelectedItems));
_data_context_hooks = _grid.SubscribeSelectionChanged((s, e) => hrs.row_selection_changed(e));
}
}
}
public static ExpirationTextConverter expiration_text_converter =>
new() {
ShowSymbol = true,
ShowType = true,
MapExp = true
};
public static IValueConverter driver_display_text_converter =>
ValueConverter.create<ExpirationDriverImmutable?, string?>(
d => d.HasValue ?
d.Value.ModeCase switch {
ExpirationDriver.ModeOneofCase.Security =>
expiration_text_converter.convert(d.Value.Security.to_sec_exp()),
ExpirationDriver.ModeOneofCase.TimeWeightedInterpolated => "Calculate",
_ => null
} :
null);
public static IValueConverter expiration_is_defined_converter =>
ValueConverter.create<SecurityExpiration?, bool>(exp =>
exp is not null && exp.expiration != default);
void _grid_PreviewMouseRightButtonUp(object sender, MouseButtonEventArgs e) {
Disposable.dispose(ref _context_menu_op);
if (e.OriginalSource is not FrameworkElement el || DataContext is not AnalyticsExpirationParametersVM vm) {
return;
}
var cell = el.find_ancestor_of_type<DataGridCell>();
if (cell?.ContextMenu is not ContextMenu cm || cell.DataContext is not AnalyticsExpirationParametersRowVM row) {
return;
}
vm.copy_row_source = row;
cm.DataContext = row;
cm.IsOpen = true;
_context_menu_op = cm.SubscribeClosed((s, e) => vm.copy_row_source = null);
e.Handled = true;
}
}
}
@@ -1,70 +0,0 @@
namespace mbts.spark {
using bts.api;
using bts.spark;
using mbts.ui;
using mbts.ui.shell;
using Spark.Core.Disposables;
using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Input;
class AnalyticsExpirationParametersWindow : SparkWindow<AnalyticsExpirationParametersSettings>, ISharedWindow {
public const string WINDOW_TYPE = "AnalyticsExpirationParameters";
readonly AnalyticsExpirationParametersSettings _init_settings;
List<SparkCommand> _commands;
AnalyticsExpirationParametersVM _vm;
AnalyticsExpirationParametersView _view;
public AnalyticsExpirationParametersWindow(
IBus bus, AnalyticsExpirationParametersWindowFactory factory, AnalyticsExpirationParametersSettings settings)
: base("Analytics Exp Params", bus, factory) {
_init_settings = settings;
_dispose = Disposable.Create(() => _vm?.Dispose());
}
public override string window_type => WINDOW_TYPE;
public string thread_id => WINDOW_TYPE;
public override AnalyticsExpirationParametersSettings SaveState =>
_vm?.get_state();
public override UIElement Content =>
_view;
public override IEnumerable<SparkCommand> Commands => _commands.empty_if_null();
public void thread_init() {
_vm = new AnalyticsExpirationParametersVM(_bus, _init_settings);
var auto_copy_rolls_cmd = new SparkCommandCommand(
"Auto Copy Rolls", null, _vm.toggle_auto_copy_rolls_cmd);
_vm.SubscribeDisposed(_vm.observe_auto_copy_rolls().Subscribe(v =>
auto_copy_rolls_cmd.icon = v ? Icons.RecurringSchedule : Icons.RecurringScheduleGray));
var auto_copy_rates_cmd = new SparkCommandCommand(
"Auto Copy Rates", null, _vm.toggle_auto_copy_rates_cmd);
_vm.SubscribeDisposed(_vm.observe_auto_copy_rates().Subscribe(v =>
auto_copy_rates_cmd.icon = v ? Icons.FinancialGrowth : Icons.FinancialGrowthGray));
_commands = new() {
new SparkCommandCommand("Commit", Icons.Disk, _vm.commit_cmd, new KeyGesture(Key.S, ModifierKeys.Control)),
new SparkCommandCommand("Revert", Icons.UndoCircular, _vm.revert_cmd, new KeyGesture(Key.Z, ModifierKeys.Control)),
auto_copy_rates_cmd,
auto_copy_rolls_cmd,
new SparkCommandCommand(
"Set Driver to Nearest Exp", null, _vm.set_driver_to_nearest_exp_cmd) {
show_in_toolbar = false,
show_in_context_menu = true
},
};
_view = new AnalyticsExpirationParametersView { DataContext = _vm };
}
}
}
@@ -1,30 +0,0 @@
namespace mbts.spark {
using bts.api;
using bts.shell;
using bts.spark;
using mbts.ui;
using System;
using System.Reactive.Linq;
using System.Threading.Tasks;
class AnalyticsExpirationParametersWindowFactory : ShellWindowFactory<AnalyticsExpirationParametersSettings> {
readonly IBus _bus;
public AnalyticsExpirationParametersWindowFactory(IShellModule module, IBus bus)
: base(module, SparkCommands.show_vol_surface.title) {
_bus = bus;
_dispose = bus.subscribe(SparkTags.show_analytics_exp_params).OnDispatcher().Subscribe(_show);
}
public override Task<IShellWindow> load(AnalyticsExpirationParametersSettings state) =>
Task.FromResult(_create(state));
void _show(AnalyticsExpirationParametersSettings _) =>
_bus.post(SparkTags.ShowWindow, _create(new()));
IShellWindow _create(AnalyticsExpirationParametersSettings startup_data) =>
new AnalyticsExpirationParametersWindow(_bus, this, startup_data);
}
}
@@ -1,40 +0,0 @@
namespace mbts.spark {
using bts.api;
using mbts;
using mbts.analytics;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
class AnalyticsParametersUIModel : IDisposable {
AnalyticsExpirationParametersMap _curr_val = null;
readonly IBus _bus;
readonly IDisposable _sub;
public event Action<AnalyticsExpirationParametersMap> on_expiration_parameters;
public AnalyticsParametersUIModel(IBus bus) {
_bus = bus;
_sub = _bus.subscribe(SparkTags.ExpirationParametersInputTag)
.Subscribe(d => on_expiration_parameters?.Invoke(d));
}
public void commit(IEnumerable<AnalyticsExpirationParameters> data) =>
_bus.post(SparkTags.ExpirationParametersCommitTag, data);
public IEnumerable<mbts.SecurityExpiration> get_smart_copy_roll_exps(AnalyticsExpirationParameters source) {
if (_curr_val != null) {
foreach (var kv in _curr_val.exp_map)
if (kv.Value.roll_schedule_expiration.Equals(source.roll_schedule_expiration))
yield return kv.Key;
}
}
public void Dispose() =>
_sub.Dispose();
}
}
@@ -1,69 +0,0 @@
#nullable enable
namespace mbts.spark {
using bts;
using bts.api;
using bts.api.analytics;
using mbts.analytics;
using Spark.Core.Disposables;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reactive.Linq;
using System.Threading;
/// <summary>
/// Reads exp params from the network and publishes it to the bus; listens to
/// <see cref="SparkTags.ExpirationParametersCommitTag"/> and persists the data
/// </summary>
public sealed class AnalyticsParametersManager : IDisposable {
IDisposable? _dispose;
public AnalyticsParametersManager(IBus bus, AnalyticsService analytics_service) {
var contracts_src = bus.subscribe(SparkTags.SystemContractsTag);
var exp_params_in_src = analytics_service.subscribei_exp_parameters()
.Select(upd => upd.all
.SelectMany(ep => ep.ParamList
.Select(ep => new AnalyticsExpirationParameters(ep)))
.ToDictionary(ep => ep.security));
var exp_params_out_src = bus.subscribe(SparkTags.ExpirationParametersCommitTag)
.Select(eps => eps
.Where(ep => ep.security.expiration.Date >= DateTime.Today - TimeSpan.FromDays(1)));
_dispose = Disposable.Create(
exp_params_in_src.CombineLatest(contracts_src)
.Select(tup => new AnalyticsExpirationParametersMap(tup.First, tup.Second))
.ObserveOn(SynchronizationContext.Current ?? throw new InvalidOperationException())
.Subscribe(bus.post_callback(SparkTags.ExpirationParametersInputTag)),
exp_params_out_src.Subscribe(save_exp_params));
void save_exp_params(IEnumerable<AnalyticsExpirationParameters> exp_params) {
Func<AnalyticsExpirationParameters, bool> is_unexpired = (p) => {
var st = p.driver_security.security_tuple.to_api_sec_tuple();
var exp = p.security.expiration;
return SecurityExpirationHelper.is_unexpired(st, exp);
};
exp_params = exp_params.Where(t => is_unexpired(t));
// listens to the commit tag and saves it
Log.Gen.info($"AnalyticsParametersManager received commit req. count:{exp_params.Count()}");
var to_save = new ExpirationParameterEntryList();
to_save.ParamList.AddRange(exp_params.Select(i => i.to_exp_param_entry()));
Log.Gen.record(
null,
(dt, elapsed, res) => {
var msg = "AnalyticsParametersManager saved exp_params. " +
$"count:{exp_params.Count()} t:{elapsed.TotalMilliseconds:0.000}ms";
return (LogLevel.Info, msg);
},
() => analytics_service.set_exp_parameters(to_save));
}
}
public void Dispose() =>
Disposable.dispose(ref _dispose);
}
}
@@ -1,44 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using mbts.analytics;
namespace mbts.spark
{
/// UI (VolSurfaceDisplayModel) publishes this to the request calculator
/// (This is published in response to user typing in, or any of the macro
/// actions on the right)
public class VolSurfaceCalculationRequest : ICloneable
{
public readonly VolSurfaceInput volsurface_input;
public readonly int request_id;
public readonly IDictionary<VolSurfaceExpiration, VolCurveAction> action_map;
public readonly bool cascade_up, cascade_down;
public VolSurfaceCalculationRequest(VolSurfaceInput this_volsurface_input, int this_request_id)
: this(this_volsurface_input, this_request_id, new Dictionary<VolSurfaceExpiration, VolCurveAction>())
{ }
public VolSurfaceCalculationRequest(VolSurfaceInput this_volsurface_input, int this_request_id,
IDictionary<VolSurfaceExpiration, VolCurveAction> this_action_map,
bool this_cascade_up = false, bool this_cascade_down = false)
{
request_id = this_request_id;
volsurface_input = VolSurfaceUtilityFunctions.clone_proto(this_volsurface_input);
action_map = this_action_map;
cascade_up = this_cascade_up;
cascade_down = this_cascade_down;
}
public object Clone()
{
return new VolSurfaceCalculationRequest(VolSurfaceUtilityFunctions.clone_proto(volsurface_input),
request_id,
action_map != null ? new Dictionary<VolSurfaceExpiration, VolCurveAction>(action_map) : null,
cascade_up, cascade_down);
}
}
}
@@ -1,25 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using mbts.analytics;
namespace mbts.spark
{
public class VolSurfaceCalculationResponse : ICloneable
{
public readonly VolSurfaceOutput volsurface_calculation_output;
public readonly int request_id;
public VolSurfaceCalculationResponse(VolSurfaceOutput this_volsurface_calculation_output, int this_request_id)
{
request_id = this_request_id;
volsurface_calculation_output = this_volsurface_calculation_output;
}
public object Clone()
{
return new VolSurfaceCalculationResponse(volsurface_calculation_output != null ? volsurface_calculation_output.Clone() as VolSurfaceOutput : null, request_id);
}
}
}
@@ -1,205 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using mbts.analytics;
using bts.api;
using bts.api.analytics;
public class DriverMD {
public readonly DriverCalculationType calc_type = DriverCalculationType.Direct;
public readonly Nullable<SecurityImmutable> driver_security = null;
public readonly VolSurfaceMDUnit md = null;
public readonly Nullable<double> calculated_driver = null;
public static DriverMD empty = new DriverMD(
DriverCalculationType.Direct, null, null, null);
public DriverMD(DriverCalculationType calc_type,
Nullable<SecurityImmutable> driver_security,
VolSurfaceMDUnit md,
Nullable<double> calculated_driver) {
this.calc_type = calc_type;
this.driver_security = driver_security;
this.md = md;
this.calculated_driver = calculated_driver;
}
public DriverMD(SecurityImmutable driver_security,
VolSurfaceMDUnit md)
:
this(DriverCalculationType.Direct, driver_security, md, null) {
}
public DriverMD(double driver)
:
this(DriverCalculationType.TimeWeightedInterp, null, null, driver) {
}
public double get_driver() {
switch (calc_type) {
case DriverCalculationType.Direct:
return VolSurfaceCoreFunctions.get_driver(md);
case DriverCalculationType.TimeWeightedInterp:
return calculated_driver.HasValue ? calculated_driver.Value : Double.NaN;
}
return Double.NaN;
}
}
namespace mbts.spark {
// Publishes the driver prices for expirations of a single option (this is not AW2 specific)
// f(AnalyticsExpirationParametersMap, SystemContractData) -> OptionDriverPriceMap
// This is constructed by the ResourceAllocator
public class SingleOptionDriverPricePublisher {
private readonly SecurityTuple _sec_tup;
private ThreadedBlackboard _bb;
// tags
private ITag<AnalyticsExpirationParametersMap> _in_bb_exp_params_tag =
SparkTags.ExpirationParametersInputTag;
private ITag<SystemContractData> _in_bb_contracts_tag =
SparkTags.SystemContractsTag;
private OptionDriverPriceMap _last_published;
private readonly PerfStatsLogger _logger;
private readonly TimeSpan _fire_period = TimeSpan.FromMilliseconds(300);
private DateTime _last_fire_time = DateTime.MinValue;
public SingleOptionDriverPricePublisher(SecurityTuple sec_tup,
ThreadedBlackboard bb) {
bts.Log.Gen.info($"SingleOptionDriverPricePublisher initialized st:{sec_tup}");
_sec_tup = sec_tup;
_bb = bb;
_logger = new PerfStatsLogger(50, 50,
$"SingleOptionDriverPricePublisher_{sec_tup.security_name}_{GetHashCode()}");
_last_published = new OptionDriverPriceMap(sec_tup.security_name,
new Dictionary<SecurityExpiration, DriverMD>());
_bb.subscribe(_in_bb_exp_params_tag);
_bb.subscribe(_in_bb_contracts_tag);
_bb.data_callback += _on_bb_data;
_bb.timer_callback += _on_bb_timer;
_compute_and_fire();
}
private void _on_bb_data(object tag, object data) {
if (_in_bb_exp_params_tag == tag || _in_bb_contracts_tag == tag) {
_on_bb_timer();
}
}
private void _on_bb_timer() {
if (DateTime.Now - _last_fire_time >= _fire_period) {
_last_fire_time = DateTime.Now;
_compute_and_fire();
}
}
private void _compute_and_fire() {
_logger.start_default_timer();
AnalyticsExpirationParametersMap param_map = _bb.read_state(_in_bb_exp_params_tag);
SystemContractData sc_data = _bb.read_state(_in_bb_contracts_tag);
if (param_map == null || sc_data == null) {
return;
}
IDictionary<mbts.SecurityExpiration, mbts.SecurityExpiration> driver_map =
param_map.get_option_to_driver_map(_sec_tup.security_name);
// look up the market data
IDictionary<SecurityExpiration, DriverMD> res =
new Dictionary<SecurityExpiration, DriverMD>();
foreach (var kv in driver_map) {
SecurityExpiration option_exp = kv.Key;
SecurityExpiration driver = kv.Value;
if (_direct_valid_driver(driver)) {
Tuple<SecurityImmutable, VolSurfaceMDUnit> md_tup = sc_data.get_exp_md(driver);
// to deal with expired expirations
if (md_tup != null) {
res.Add(option_exp, new DriverMD(md_tup.Item1, md_tup.Item2));
}
} else {
// SecurityTuple driver_sectup = _get_option_driver(driver_map, option_exp);
// bts.Log.Gen.info("SingleOptionDriverPricePublisher._compute_and_fire " +
// $"option_exp: {option_exp} driver: {driver_sectup}");
//
double interp_pr = interp_driver(sc_data, driver_map, option_exp);
res.Add(option_exp, new DriverMD(interp_pr));
}
// for exps with interp_drivers (right represented by invalid driver) find the
// neighboring option's future. then find the nearest 2 future exps (nearest
// to this option's exp) and do a tim weighted interp
// if not neighboring driver then calculate it from the spot
}
if (_is_different(res)) {
_last_published = new OptionDriverPriceMap(_sec_tup.security_name, res);
var to_fire = new OptionDriverPriceMap(_sec_tup.security_name, res);
// bts.Log.Gen.info("SingleOptionDriverPricePublisher._compute_and_fire \n" +
// $"map:{to_fire.log_string()}");
_logger.stop_default_timer();
_bb.post(SparkTags.OptionDriverBBOTag(_sec_tup.security_name),
new OptionDriverPriceMap(_sec_tup.security_name, res));
}
}
// compares the new values to the previous
private bool _is_different(IDictionary<SecurityExpiration, DriverMD> new_dic) {
Func<DriverMD, DriverMD, bool> is_dmd_diff = (d1, d2) => {
bool eq = VolSurfaceUtilityFunctions.compare_doubles(d1.get_driver(), d2.get_driver());
return !eq;
};
new_dic.Difference(_last_published.exp_price_map, out var ex_left, out var ex_right, out var overlap);
return ex_left.Count() != 0 || ex_right.Count() != 0 ||
overlap.Where(v => is_dmd_diff(v.Value.left, v.Value.right)).Count() > 0;
}
#region driver interp
private static bool _direct_valid_driver(SecurityExpiration driver_exp) {
return driver_exp != null && /*driver_exp.expiration >= DateTime.Now.Date &&*/
(driver_exp.security_tuple.security_type == SecurityType.Future ||
driver_exp.security_tuple.security_type == SecurityType.Stock);
}
// returns the driver sectup (it assumes all expirations of this option sectup
// are being driven by the same sectup)
public static SecurityTuple get_driver_sectup(
IDictionary<mbts.SecurityExpiration, mbts.SecurityExpiration> driver_map,
SecurityExpiration exp) {
foreach (var kv in driver_map) {
SecurityExpiration driver = kv.Value;
if (_direct_valid_driver(driver) &&
exp.security_tuple.Equals(kv.Key.security_tuple)) {
return driver.security_tuple;
}
}
return null;
}
public static Tuple<SecurityExpiration, SecurityExpiration>
find_neighbors(SystemContractData sc_data,
SecurityTuple sec_tup, DateTime exp) {
var exps = sc_data.exp_map.Where(
kv => sec_tup.Equals(kv.Key.security_tuple)).Select(kv => kv.Key);
if (exps == null) {
return null;
}
SecurityExpiration low, high;
VolSurfaceUtilityFunctions.find_neighbors(exps, exp,
(t, p) => t.expiration.Subtract(p).TotalMilliseconds, out low, out high);
return Tuple.Create(low, high);
}
public static double interp_driver(SystemContractData sc_data,
IDictionary<SecurityExpiration, SecurityExpiration> driver_map,
SecurityExpiration option_exp) {
SecurityTuple driver_sectup = get_driver_sectup(driver_map, option_exp);
if (driver_sectup == null)
return Double.NaN;
var ngh_drivers = find_neighbors(sc_data, driver_sectup, option_exp.expiration);
if (ngh_drivers == null || ngh_drivers.Item1 == null || ngh_drivers.Item2 == null)
return Double.NaN;
var low = sc_data.get_exp_md(ngh_drivers.Item1);
var high = sc_data.get_exp_md(ngh_drivers.Item2);
if (low == null || low.Item2 == null)
return Double.NaN;
if (high == null || high.Item2 == null)
return Double.NaN;
// finally we have the value we need, interp it now
return VolSurfaceCoreFunctions.linear_interpolate_time(
ngh_drivers.Item1.expiration, VolSurfaceCoreFunctions.get_driver(low.Item2),
ngh_drivers.Item2.expiration, VolSurfaceCoreFunctions.get_driver(high.Item2),
option_exp.expiration);
}
#endregion
}
}
@@ -1,47 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using mbts.analytics;
namespace mbts.spark {
// UNUSED
// This class is held by the SingleVolSurfaceClientPrecomputedTheosPublisher
// and acts as a buffer for publishing values. If wait_for_theo_confirmation
// setting is true, it publshes an alert tag, otherwise publishes the theos
// directly
public class SingleVolSurfaceClientTheosPublishHelper {
private readonly int _vs_id;
private readonly ThreadedBlackboard _bb;
private int _n_updates = 0;
public SingleVolSurfaceClientTheosPublishHelper(int vs_id, ThreadedBlackboard bb) {
bts.Log.assert(false);
_vs_id = vs_id;
_bb = bb;
}
public void publish(IDictionary<VolSurfaceExpiration, IEnumerable<Theos>> exp_theo_map) {
if (_n_updates == 0)
/// If its the first theos send it rightaway
_bb.post(SparkTags.VolSurfaceInterpGreeksTag(_vs_id), exp_theo_map);
else {
if (_is_theo_acceptance_confirmation_on)
_bb.post(SparkTags.VolSurfaceTheoAlertTag,
new VolSurfaceTheoAlertData(Guid.NewGuid().ToString(), _vs_id, exp_theo_map));
else
_bb.post(SparkTags.VolSurfaceInterpGreeksTag(_vs_id), exp_theo_map);
}
_n_updates++;
}
private bool _is_theo_acceptance_confirmation_on {
get {
// in edge this was in a TC2 setting
return false;
}
}
}
}
@@ -1,78 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using mbts.analytics;
using bts.api;
namespace mbts.spark {
// Publishes the vol outputs for a single vol surface.
// Despite of the name Retriever, this class computes the vols
// - f (vs_input, aux_data, securities) -> vs_output
// and publishes it
// Subs :
// 1. Committed VS Input
// 3. VS Nonvol Data
// Pubs :
// 1. VS Out
public class SingleVolSurfaceCommittedOutputRetriever : IDisposable {
private readonly int _vs_id;
private readonly ITag<VolSurfaceInput> _in_bb_vs_input_tag;
private readonly ITag<VolSurfaceNonVolData> _in_bb_nonvol_data_tag;
private readonly ITag<VolSurfaceStandardTime> _in_vs_standard_time_tag;
private readonly ITag<VolSurfaceOutput> _out_bb_computed_vol_tag;
private readonly ThreadedBlackboard _bb;
private readonly HighPerformanceTimer _timer = new HighPerformanceTimer();
private readonly PerfStatsLogger _logger = new PerfStatsLogger(50, 100);
private readonly string _log_id;
public SingleVolSurfaceCommittedOutputRetriever(int vs_id,
ThreadedBlackboard threaded_bb, IEnumerable<string> symbols) {
bts.Log.Gen.info($"SingleVolSurfaceCommittedOutputRetriever cons vs_id:{vs_id} tid:{_tid()}");
_vs_id = vs_id;
_bb = threaded_bb;
_in_bb_vs_input_tag = SparkTags.VolSurfaceCommittedInputTag(vs_id);
_in_bb_nonvol_data_tag = SparkTags.VolSurfaceNonVolDataTag(vs_id);
_in_vs_standard_time_tag = SparkTags.VolSurfaceStandardTimeTag(vs_id);
_out_bb_computed_vol_tag = SparkTags.VolSurfaceCommittedOutputTag(vs_id);
_log_id = String.Format("SingleVolSurfaceCommittedOutputRetriever_{0}", vs_id);
_bb.subscribe(_in_bb_vs_input_tag);
_bb.subscribe(_in_bb_nonvol_data_tag);
_bb.subscribe(_in_vs_standard_time_tag);
_bb.data_callback += _on_bb_data;
_recompute_and_publish();
}
private static int _tid() { return VolSurfaceTroubleshootingFunctions.tid(); }
private void _on_bb_data(object tag, object data) {
if (_in_bb_vs_input_tag.Equals(tag) || _in_bb_nonvol_data_tag.Equals(tag) ||
_in_vs_standard_time_tag.Equals(tag))
_recompute_and_publish(tag);
}
private void _recompute_and_publish(object tag = null) {
VolSurfaceInput vs_input = _bb.read_state(_in_bb_vs_input_tag);
VolSurfaceNonVolData vs_nonvol_data = _bb.read_state(_in_bb_nonvol_data_tag);
VolSurfaceStandardTime vs_standard_time = _bb.read_state(_in_vs_standard_time_tag);
if (vs_input != null && vs_nonvol_data != null && vs_standard_time != null) {
_timer.start();
IDictionary<VolSurfaceExpiration, VolSurfaceExpirationAuxiliaryData> aux_data_map =
VolSurfaceUtilityFunctions.compute_aux_data(vs_input,
vs_nonvol_data.input, vs_nonvol_data.driver_price_map, vs_standard_time);
VolSurfaceOutput vs_output = GeneralVolSurfaceCalculator.compute(
vs_input, vs_nonvol_data.contracts, aux_data_map);
_timer.stop();
var tag_str = tag == null ? "Null" : tag.ToString();
// bts.Log.Gen.info($"SingleVolSurfaceCommittedOutputRetriever._recompute_and_publish " +
// $"vs_id: {_vs_id} time:{_timer.lastIntervalTime} ms tag:{tag_str} " +
// $"tid:{_tid()}"); //output: {vs_output.log_string()}*/");
_logger.log(_log_id, _log_id, _timer.lastIntervalTime);
_bb.post(_out_bb_computed_vol_tag, vs_output);
}
}
#region IDisposable
public void Dispose() { _bb.data_callback -= _on_bb_data; }
#endregion
}
}
@@ -1,98 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using mbts.analytics;
using bts;
using bts.utils;
using bts.api;
namespace mbts.spark {
/// Listens to the input (either committed or candidate depending on the arg)
/// and creates the actual source that is immutable wrt the symbol list.
/// (Making the real sources immutable wrt to the symbol list simplifies
/// things a lot. Symbol lists rarely every change, but its a pain to
/// handle such changes)
public class SingleVolSurfaceDataSource : IDisposable {
public enum SymbolListType {
Committed,
Candidate,
Combined,
}
private readonly SymbolListType _list_type;
private readonly int _vs_id;
private readonly ThreadedBlackboard _bb;
private readonly Func<IEnumerable<string>, IDisposable> _create_func;
private readonly ITag<VolSurfaceInput> _in_bb_committed_data_tag;
private readonly ITag<VolSurfaceCalculationRequest> _in_bb_calc_req_tag;
private HashSet<string> _option_symbols = new HashSet<string>();
private IDisposable _source = null;
public SingleVolSurfaceDataSource(SymbolListType list_type, int vs_id, ThreadedBlackboard threaded_bb,
Func<IEnumerable<string>, IDisposable> create_func) {
Log.Gen.info(String.Format("SingleVolSurfaceDataSource constructed vs_id {0}", vs_id));
_list_type = list_type;
_vs_id = vs_id;
_bb = threaded_bb;
_create_func = create_func;
_in_bb_committed_data_tag = SparkTags.VolSurfaceCommittedInputTag(vs_id);
_in_bb_calc_req_tag = SparkTags.VolSurfaceCalculationRequestTag(vs_id);
_bb.subscribe(_in_bb_committed_data_tag);
_bb.subscribe(_in_bb_calc_req_tag);
_bb.data_callback += _on_bb_data;
_recompute();
}
private void _on_bb_data(object tag, object data) {
if (_in_bb_committed_data_tag.Equals(tag) || _in_bb_calc_req_tag.Equals(tag))
_recompute();
}
private void _recompute() {
VolSurfaceCalculationRequest vs_calc_req = _bb.read_state(_in_bb_calc_req_tag);
VolSurfaceInput vs_comm_inp = _bb.read_state(_in_bb_committed_data_tag);
if (_list_type == SymbolListType.Candidate) {
if (vs_calc_req != null && vs_calc_req.volsurface_input != null) {
HashSet<string> new_sym_map = new HashSet<string>(VolSurfaceDataFunctions.get_symbols(vs_calc_req.volsurface_input));
_create_if_needed(new_sym_map);
}
} else if (_list_type == SymbolListType.Committed) {
if (vs_comm_inp != null) {
HashSet<string> new_sym_map = new HashSet<string>(VolSurfaceDataFunctions.get_symbols(vs_comm_inp));
_create_if_needed(new_sym_map);
}
} else if (_list_type == SymbolListType.Combined) {
List<string> new_sym_list = new List<string>();
if (vs_calc_req != null && vs_calc_req.volsurface_input != null)
new_sym_list.AddRange(VolSurfaceDataFunctions.get_symbols(vs_calc_req.volsurface_input));
if (vs_comm_inp != null)
new_sym_list.AddRange(VolSurfaceDataFunctions.get_symbols(vs_comm_inp));
_create_if_needed(new HashSet<string>(new_sym_list));
}
}
private void _create_if_needed(HashSet<string> new_sym_map) {
if (!CollectionHelper.hashset_equals(_option_symbols, new_sym_map)) {
_option_symbols = new HashSet<string>(new_sym_map);
if (_source != null)
_source.Dispose();
_source = _create_func(_option_symbols);
_bb.post(SparkTags.AquireTag(Guid.NewGuid().ToString()),
new SymbolResourceAllocationUnit(
_option_symbols.Select(i => new mbts.SecurityTuple(SecurityType.Option, i, Venue.Unset)), this, true));
}
}
#region IDisposable
public void Dispose() {
if (_source != null)
_source.Dispose();
_bb.data_callback -= _on_bb_data;
}
#endregion
}
}
@@ -1,144 +0,0 @@
namespace mbts.spark {
using bts;
using bts.api;
using bts.api.analytics;
using mbts.analytics;
using Spark.Core.Protobuf;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Reactive.Linq;
using System.Threading;
// For a single VolSurface this class
// 1. Listents to commmits and calls the service to persist data
// 2. Gathers the vol surface input from the nw and publishes it
// 3. Gathers the vol surface list and publishes it
public class SingleVolSurfaceGateway : IDisposable {
private readonly int _volsurface_id;
private readonly ThreadedBlackboard _bb;
private readonly ITag<VolSurfaceInput> _in_bb_committ_tag;
private readonly AnalyticsService _analytics_service;
private readonly HighPerformanceTimer _timer = new HighPerformanceTimer();
private readonly string _user;
private readonly List<IDisposable> _disposables = new List<IDisposable>();
private IDictionary<UInt64, VolSurfaceInputSnapshot> _snp_shot_map = new
Dictionary<UInt64, VolSurfaceInputSnapshot>();
public SingleVolSurfaceGateway(int volsurface_id, ThreadedBlackboard threaded_bb,
AnalyticsService analytics_service) {
bts.Log.Gen.info(String.Format("SingleVolSurfaceGateway created for vs_id:{0}",
volsurface_id));
_volsurface_id = volsurface_id;
_bb = threaded_bb;
_user = "TEST_USER"; // TODO
_in_bb_committ_tag = SparkTags.VolSurfaceCommitTag(volsurface_id);
_analytics_service = analytics_service;
_bb.subscribe(_in_bb_committ_tag);
_bb.data_callback += _on_bb_data;
var vs_sub = _analytics_service.subscribei_volsurfaces()
.ObserveOn(SynchronizationContext.Current)
.Subscribe(_on_vss);
_disposables.Add(vs_sub);
}
private void _log_basic_vs_info(VolSurfaceInput vs_inp) {
bts.Log.Gen.info(String.Format("SingleVolSurfaceGateway vs_id:{0} vs:{1}",
vs_inp.surface_settings.core_settings.vol_surface_id, vs_inp.log_string()));
}
private void _on_vss(bts.api.core.Update<VolSurfaceEntryImmutable, UInt64> update) {
IEnumerable<VolSurfaceEntryImmutable> all_vss = update.all;
var this_vs_vss = all_vss.Where(vs => vs.VsId == _volsurface_id);
bts.Log.Gen.info(String.Format("SingleVolSurfaceGateway._on_vss count:{0} vs_count:{1}",
all_vss.Count(), this_vs_vss.Count()));
if (this_vs_vss.Count() == 0) {
return;
}
VolSurfaceEntryImmutable vs = this_vs_vss.MaxElement(vs => vs.SaveTime);
VolSurfaceInput vs_input = _to_vs_input(vs);
_log_basic_vs_info(vs_input);
_bb.post(
SparkTags.VolSurfaceCommittedInputTag(_volsurface_id), vs_input);
_update_publish_snapshots(this_vs_vss);
}
private void _update_publish_snapshots(IEnumerable<VolSurfaceEntryImmutable> vss) {
foreach (VolSurfaceEntryImmutable vse in vss) {
if (!_snp_shot_map.ContainsKey(vse.SaveTime)) {
VolSurfaceInputSnapshot snp = new VolSurfaceInputSnapshot(vse);
_snp_shot_map.Add(vse.SaveTime, snp);
}
}
bts.Log.Gen.info(String.Format("SingleVolSurfaceGateway._update_publish_snapshots count:{0}",
_snp_shot_map.Count));
_bb.post(SparkTags.VolSurfaceInputSnapshotListTag(_volsurface_id),
_snp_shot_map.Values);
}
static VolSurfaceInput _to_vs_input(VolSurfaceEntryImmutable vs) =>
ProtobufSerializationHelper.deserialize<VolSurfaceInput>(vs.Volsurface.ToByteArray());
private void _on_bb_data(object tag, object data) {
if (_in_bb_committ_tag.Equals(tag)) {
try {
_timer.start();
VolSurfaceInput vs_input = data as VolSurfaceInput;
_sanitize_input(ref vs_input);
vs_input = VolSurfaceDataFunctions.unset_driver_overrides(vs_input);
vs_input.saver_login = _user;
VolSurfaceUtilityFunctions.save_volsurface(vs_input, _analytics_service, _user);
_timer.stop();
Log.Gen.info(String.Format(
"SingleVolSurfaceGateway._on_bb_data Time to commit volsurface {0} {1} msecs",
_volsurface_id, _timer.lastIntervalTime));
var archived_theos = _get_theos();
if (archived_theos != null)
_analytics_service.archive_theos(archived_theos);
} catch (Exception ex) {
Log.Gen.warn(ex.ToString());
_bb.post(SparkTags.MessageDisplayTag,
new MessageDisplayData("Vol Surface Addition",
String.Format("Could not create Vol Surface, Error : {0}", ex.Message)));
}
}
}
private void _sanitize_input(ref VolSurfaceInput vs_input) {
vs_input.surface_settings.core_settings.time_settings = vs_input.surface_settings.core_settings.time_settings ?? new VolSurfaceTimeSettings() { time_mode = VolSurfaceEnums.VolSurfaceTimeMode.Manual };
if (vs_input.surface_settings.core_settings.master_slave_relationships != null)
foreach (VolSurfaceSymbolRelationship vssr in vs_input.surface_settings.core_settings.master_slave_relationships)
_force_distinct_connected_symbols(vssr);
if (vs_input.surface_settings.core_settings.implied_vol_marketdata_relationships != null)
foreach (VolSurfaceSymbolRelationship vssr in vs_input.surface_settings.core_settings.implied_vol_marketdata_relationships)
_force_distinct_connected_symbols(vssr);
}
private void _force_distinct_connected_symbols(VolSurfaceSymbolRelationship vssr) {
var distinct_syms = vssr.connected_symbols.Distinct().ToList();
if (distinct_syms.Count != vssr.connected_symbols.Count)
vssr.connected_symbols = distinct_syms;
}
private ArchivedTheoList _get_theos() {
var cand_theos = SingleVolSurfaceTheoSource.compute_cand_theos(_volsurface_id, _bb);
SystemContractData sc_data = _bb.read_state(SparkTags.SystemContractsTag);
var rv = SingleVolSurfaceTheoSource.convert_to_id_map(cand_theos, sc_data);
rv.SaveTime = VolSurfaceUtilityFunctions.get_unix_epoch_msecs();
var sec_tups = SingleVolSurfaceTheoSource.get_vs_sectups(_volsurface_id, _bb);
rv.SecTups.AddRange(sec_tups);
return rv;
}
#region Disposable
public void Dispose() {
_bb.data_callback -= _on_bb_data;
_disposables.ForEach(d => d.Dispose());
}
#endregion
}
}
@@ -1,194 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using mbts.analytics;
using System.Collections.Concurrent;
using System.IO;
using System.IO.Compression;
using bts;
using bts.api;
using mbts.ui.converters;
namespace mbts.spark {
// This class gathers all the inputs needed to calculate InterpGreeks, pass it to
// VolSurfacePrecomputedTheosProducer, and publishes the InterpGreeks to the bus
// (called SingleVolSurfaceClientPrecomputedTheosPublisher in Edge)
// It listens to
// a. vol surface inputs
// b. exp params (roll, rates etc)
// c. securities (exp, strikes) for options in the vs
// d. driver prices for options in vs
// and passes the data above to VolSurfacePrecomputedTheosProducer where
// the real calculations take place.
public class SingleVolSurfaceInterpGreeksPublisher : IDisposable {
private readonly int _vs_id;
private readonly ThreadedBlackboard _bb;
private HashSet<string> _all_symbols;
private VolSurfaceInterpGreeksProducer _theo_producer;
private readonly ITag<VolSurfaceInput> _in_vs_input_tag;
private readonly ITag<VolSurfaceNonVolInput> _in_vs_nonvol_input_tag;
private readonly ITag<VolSurfaceStrikeMap> _in_vs_contracts_tag;
private ITag<IReadOnlyDictionary<string, OptionDriverPriceMap>>
_in_all_syms_driver_price_tag = SparkTags.AllOptionDriverBBOTag;
private readonly ITag<VolSurfaceStandardTime> _in_vs_standard_time_tag;
private readonly ITag<bool> _in_ui_up_tag;
private readonly string _user;
private readonly PerfStatsLogger _logger;
public SingleVolSurfaceInterpGreeksPublisher(int vs_id,
ThreadedBlackboard threaded_bb, IEnumerable<string> symbols) {
bts.Log.Gen.info($"SingleVolSurfaceInterpGreeksPublisher cons {vs_id}");
_vs_id = vs_id;
_bb = threaded_bb;
_all_symbols = new HashSet<string>(symbols);
_logger = new PerfStatsLogger(10, 100,
$"SingleVolSurfaceInterpGreeksPublisher_{vs_id}");
_theo_producer = new VolSurfaceInterpGreeksProducer(vs_id);
// TODO
_user = String.Empty; // get current user from somewhere (ask John)
_theo_producer.on_theos += _theo_producer_on_theos;
_theo_producer.on_vols += _theo_producer_on_vols;
_in_vs_input_tag = SparkTags.VolSurfaceCommittedInputTag(vs_id);
_in_vs_nonvol_input_tag = SparkTags.VolSurfaceNonVolInputTag;
_in_vs_contracts_tag = SparkTags.VolSurfaceContractsTag(vs_id);
_in_vs_standard_time_tag = SparkTags.VolSurfaceStandardTimeTag(vs_id);
_in_ui_up_tag = SparkTags.VolSurfaceActiveUITag(_vs_id);
_bb.subscribe(_in_vs_input_tag);
_bb.subscribe(_in_vs_nonvol_input_tag);
_bb.subscribe(_in_vs_contracts_tag);
_bb.subscribe(_in_all_syms_driver_price_tag);
_bb.subscribe(_in_vs_standard_time_tag);
_bb.subscribe(_in_ui_up_tag);
_bb.data_callback += _on_bb_data;
_init();
}
// reading all the data from the bus and setting up the producer
private void _init() {
var vs_inp = _bb.read_state(_in_vs_input_tag);
if (vs_inp != null)
_theo_producer.set_vol_data(vs_inp);
var vs_nonvol_input = _bb.read_state(_in_vs_nonvol_input_tag);
if (vs_nonvol_input != null)
_theo_producer.set_nonvol_parameters((vs_nonvol_input).exp_input_map);
_set_contracts();
_read_and_set_drivers();
var vs_standard_time = _bb.read_state(_in_vs_standard_time_tag);
if (vs_standard_time != null)
_theo_producer.set_system_vol_time(vs_standard_time);
}
private void _read_and_set_drivers() {
var all_sym_price_map = _bb.read_state(_in_all_syms_driver_price_tag);
IDictionary<VolSurfaceExpiration, DriverMD> exp_price_map =
OptionDriverPriceMap.get_vs_price_map(all_sym_price_map,
(s) => _all_symbols.Contains(s));
_theo_producer.set_driver_price(
exp_price_map.ToDictionary(kv => kv.Key, kv => kv.Value.get_driver()));
}
#region Blackboard Callbacks
private void _on_bb_data(object tag, object data) {
if (_in_vs_input_tag.Equals(tag)) {
var vs_inp = _bb.read_state(_in_vs_input_tag);
_theo_producer.set_vol_data(vs_inp);
} else if (_in_vs_nonvol_input_tag.Equals(tag)) {
var vs_nonvol_input = _bb.read_state(_in_vs_nonvol_input_tag);
if (vs_nonvol_input != null)
_theo_producer.set_nonvol_parameters((vs_nonvol_input).exp_input_map);
} else if (_in_vs_contracts_tag.Equals(tag))
_set_contracts();
else if (_in_all_syms_driver_price_tag.Equals(tag))
_read_and_set_drivers();
else if (_in_vs_standard_time_tag.Equals(tag))
_theo_producer.set_system_vol_time(_bb.read_state(_in_vs_standard_time_tag));
}
private void _set_contracts() {
// in edge this used to filter exps that were active in TC2
var all_contracts = _bb.read_state(_in_vs_contracts_tag);
if (all_contracts != null) {
_theo_producer.set_contracts(all_contracts.strike_map);
}
}
#endregion
private void _log_data<T>(
IDictionary<VolSurfaceExpiration, IEnumerable<T>> theos,
DateTime exp_filter,
string prefix,
Func<T, string> log_func,
Comparison<T> sort_func) {
string rv = prefix + "\n";
foreach (var kv in theos) {
var exp = kv.Key;
if (exp.expiration != exp_filter) {
continue;
}
var sorted = new List<T>(kv.Value);
sorted.Sort(sort_func);
foreach (var t in sorted) {
rv += "\n" + $"exp: {exp} {log_func(t)}";
}
}
Log.Gen.info(rv);
}
private void _log_vol_matrix(
IDictionary<VolSurfaceExpiration, IEnumerable<VolMatrix>> vols,
DateTime exp_filter) {
_log_data(vols, exp_filter, "InterpGreeks VolMatrix", (t) => t.log_string(),
(t1, t2) => {
var rv = t1.expiration.CompareTo(t2.expiration);
if (rv == 0)
rv = t1.strike.CompareTo(t2.strike);
if (rv == 0)
rv = t1.driver.CompareTo(t2.driver);
return rv;
});
}
private void _log_theos(
IDictionary<VolSurfaceExpiration, IEnumerable<Theos>> theos,
DateTime exp_filter) {
_log_data(theos, exp_filter, "InterpGreeks Theos", (t) => t.log_string(),
(t1, t2) => {
var rv = t1.expiration.CompareTo(t2.expiration);
if (rv == 0)
rv = t1.strike.CompareTo(t2.strike);
if (rv == 0)
rv = t1.driver.CompareTo(t2.driver);
return rv;
});
}
private int _n_updates = 0;
private void _theo_producer_on_theos(
IDictionary<VolSurfaceExpiration, IEnumerable<Theos>> exp_theo_map,
double vol_compute_time, double theo_compute_time) {
Log.Gen.info("SingleVolSurfaceInterpGreeksPublisher._theo_producer_on_theos " +
$"vs_id: {_vs_id} n_updates: {++_n_updates} " +
$"vol_compute_time: {vol_compute_time} " +
$"theo_compute_time: {theo_compute_time}");
_logger.log_default(theo_compute_time);
_bb.post(SparkTags.VolSurfaceInterpGreeksTag(_vs_id), exp_theo_map);
}
private void _theo_producer_on_vols(
IDictionary<VolSurfaceExpiration, IEnumerable<mbts.analytics.VolMatrix>> exp_vol_map,
double vol_compute_time, double theo_compute_time) {
Log.Gen.info("SingleVolSurfaceInterpGreeksPublisher._theo_producer_on_vols " +
$"vs_id: {_vs_id} vol_compute_time: {vol_compute_time} " +
$"theo_compute_time: {theo_compute_time}");
}
#region IDisposable
public void Dispose() {
_bb.data_callback -= _on_bb_data;
}
#endregion
}
}
@@ -1,74 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using bts.api.analytics;
using bts.api;
namespace mbts.spark {
public class SingleVolSurfaceManager : IDisposable {
private readonly int _vs_id;
private IEnumerable<IDisposable> _resources;
private readonly ThreadedBlackboard _bb;
private readonly AnalyticsService _analytics_service;
private ITag<bool> _vs_activation_tag;
private bool _activated = false;
public SingleVolSurfaceManager(int vs_id, ThreadedBlackboard t_bb,
AnalyticsService analytics_service) {
var tid = System.Threading.Thread.CurrentThread.ManagedThreadId;
bts.Log.Ui.info($"SingleVolSurfaceManager.cons vs_id:{vs_id} tid:{tid}");
_vs_id = vs_id;
_bb = t_bb;
_analytics_service = analytics_service;
_vs_activation_tag = SparkTags.VolSurfaceActiveUITag(vs_id);
_bb.subscribe(_vs_activation_tag);
_bb.data_callback += _on_data;
}
private void _spin_resources() {
bts.Log.Ui.info($"SingleVolSurfaceManager._spin_resources vs_id:{_vs_id}");
_resources = new IDisposable[]
{
new SingleVolSurfaceGateway(_vs_id, _bb, _analytics_service),
new SingleVolSurfaceTimeSource(_vs_id,_bb),
new SingleVolSurfaceDataSource(SingleVolSurfaceDataSource.SymbolListType.Combined,
_vs_id, _bb, syms => new SingleVolSurfaceNonVolDataSource(_vs_id, syms, _bb)),
new SingleVolSurfaceDataSource(SingleVolSurfaceDataSource.SymbolListType.Committed, _vs_id, _bb,
a_syms => new SingleVolSurfaceCommittedOutputRetriever(_vs_id, _bb, a_syms)),
new SingleVolSurfaceDataSource(SingleVolSurfaceDataSource.SymbolListType.Combined, _vs_id, _bb,
a_syms => new SingleVolSurfaceRequestCalculator(_vs_id, a_syms, _bb)),
new SingleVolSurfaceMarketImpliedVolSource(_vs_id, _bb),
// new SingleVolSurfaceTheoSource(_vs_id, _bb),
// TODO: suspending heatmaps for now (12/24/21)
// new SingleVolSurfaceHeatmapManager (vs_id, t_bb),
// server work that can optionally be done on the client
new SingleVolSurfaceDataSource (SingleVolSurfaceDataSource.SymbolListType.Committed, _vs_id, _bb,
a_syms => new SingleVolSurfaceInterpGreeksPublisher (_vs_id, _bb, a_syms)),
};
}
private void _on_data(object tag, object data) {
if (_vs_activation_tag.Equals(tag)) {
if (_activated) {
// TODO: not cleaning up recources
return;
}
bool is_activation_signal = data is Boolean && (Boolean)data;
if (is_activation_signal) {
_activated = true;
_spin_resources();
}
}
}
#region IDisposable
private bool _is_disposed = false;
public void Dispose() {
if (!_is_disposed) {
_is_disposed = true;
_resources.ToList().ForEach(d => d.Dispose());
}
}
#endregion
}
}
@@ -1,236 +0,0 @@
namespace mbts.spark {
using bts;
using bts.api;
using mbts;
using mbts.analytics;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Collections;
/// This class publishes the market implied vols for the
/// selected expiration.
public class SingleVolSurfaceMarketImpliedVolSource : IDisposable {
// This keeps the last computed exp and its bbo
#region MD caching
private class CachedExpMD {
public SecurityExpiration exp = SecurityExpiration.empty;
public IDictionary<double, Tuple<VolSurfaceMDUnit, VolSurfaceMDUnit>> k_md_map =
new Dictionary<double, Tuple<VolSurfaceMDUnit, VolSurfaceMDUnit>>();
private bool _has_changed(
SecurityExpiration new_exp,
IDictionary<double, Tuple<VolSurfaceMDUnit, VolSurfaceMDUnit>> new_k_md_map) {
if (new_exp != exp) {
return true;
}
if (k_md_map.Count() != new_k_md_map.Count) {
return true;
}
foreach (var kv in k_md_map) {
Tuple<VolSurfaceMDUnit, VolSurfaceMDUnit> k_md;
if (!new_k_md_map.TryGetValue(kv.Key, out k_md)) {
return true;
}
if (!kv.Value.Item1.Equals(k_md.Item1) ||
!kv.Value.Item2.Equals(k_md.Item2)) {
return true;
}
}
return false;
}
public bool set(
SecurityExpiration new_exp,
IDictionary<double, Tuple<VolSurfaceMDUnit, VolSurfaceMDUnit>> new_k_md_map) {
bool has_changed = _has_changed(new_exp, new_k_md_map);
if (has_changed) {
exp = new_exp;
k_md_map = new_k_md_map;
}
return has_changed;
}
}
#endregion
private readonly int _vs_id;
private readonly ITag<IReadOnlyDictionary<uint, SecurityMD>> _in_bb_sec_map_tag;
private readonly ITag<mbts.analytics.VolSurfaceOutput> _in_bb_committed_output_tag;
private readonly ITag<VolSurfaceCalculationResponse> _in_bb_calc_resp_tag;
private readonly ITag<bool> _in_bb_inp_dirty_tag;
private readonly ITag<Tuple<VolSurfaceDisplayGridExpiration, bool>>
_in_bb_selected_exp_tag;
private readonly ITag<mbts.analytics.VolSurfaceEnums.MarketSide>
_in_bb_market_impliedvol_side_tag;
private readonly ITag<bool> _in_bb_ignore_market_implied_vol_source_settings_tag;
private CachedExpMD _cached_exp_md = new CachedExpMD();
private readonly ThreadedBlackboard _bb;
private readonly HighPerformanceTimer _timer = new HighPerformanceTimer();
private readonly PerfStatsLogger _logger = new PerfStatsLogger(50, 50);
private TimeSpan _compute_period = TimeSpan.FromMilliseconds(333);
private bool _is_dirty = true;
public SingleVolSurfaceMarketImpliedVolSource(int vs_id, ThreadedBlackboard bb) {
bts.Log.Gen.info($"SingleVolSurfaceMarketImpliedVolSource cons vs_id:{vs_id}");
_vs_id = vs_id;
_bb = bb;
_in_bb_sec_map_tag = SparkTags.SecuritiesTag;
_in_bb_committed_output_tag = SparkTags.VolSurfaceCommittedOutputTag(vs_id);
_in_bb_calc_resp_tag = SparkTags.VolSurfaceCalculationResponseTag(vs_id);
_in_bb_inp_dirty_tag = SparkTags.VolSurfaceDirtyStateTag(vs_id);
_in_bb_selected_exp_tag = SparkTags.VolSurfaceGridSelectionTag(_vs_id);
_in_bb_market_impliedvol_side_tag = SparkTags.VolSurfaceMarketImpliedVolSide(_vs_id);
_in_bb_ignore_market_implied_vol_source_settings_tag =
SparkTags.VolSurfaceIgnoreImpliedVolSettingsTag(vs_id);
_bb.subscribe(_in_bb_committed_output_tag);
_bb.subscribe(_in_bb_calc_resp_tag);
_bb.subscribe(_in_bb_inp_dirty_tag);
_bb.subscribe(_in_bb_selected_exp_tag);
_bb.subscribe(_in_bb_market_impliedvol_side_tag);
_bb.subscribe(_in_bb_ignore_market_implied_vol_source_settings_tag);
_bb.data_callback += _on_bb_data;
_bb.timer_callback += _on_bb_timer;
}
private void _on_bb_data(object tag, object data) {
if (tag != null)
if (_in_bb_committed_output_tag.Equals(tag) ||
_in_bb_calc_resp_tag.Equals(tag) ||
_in_bb_inp_dirty_tag.Equals(tag) || _in_bb_selected_exp_tag.Equals(tag) ||
_in_bb_market_impliedvol_side_tag.Equals(tag) ||
_in_bb_ignore_market_implied_vol_source_settings_tag.Equals(tag))
_is_dirty = true;
}
private void _check_bbo_change() {
var sc_data = _bb.read_state(SparkTags.SystemContractsTag);
Tuple<VolSurfaceDisplayGridExpiration, bool> sel_exp_tup =
_bb.read_state(_in_bb_selected_exp_tag);
if (sc_data == null || sel_exp_tup == null) {
return;
}
VolSurfaceExpiration new_sel_exp = sel_exp_tup.Item1.ToVSExp();
var new_md = sc_data.get_option_bbo_vsexp(new_sel_exp);
bool bbo_dirty = _cached_exp_md.set(new_md.Item1, new_md.Item2);
_is_dirty = _is_dirty || bbo_dirty;
}
private DateTime _last_publish_time = DateTime.MinValue;
private void _on_bb_timer() {
if (DateTime.Now - _last_publish_time >= _compute_period) {
_check_bbo_change();
if (_is_dirty)
_recompute_and_publish();
_is_dirty = false;
_last_publish_time = DateTime.Now;
}
}
private void _recompute_and_publish() {
Tuple<VolSurfaceDisplayGridExpiration, bool> sel_exp =
_bb.read_state(_in_bb_selected_exp_tag);
VolSurfaceOutput vs_output = _resolve_curr_cand();
if (vs_output != null && vs_output.volsurface_input != null &&
vs_output.aux_data_map != null &&
sel_exp != null && sel_exp.Item1 != null) {
var impliedvol_side = _get_market_impliedvol_side(_bb, _vs_id);
VolSurfaceExpiration orig_exp = new VolSurfaceExpiration() {
symbol = sel_exp.Item1.symbol,
expiration = sel_exp.Item1.expiration
};
_timer.start();
VolSurfaceExpiration md_exp;
VolCurveMarketImpliedVolData exp_impl_vol_map =
VolSurfaceCoreFunctions.compute_implied_vols(
vs_output.volsurface_input,
orig_exp, vs_output.aux_data_map,
arg_exp => _get_bbo(arg_exp),
impliedvol_side,
_ignore_market_implied_vol_source_settings(_bb, _vs_id),
out md_exp);
_timer.stop();
_logger.log("SingleVolSurfaceMarketImpliedVolSource",
"SingleVolSurfaceMarketImpliedVolSource",
_timer.lastIntervalTime);
if (exp_impl_vol_map is null) {
return;
}
bts.Log.Gen.info(
$"SingleVolSurfaceMarketImpliedVolSource._recompute_and_publish " +
exp_impl_vol_map.log_string());
_bb.post(SparkTags.VolSurfaceMarketImpliedVolTag(_vs_id),
new Dictionary<VolSurfaceExpiration,
Tuple<VolSurfaceExpiration, VolCurveMarketImpliedVolData>>() {
{ orig_exp, Tuple.Create(md_exp, exp_impl_vol_map) }
});
}
}
// Returns the candidate or committed VolSurface depending
private VolSurfaceOutput _resolve_curr_cand() {
bool is_dirty = _bb.read_state(_in_bb_inp_dirty_tag, false);
if (is_dirty) {
VolSurfaceCalculationResponse vs_resp = _bb.read_state(_in_bb_calc_resp_tag);
return vs_resp != null ? vs_resp.volsurface_calculation_output : null;
} else
return _bb.read_state(_in_bb_committed_output_tag);
}
private IDictionary<double, Tuple<VolSurfaceMDUnit, VolSurfaceMDUnit>>
_get_bbo(VolSurfaceExpiration vs_exp) {
return get_option_bbo(_bb, vs_exp);
}
private static bool _normalize_bbo = true;
#region Static helpers
// for some markets (crypto ie), the options prices are not in
// the same terms as strikes, ie strikes are in USD whereras the
// option prices are in BTC
internal static double get_option_price_mult(
ThreadedBlackboard bb,
VolSurfaceExpiration option_exp) {
var driver_map = bb.read_state(SparkTags.AllOptionDriverBBOTag);
if (driver_map != null &&
driver_map.TryGetValue(option_exp.symbol, out var sym_map)) {
var vs_md = sym_map.get_driver_md(option_exp.expiration);
return vs_md.get_driver();
}
return Double.NaN;
}
internal static
IDictionary<double, Tuple<VolSurfaceMDUnit, VolSurfaceMDUnit>>
get_option_bbo(ThreadedBlackboard bb, VolSurfaceExpiration vs_exp) {
var sc_data = bb.read_state(SparkTags.SystemContractsTag);
IDictionary<double, Tuple<VolSurfaceMDUnit, VolSurfaceMDUnit>> rv =
sc_data.get_option_bbo_vsexp(vs_exp).Item2;
double mult = get_option_price_mult(bb, vs_exp);
if (_normalize_bbo)
return rv.ToDictionary(kv => kv.Key, kv =>
Tuple.Create(kv.Value.Item1.mult_price(mult),
kv.Value.Item2.mult_price(mult)));
return rv;
}
internal static bool _ignore_market_implied_vol_source_settings(
ThreadedBlackboard bb, int vs_id) {
return bb.read_state(
SparkTags.VolSurfaceIgnoreImpliedVolSettingsTag(vs_id), false);
}
internal static VolSurfaceEnums.MarketSide
_get_market_impliedvol_side(ThreadedBlackboard bb, int vs_id) {
return bb.read_state(
SparkTags.VolSurfaceMarketImpliedVolSide(vs_id),
VolSurfaceEnums.MarketSide.Mid);
}
#endregion
#region IDisposable
public void Dispose() {
_bb.data_callback -= _on_bb_data;
_bb.timer_callback -= _on_bb_timer;
}
#endregion
}
}
@@ -1,91 +0,0 @@
using System;
using System.Collections.Generic;
using mbts.analytics;
using bts.api;
using System.Linq;
namespace mbts.spark {
// f (SystemContractData,
// VolSurfaceNonVolInput,
// IDictionary<mbts.analytics.VolSurfaceExpiration, double>) -> VolSurfaceNonVolData
// Subs :
// 1. Securities (SystemContractsTag)
// 2. NonVolInput (VolSurfaceNonVolInputTag)
// 3. Driver prices (VolSurfaceOptionDriverTag)
// Publishes :
// 1. VolSurfaceNonVolData which is simply a union of the 3 inputs
// 2. VolSurfaceStrikeMap
public class SingleVolSurfaceNonVolDataSource : IDisposable {
private readonly int _vs_id;
private readonly IEnumerable<string> _option_symbols;
private readonly ThreadedBlackboard _bb;
private readonly ITag<SystemContractData> _in_bb_contract_data_tag;
private readonly ITag<VolSurfaceNonVolInput> _in_bb_vs_nonvol_input_tag;
private readonly ITag<IReadOnlyDictionary<string, OptionDriverPriceMap>> _in_bb_all_driver_price_tag;
private readonly ITag<mbts.analytics.VolSurfaceNonVolData> _out_bb_vs_nonvol_data_tag;
private readonly ITag<mbts.analytics.VolSurfaceStrikeMap> _out_bb_vs_contracts_tag;
public SingleVolSurfaceNonVolDataSource(int vs_id, IEnumerable<string> option_symbols,
ThreadedBlackboard bb) {
bts.Log.Gen.info($"SingleVolSurfaceNonVolDataSource vs_id:{vs_id}");
_vs_id = vs_id;
_option_symbols = option_symbols;
_bb = bb;
_in_bb_contract_data_tag = SparkTags.SystemContractsTag;
_in_bb_vs_nonvol_input_tag = SparkTags.VolSurfaceNonVolInputTag;
_in_bb_all_driver_price_tag = SparkTags.AllOptionDriverBBOTag;
_out_bb_vs_nonvol_data_tag = SparkTags.VolSurfaceNonVolDataTag(vs_id);
_out_bb_vs_contracts_tag = SparkTags.VolSurfaceContractsTag(vs_id);
_bb.subscribe(_in_bb_contract_data_tag);
_bb.subscribe(_in_bb_vs_nonvol_input_tag);
_bb.subscribe(_in_bb_all_driver_price_tag);
_bb.data_callback += _on_bb_data;
_init();
}
private void _init() {
_publish_vs_strike_map();
_recompute_and_fire();
}
private void _publish_vs_strike_map() {
SystemContractData sc_data = _bb.read_state(_in_bb_contract_data_tag);
if (sc_data != null) {
var k_map = new VolSurfaceStrikeMap(_option_symbols, sc_data);
bts.Log.Gen.info($"SingleVolSurfaceNonVolDataSource vs_id:{_vs_id} " +
"publishing strike_map sz:{k_map.strike_map.Count()}");
_bb.post(_out_bb_vs_contracts_tag, new VolSurfaceStrikeMap(_option_symbols, sc_data));
}
}
private void _on_bb_data(object tag, object data) {
if (_in_bb_contract_data_tag.Equals(tag)) {
_publish_vs_strike_map();
_recompute_and_fire();
} else if (_in_bb_vs_nonvol_input_tag.Equals(tag) ||
_in_bb_all_driver_price_tag.Equals(tag))
_recompute_and_fire();
}
private void _recompute_and_fire() {
SystemContractData sc_data = _bb.read_state(_in_bb_contract_data_tag);
VolSurfaceNonVolInput vs_nonvol_input = _bb.read_state(_in_bb_vs_nonvol_input_tag);
var all_sym_price_map = _bb.read_state(_in_bb_all_driver_price_tag);
var exp_price_map = OptionDriverPriceMap.get_vs_price_map(
all_sym_price_map, (s) => _option_symbols.Contains(s));
if (sc_data != null && vs_nonvol_input != null && exp_price_map != null) {
bts.Log.Gen.diag($"SingleVolSurfaceNonVolDataSource vs_id:{_vs_id} " +
"publishing VolSurfaceNonVolData");
_bb.post(_out_bb_vs_nonvol_data_tag,
new VolSurfaceNonVolData(
vs_nonvol_input, exp_price_map,
new VolSurfaceStrikeMap(_option_symbols, sc_data).strike_map));
}
}
#region IDisposable
public void Dispose() { _bb.data_callback -= _on_bb_data; }
#endregion
}
}
@@ -1,168 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using bts.api;
using mbts.analytics;
namespace mbts.spark {
// All local changes to the VolSurface that trigger calculations
// are handled here.
// Subs :
// 1. VS Calc Req
// 2. VS Nonvol Data
// 3. Dirty
// Pubs :
// 1. Calc Resp
public class SingleVolSurfaceRequestCalculator : IDisposable {
private readonly int _vs_id;
private readonly HashSet<string> _symbols;
private readonly ThreadedBlackboard _bb;
private readonly ITag<VolSurfaceCalculationRequest> _in_bb_request_tag;
private readonly ITag<VolSurfaceNonVolData> _in_bb_nonvol_data_tag;
private readonly ITag<VolSurfaceStandardTime> _in_bb_vs_standard_time_tag;
private readonly ITag<VolSurfaceEnums.MarketSide> _in_bb_market_impliedvol_side_tag;
private readonly ITag<bool> _in_bb_dirty_tag;
private HighPerformanceTimer _timer = new HighPerformanceTimer();
/// data
private VolSurfaceOutput _last_output;
public SingleVolSurfaceRequestCalculator(int vs_id, IEnumerable<string> symbols,
ThreadedBlackboard threaded_bb) {
bts.Log.Gen.info($"SingleVolSurfaceRequestCalculator cons vs_id: {vs_id}");
_vs_id = vs_id;
_symbols = new HashSet<string>(symbols);
_bb = threaded_bb;
_in_bb_request_tag = SparkTags.VolSurfaceCalculationRequestTag(vs_id);
_in_bb_nonvol_data_tag = SparkTags.VolSurfaceNonVolDataTag(vs_id);
_in_bb_vs_standard_time_tag = SparkTags.VolSurfaceStandardTimeTag(vs_id);
_in_bb_market_impliedvol_side_tag = SparkTags.VolSurfaceMarketImpliedVolSide(vs_id);
_in_bb_dirty_tag = SparkTags.VolSurfaceDirtyStateTag(vs_id);
_bb.subscribe(_in_bb_request_tag);
_bb.subscribe(_in_bb_nonvol_data_tag);
_bb.subscribe(_in_bb_vs_standard_time_tag);
_bb.subscribe(_in_bb_vs_standard_time_tag);
_bb.subscribe(_in_bb_dirty_tag);
_bb.data_callback += _on_bb_data;
_recompute_and_publish(true);
}
private void _on_bb_data(object tag, object data) {
if (_in_bb_request_tag.Equals(tag) || _in_bb_dirty_tag.Equals(tag))
_recompute_and_publish(true);
else if (_in_bb_nonvol_data_tag.Equals(tag) || _in_bb_vs_standard_time_tag.Equals(tag))
_recompute_and_publish(false);
}
private void _recompute_and_publish(bool is_new_request) {
bool is_dirty = _bb.read_state(_in_bb_dirty_tag, false);
VolSurfaceNonVolData nonvol_data = _bb.read_state(_in_bb_nonvol_data_tag);
VolSurfaceStandardTime vs_standard_time = _bb.read_state(_in_bb_vs_standard_time_tag);
if (is_dirty && nonvol_data != null) {
_timer.start();
VolSurfaceCalculationRequest curr_req = _bb.read_state(_in_bb_request_tag),
effective_req = null;
if (is_new_request)
effective_req = curr_req;
else {
if (_last_output != null)
effective_req =
new VolSurfaceCalculationRequest(_last_output.volsurface_input, curr_req.request_id);
}
if (effective_req != null) {
IDictionary<VolSurfaceExpiration, VolSurfaceExpirationAuxiliaryData> aux_data_map =
VolSurfaceUtilityFunctions.compute_aux_data(effective_req.volsurface_input,
nonvol_data.input,
nonvol_data.driver_price_map,
vs_standard_time, true);
IDictionary<VolSurfaceExpiration, VolCurveAction> action_map =
_post_process_action(effective_req, aux_data_map);
_last_output = GeneralVolSurfaceCalculator.compute(effective_req.volsurface_input,
nonvol_data.contracts,
aux_data_map,
action_map,
null,
effective_req.cascade_up,
effective_req.cascade_down);
_timer.stop();
bts.Log.Gen.info($"SingleVolSurfaceRequestCalculator._recompute_and_publish time: " +
$"{_timer.lastIntervalTime}");
_bb.post(SparkTags.VolSurfaceCalculationResponseTag(_vs_id),
new VolSurfaceCalculationResponse(_last_output, effective_req.request_id));
}
}
}
/// Computes the impl vol if the action is fit to market
private IDictionary<VolSurfaceExpiration, VolCurveAction> _post_process_action(
VolSurfaceCalculationRequest req,
IDictionary<VolSurfaceExpiration, VolSurfaceExpirationAuxiliaryData> aux_data_map) {
IDictionary<VolSurfaceExpiration, VolCurveAction> rv = req.action_map;
/// TODO : VolCurveAction needs to be structured better. The UI enforces that
/// all exps have the same action, but the structure doesnt. So here the UI
/// constraint is flowing in
if (rv != null && rv.Count > 0) {
VolCurveAction rep_action = rv.ElementAt(0).Value;
if (rep_action.action_type == VolCurveAction.ActionType.FitToMarket) {
IDictionary<VolSurfaceExpiration, VolCurveMarketImpliedVolData> impl_vol_map =
_fill_in_implied_vols(req.volsurface_input, req.action_map, aux_data_map,
req.cascade_up, req.cascade_down);
rv = impl_vol_map.ToDictionary(kv => kv.Key, kv => new VolCurveAction(
new VolCurveMarketFitAction(rep_action.market_fit_action.fit_action, kv.Value,
rep_action.market_fit_action.use_weighted_regression)));
}
}
return rv;
}
private IDictionary<VolSurfaceExpiration, VolCurveMarketImpliedVolData> _fill_in_implied_vols(
VolSurfaceInput vs_inp,
IDictionary<VolSurfaceExpiration, VolCurveAction> action_map,
IDictionary<VolSurfaceExpiration, VolSurfaceExpirationAuxiliaryData> aux_data_map,
bool cascade_up, bool cascade_down) {
IDictionary<VolSurfaceExpiration, VolCurveMarketImpliedVolData> rv =
new Dictionary<VolSurfaceExpiration, VolCurveMarketImpliedVolData>();
VolCurveAction rep_action = action_map.ElementAt(0).Value;
HashSet<VolSurfaceExpiration> master_exps =
VolSurfaceUtilityFunctions.get_master_expirations(vs_inp, true);
IEnumerable<VolSurfaceExpiration> applicable_exps;
if (cascade_up || cascade_down)
applicable_exps =
VolSurfaceUtilityFunctions.get_exp_list_from_cascade(
vs_inp.surface_parameters.curve_parameters_map.Select(t => t.Item1),
action_map.Keys, cascade_up, cascade_down);
else
applicable_exps = action_map.Keys;
applicable_exps = applicable_exps.Where(vs_exp => master_exps.Contains(vs_exp));
VolSurfaceEnums.MarketSide impliedvol_side =
SingleVolSurfaceMarketImpliedVolSource._get_market_impliedvol_side(_bb, _vs_id);
foreach (VolSurfaceExpiration vs_exp in applicable_exps) {
VolSurfaceExpiration md_exp;
VolCurveMarketImpliedVolData exp_impl_data =
VolSurfaceCoreFunctions.compute_implied_vols(vs_inp, vs_exp, aux_data_map,
arg_vs_exp => SingleVolSurfaceMarketImpliedVolSource.get_option_bbo(_bb, arg_vs_exp),
impliedvol_side,
SingleVolSurfaceMarketImpliedVolSource._ignore_market_implied_vol_source_settings(
_bb, _vs_id),
out md_exp);
rv[vs_exp] = exp_impl_data;
}
return rv;
}
#region IDisposable
private bool _disposed = false;
public void Dispose() {
if (!_disposed) {
_disposed = true;
_bb.data_callback -= _on_bb_data;
}
}
#endregion
}
}
@@ -1,245 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using mbts.analytics;
using bts;
using bts.api;
using bts.api.analytics;
namespace mbts.spark {
// Publishes the committed and candidate greeks in the
// form of VolSurfaceTheoData
// (this was the data that was published in the winform syncfusion grid,
// with the candidate/committed next to each other)
// Subs :
// 1. Comm Vol Output
// 2. Cand Calc Response
// 3. Is Dirty (ie a pending change?)
// 4. Detailed Window State
// Pubs :
// 1. VolSurfaceTheoData (cand and comm theos)
public class SingleVolSurfaceTheoSource : IDisposable {
private readonly int _vs_id;
private readonly ThreadedBlackboard _bb;
private readonly ITag<VolSurfaceOutput> _in_committed_vol_output_tag;
private readonly ITag<VolSurfaceCalculationResponse> _in_candidate_vol_output_tag;
private readonly ITag<bool> _in_input_dirty_tag;
private readonly ITag<bool> _in_window_state_tag;
private readonly HighPerformanceTimer _timer = new HighPerformanceTimer();
private bool _is_dirty = true;
private static readonly IDictionary<VolSurfaceExpiration, IEnumerable<Theos>>
_empty_theos = new Dictionary<VolSurfaceExpiration, IEnumerable<Theos>>();
private VolSurfaceTheoData _last_data =
new VolSurfaceTheoData(new Dictionary<VolSurfaceExpiration, HashSet<double>>(),
_empty_theos, _empty_theos, false);
private uint _n_comps = 0;
public SingleVolSurfaceTheoSource(int vs_id, ThreadedBlackboard threaded_bb) {
bts.Log.Gen.info($"SingleVolSurfaceTheoSource cons vs_id:{vs_id}");
_vs_id = vs_id;
_bb = threaded_bb;
_in_committed_vol_output_tag = SparkTags.VolSurfaceCommittedOutputTag(_vs_id);
_in_candidate_vol_output_tag = SparkTags.VolSurfaceCalculationResponseTag(_vs_id);
_in_input_dirty_tag = SparkTags.VolSurfaceDirtyStateTag(_vs_id);
_in_window_state_tag = SparkTags.VolSurfaceTheoWindowStateTag(_vs_id);
_bb.subscribe(_in_committed_vol_output_tag);
_bb.subscribe(_in_candidate_vol_output_tag);
_bb.subscribe(_in_input_dirty_tag);
_bb.subscribe(_in_window_state_tag);
_bb.data_callback += _on_data;
_bb.timer_callback += _on_timer;
// (TODO) forcing computing of theos by publishing an
// active theos window tag, remove it
_bb.post(_in_window_state_tag, true);
}
#region Blackboard
private void _on_data(object tag, object data) {
if (_in_candidate_vol_output_tag.Equals(tag) ||
_in_committed_vol_output_tag.Equals(tag) ||
_in_input_dirty_tag.Equals(tag) || _in_window_state_tag.Equals(tag)) {
_is_dirty = true;
}
}
private void _on_timer() {
if (_is_dirty) {
// publishes new values when there is an
// 1. theos window up
// 2. waiting candidate change
_compute_and_publish(_is_active_candidate(), _is_active_theos_window());
_is_dirty = false;
}
}
#endregion
private void _compute_and_publish(bool is_active_candidate,
bool is_active_theos_window) {
VolSurfaceCalculationResponse calc_resp =
_bb.read_state(_in_candidate_vol_output_tag);
VolSurfaceOutput candidate_output =
calc_resp != null ? calc_resp.volsurface_calculation_output : null,
committed_output = _bb.read_state(_in_committed_vol_output_tag);
IDictionary<VolSurfaceExpiration, HashSet<double>> secs =
_get_securities(committed_output, candidate_output);
IDictionary<VolSurfaceExpiration, IEnumerable<Theos>> comm_theo_map =
_empty_theos, cand_theo_map = _empty_theos;
if (is_active_theos_window) {
comm_theo_map = _compute_theos(committed_output, secs);
if (is_active_candidate)
cand_theo_map = _compute_theos(candidate_output, secs);
} else {
if (is_active_candidate)
cand_theo_map = _compute_theos(candidate_output, secs);
}
var new_data = new VolSurfaceTheoData(secs, comm_theo_map,
cand_theo_map, is_active_candidate);
if (_is_valid_update(new_data))
_bb.post(SparkTags.VolSurfaceTheoOutputTag(_vs_id), new_data);
}
private bool _is_valid_update(VolSurfaceTheoData new_data) {
bool is_spurious = _last_data.committed_theo_map.Count == 0 &&
_last_data.candidate_theo_map.Count == 0 &&
new_data.committed_theo_map.Count == 0 &&
new_data.candidate_theo_map.Count == 0;
_last_data = new_data;
return !is_spurious;
}
private IDictionary<VolSurfaceExpiration, IEnumerable<Theos>> _compute_theos(
VolSurfaceOutput vs_output,
IDictionary<VolSurfaceExpiration, HashSet<double>> exp_strikes) {
if (vs_output != null) {
_timer.start();
var exp_volmat_map = VolSurfaceVolMatrixCalculator.generate_volmatrix(
vs_output.volsurface_input,
exp_strikes.ToDictionary(kv => kv.Key,
kv => kv.Value as IEnumerable<double>),
vs_output.aux_data_map,
new double[] { 0.0 }, false, true, false, false, false);
_timer.stop();
_n_comps++;
Log.Gen.info($"SingleVolSurfaceTheoSource._compute_theos vs_id:{_vs_id} " +
$"vol time:{ _timer.lastIntervalTime} msecs n_comps: {_n_comps}");
_timer.start();
var theo_map = VolSurfaceTheoCalculator.compute_standard_greeks(
vs_output.volsurface_input.surface_settings, exp_volmat_map, true);
_timer.stop();
Log.Gen.info($"SingleVolSurfaceTheoSource._compute_theos vs_id:{_vs_id} " +
$"theo time:{ _timer.lastIntervalTime} msecs n_comps: {_n_comps}");
return theo_map;
}
return new Dictionary<VolSurfaceExpiration, IEnumerable<Theos>>();
}
// plucks the data off the bus, computes the theos and returns it
public static IDictionary<VolSurfaceExpiration, IEnumerable<Theos>> compute_cand_theos(
int vs_id, ThreadedBlackboard bb) {
VolSurfaceCalculationResponse calc_resp =
bb.read_state(SparkTags.VolSurfaceCalculationResponseTag(vs_id));
VolSurfaceOutput vs_output =
calc_resp != null ? calc_resp.volsurface_calculation_output : null;
IDictionary<VolSurfaceExpiration, HashSet<double>> exp_strikes =
VolSurfaceUtilityFunctions.get_contracts(vs_output);
if (vs_output != null && exp_strikes != null) {
var exp_volmat_map = VolSurfaceVolMatrixCalculator.generate_volmatrix(
vs_output.volsurface_input,
exp_strikes.ToDictionary(kv => kv.Key,
kv => kv.Value as IEnumerable<double>),
vs_output.aux_data_map,
new double[] { 0.0 }, false, true, false, false, false);
var theo_map = VolSurfaceTheoCalculator.compute_standard_greeks(
vs_output.volsurface_input.surface_settings, exp_volmat_map, true);
return theo_map;
}
return new Dictionary<VolSurfaceExpiration, IEnumerable<Theos>>();
}
public static IEnumerable<bts.api.SecurityTuple> get_vs_sectups(
int vs_id, ThreadedBlackboard bb) {
VolSurfaceUsageListImmutable vs_usage_list = bb.read_state(SparkTags.VolSurfaceUsageTag);
return vs_usage_list.get_sectups(vs_id);
}
// old -> new transformation, this is slow ! transforms data from one
// form to another
public static ArchivedTheoList
convert_to_id_map(IDictionary<VolSurfaceExpiration, IEnumerable<Theos>> theos,
SystemContractData sc_data) {
Func<Theos, PutOrCall, uint, ArchivedSecurityTheo> mk_theo = (t, cp, id) => {
ArchivedSecurityTheo rv = new ArchivedSecurityTheo();
rv.Id = id;
rv.Driver = t.driver;
rv.Vol = t.vol;
if (cp == PutOrCall.Call) {
rv.Theo = t.call;
rv.Theo = t.cdelta;
} else {
rv.Theo = t.put;
rv.Theo = t.pdelta;
}
return rv;
};
Func<string, DateTime, double, Tuple<uint?, uint?>> get_id = (s, e, k) => {
foreach (Venue v in Enum.GetValues(typeof(Venue))) {
var rv = sc_data.get_option_sec_id(v, s, e, k);
if (rv != null)
return rv;
}
return null;
};
var rv = new List<ArchivedSecurityTheo>();
foreach (var exp_kv in theos) {
var exp = exp_kv.Key;
foreach (var t in exp_kv.Value) {
var strike = t.strike;
var cp_id = get_id(exp.symbol, exp.expiration, strike);
if (cp_id != null) {
if (cp_id.Item1.HasValue) {
var c_theo = mk_theo(t, PutOrCall.Call, cp_id.Item1.Value);
rv.Add(c_theo);
}
if (cp_id.Item2.HasValue) {
var p_theo = mk_theo(t, PutOrCall.Call, cp_id.Item2.Value);
rv.Add(p_theo);
}
}
}
}
ArchivedTheoList rv_list = new ArchivedTheoList();
rv_list.SecTheo.AddRange(rv);
return rv_list;
}
private IDictionary<VolSurfaceExpiration, HashSet<double>> _get_securities(
VolSurfaceOutput commited_output, VolSurfaceOutput candidate_output) {
if (candidate_output != null)
/// candidate output wins if its active
return VolSurfaceUtilityFunctions.get_contracts(candidate_output);
else if (commited_output != null)
return VolSurfaceUtilityFunctions.get_contracts(commited_output);
else
return new Dictionary<VolSurfaceExpiration, HashSet<double>>();
}
/// If the details window is not active, the calculations are suspended
private bool _is_active_theos_window() {
return _bb.read_state(_in_window_state_tag, false);
}
private bool _is_active_candidate() {
return _bb.read_state(_in_input_dirty_tag, false);
}
#region IDisposable
public void Dispose() {
_bb.data_callback -= _on_data;
_bb.timer_callback -= _on_timer;
}
#endregion
}
}
@@ -1,34 +0,0 @@
using System;
using mbts.analytics;
namespace mbts.spark {
public class SingleVolSurfaceTimeSource : IDisposable {
private readonly int _vs_id;
private readonly ThreadedBlackboard _bb;
private readonly TimeSpan _publish_period = TimeSpan.FromMinutes(VolSurfaceConstants.vol_time_sample_mins);
private DateTime _last_publish_time = DateTime.MinValue;
public SingleVolSurfaceTimeSource(int vs_id, ThreadedBlackboard bb) {
bts.Log.Gen.info($"SingleVolSurfaceTimeSource cons vs_id:{vs_id}");
_vs_id = vs_id;
_bb = bb;
_bb.timer_callback += _on_timer;
}
private void _on_timer() {
if (DateTime.Now - _last_publish_time >= _publish_period) {
_last_publish_time = DateTime.Now;
VolSurfaceStandardTime time = VolSurfaceStandardTime.get_local_default();
bts.Log.Gen.info($"SingleVolSurfaceTimeSource vs_id:{_vs_id} posting time:{time.ToString()}");
_bb.post(SparkTags.VolSurfaceStandardTimeTag(_vs_id), time);
}
}
#region IDisposable
public void Dispose() {
_bb.timer_callback -= _on_timer;
}
#endregion
}
}
@@ -1,95 +0,0 @@
using mbts.spark;
using System;
using System.Collections.Generic;
using bts.api;
using System.Linq;
namespace mbts.analytics {
// Thin class that assembles all symbol based data published on different
// tags, into IReadOnlyDictionary of symbol vs data publsihed under one tag
public class SymbolAggregationPublisher<TData> : IDisposable {
private readonly ThreadedBlackboard _bb;
private readonly SecurityType _sec_type;
Func<string, ITag<TData>> _get_tag;
// the tag on which the output will be published
ITag<IReadOnlyDictionary<string, TData>> _out_tag;
private readonly ITag<SystemContractData> _sc_data_tag;
private Dictionary<string, ITag<TData>> _tag_map =
new Dictionary<string, ITag<TData>>();
private HashSet<object> _obj_tags = new HashSet<object>();
private bool _dirty = true;
public SymbolAggregationPublisher(
ThreadedBlackboard bb,
SecurityType sec_type,
Func<string, ITag<TData>> get_tag,
ITag<IReadOnlyDictionary<string, TData>> out_tag) {
_bb = bb;
_sec_type = sec_type;
_get_tag = get_tag;
_out_tag = out_tag;
_sc_data_tag = SparkTags.SystemContractsTag;
_bb.subscribe(SparkTags.SystemContractsTag);
_bb.data_callback += _on_bb_data;
_bb.timer_callback += _on_timer;
_handle_sc_data();
}
private void _on_bb_data(object tag, object data) {
if (_sc_data_tag.Equals(tag)) {
_handle_sc_data();
} else {
if (_obj_tags.Contains(tag)) {
_dirty = true;
}
}
}
private void _handle_sc_data() {
var sc_data = _bb.read_state(_sc_data_tag);
if (sc_data == null) {
return;
}
foreach (var st in sc_data.sectup_map) {
if (st.security_type != _sec_type) {
continue;
}
// this is not correct since it is assuming symbol/name is
// unique across securty_tuples
string symbol = st.security_name;
if (!_tag_map.ContainsKey(symbol)) {
var tag = _get_tag(symbol);
if (tag != null) {
_tag_map.Add(symbol, tag);
_obj_tags.Add(tag);
_bb.subscribe(tag);
_dirty = true;
}
}
}
}
private void _on_timer() {
if (_dirty) {
_dirty = false;
Dictionary<string, TData> output = new Dictionary<string, TData>();
foreach (var kv in _tag_map) {
var symbol = kv.Key;
var symbol_tag = kv.Value;
TData symbol_data = _bb.read_state(symbol_tag);
output.Add(symbol, symbol_data);
}
IReadOnlyDictionary<string, TData> ro_output = output;
bts.Log.Gen.diag($"SymbolAggregationPublisher._on_timer publishing " +
$"tag: {_out_tag} sz: {ro_output.Count}");
_bb.post(_out_tag, ro_output);
}
}
public void Dispose() {
_bb.data_callback -= _on_bb_data;
_bb.timer_callback -= _on_timer;
}
}
}
@@ -1,334 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using mbts.analytics;
using bts.api;
using bts;
using bts.api.analytics;
using bts.api.core;
using bts.api.position;
using mbts;
using System.Reactive.Linq;
using System.Collections;
using mbts.spark;
using System.DirectoryServices.ActiveDirectory;
using Spark.Core.Protobuf;
using mbts.ui;
// using mbts.bb;
namespace mbts.spark {
internal class ResourceAllocator : IDisposable {
private List<IDisposable> _disps = new List<IDisposable>();
private Dictionary<SecurityTuple, SingleOptionDriverPricePublisher> _option_driver_map =
new Dictionary<SecurityTuple, SingleOptionDriverPricePublisher>();
ThreadedBlackboard _bb;
public ResourceAllocator(IBus bus, ThreadedBlackboard bb) {
bts.Log.Gen.info("ResourceAllocator started");
_bb = bb;
var s = bus.subscribe(SparkTags.SystemContractsTag).OnDispatcher().Subscribe(_on_data);
_disps.Add(s);
}
private void _on_data(SystemContractData d) {
bts.Log.Gen.info(String.Format("ResourceAllocator._on_data sz: {0}", d.sec_md_map.Count()));
foreach (SecurityTuple sec_tup in d.get_options()) {
if (!_option_driver_map.ContainsKey(sec_tup)) {
bts.Log.Gen.info($"ResourceAllocator._on_data allocating SingleOptionDriverPricePublisher for '{sec_tup}'");
_option_driver_map.Add(sec_tup, new SingleOptionDriverPricePublisher(sec_tup, _bb));
}
}
}
public void Dispose() {
_disps.ForEach(d => d.Dispose());
}
}
// This is the anologous to the QuoteSetBlackboardManager. There
// is only instance of this per running app and it does the folliwing
// 1. Publishes
// - SystemContractsData
// - Vol Surface symbol usage tag (VolSurfaceUsageTag)
// - Vol Surface List tag (VolSurfaceListTag)
// - Vol Surface Non Vol Input (config + exp_params) (VolSurfaceNonVolInputTag)
// - Activation Tag for newly created VS's (VolSurfaceActivationTag) (retired)
// 2. Listens to the activation tag (also published by the UI) and
// creates the SingleVolSurfaceManager for the VS
public class VolSurfaceBusManager : IDisposable {
private List<IDisposable> _disps = new List<IDisposable>();
private ThreadedBlackboard _bb;
private bts.api.analytics.AnalyticsService _analytics_service;
// in tags
private readonly ITag<SystemContractData> _in_scdata_tag =
SparkTags.SystemContractsTag;
private readonly ITag<VolSurfaceSettings> _in_bb_create_tag = SparkTags.VolSurfaceCreateTag;
private readonly ITag<int> _in_bb_delete_tag = SparkTags.VolSurfaceDeleteTag;
private readonly ITag<AnalyticsExpirationParametersMap> _in_bb_exp_params_tag =
SparkTags.ExpirationParametersInputTag;
private readonly ITag<ClientArchivedVolRequest> _in_bb_req_vol = SparkTags.RequestArchivedVols;
// state
private SystemContractData _contract_data = null;
private IDictionary<int, SingleVolSurfaceManager> _vs_manager_map =
new Dictionary<int, SingleVolSurfaceManager>();
private Queue<mbts.analytics.VolSurfaceSettings> _waiting_creations =
new Queue<mbts.analytics.VolSurfaceSettings>();
private bts.api.IBus _bus;
private List<IDisposable> _subs = new List<IDisposable>();
private HighPerformanceTimer _timer = new HighPerformanceTimer();
public VolSurfaceBusManager(bts.api.IBus bus,
bts.api.analytics.AnalyticsService analytics_service,
bts.api.orderman.OrderService order_service) {
bts.Log.Ui.info("VSBusManager cons tid:{VolSurfaceTroubleshootingFunctions.tid()}");
_bus = bus;
_bb = new ThreadedBlackboard("AW2", bus);
_analytics_service = analytics_service;
// subs to bb
_bb.subscribe(_in_scdata_tag);
_bb.subscribe(_in_bb_create_tag);
_bb.subscribe(_in_bb_delete_tag);
_bb.subscribe(_in_bb_exp_params_tag);
_bb.subscribe(_in_bb_req_vol);
_bb.data_callback += _on_bb_update;
_bb.timer_callback += _on_timer;
// sub to service
var vs_sub = _analytics_service.subscribei_volsurfaces()
.ObserveOn(SynchronizationContext.Current)
.Subscribe(_on_vss);
var vs_usage_sub = _analytics_service.subscribei_volsurface_usage()
.ObserveOn(SynchronizationContext.Current)
.Subscribe(_on_vs_usage_update);
_subs.Add(vs_sub);
_subs.Add(vs_usage_sub);
_subs.Add(new AnalyticsParametersManager(bus, _analytics_service));
_subs.Add(new ResourceAllocator(bus, _bb));
_subs.Add(new SymbolAggregationPublisher<OptionDriverPriceMap>(
_bb, SecurityType.Option, sym => SparkTags.OptionDriverBBOTag(sym),
SparkTags.AllOptionDriverBBOTag));
_subs.Add(new SymbolAggregationPublisher<OptionTheoInterpolationData>(
_bb, SecurityType.Option, sym => SparkTags.SymbolInterpGreeksTag(sym),
SparkTags.AllInterpGreeks));
_subs.Add(new SymbolAggregationPublisher<ExpStrikeKeyedData<TheoPoint>>(
_bb, SecurityType.Option, sym => SparkTags.TC2Tags.LiveTheosTag(sym),
SparkTags.TC2Tags.AllLiveTheosTag));
_subs.Add(new LiveTheoPublisher(_bb));
_subs.Add(new InterpTheosServerPublisher(_bb, order_service));
_subs.Add(new VolSurfaceInterpGreeksMultiplexer(_bb));
// usage
var list_sub = _bus.subscribe(SparkTags.VolSurfaceListTag).OnDispatcher().Subscribe(t => {
VolSurfaceUsageList ulist = new VolSurfaceUsageList();
IDictionary<string, int> name_to_ids = new Dictionary<string, int>();
foreach (var kv in t) {
name_to_ids[kv.Value] = kv.Key;
}
Log.Ui.info($"VolSurfaceUsageList name_to_ids count: {name_to_ids.Count}");
var vs_usage = mbts.config.Configuration.get<bts.config.toggles.VolSurfaceUsage>();
Log.Ui.info($"VolSurfaceUsageList vs_usage acount: {vs_usage.vol_surface_usage.Count}");
foreach (var u in vs_usage.vol_surface_usage) {
string option_name = u.option_name;
string vs_name = u.vs_name;
int vs_key;
if (name_to_ids.TryGetValue(vs_name, out vs_key)) {
ulist.UsageList.Add(new VolSurfaceUsageEntry() {
VsId = vs_key,
SecTup = new bts.api.SecurityTuple {
Type = SecurityType.Option,
Venue = Venue.Deribit,
Symbol = option_name
}
});
} else {
Log.Gen.error($"Could not find vol surface with name: {vs_name}");
}
}
var list_imm = new VolSurfaceUsageListImmutable(ulist);
Log.Ui.info(list_imm.log_string());
_bb.post(SparkTags.VolSurfaceUsageTag, list_imm);
_spin_vss(list_imm);
});
_disps.Add(list_sub);
// f(contract keyed theos, securities) -> id keyed theos
// (so the newer UI controls can access theos vis sec keys)
var theo_sub =
_bus.subscribe(SparkTags.TC2Tags.AllLiveTheosTag)
.CombineLatest(bus.subscribe(SparkTags.SystemContractsTag),
(theos, sc_data) => (theos, sc_data)).Subscribe(
tup => {
var keyed_theos = _assemble_keyed_theos(tup.sc_data, tup.theos);
_bus.post(SparkTags.KeyedTheos, keyed_theos);
}
);
_disps.Add(theo_sub);
}
static IReadOnlyDictionary<uint, VolSurfaceTheoPoint> _assemble_keyed_theos(
SystemContractData sc_data,
IReadOnlyDictionary<string, ExpStrikeKeyedData<TheoPoint>> theos) {
if (sc_data is null || theos is null) {
return new Dictionary<uint, VolSurfaceTheoPoint>(0);
}
HighPerformanceTimer timer = new HighPerformanceTimer();
timer.start();
Dictionary<uint, VolSurfaceTheoPoint> rv = new Dictionary<uint, VolSurfaceTheoPoint>();
foreach (var kv in theos) {
var symbol = kv.Key;
ExpStrikeKeyedData<TheoPoint> sym_theos = kv.Value;
if (sym_theos == null)
continue;
foreach (var s_kv in sym_theos.get_data_linearly()) {
DateTime exp = s_kv.first;
double strike = s_kv.second;
TheoPoint tp = s_kv.third;
// TODO: fix exchange later
Tuple<uint?, uint?> keys =
sc_data.get_option_sec_id(Venue.Deribit, symbol, exp, strike);
if (keys != null) {
var c_key = keys.Item1;
var p_key = keys.Item2;
if (c_key.HasValue) {
rv[c_key.Value] = new VolSurfaceTheoPoint(tp, true);
}
if (p_key.HasValue) {
rv[p_key.Value] = new VolSurfaceTheoPoint(tp, false);
}
}
}
}
timer.stop();
Log.Gen.info($"VolSurfaceBusManager keyed theos count: {rv.Count} " +
$"time: {timer.lastIntervalTime}");
return rv;
}
public ThreadedBlackboard bb() {
return _bb;
}
void _spin_vss(VolSurfaceUsageListImmutable ulist) {
foreach (var u in ulist.UsageList) {
var vs_id = u.VsId;
_bb.post(SparkTags.VolSurfaceActiveUITag(vs_id), true);
}
}
void _on_vs_usage_update(Update<VolSurfaceUsageListImmutable, int> update) {
// TODO
return;
}
void _on_vss(bts.api.core.Update<VolSurfaceEntryImmutable, UInt64> update) {
bts.Log.Gen.info(String.Format("VSBusManager._on_vss tid:{0} count:{1}",
System.Threading.Thread.CurrentThread.ManagedThreadId, update.all.Count()));
IDictionary<int, string> to_publish = new Dictionary<int, string>();
// publish a dictionary of vs id vs vs names
foreach (VolSurfaceEntryImmutable vs in update.all) {
to_publish[vs.VsId] = vs.VsName;
}
_bb.post(SparkTags.VolSurfaceListTag, to_publish);
_init_vss(to_publish.Keys);
}
private void _init_vss(IEnumerable<int> vs_ids) {
// we consider every vs in the db as "activated" which might prove to be expensive
// (will take care of it later)
foreach (var vs_id in vs_ids) {
if (!_vs_manager_map.ContainsKey(vs_id)) {
_vs_manager_map.Add(vs_id, new SingleVolSurfaceManager(
vs_id, _bb, _analytics_service));
}
}
}
private void _on_bb_update(object tag, object data) {
if (_in_scdata_tag.Equals(tag)) {
_contract_data = _bb.read_state(_in_scdata_tag);
}
if (_in_bb_create_tag.Equals(tag)) {
// creations are written in a queue and handled later in the timer
// callback
mbts.analytics.VolSurfaceSettings vs_settings = data as mbts.analytics.VolSurfaceSettings;
bts.Log.Gen.info(String.Format("VSBusManager._on_bb_update received vs creation tag vs:{0}",
ProtobufSerializationHelper.serialize_to_string(vs_settings)));
_waiting_creations.Enqueue(vs_settings);
} else if (_in_bb_delete_tag.Equals(tag)) {
int vs_id = (int)data;
try {
IntWrapper vs_id_w = new IntWrapper();
vs_id_w.Data = vs_id;
_analytics_service.delete_volsurface(vs_id_w);
} catch (Exception ex) {
Log.Gen.error(String.Format("Vol Surface deletion failed with exception:{0}", ex.Message));
_bb.post(SparkTags.MessageDisplayTag,
new MessageDisplayData("Vol Surface Deletion",
String.Format("Could not delete Vol Surface, Error : {0}", ex.Message)));
}
} else if (_in_bb_exp_params_tag.Equals(tag)) {
AnalyticsExpirationParametersMap exp_param_map = data as AnalyticsExpirationParametersMap;
// TODO, add whatever else is needed to AnalyticsExpirationParametersMap -> VolSurfaceNonVolInputTag
_bb.post(SparkTags.VolSurfaceNonVolInputTag,
new mbts.analytics.VolSurfaceNonVolInput(exp_param_map.exp_map.ToDictionary()));
} else if (_in_bb_req_vol.Equals(tag)) {
ClientArchivedVolRequest client_req = _bb.read_state(_in_bb_req_vol);
ArchivedTheoRetrieval ret = client_req.ret;
if (ret == null || ret.SecTup == null) {
bts.Log.Ui.warn($"VolSurfaceBusManager malformed ArchivedTheoRetrieval");
ArchivedTheoList empty = new ArchivedTheoList();
_bb.post(SparkTags.ResponseArchivedVols, Tuple.Create(client_req, empty));
return;
}
bts.Log.Ui.info($"VolSurfaceBusManager ArchivedTheoRetrieval id: {client_req.id} save_time: {ret.SaveTime} " +
$"sec_tup: {ret.SecTup.Venue}_{ret.SecTup.Type}_{ret.SecTup.Symbol}");
_timer.start();
ArchivedTheoList arch_theos = _analytics_service.get_archived_theos(ret);
_timer.stop();
bts.Log.Ui.info($"VolSurfaceBusManager ArchivedTheoRetrieval time: {_timer.lastIntervalTime} " +
$"n_entries: {arch_theos.SecTheo.Count}");
_bb.post(SparkTags.ResponseArchivedVols, Tuple.Create(client_req, arch_theos));
}
}
private int _timer_count = 0;
private void _on_timer() {
Action<string> report_err = (string err_txt) => {
Log.Gen.error(String.Format("VSBusManager, creation failed with message:{0}", err_txt));
_bb.post(SparkTags.MessageDisplayTag, new MessageDisplayData("Vol Surface Addition",
String.Format("Could not create Vol Surface, Error : {0}", err_txt)));
};
bts.Log.Gen.diag(String.Format("VSBusManager._on_timer tid:{0} count:{1}",
System.Threading.Thread.CurrentThread.ManagedThreadId, _timer_count++));
if (_waiting_creations.Count == 0) {
return;
}
if (_contract_data == null) {
return;
}
mbts.analytics.VolSurfaceSettings vs_settings = _waiting_creations.Dequeue();
IDictionary<string, IEnumerable<DateTime>> exp_map = _contract_data.get_option_expirations(VolSurfaceDataFunctions.get_symbols(vs_settings), false);
VolSurfaceInput vs_input = mbts.analytics.VolSurfaceDataFunctions.get_default_vs_input(vs_settings, exp_map);
var reply = _analytics_service.get_new_volsurface_id(new VoidMessage());
if (!reply.Ok) {
report_err("Could not obtain new ID");
return;
}
bts.Log.Gen.info(String.Format("VSBusManager, successfully obtained new vs_id:{0}", reply.NewId));
vs_input.surface_settings.core_settings.vol_surface_id = reply.NewId;
_timer.start();
ResultMessage res = VolSurfaceUtilityFunctions.save_volsurface(vs_input, _analytics_service);
_timer.stop();
if (!res.Success) {
report_err(res.ErrorMessage);
return;
}
Log.Gen.info(String.Format("VSBusManager, successfully created vol surface, vs_id:{0} ts:{1} msecs",
vs_input.surface_settings.core_settings.vol_surface_id,
_timer.lastIntervalTime.ToString()));
_bb.post(SparkTags.VolSurfaceActivationTag(reply.NewId), true, false);
}
public void Dispose() {
_subs.ForEach(s => s.Dispose());
}
}
}
@@ -1,30 +0,0 @@
using bts.api.analytics;
using mbts.analytics;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace mbts.spark {
/// Conveniance wrapper around the VolSurfaceInputSnapshotListStream rows
public class VolSurfaceInputSnapshot {
public readonly int volsurface_id;
public readonly int transaction_id;
public readonly DateTime save_time_utc;
public readonly string save_marker;
public readonly byte[] data;
public VolSurfaceInputSnapshot(bts.api.analytics.VolSurfaceEntryImmutable vs) {
volsurface_id = vs.VsId;
transaction_id = 0;
save_time_utc = VolSurfaceUtilityFunctions.from_unix_epoch_msecs(vs.SaveTime);
data = vs.Volsurface.ToByteArray();
save_marker = save_time_utc.ToShortDateString() + " " +
save_time_utc.ToLocalTime().ToLongTimeString();
}
}
}
@@ -1,26 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using mbts.analytics;
namespace mbts.spark
{
public class VolSurfaceTheoAlertData
{
public readonly string guid;
public readonly int vs_id;
public readonly IDictionary<VolSurfaceExpiration, IEnumerable<Theos>> theos;
public VolSurfaceTheoAlertData(string guid,
int vs_id,
IDictionary<VolSurfaceExpiration, IEnumerable<Theos>> theos)
{
this.guid = guid;
this.vs_id = vs_id;
this.theos = theos;
}
}
}
@@ -1,69 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using mbts.analytics;
namespace mbts.spark
{
public class VolSurfaceTheoData
{
/// This is the set of all contracts in the
public readonly IDictionary<VolSurfaceExpiration, HashSet<double>> all_contracts;
public readonly Dictionary<VolSurfaceExpiration, Dictionary<double, Theos>> committed_theo_map, candidate_theo_map;
private readonly bool _is_dirty;
public VolSurfaceTheoData(IDictionary<VolSurfaceExpiration, HashSet<double>> this_all_contracts,
IDictionary<VolSurfaceExpiration, IEnumerable<Theos>> this_committed_theo_map,
IDictionary<VolSurfaceExpiration, IEnumerable<Theos>> this_candidate_theo_map,
bool this_is_dirty)
{
all_contracts = this_all_contracts;
committed_theo_map = this_committed_theo_map.ToDictionary(kv => kv.Key, kv => kv.Value.ToDictionary(i => i.strike, i => i));
candidate_theo_map = this_candidate_theo_map.ToDictionary(kv => kv.Key, kv => kv.Value.ToDictionary(i => i.strike, i => i));
_is_dirty = this_is_dirty;
}
// TODO
// public IBlueRowCollection get_rows()
// {
// List<IBlueRow> rows = new List<IBlueRow>();
// IBlueTableSchema schema = new VolSurfaceTheoPointRow(-1, String.Empty, true, null, null, _is_dirty).schema;
// foreach (KeyValuePair<VolSurfaceExpiration, HashSet<double>> kvp in all_contracts)
// {
// VolSurfaceExpiration exp = kvp.Key;
// Dictionary<double, Theos> exp_comm_map, exp_cand_map;
// committed_theo_map.TryGetValue(exp, out exp_comm_map);
// candidate_theo_map.TryGetValue(exp, out exp_cand_map);
// foreach (double k in kvp.Value)
// {
// Theos committed_tp = null, candidate_tp = null;
// committed_tp = (exp_comm_map != null && exp_comm_map.TryGetValue(k, out committed_tp)) ? committed_tp : null;
// if (_is_dirty)
// candidate_tp = (exp_cand_map != null && exp_cand_map.TryGetValue(k, out candidate_tp)) ? candidate_tp : null;
// rows.Add(new VolSurfaceTheoPointRow(rows.Count, exp.symbol, true, committed_tp, candidate_tp, _is_dirty));
// rows.Add(new VolSurfaceTheoPointRow(rows.Count, exp.symbol, false, committed_tp, candidate_tp, _is_dirty));
// }
// }
// return new SequentialIDBlueTable(schema, rows.ToArray());
// }
public IEnumerable<VolSurfaceExpiration> get_all_expirations() { return all_contracts.Keys; }
// TODO
// public ExpStrikeKeyedData<Theos> get_exp_mapped_data(string option_sym, bool is_cand)
// {
// ExpStrikeKeyedData<Theos> rv = new ExpStrikeKeyedData<Theos>();
// IDictionary<VolSurfaceExpiration, Dictionary<double, Theos>> map = is_cand ? candidate_theo_map : committed_theo_map;
// if (map != null)
// foreach (KeyValuePair<VolSurfaceExpiration, Dictionary<double, Theos>> kv in map)
// {
// VolSurfaceExpiration exp = kv.Key;
// if (exp.symbol == option_sym)
// rv.set_data_for_expiration(exp.expiration, kv.Value);
// }
// return rv;
// }
}
}
@@ -1,20 +0,0 @@
namespace mbts.analytics {
using mbts.spark;
// TheoPoint (from edge) has both calls and puts in the same structure.
// This shoudl dis-entangle that
public class VolSurfaceTheoPoint {
public readonly double theo = double.NaN;
public readonly double delta = double.NaN;
public readonly double driver = double.NaN;
public VolSurfaceTheoPoint(TheoPoint tp, bool is_call) {
if (tp != null) {
theo = is_call ? tp.fwd_normalized_call : tp.fwd_normalized_put;
delta = is_call ? tp.cdelta : tp.pdelta;
driver = tp.driver;
}
}
}
}
@@ -1,13 +0,0 @@
namespace mbts.spark {
enum AxisPosition {
None,
TopLeftToRight,
TopRightToLeft,
BottomLeftToRight,
BottomRightToLeft,
LeftTopToBottom,
LeftBottomToTop,
RightTopToBottom,
RightBottomToTop
}
}
@@ -1,12 +0,0 @@
namespace mbts.spark {
enum DateTimeIntervalType {
Auto,
Seconds,
Minutes,
Hours,
Days,
Weeks,
Months,
Years
}
}
-22
View File
@@ -1,22 +0,0 @@
namespace mbts.spark {
using mbts.ui.shell;
/// ** BTSGraphPoint in edge **
/// <summary>
/// Represents a point in a graph
/// </summary>
class GraphPointVM : ViewModelBase {
object _x;
object _y;
public GraphPointVM() { }
public GraphPointVM(object x, object y) {
this.x = x;
this.y = y;
}
public object x { get => _x; set => Set(ref _x, value); }
public object y { get => _y; set => Set(ref _y, value); }
}
}
@@ -1,9 +0,0 @@
namespace mbts.spark {
using System;
using System.Collections.Generic;
interface IVolTermsSeries {
bool is_committed { get; }
void update_points(IReadOnlyDictionary<DateTime, double> vol_map);
}
}
@@ -1,36 +0,0 @@
namespace mbts.spark {
using mbts.ui;
using ProtoBuf;
using System;
[ProtoContract]
class LineSeriesSettings : IEquatable<LineSeriesSettings>, ICloneable {
[ProtoMember(1)]
public LineStyle line_style { get; set; }
[ProtoMember(2)]
public double stroke_thickness { get; set; }
[ProtoMember(3)]
public BTSColor color { get; set; }
public object Clone() =>
new LineSeriesSettings {
line_style = line_style,
stroke_thickness = stroke_thickness,
color = color.clone()
};
public bool Equals(LineSeriesSettings other) =>
other != null &&
line_style == other.line_style &&
stroke_thickness.Equals(other.stroke_thickness) &&
color == other.color;
public override bool Equals(object obj) =>
Equals(obj as LineSeriesSettings);
public override int GetHashCode() =>
GetType().GetHashCode();
}
}
-16
View File
@@ -1,16 +0,0 @@
namespace mbts.spark {
enum LineStyle {
None,
Solid,
Dashed,
Dot,
DashDot,
DashDashDot,
DashDotDot,
DashDashDotDot,
LongDash,
LongDashDot,
LongDashDotDot,
Automatic
};
}
-11
View File
@@ -1,11 +0,0 @@
namespace mbts.spark {
enum MarkerShape {
None,
Circle,
Cross, Diamond,
Plus,
Square,
Star,
Triangle
}
}
@@ -1,40 +0,0 @@
namespace mbts.spark {
using mbts.ui;
using ProtoBuf;
using System;
[ProtoContract]
class ScatterSeriesSettings : IEquatable<ScatterSeriesSettings>, ICloneable {
[ProtoMember(1)]
public MarkerShape shape { get; set; }
[ProtoMember(2)]
public double size { get; set; }
[ProtoMember(3)]
public BTSColor fill { get; set; }
[ProtoMember(4)]
public BTSColor stroke { get; set; }
public object Clone() =>
new ScatterSeriesSettings {
shape = shape,
size = size,
fill = fill.clone(),
stroke = stroke.clone()
};
public bool Equals(ScatterSeriesSettings other) =>
other != null &&
shape == other.shape &&
size.Equals(other.size) &&
fill == other.fill &&
stroke == other.stroke;
public override bool Equals(object obj) =>
Equals(obj as ScatterSeriesSettings);
public override int GetHashCode() =>
GetType().GetHashCode();
}
}
@@ -1,49 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using mbts.spark;
namespace mbts.ui.controls
{
/// This is all the general data that is needed to display
/// a vol curve - committed or candidate.
/// The special_call/put_points depend on the model - there
/// might not be any.
public class VolCurveDisplayGraph
{
public readonly IEnumerable<Tuple<double, double>> all_points;
/// Scatter points, ex in polynomial and spline models these
/// will be the control points (could be null or empty)
public readonly IEnumerable<Tuple<double, double>> special_call_points, special_put_points;
/// Could also be null or Double.NaN's
public readonly Tuple<double, double> atm_point;
public readonly double call_wing_start, put_wing_start;
public VolCurveDisplayGraph (IEnumerable<Tuple<double, double>> this_all_points,
IEnumerable<Tuple<double, double>> this_special_call_points,
IEnumerable<Tuple<double, double>> this_special_put_points,
Tuple<double, double> this_atm_point,
double this_meat_left_x, double this_meat_right_x)
{
all_points = this_all_points ?? Enumerable.Empty<Tuple<double, double>>();
special_call_points = this_special_call_points ?? Enumerable.Empty<Tuple<double, double>>();
special_put_points = this_special_put_points ?? Enumerable.Empty<Tuple<double, double>>();
atm_point = this_atm_point;
call_wing_start = this_meat_left_x;
put_wing_start = this_meat_right_x;
}
}
public class VolSurfaceTermsStructure
{
public VolSurfaceTermsStructure(double vol, double vega, double straddle) {
this.vol = vol;
this.vega = vega;
this.straddle = straddle;
}
public readonly double vol, vega, straddle;
}
}
@@ -1,40 +0,0 @@
namespace mbts.spark {
using bts.collections;
using mbts.ui;
using System;
using System.Collections.Generic;
using System.Linq;
/// ** VolTermsLineSeries in edge **
/// <summary>
/// Represents a scatter series in a graph
/// </summary>
class VolTermsLineSeriesVM : LineSeriesVM, IVolTermsSeries {
bool _is_committed;
// public VolTermsLineSeriesVM(bool is_committed) {
// this.is_committed = is_committed;
// name = is_committed ? "Committed" : "Candidate";
// is_visible = true;
// color = BTSColors.VolSurfaceGraph.main_curve;
// line_style = is_committed ? LineStyle.Solid : LineStyle.Dashed;
// stroke_thickness = 1.5;
// }
public bool is_committed {
get => _is_committed;
set {
if (Set(ref _is_committed, value)) {
name = value ? "Committed" : "Candidate";
}
}
}
public void update_points(IReadOnlyDictionary<DateTime, double> vol_map) =>
points.SetItems(vol_map
.Where(kv => !double.IsNaN(kv.Value))
.OrderBy(kv => kv.Key)
.Select(kv => new GraphPointVM(OxyPlot.Axes.DateTimeAxis.ToDouble(kv.Key), kv.Value)));
}
}
@@ -1,37 +0,0 @@
namespace mbts.spark {
using bts.collections;
using mbts.ui;
using System;
using System.Collections.Generic;
using System.Linq;
class VolTermsScatterSeriesVM : ScatterSeriesVM, IVolTermsSeries {
bool _is_committed;
// public VolTermsScatterSeriesVM(bool is_committed) {
// this.is_committed = is_committed;
// name = is_committed ? "Committed" : "Candidate";
// is_visible = true;
// marker_color = BTSColors.VolSurfaceGraph.main_curve_atm;
// marker_shape = MarkerShape.Circle;
// marker_size = 3.0;
// }
public bool is_committed {
get => _is_committed;
set {
if (Set(ref _is_committed, value)) {
name = value ? "Committed" : "Candidate";
}
}
}
public void update_points(IReadOnlyDictionary<DateTime, double> vol_map) =>
points.SetItems(vol_map
.Where(kv => !double.IsNaN(kv.Value))
.OrderBy(kv => kv.Key)
.Select(kv => new GraphPointVM(OxyPlot.Axes.DateTimeAxis.ToDouble(kv.Key), kv.Value)));
}
}
@@ -1,66 +0,0 @@
namespace mbts.ui.controls {
using bts.utils;
using mbts.spark;
using mbts.spark.VolSurface;
using mbts.user.settings;
using System;
using System.Collections.Generic;
public class VolSurfaceDisplayGridColumn : IEquatable<VolSurfaceDisplayGridColumn> {
public readonly Func<object, string> format;
public readonly Func<string, object> parse;
public readonly Func<object, bool, object> tick_move;
internal readonly VolSurfaceColumnSettings settings;
internal VolSurfaceDisplayGridColumn(
VolSurfaceColumnSettings settings,
Func<object, string> format = null,
Func<string, object> parse = null,
Func<object, bool, object> tick_move = null,
IEqualityComparer<object> comparer = null) {
this.settings = settings;
this.format = format ?? (v => v?.ToString() ?? string.Empty);
this.parse = parse ?? (v => v);
this.tick_move = tick_move ?? ((v, is_up) => v);
this.comparer = comparer ?? EqualityComparer<object>.Default;
}
public string unique_col_name => settings.id;
public string display_name => settings.display_name;
public string group => settings.group;
public IEqualityComparer<object> comparer { get; }
internal VolSurfaceColumnType type => settings.type;
public TickDisplaySettings tick_display {
get => settings.tick_display;
set => settings.tick_display = value;
}
public TickFactors tick_factors {
get => settings.tick_factors;
set => settings.tick_factors = value;
}
public int tick_move_units {
get => settings.tick_move;
set => settings.tick_move = value;
}
public override int GetHashCode() =>
unique_col_name.GetHashCode();
public override string ToString() =>
unique_col_name;
public override bool Equals(object obj) =>
Equals(obj as VolSurfaceDisplayGridColumn);
public bool Equals(VolSurfaceDisplayGridColumn other) =>
other is not null &&
settings.safe_equals(other.settings);
}
}
@@ -1,97 +0,0 @@
namespace mbts.spark {
using bts;
using bts.api;
using bts.utils;
using mbts.spark.VolSurface;
using mbts.ui.controls;
using mbts.ui.settings;
using mbts.user.settings;
using ProtoBuf;
using System;
[ProtoContract]
class VolSurfaceColumnSettings : ICloneable<VolSurfaceColumnSettings>, IEquatable<VolSurfaceColumnSettings> {
public static VolSurfaceColumnSettings Default(GridColumnSettings core = null) =>
new() {
core = core,
tick_factors = new(100, 1),
tick_move = 1,
tick_display = TickDisplaySettings.Default.with(nan_text: string.Empty)
};
public string id => core?.id;
public string display_name => core?.display_name;
public string group => core?.group;
public bool is_visible => core?.is_visible ?? false;
public VolSurfaceColumnType type { get; set; }
[ProtoMember(1)]
public GridColumnSettings core { get; set; }
[ProtoMember(2)]
public TickFactors tick_factors { get; set; }
[ProtoMember(3)]
public int tick_move { get; set; }
[ProtoMember(4)]
public TickDisplaySettings tick_display { get; set; }
[ProtoMember(5)]
public DateFormat date_formatting { get; set; }
public static VolSurfaceColumnSettings from_column_model(VolSurfaceDisplayGridColumn model) {
var rv = Default(new GridColumnSettings(
model.unique_col_name,
model.display_name,
is_visible: true,
is_expanded: true
));
rv.type = model.type;
rv.tick_display = model.tick_display;
rv.tick_factors = model.tick_factors;
rv.tick_move = model.tick_move_units;
return rv;
}
public VolSurfaceDisplayGridColumn to_column_model() =>
type switch {
VolSurfaceColumnType.ReadOnly => VolSurfaceDisplayUtilities.get_double_col(
true, group, id, display_name, this, tick_factors, tick_display),
VolSurfaceColumnType.ReadWriteTick => VolSurfaceDisplayUtilities.get_double_col(
false, group, id, display_name, this, tick_factors, tick_display),
_ => null
};
public VolSurfaceColumnSettings Clone() =>
new() {
type = type,
core = core?.Clone(),
tick_factors = tick_factors,
tick_move = tick_move,
tick_display = tick_display.Clone(),
date_formatting = date_formatting
};
object ICloneable.Clone() =>
Clone();
public bool Equals(VolSurfaceColumnSettings other) =>
other is not null &&
type == other.type &&
core.safe_equals(other.core) &&
tick_factors.safe_equals(other.tick_factors) &&
tick_display.safe_equals(other.tick_display) &&
tick_move == other.tick_move &&
date_formatting == other.date_formatting;
public override bool Equals(object obj) =>
Equals(obj as VolSurfaceColumnSettings);
public override int GetHashCode() =>
EqualityComparer.auto_phase(id.GetHashCode(), display_name.GetHashCode());
}
}
@@ -1,60 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using mbts.spark;
namespace mbts.ui.controls
{
/// This contains the list of global values for the vol
/// surface (whereas VolSurfaceDisplayGrid has exp keyed
/// values)
public class VolSurfaceDisplayGlobalGrid : ICloneable
{
private IEnumerable<VolSurfaceDisplayGridColumn> _ordered_columns = null;
private IDictionary<VolSurfaceDisplayGridColumn, object> _data_map = new Dictionary<VolSurfaceDisplayGridColumn, object>();
public VolSurfaceDisplayGlobalGrid(IEnumerable<VolSurfaceDisplayGridColumn> this_ordered_cols,
IDictionary<VolSurfaceDisplayGridColumn, object> this_data_map)
{
_ordered_columns = this_ordered_cols;
_data_map = this_data_map;
}
public IEnumerable<VolSurfaceDisplayGridColumn> get_ordered_columns() { return _ordered_columns; }
public bool get_grid_data(VolSurfaceDisplayGridColumn col, out object data)
{
return _data_map.TryGetValue(col, out data) ? true : false;
}
public bool set_grid_data(VolSurfaceDisplayGridColumn col, object data)
{
if (_data_map.ContainsKey(col))
{
_data_map[col] = data;
return true;
}
return false;
}
public string format(VolSurfaceDisplayGridColumn col, object data)
{
return data != null ? data.ToString() : String.Empty;
}
public object unformat(VolSurfaceDisplayGridExpiration exp, VolSurfaceDisplayGridColumn col, string data)
{
return data;
}
#region ICloneable
public object Clone()
{
return new VolSurfaceDisplayGlobalGrid(new List<VolSurfaceDisplayGridColumn>(_ordered_columns),
new Dictionary<VolSurfaceDisplayGridColumn, object>(_data_map));
}
#endregion
}
}
@@ -1,205 +0,0 @@
namespace mbts.ui.controls {
using bts;
using bts.utils;
using mbts.spark;
using System;
using System.Collections.Generic;
using System.Linq;
/// Encapsulates the vol data that would show up in the top grid
public class VolSurfaceDisplayGrid :
ICellDataStore<VolSurfaceDisplayGridExpiration, VolSurfaceDisplayGridColumn, object>,
ICloneable<VolSurfaceDisplayGrid> {
readonly IEnumerable<VolSurfaceDisplayGridExpiration> _ordered_expirations = null;
readonly IEnumerable<VolSurfaceDisplayGridColumn> _ordered_columns = null;
readonly IDictionary<string, VolSurfaceDisplayGridColumn> _column_map;
readonly IDictionary<VolSurfaceDisplayGridExpiration, IDictionary<string, object>> _data_map =
new Dictionary<VolSurfaceDisplayGridExpiration, IDictionary<string, object>>();
public IEnumerable<VolSurfaceDisplayGridExpiration> get_ordered_expirations() { return _ordered_expirations; }
public IEnumerable<VolSurfaceDisplayGridColumn> get_ordered_columns() { return _ordered_columns; }
public IDictionary<VolSurfaceDisplayGridExpiration, IDictionary<string, object>> data_map {
get {
return _data_map;
}
}
// TODO: get rid of this constructor. The VolSurfaceDisplayGridColumn
// keys in the data contain more information than neccessary, a column id
// string will suffice.
public VolSurfaceDisplayGrid(
IEnumerable<VolSurfaceDisplayGridExpiration> ordered_expirations,
IEnumerable<VolSurfaceDisplayGridColumn> ordered_columns,
IDictionary<VolSurfaceDisplayGridExpiration, IDictionary<VolSurfaceDisplayGridColumn, object>> data)
: this(ordered_expirations, ordered_columns, data.ToDictionary(
kv => kv.Key, kv => kv.Value.ToDictionary(_kv => _kv.Key.unique_col_name, _kv => _kv.Value).as_idictionary())) { }
public VolSurfaceDisplayGrid(IEnumerable<VolSurfaceDisplayGridExpiration> ordered_expirations,
IEnumerable<VolSurfaceDisplayGridColumn> ordered_columns,
IDictionary<VolSurfaceDisplayGridExpiration, IDictionary<string, object>> data) {
_ordered_expirations = ordered_expirations;
_ordered_columns = ordered_columns;
_data_map = data;
_column_map = ordered_columns.ToDictionary(k => k.unique_col_name, k => k);
}
public object get_grid_data(VolSurfaceDisplayGridExpiration exp, VolSurfaceDisplayGridColumn col, object default_value) =>
get_grid_data(exp, col.unique_col_name, out var res) ? res : default_value;
public object get_grid_data(VolSurfaceDisplayGridExpiration exp, string col_name, object default_value) =>
get_grid_data(exp, col_name, out var res) ? res : default_value;
public bool get_grid_data(VolSurfaceDisplayGridExpiration exp, string col_name, out object data) {
if (_data_map.TryGetValue(exp, out var exp_data) && exp_data.TryGetValue(col_name, out data)) {
return true;
}
data = null;
return false;
}
public bool get_grid_data<T>(VolSurfaceDisplayGridExpiration exp, string col_name, out T result) {
if (get_grid_data(exp, col_name, out var res) && res is T res_t) {
result = res_t;
return true;
}
result = default;
return false;
}
public bool has_grid_data(VolSurfaceDisplayGridExpiration exp, VolSurfaceDisplayGridColumn col) =>
_data_map.TryGetValue(exp, out var exp_data) && exp_data.ContainsKey(col.unique_col_name);
public bool copy(
VolSurfaceDisplayGridExpiration source_exp,
VolSurfaceDisplayGridColumn source_col,
VolSurfaceDisplayGridExpiration target_exp,
VolSurfaceDisplayGridColumn target_col) =>
copy(source_exp, source_col?.unique_col_name, target_exp, target_col?.unique_col_name);
public bool copy(
VolSurfaceDisplayGridExpiration source_exp,
string source_col_name,
VolSurfaceDisplayGridExpiration target_exp,
string target_col_name) =>
get_grid_data(source_exp, source_col_name, out var data) &&
set_grid_data(target_exp, target_col_name, data);
/// Returns the expiration differences
public static void compare_exps(
VolSurfaceDisplayGrid new_grid,
VolSurfaceDisplayGrid old_grid,
out IEnumerable<VolSurfaceDisplayGridExpiration> deleted,
out IEnumerable<VolSurfaceDisplayGridExpiration> added) {
var new_grid_map = HashSet.create(new_grid.get_ordered_expirations());
var old_grid_map = HashSet.create(old_grid.get_ordered_expirations());
CollectionHelper.compare_hashsets(new_grid_map, old_grid_map, out var del, out var add);
deleted = del;
added = add;
}
public static bool cols_changed(VolSurfaceDisplayGrid d1, VolSurfaceDisplayGrid d2) {
compare_cols(d1, d2, out var d1_extra, out var d2_extra);
return d1_extra.Any() || d2_extra.Any();
}
/// Returns the col name differences (it will generally be very rare, but for instance when a point gets added
/// to a polynomial or the spline model, d1 or d2 wont be empty)
public static void compare_cols(
VolSurfaceDisplayGrid d1,
VolSurfaceDisplayGrid d2,
out IEnumerable<VolSurfaceDisplayGridColumn> d1_extra,
out IEnumerable<VolSurfaceDisplayGridColumn> d2_extra) {
var d1_exp_map = HashSet.create(d1.get_ordered_columns());
var d2_exp_map = HashSet.create(d2.get_ordered_columns());
CollectionHelper.compare_hashsets(d1_exp_map, d2_exp_map, out var del, out var add);
d1_extra = add;
d2_extra = del;
}
/// Returns the differernce between two VolSurfaceDisplay's.
/// It only returns the elements that are present in both
/// and are different.
public static IEnumerable<Tuple<VolSurfaceDisplayGridExpiration, VolSurfaceDisplayGridColumn>> compare_data(
VolSurfaceDisplayGrid d1, VolSurfaceDisplayGrid d2) {
if (d1 == d2) {
return Enumerable.Empty<Tuple<VolSurfaceDisplayGridExpiration, VolSurfaceDisplayGridColumn>>();
}
var exps = d1.get_ordered_expirations().Concat(d2.get_ordered_expirations());
var cols = d1.get_ordered_columns().Concat(d2.get_ordered_columns());
return exps.SelectMany(exp => cols
.Where(col => d1.has_grid_data(exp, col) && d2.has_grid_data(exp, col))
.Select(col => Tuple.Create(exp, col)));
}
public VolSurfaceDisplayGrid Clone() => new(
_ordered_expirations.ToList(),
_ordered_columns.ToList(),
_data_map.ToDictionary(kv => kv.Key, kv => kv.Value.ToDictionary().as_idictionary()));
object ICloneable.Clone() =>
Clone();
public IEnumerable<VolSurfaceDisplayGridExpiration> get_rows() =>
get_ordered_expirations();
public ICellDataStore<VolSurfaceDisplayGridExpiration, VolSurfaceDisplayGridColumn, object> get_cell_data_store() => this;
public bool read(VolSurfaceDisplayGridExpiration row, VolSurfaceDisplayGridColumn col, out object value) =>
read(row, col?.unique_col_name, out value);
public bool read(VolSurfaceDisplayGridExpiration row, string col_name, out object value) =>
get_grid_data(row, col_name, out value);
public object read(VolSurfaceDisplayGridExpiration row, VolSurfaceDisplayGridColumn col) =>
read(row, col?.unique_col_name);
public object read(VolSurfaceDisplayGridExpiration row, string col_name) =>
get_grid_data(row, col_name, out var value) ? value : null;
public bool write(VolSurfaceDisplayGridExpiration row, VolSurfaceDisplayGridColumn col, object value) =>
write(row, col?.unique_col_name, value);
public bool write(VolSurfaceDisplayGridExpiration row, string col_name, object value) =>
set_grid_data(row, col_name, value);
internal bool set_grid_data(VolSurfaceDisplayGridExpiration exp, string col_name, object data) {
if (_data_map.TryGetValue(exp, out var exp_data) && exp_data.ContainsKey(col_name)) {
exp_data[col_name] = data;
return true;
}
return false;
}
internal void set_grid_data_text(VolSurfaceDisplayGridExpiration exp, string col_name, string formatted_data) {
if (_column_map.TryGetValue(col_name, out var grid_col)) {
write(exp, grid_col.unique_col_name, formatted_data);
}
}
// internal string log_string {
// get {
// Func<string, string> trim_leading_comma = (s) => {
// if (!s.IsNullOrEmpty() && s.EndsWith(",")) {
// return s.Remove(s.Length - 1, 1);
// }
// return s;
// };
// Func<IDictionary<VolSurfaceDisplayGridColumn, object>, string> log_exp = (map) => {
// string rv = String.Empty;
// foreach (var kv in map) {
// string val_string = kv.Value == null ? "Null" : kv.Value.ToString();
// rv += $"{kv.Key.display_name}:{val_string},";
// }
// return trim_leading_comma(rv);
// };
// string rv = String.Empty;
// foreach (var kv in _data_map) {
// rv += $"Exp:{kv.Key.expiration.ToShortDateString()} Data:{log_exp(kv.Value)},";
// }
// return trim_leading_comma(rv);
// }
// }
}
}
@@ -1,55 +0,0 @@
namespace mbts.spark {
using bts.api;
using bts.utils;
using System;
public class VolSurfaceDisplayGridExpiration : IComparable<VolSurfaceDisplayGridExpiration>, IEquatable<VolSurfaceDisplayGridExpiration> {
public VolSurfaceDisplayGridExpiration(string symbol, DateTime expiration, analytics.VolSurfaceEnums.VolSurfaceExpirationCalculationMethod calc_mode) {
this.symbol = symbol;
this.expiration = expiration;
this.calc_mode = calc_mode;
}
public string symbol { get; }
public DateTime expiration { get; }
public analytics.VolSurfaceEnums.VolSurfaceExpirationCalculationMethod calc_mode { get; }
/// Slave exps are drawn differently and selecting them does not activate
/// the controls
public bool is_slave =>
calc_mode == analytics.VolSurfaceEnums.VolSurfaceExpirationCalculationMethod.Slave;
public bool Equals(VolSurfaceDisplayGridExpiration other) =>
other != null &&
expiration == other.expiration &&
symbol == other.symbol &&
calc_mode == other.calc_mode;
public override int GetHashCode() =>
EqualityComparer.auto_phase(symbol.GetHashCode(), expiration.GetHashCode());
public override bool Equals(object obj) =>
Equals(obj as VolSurfaceDisplayGridExpiration);
public override string ToString() =>
SecurityFormatter.format_future(symbol, expiration);
public static bool operator ==(VolSurfaceDisplayGridExpiration x, VolSurfaceDisplayGridExpiration y) =>
x is null ? y is null : x.Equals(y);
public static bool operator !=(VolSurfaceDisplayGridExpiration left, VolSurfaceDisplayGridExpiration right) =>
!(left == right);
public int CompareTo(VolSurfaceDisplayGridExpiration other) {
if (other is null) {
return 1;
}
int rv = expiration.CompareTo(other.expiration);
if (rv == 0) {
rv = string.Compare(symbol, other.symbol);
}
return rv;
}
}
}
@@ -1,149 +0,0 @@
namespace mbts.ui.controls {
using bts;
using bts.utils;
using mbts.spark;
using mbts.spark.VolSurface;
using mbts.user.settings;
using System;
using System.Collections.Generic;
class VolSurfaceDisplayUtilities {
public static TickDisplaySettings default_tick_display =>
TickDisplaySettings.Default.with(
show_commas: false,
nan_text: string.Empty);
public static TickDisplaySettings percent_tick_display =>
default_tick_display.with(display_multiplier: 100);
public static double parse_double(object obj) {
if (obj is null) {
Log.Gen.warn("parse_double received null input (will return nan and continue)");
return double.NaN;
}
Log.assert(obj is double);
obj = obj ?? Double.NaN;
double rv = obj is Double ? (double)obj : (Double.TryParse(obj.ToString(), out rv) ? rv : Double.NaN);
return rv;
}
public static bool parse_boolean(object obj, bool def_value) {
Log.assert(obj is bool);
bool rv;
rv = Boolean.TryParse(obj == null ? String.Empty : obj.ToString(), out rv) ? rv : def_value;
return rv;
}
public static Func<string, object> get_parse_double(TickFactors tick_factors, TickDisplaySettings tick_display) =>
tick_factors is null ?
text => double.TryParse(text, out var res) ? res : double.NaN :
text => tick_factors.parse(text, tick_display);
public static Func<object, string> get_double_tostring(TickFactors tick_factors, TickDisplaySettings tick_display) {
if (tick_factors is null) {
return data => data is double d_data && !d_data.is_nan() ? d_data.ToString() : string.Empty;
}
return data => {
if (data is not double d_data) {
return string.Empty;
}
return tick_factors.format(d_data, tick_display);
};
}
public static Func<object, bool, object> get_double_tickmove(TickFactors tick_factors, int tick_move) =>
(data, is_up) => {
if (data is not double dbl) {
return data;
}
if (dbl.is_nan()) {
return 0D;
}
return tick_factors.tick(dbl, is_up ? tick_move : -tick_move);
};
public static IEqualityComparer<double> get_double_comparer(
TickFactors tick_factors = null, double display_mult = double.NaN) {
if (tick_factors is null) {
return new TickFactors(10^7, 1).tick_equality_comparer();
}
// This equality comparer is used to compare actual values (not multiplied by
// 'display_mult'), while the TickFactors are used to format the display value (multiplied
// by 'display_mult'). Multiply the tick base by 'display_mult' so the equality comparison
// is done with the correct number of decimal places.
if (display_mult > 0 && Math.Log10(display_mult).is_int()) {
tick_factors = tick_factors.with(
tick_base: tick_factors.tick_base * display_mult);
}
return tick_factors.tick_equality_comparer();
}
public static VolSurfaceDisplayGridColumn get_double_output_col(
string group,
string name,
string display_name,
VolSurfaceMacroGridSettings grid_settings,
TickFactors tick_factors,
TickDisplaySettings tick_display = null) =>
get_double_col(true, group, name, display_name, grid_settings, tick_factors, tick_display);
public static VolSurfaceDisplayGridColumn get_double_input_col(
string group,
string name,
string display_name,
VolSurfaceMacroGridSettings grid_settings,
TickFactors tick_factors,
TickDisplaySettings tick_display = null) =>
get_double_col(false, group, name, display_name, grid_settings, tick_factors, tick_display);
public static VolSurfaceDisplayGridColumn get_double_col(
bool is_readonly,
string group,
string name,
string display_name,
VolSurfaceMacroGridSettings grid_settings,
TickFactors tick_factors,
TickDisplaySettings tick_display = null) => get_double_col(
is_readonly, group, name, display_name, grid_settings?.get_column(name), tick_factors, tick_display);
public static VolSurfaceDisplayGridColumn get_double_col(
bool is_readonly,
string group,
string name,
string display_name,
VolSurfaceColumnSettings col_config,
TickFactors tick_factors,
TickDisplaySettings tick_display = null) {
if (col_config is null) {
col_config = VolSurfaceColumnSettings.Default(new(name, display_name));
if (tick_factors?.is_valid() ?? false) {
col_config.tick_factors = tick_factors;
}
if (tick_display is not null) {
col_config.tick_display = tick_display;
}
} else {
if (!(col_config.tick_factors?.is_valid() ?? false) && (tick_factors?.is_valid() ?? false)) {
col_config.tick_factors = tick_factors;
}
if (col_config.tick_display is null) {
col_config.tick_display = tick_display;
}
}
col_config.core.group = group;
col_config.type = is_readonly ? VolSurfaceColumnType.ReadOnly : VolSurfaceColumnType.ReadWriteTick;
return new VolSurfaceDisplayGridColumn(
col_config,
format: get_double_tostring(col_config.tick_factors, col_config.tick_display),
parse: get_parse_double(col_config.tick_factors, col_config.tick_display),
tick_move: get_double_tickmove(col_config.tick_factors, col_config.tick_move),
comparer: get_double_comparer(
col_config.tick_factors, col_config.tick_display.display_multiplier)
.cast<double, object>());
}
}
}
@@ -1,56 +0,0 @@
namespace mbts.ui.controls {
using bts;
using bts.utils;
using mbts.spark;
using ProtoBuf;
using System;
using System.Collections.Generic;
using System.Linq;
[ProtoContract]
class VolSurfaceMacroGridSettings : ICloneable<VolSurfaceMacroGridSettings> {
[ProtoMember(1)]
readonly List<VolSurfaceColumnSettings> _column_settings = new();
public static VolSurfaceMacroGridSettings Default =>
new();
public IReadOnlyList<VolSurfaceColumnSettings> column_settings => _column_settings;
public void set_column(VolSurfaceColumnSettings column_settings) {
var idx = _column_settings.FindIndex(c => c.core?.id == column_settings?.core?.id);
if (idx >= 0) {
_column_settings[idx] = column_settings;
return;
}
_column_settings.Add(column_settings);
}
public void set_columns(IEnumerable<VolSurfaceColumnSettings> column_settings) {
foreach (var c in column_settings) {
set_column(c);
}
}
public VolSurfaceColumnSettings get_column(string col_name) {
if (col_name is null) {
throw new ArgumentNullException(nameof(col_name));
}
var lcol_name = col_name.ToLower();
return _column_settings.FirstOrDefault(c => c.core?.id?.ToLower() == lcol_name);
}
public VolSurfaceMacroGridSettings Clone() {
var rv = new VolSurfaceMacroGridSettings();
rv._column_settings.AddRange(_column_settings.clone_all());
return rv;
}
object ICloneable.Clone() =>
Clone();
}
}
@@ -1,108 +0,0 @@
using System;
using System.Collections.Generic;
using mbts.analytics;
using bts.api;
using bts.collections;
using System.Linq;
using bts.api.orderman;
using bts;
namespace mbts.spark {
// Listens to the interp theos, decorates the data
// and sends them over to the sparkd server
public class InterpTheosServerPublisher : IDisposable {
private readonly ThreadedBlackboard _bb;
private readonly bts.api.orderman.OrderService _order_service;
private HighPerformanceTimer _timer = new HighPerformanceTimer();
public InterpTheosServerPublisher(ThreadedBlackboard bb,
bts.api.orderman.OrderService order_service) {
bts.Log.Ui.info(
$"InterpTheosServerPublisher cons tid:{VolSurfaceTroubleshootingFunctions.tid()}");
_bb = bb;
_order_service = order_service;
_bb.subscribe(SparkTags.AllInterpGreeks);
_bb.subscribe(SparkTags.SystemContractsTag);
_bb.data_callback += _on_data;
}
private void _on_data(object tag, object data) {
if (tag.Equals(SparkTags.SystemContractsTag) ||
tag.Equals(SparkTags.AllInterpGreeks)) {
_publish_data();
}
}
private static IDictionary<UInt32, DriverMD> _get_drivers(
IReadOnlyDictionary<string, OptionDriverPriceMap> driver_map,
SystemContractData sc_data) {
var rv = new Dictionary<UInt32, DriverMD>();
foreach (var kv in driver_map) {
rv.AddRange(
SecurityNormalizer.normalize_drivers(kv.Value, sc_data).ToArray());
}
return rv;
}
private static IEnumerable<Tuple<SecurityImmutable, TheoPoint>> _get_theos(
IReadOnlyDictionary<string, OptionTheoInterpolationData> theo_data,
SystemContractData sc_data) {
var rv = new List<Tuple<SecurityImmutable, TheoPoint>>();
foreach (var kv in theo_data) {
rv.AddRange(
SecurityNormalizer.normalize_interp_theos(kv.Value, sc_data));
}
return rv;
}
private void _publish_data() {
SystemContractData sc_data = _bb.read_state(SparkTags.SystemContractsTag, null);
IReadOnlyDictionary<string, OptionTheoInterpolationData> all_theos =
_bb.read_state(SparkTags.AllInterpGreeks, null);
IReadOnlyDictionary<string, OptionDriverPriceMap> all_drivers =
_bb.read_state(SparkTags.AllOptionDriverBBOTag, null);
if (sc_data == null || all_theos == null || all_drivers == null)
return;
_timer.start();
IDictionary<UInt32, DriverMD> driver_map = _get_drivers(all_drivers, sc_data);
IEnumerable<Tuple<SecurityImmutable, TheoPoint>> theo_map = _get_theos(all_theos, sc_data);
// assemble it together and send it to the server
var ptp_list = new List<bts.api.orderman.PrecomputedTheoPoint>();
foreach (var tup in theo_map) {
SecurityImmutable sec = tup.Item1;
TheoPoint tp = tup.Item2;
bool is_call = sec.Option.CallPut == PutOrCall.Call;
var sec_id = sec.Id;
DriverMD dmd = null;
driver_map.TryGetValue(sec_id, out dmd);
PrecomputedTheoPoint ptp = new PrecomputedTheoPoint();
ptp.SecId = sec_id;
ptp.Driver = tp.driver;
ptp.DriverSecId = dmd != null && dmd.driver_security.HasValue ?
dmd.driver_security.Value.Id : 0;
ptp.Theo = is_call ? tp.call : tp.put;
ptp.Delta = is_call ? tp.cdelta : tp.pdelta;
ptp.Gamma = is_call ? tp.cgamma : tp.pgamma;
ptp.Vega = is_call ? tp.cvega : tp.pvega;
ptp.Theta = is_call ? tp.c_theta : tp.p_theta;
ptp.Rho = Double.NaN;
ptp_list.Add(ptp);
}
bts.api.orderman.PrecomputedTheos server_theos = new PrecomputedTheos();
server_theos.Theos.AddRange(ptp_list);
_timer.stop();
var comp_time = _timer.lastIntervalTime;
_timer.start();
_order_service.set_precomputed_theos(server_theos);
_timer.stop();
var pub_time = _timer.lastIntervalTime;
bts.Log.Gen.info($"InterpTheosServerPublisher._publish_data " +
$"size: {server_theos.Theos.Count} comp_time: {comp_time} msecs " +
$"pub_time: {pub_time}");
}
public void Dispose() {
_bb.data_callback -= _on_data;
}
}
}
-223
View File
@@ -1,223 +0,0 @@
using System;
using System.Collections.Generic;
using mbts.analytics;
using bts.api;
using mbts.ui;
using MathNet.Numerics.Providers.FourierTransform;
using BCG;
using System.Windows.Automation;
using bts.collections;
namespace mbts.spark {
// Publishes theos for all options (on the side, also publishes the theos for TC2)
public class LiveTheoPublisher : IDisposable {
private ThreadedBlackboard _bb;
private readonly ITag<IReadOnlyDictionary<string, OptionTheoInterpolationData>>
_greeks_tag = SparkTags.AllInterpGreeks;
private readonly ITag<IReadOnlyDictionary<string, OptionDriverPriceMap>>
_drivers_tag = SparkTags.AllOptionDriverBBOTag;
private readonly HighPerformanceTimer _timer = new HighPerformanceTimer();
private readonly PerfStatsLogger _logger = new PerfStatsLogger(50, 100);
private readonly string _log_id = "LiveTheoPublisher";
private DateTime _last_future_theos_published = DateTime.MinValue;
private TimeSpan _futures_theos_publish_period = TimeSpan.FromMilliseconds(300);
public LiveTheoPublisher(ThreadedBlackboard bb) {
_bb = bb;
_bb.subscribe(_greeks_tag);
_bb.subscribe(_drivers_tag);
_bb.data_callback += _on_data;
_bb.timer_callback += _on_timer;
_interp_and_publish();
}
private void _on_data(object tag, object data) {
if (tag.Equals(_drivers_tag) ||
tag.Equals(_greeks_tag)) {
_interp_and_publish();
}
}
private void _on_timer() {
_publish_future_theos();
}
private void _log_interpgreeks(
IReadOnlyDictionary<string, OptionTheoInterpolationData> interp_greeks) {
string log_msg = String.Empty;
foreach (var kv in interp_greeks) {
string symbol = kv.Key;
var symbol_ig = kv.Value;
if (symbol_ig == null) {
continue;
}
var exps = symbol_ig.get_expirations();
foreach (DateTime e in exps) {
var e_data = symbol_ig.get_expiration_data(e);
foreach (var e_kv in e_data) {
double driver = e_kv.Key;
foreach (var k_kv in e_kv.Value) {
double k = k_kv.Key;
TheoPoint tp = k_kv.Value;
log_msg += "\n" + $"s: {symbol} e: {e} k: {k} d: {driver} " +
$"c: {tp.call} p: {tp.put}";
}
}
}
}
if (!String.IsNullOrEmpty(log_msg))
bts.Log.Gen.info($"LiveTheoPublisher state: {log_msg}");
}
private void _log_theos(SystemContractData sc_data,
IReadOnlyDictionary<uint, GreeksTuple> greeks_map) {
string rv = "LiveTheosPublisher data: ";
foreach (var kv in greeks_map) {
var id = kv.Key;
var g_tup = kv.Value;
if (sc_data.sec_md_map.TryGetValue(id, out var smd)) {
string sec_str = smd.ToString();
rv += "\n" + $"id: {id} sec: {sec_str} greeks: {g_tup}";
}
}
bts.Log.Gen.info(rv);
}
private static DriverMD _get_option_driver(
IReadOnlyDictionary<string, OptionDriverPriceMap> driver_map,
SecurityStrike k) {
if (driver_map.TryGetValue(k.expiration.symbol, out var exp_map) &&
exp_map != null)
return exp_map.get_driver_md(k.expiration);
return DriverMD.empty;
}
private static TheoPoint _interp_theo(
IReadOnlyDictionary<string, OptionTheoInterpolationData> interp_greeks_map,
SecurityStrike k, double driver_price) {
if (interp_greeks_map.TryGetValue(k.expiration.symbol, out var interp_greeks) &&
interp_greeks != null)
return interp_greeks.interpolate_theos(k.expiration.expiration, k.strike,
driver_price);
return TheoPoint.getNulledObject();
}
private void _publish_tc2_theos(IDictionary<SecurityStrike, TheoPoint> theos) {
var rv = new Dictionary<string, ExpStrikeKeyedData<TheoPoint>>();
foreach (var kv in theos) {
SecurityStrike k = kv.Key;
TheoPoint tp = kv.Value;
ExpStrikeKeyedData<TheoPoint> sym_theos = null;
if (!rv.TryGetValue(k.expiration.symbol, out sym_theos)) {
sym_theos = new ExpStrikeKeyedData<TheoPoint>();
rv.Add(k.expiration.symbol, sym_theos);
}
sym_theos.set_data(k, tp);
}
foreach (var kv in rv) {
_bb.post(SparkTags.TC2Tags.LiveTheosTag(kv.Key), kv.Value);
}
}
private void _interp_and_publish() {
_timer.start();
var res = new Dictionary<uint, GreeksTuple>();
IReadOnlyDictionary<string, OptionDriverPriceMap> driver_map =
_bb.read_state(_drivers_tag);
IReadOnlyDictionary<string, OptionTheoInterpolationData> interp_greeks =
_bb.read_state(SparkTags.AllInterpGreeks);
SystemContractData sc_data = _bb.read_state(SparkTags.SystemContractsTag);
if (driver_map == null || interp_greeks == null || sc_data == null) {
return;
}
var k_theos = new Dictionary<SecurityStrike, TheoPoint>();
// option spreads
foreach (var kv in sc_data.strike_map) {
foreach (SecurityStrike k in kv.Value) {
var (call_id, put_id) = k.call_put_id;
var driver = _get_option_driver(driver_map, k);
var tp = _interp_theo(interp_greeks, k, driver.get_driver());
k_theos[k] = tp;
// put it in the output map
if (call_id.HasValue) {
var normalized_theo = VolSurfaceCoreFunctions.normalize_theo(tp.call, tp.driver);
res.Add(call_id.Value,
new GreeksTuple(tp.vol, tp.driver, tp.call, tp.cdelta, tp.cgamma,
tp.cvega, tp.c_theta, Double.NaN, normalized_theo));
}
if (put_id.HasValue) {
var normalized_theo = VolSurfaceCoreFunctions.normalize_theo(tp.put, tp.driver);
res.Add(put_id.Value,
new GreeksTuple(tp.vol, tp.driver, tp.put, tp.pdelta, tp.pgamma,
tp.pvega, tp.p_theta, Double.NaN, normalized_theo));
}
}
}
// futures
var future_theos = _get_future_theos();
res.AddRange(future_theos);
// spreads, all option and future non tied spreads
foreach (var spr in sc_data.spreads) {
GreeksTuple gtup = StatelessSpreadCalculator.compute_non_tied_spread(spr.security, res);
res.Add(spr.security.Id, gtup);
}
// copy and publish
IReadOnlyDictionary<uint, GreeksTuple> res_ro = res;
bts.Log.Gen.info($"LiveTheoPublisher._interp_and_publish posting " +
$"count: {res_ro.Count}");
_timer.stop();
_logger.log(_log_id, _log_id, _timer.lastIntervalTime);
_bb.post(SparkTags.Greeks, res_ro);
// oh and those TC2 theos for comptability
_publish_tc2_theos(k_theos);
}
// If we do any rolls like SP for futures, it will be here
IDictionary<UInt32, GreeksTuple> _get_future_theos() {
var rv = new Dictionary<UInt32, GreeksTuple>();
SystemContractData sc_data = _bb.read_state(SparkTags.SystemContractsTag);
if (sc_data == null)
return rv;
foreach (var kv in sc_data.exp_map) {
var id = kv.Value;
SecurityMD sec_md;
if (sc_data.sec_md_map.TryGetValue(id, out sec_md)) {
if (sec_md.security.HasFuture) {
SecurityExpiration exp = kv.Key;
double pr = sec_md.md.fixing_price;
rv.Add(sec_md.security.Id,
new GreeksTuple(0, pr, pr, 1, 0, 0, 0, 0, pr));
}
}
}
return rv;
}
// recomputes and publishes them periodicially
void _publish_future_theos() {
if (DateTime.Now - _last_future_theos_published < _futures_theos_publish_period)
return;
_last_future_theos_published = DateTime.Now;
var rv = new Dictionary<SecurityExpiration, FutureTheoStructure>();
SystemContractData sc_data = _bb.read_state(SparkTags.SystemContractsTag);
if (sc_data == null)
return;
foreach (var kv in sc_data.exp_map) {
var id = kv.Value;
SecurityMD sec_md;
if (sc_data.sec_md_map.TryGetValue(id, out sec_md)) {
if (sec_md.security.HasFuture) {
SecurityExpiration exp = kv.Key;
double pr = sec_md.md.fixing_price;
rv.Add(exp, new FutureTheoStructure(exp.expiration, pr, pr, 1, 0));
}
}
}
_bb.post(SparkTags.TC2Tags.LiveFutureTheosTag, rv);
}
public void Dispose() {
_bb.data_callback -= _on_data;
}
}
}
@@ -1,130 +0,0 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using bts.api;
using mbts.analytics;
namespace mbts.spark {
// Conveniant wrapper with some functions added
// around map of AnalyticsExpirationParameters
public class AnalyticsExpirationParametersMap {
public readonly
IReadOnlyDictionary<mbts.SecurityExpiration, AnalyticsExpirationParameters> exp_map;
public AnalyticsExpirationParametersMap(
IDictionary<SecurityExpiration, AnalyticsExpirationParameters> exp_map_arg,
SystemContractData sc_data) {
var empty = SecurityExpiration.empty;
var temp = new Dictionary<SecurityExpiration,
AnalyticsExpirationParameters>(exp_map_arg);
foreach (var kv in sc_data.exp_map) {
var exp = kv.Key;
if (!temp.ContainsKey(kv.Key)) {
temp.Add(kv.Key,
new AnalyticsExpirationParameters(exp, null, empty, empty, 0, 0, 0, 0, 0));
}
}
exp_map = temp;
}
public IEnumerable<mbts.SecurityExpiration> get_sorted_exps() {
List<SecurityExpiration> sorted_exps = new List<SecurityExpiration>(exp_map.Keys);
sorted_exps.Sort((e1, e2) => {
int rv = e1.expiration.CompareTo(e2.expiration);
if (rv == 0)
rv = e1.symbol.CompareTo(e2.symbol);
if (rv == 0)
rv = e1.security_type.ToString().CompareTo(e2.security_type.ToString());
return rv;
});
return sorted_exps;
}
public AnalyticsExpirationParameters get_parameter(mbts.SecurityExpiration sec_expiration) {
mbts.analytics.AnalyticsExpirationParameters rv = null;
return exp_map.TryGetValue(sec_expiration, out rv) ? rv : null;
}
/// Ignores the exchange and gets the first match
public AnalyticsExpirationParameters get_option_parameter(string symbol, DateTime exp) {
var rv = exp_map.Where(i => i.Key.security_type == SecurityType.Option &&
i.Key.symbol == symbol && i.Key.expiration == exp);
return rv != null && rv.Count() == 1 ?
rv.ElementAt(0).Value : mbts.analytics.AnalyticsExpirationParameters.empty;
}
public IEnumerable<mbts.SecurityExpiration> get_futures() {
return exp_map.Keys.Where(i => i.security_type == SecurityType.Future);
}
/// Ignores the exchange
// public IDictionary<DateTime, AnalyticsExpirationParameters> get_future_map(string future_name) {
// return exp_map.ToList().Where(
// kv => kv.Key.security_type == SecurityType.Future &&
// kv.Key.symbol == future_name).ToDictionary(kv => kv.Key.expiration, kv => kv.Value);
// }
/// Ignores the exchange
// public IDictionary<mbts.SecurityExpiration, AnalyticsExpirationParameters>
// get_symbol_params(SecurityType sec_type, string symbol) {
// return exp_map.ToList().Where(kv => kv.Key.security_type == sec_type &&
// kv.Key.symbol == symbol).ToDictionaryDupes(kv => kv.Key, kv => kv.Value);
// }
// public IEnumerable<mbts.SecurityExpiration> get_stocks() {
// return exp_map.Keys.Where(i => i.security_type == SecurityType.Stock);
// }
// public IDictionary<DateTime, double> get_option_rolls(string option_name) {
// IDictionary<DateTime, double> rv = new Dictionary<DateTime, double>();
// var list = exp_map.Where(kv => kv.Key.security_type == SecurityType.Option &&
// kv.Key.symbol == option_name);
// foreach (var kv in list)
// rv[kv.Key.expiration] = kv.Value.roll_target;
// return rv;
// }
// Returns a driver to expiration it drives
public IDictionary<mbts.SecurityExpiration, IEnumerable<mbts.SecurityExpiration>>
get_option_driver_map() {
var rv = new Dictionary<mbts.SecurityExpiration, HashSet<mbts.SecurityExpiration>>();
foreach (var kv in exp_map.Where(kv_arg => kv_arg.Key.security_type == SecurityType.Option)) {
mbts.SecurityExpiration sec = kv.Key, driver_sec = kv.Value.driver_security;
HashSet<mbts.SecurityExpiration> driven_by_this_driver;
if (!rv.TryGetValue(driver_sec, out driven_by_this_driver))
rv[driver_sec] = driven_by_this_driver = new HashSet<mbts.SecurityExpiration>();
driven_by_this_driver.Add(sec);
}
return rv.ToDictionary(kv => kv.Key, kv => kv.Value as IEnumerable<mbts.SecurityExpiration>);
}
public IDictionary<mbts.SecurityExpiration, mbts.SecurityExpiration>
get_option_to_driver_map(string option_name) {
var filt = exp_map.Where(kv => kv.Key.security_type == SecurityType.Option &&
kv.Key.symbol == option_name);
return filt.ToDictionary(kv => kv.Key, kv => kv.Value.driver_security);
}
// public IList<Tuple<mbts.SecurityExpiration, mbts.SecurityExpiration, double>>
// get_expiring_expirations(DateTime expiration_date) {
// var rv = new List<Tuple<mbts.SecurityExpiration, mbts.SecurityExpiration, double>>();
// foreach (var kv in exp_map.Where(kv_arg => kv_arg.Key.expiration == expiration_date.Date &&
// kv_arg.Value.deliverable_security != mbts.SecurityExpiration.empty)) {
// mbts.SecurityExpiration sec = kv.Key;
// mbts.SecurityExpiration deliverable = kv.Value.deliverable_security;
// rv.Add(Tuple.Create(sec, deliverable, kv.Value.settlement_price));
// }
// return rv;
// }
// public IList<Tuple<mbts.SecurityExpiration, mbts.SecurityExpiration, double>>
// get_expiring_expirations() {
// return get_expiring_expirations(DateTime.Now);
// }
}
}
@@ -1,160 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using mbts.spark;
namespace mbts.ui {
/// <summary>
/// just a conveniant way to store exp,K based data
/// </summary>
/// <typeparam name="T"></typeparam>
public class ExpStrikeKeyedData<T> {
public delegate T CreateT(DateTime exp, double strike);
private IDictionary<DateTime, IDictionary<double, T>> _map = new Dictionary<DateTime, IDictionary<double, T>>();
public ExpStrikeKeyedData() { }
public ExpStrikeKeyedData(ExpStrikeKeyedData<T> data) {
foreach (KeyValuePair<DateTime, IDictionary<double, T>> p in data._map)
_map[p.Key] = new Dictionary<double, T>(p.Value);
}
public ExpStrikeKeyedData(ICollection<Pair<DateTime, double>> exp_strikes, CreateT del) {
foreach (Pair<DateTime, double> p in exp_strikes)
set_data(p.first, p.second, del(p.first, p.second));
}
#region Mutators
public void set_data(SecurityStrike k, T t) {
set_data(k.expiration.expiration, k.strike, t);
}
public void set_data(DateTime exp, double strike, T t) {
IDictionary<double, T> strike_vs_t_map = null;
if (!_map.TryGetValue(exp, out strike_vs_t_map)) {
strike_vs_t_map = new Dictionary<double, T>();
_map.Add(exp, strike_vs_t_map);
}
strike_vs_t_map[strike] = t;
}
public void set_data_for_expiration(DateTime expiration, IDictionary<double, T> strike_data) {
_map[expiration] = strike_data;
}
public void clear() { _map.Clear(); }
public bool delete_data(DateTime exp, double strike) {
IDictionary<double, T> strike_vs_t_map = null;
if (_map.TryGetValue(exp, out strike_vs_t_map))
return strike_vs_t_map.Remove(strike);
return false;
}
#endregion
#region Accessors
public T get_data(DateTime exp, double strike) {
IDictionary<double, T> strike_vs_t_map = null;
if (_map.TryGetValue(exp, out strike_vs_t_map)) {
T rv;
if (strike_vs_t_map.TryGetValue(strike, out rv))
return rv;
}
return default(T);
}
public bool contains(DateTime exp, double strike) {
IDictionary<double, T> strike_vs_t_map = null;
return _map.TryGetValue(exp, out strike_vs_t_map) && strike_vs_t_map.ContainsKey(strike);
}
public List<double> get_strike_list_for_expiration(DateTime expiration) {
List<double> rv = new List<double>();
IDictionary<double, T> exp_map = null;
if (_map.TryGetValue(expiration, out exp_map))
rv = new List<double>(exp_map.Keys);
return rv;
}
public T get_random_data_for_exp(DateTime option_expiration) {
IDictionary<double, T> exp_data = null;
if (_map.TryGetValue(option_expiration, out exp_data))
foreach (T t in exp_data.Values)
return t;
return default(T);
}
public DateTime[] get_expirations() {
return new List<DateTime>(_map.Keys).ToArray();
}
public double[] get_strikes() {
Dictionary<double, bool> strikes = new Dictionary<double, bool>();
foreach (Pair<DateTime, double> p in get_expstrike_pairs())
if (!strikes.ContainsKey(p.second))
strikes.Add(p.second, true);
double[] rv = new double[strikes.Count];
strikes.Keys.CopyTo(rv, 0);
return rv;
}
public ICollection<Pair<DateTime, double>> get_expstrike_pairs() {
List<Pair<DateTime, double>> rv = new List<Pair<DateTime, double>>();
foreach (KeyValuePair<DateTime, IDictionary<double, T>> kv1 in _map) {
DateTime exp = kv1.Key;
foreach (KeyValuePair<double, T> kv2 in kv1.Value)
rv.Add(new Pair<DateTime, double>(exp, kv2.Key));
}
return rv;
}
private ICollection<Tuple<DateTime, double, T>> _get_data_linearly() {
List<Tuple<DateTime, double, T>> rv = new List<Tuple<DateTime, double, T>>();
foreach (KeyValuePair<DateTime, IDictionary<double, T>> kv1 in _map) {
DateTime exp = kv1.Key;
foreach (KeyValuePair<double, T> kv2 in kv1.Value)
rv.Add(new Tuple<DateTime, double, T>(exp, kv2.Key, kv2.Value));
}
return rv;
}
public ICollection<Triplet<DateTime, double, T>> get_data_linearly() {
var rv = _get_data_linearly();
return rv.Select(i => new Triplet<DateTime, double, T>(i)).ToList();
}
public ExpStrikeKeyedData<T> clone_filtered_set(HashSet<DateTime> filtered_expirations, bool is_exp_inclusive,
HashSet<double> filtered_strikes, bool is_strike_inclusive) {
ExpStrikeKeyedData<T> rv = new ExpStrikeKeyedData<T>();
foreach (KeyValuePair<DateTime, IDictionary<double, T>> ep in _map)
if ((is_exp_inclusive && filtered_expirations.Contains(ep.Key)) || (!is_exp_inclusive && !filtered_expirations.Contains(ep.Key)))
foreach (KeyValuePair<double, T> kp in ep.Value)
if ((is_strike_inclusive && filtered_strikes.Contains(kp.Key)) || (!is_strike_inclusive && !filtered_strikes.Contains(kp.Key)))
rv.set_data(ep.Key, kp.Key, kp.Value);
return rv;
}
public IDictionary<double, T> get_data_for_single_exp(DateTime exp) {
IDictionary<double, T> rv = null;
_map.TryGetValue(exp, out rv);
return rv;
}
public IReadOnlyDictionary<DateTime, IReadOnlyDictionary<double, T>> get_full_data() {
IDictionary<DateTime, IReadOnlyDictionary<double, T>> rv = _map.ToDictionary(kv => kv.Key, kv => (IReadOnlyDictionary<double, T>)kv.Value);
return (IReadOnlyDictionary<DateTime, IReadOnlyDictionary<double, T>>)rv;
}
public int count {
get {
int count = 0;
foreach (Dictionary<double, T> exp_map in _map.Values)
count += exp_map.Count;
return count;
}
}
#endregion
}
}
@@ -1,119 +0,0 @@
using System;
using System.Runtime.InteropServices;
namespace mbts.spark
{
/// <summary>
/// Provides a timer, much more accurate than using timers based on System.DateTime. It does not accumulate time, as the
/// stress was on small time intervals.
/// </summary>
public class HighPerformanceTimer
{
[DllImport("kernel32.dll")]
public extern static short QueryPerformanceCounter(ref long x);
[DllImport("kernel32.dll")]
public extern static short QueryPerformanceFrequency(ref long x);
private long myStartCount = 0, myEndCount = 0, myFreq = 0, myTotalCount = 0;
private long myZeroTime;
/// <summary>
/// This a static instance that can be shared across a running process.
/// The only member function that is thread-safe right now
/// is 'runningMilliseconds'
/// </summary>
public readonly static HighPerformanceTimer sharedTimer = new HighPerformanceTimer ();
public HighPerformanceTimer()
{
QueryPerformanceFrequency(ref myFreq);
if (myFreq == 0)
throw new ApplicationException ("High resolution timers not supported by this machine's hardware");
QueryPerformanceCounter(ref myZeroTime);
}
/// <summary>
/// starts measuring the time
/// </summary>
public void start()
{
QueryPerformanceCounter (ref myStartCount);
}
public double runningMilliseconds()
{
double rv = 0;
lock (this)
{
long t = 0;
QueryPerformanceCounter (ref t);
rv = (t - myZeroTime) * 1000.0 / myFreq;
}
return rv;
}
public double toMilliseconds(long count)
{
lock (this)
return count * 1000.0 / myFreq;
}
public double getRunningMilliseconds (long count)
{
double rv = 0;
lock (this)
{
rv = (count - myZeroTime) * 1000.0 / myFreq;
}
return rv;
}
public long nowCount
{
get
{
long t = 0;
QueryPerformanceCounter (ref t);
return t;
}
}
/// <summary>
/// stops recording time
/// </summary>
public void stop()
{
QueryPerformanceCounter (ref myEndCount);
myTotalCount += myEndCount - myStartCount;
}
/// <summary>
/// total milliseconds, ie aggregated time of all intervals
/// </summary>
public double totalMilliseconds {get{return myTotalCount * 1000.0 / myFreq ; }}
public double getMilliseconds (long count)
{
return count * 1000.0 / myFreq;
}
public long ticks {get{return myEndCount - myStartCount;}}
/// <summary>
/// time between the last start-stop
/// </summary>
public double lastIntervalTime {get{return (myEndCount - myStartCount) * 1000.0 / myFreq ; }}
/// <summary>
/// Resets the running time
/// </summary>
public void reset ()
{
QueryPerformanceCounter(ref myZeroTime);
myTotalCount = 0;
}
public long freq
{
get { return myFreq; }
}
}
}
@@ -1,19 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using mbts.analytics;
namespace mbts.spark
{
public interface IVolSurfaceBroker
{
int get_new_volsurface_id();
void save_volsurface(int volsurface_id, string volsurface_name, byte[] data, string save_marker = null);
void delete_volsurface(int volsurface_id);
/// Cleans up all the vol surfaces, leeping the
/// last active_list_size around
void clean_up(int active_list_size);
}
}
@@ -1,21 +0,0 @@
namespace mbts.spark {
public enum MessageDisplayType { Info, Warn, Error }
public class MessageDisplayData {
public MessageDisplayData(string caption, string message)
: this(caption, message, true) { }
public MessageDisplayData(string caption, string message, bool move_to_mouse)
: this(caption, message, MessageDisplayType.Info, move_to_mouse) { }
public MessageDisplayData(string caption, string message, MessageDisplayType type, bool move_to_mouse) {
this.caption = caption;
this.message = message;
this.type = type;
this.move_to_mouse = move_to_mouse;
}
public readonly string message, caption;
public readonly MessageDisplayType type;
public readonly bool move_to_mouse;
}
}
@@ -1,50 +0,0 @@
#nullable enable
namespace mbts.spark {
using bts.api;
using mbts.analytics;
using System;
using System.Collections.Generic;
using System.Linq;
// All driver prices (along with some more info) for an option symbol
public class OptionDriverPriceMap {
public readonly string option_symbol;
public readonly IDictionary<SecurityExpiration, DriverMD> exp_price_map;
Dictionary<SecurityExpiration, DriverMD>? _unexpired_exp_price_map_backing;
public OptionDriverPriceMap(
string option_symbol, IDictionary<SecurityExpiration, DriverMD> exp_price_map) {
this.option_symbol = option_symbol;
this.exp_price_map = exp_price_map;
}
public IDictionary<SecurityExpiration, DriverMD> unexpired_exp_price_map =>
_unexpired_exp_price_map_backing ??=
exp_price_map.Where(kv => kv.Key.expiration >= DateTime.Now.Date).ToDictionary();
// this is the BS needed because of ignoring exchange
public DriverMD get_driver_md(DateTime exp) =>
exp_price_map.FirstOrDefault(kv => kv.Key.expiration == exp).Value ?? DriverMD.empty;
public DriverMD get_driver_md(SecurityExpiration exp) =>
exp_price_map.GetValueOrDefault(exp) ?? DriverMD.empty;
public static IDictionary<VolSurfaceExpiration, DriverMD> get_vs_price_map(
IReadOnlyDictionary<string, OptionDriverPriceMap> all_sym_map,
Func<string, bool>? sym_filter = null
) {
sym_filter ??= _ => true;
return all_sym_map.SafeWhere(kv => kv.Value is not null && sym_filter(kv.Key))
.SelectMany(kv => kv.Value.exp_price_map)
.ToDictionaryCrushed(kv => kv.Key.to_vs_exp(), kv => kv.Value);
}
public IReadOnlyDictionary<SecurityExpiration, DriverMD> get_price_map() {
return new Dictionary<SecurityExpiration, DriverMD>(exp_price_map);
}
}
}
@@ -1,128 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace mbts.spark {
// A conveniant way to hold precomputed theo values
// indexed by option_expiration->driver_price->option_strike->TheoPoint
public class OptionTheoInterpolationData {
public readonly string symbol;
private IDictionary<DateTime, Dictionary<double, Dictionary<double, TheoPoint>>> _map =
new Dictionary<DateTime, Dictionary<double, Dictionary<double, TheoPoint>>>();
private IDictionary<DateTime, double> _zero_move_driver_map = new Dictionary<DateTime, double>();
public OptionTheoInterpolationData(string symbol) { this.symbol = symbol; }
public void set_data(DateTime option_expiration, double driver_price,
double move, double option_strike, TheoPoint theo_point) {
Dictionary<double, Dictionary<double, TheoPoint>> driver_map = null;
if (!_map.TryGetValue(option_expiration, out driver_map))
_map.Add(option_expiration, driver_map = new Dictionary<double, Dictionary<double, TheoPoint>>());
Dictionary<double, TheoPoint> strike_map = null;
if (!driver_map.TryGetValue(driver_price, out strike_map))
driver_map.Add(driver_price, strike_map = new Dictionary<double, TheoPoint>());
strike_map[option_strike] = theo_point;
if (move == 0)
_zero_move_driver_map[option_expiration] = driver_price;
}
/// Returns NULL if data is not present (should it return a nulled out TheoPoint ?)
public TheoPoint get_data(DateTime option_expiration, double driver_price, double option_strike) {
Dictionary<double, Dictionary<double, TheoPoint>> driver_map = null;
Dictionary<double, TheoPoint> strike_map = null;
TheoPoint rv = null;
if (_map.TryGetValue(option_expiration, out driver_map))
if (driver_map.TryGetValue(driver_price, out strike_map))
if (strike_map.TryGetValue(option_strike, out rv))
return rv;
return null;
}
public Dictionary<double, Dictionary<double, TheoPoint>> get_expiration_data(
DateTime option_expiration) {
Dictionary<double, Dictionary<double, TheoPoint>> rv = null;
_map.TryGetValue(option_expiration, out rv);
return rv;
}
public List<double> get_sorted_driverprices_for_expiration(DateTime option_expiration) {
List<double> rv = new List<double>();
Dictionary<double, Dictionary<double, TheoPoint>> driver_map = null;
if (_map.TryGetValue(option_expiration, out driver_map)) {
rv = new List<double>(driver_map.Keys);
rv.Sort();
}
return rv;
}
public IEnumerable<DateTime> get_expirations() { return _map.Keys; }
public bool contains_expiration(DateTime exp) {
Dictionary<double, Dictionary<double, TheoPoint>> price_map = null;
return _map.TryGetValue(exp, out price_map) && price_map != null && price_map.Count > 0;
}
public IDictionary<DateTime, HashSet<double>> get_contracts() {
Dictionary<DateTime, HashSet<double>> rv = new Dictionary<DateTime, HashSet<double>>();
foreach (KeyValuePair<DateTime, Dictionary<double, Dictionary<double, TheoPoint>>> exp_p in _map) {
HashSet<double> strike_map = new HashSet<double>();
foreach (KeyValuePair<double, Dictionary<double, TheoPoint>> driver_p in exp_p.Value)
strike_map.AddRange(driver_p.Value.Keys);
rv.Add(exp_p.Key, strike_map);
}
return rv;
}
public int get_n_exps() { return _map.Count; }
public double get_zero_move_driver(DateTime option_exp) {
double rv = _zero_move_driver_map.TryGetValue(option_exp, out rv) ? rv : Double.NaN;
return rv;
}
#region Interpoaltion
public TheoPoint interpolate_theos(DateTime option_expiration,
double option_strike,
double driver_price) {
Tuple<double, double> neighbor_driver_points =
_find_neighboring_drivers(this, option_expiration, driver_price);
return _interpolate_theos(this, driver_price,
neighbor_driver_points, option_expiration, option_strike);
}
private static Tuple<double, double> _find_neighboring_drivers(
OptionTheoInterpolationData interp_data, DateTime option_expiration, double driver_price) {
if (interp_data != null) {
List<double> sorted_drivers =
interp_data.get_sorted_driverprices_for_expiration(option_expiration);
for (int i = 0; i < sorted_drivers.Count - 1; i++)
if (driver_price >= sorted_drivers[i] && driver_price <= sorted_drivers[i + 1])
return new Tuple<double, double>(sorted_drivers[i], sorted_drivers[i + 1]);
}
return null;
}
private static TheoPoint _interpolate_theos(OptionTheoInterpolationData interp_data,
double driver_price, Tuple<double, double> neighbors,
DateTime option_expiration,
double option_strike) {
TheoPoint rv = TheoPoint.getNulledObject();
rv.driver = driver_price;
if (interp_data != null && neighbors != null) {
TheoPoint p1 = interp_data.get_data(option_expiration, neighbors.Item1, option_strike),
p2 = interp_data.get_data(option_expiration, neighbors.Item2, option_strike);
if (p1 != null && p2 != null)
TheoPoint.interp(TheoPoint.InterpolationMethod.TAYLOR,
p1, p2, driver_price, rv, option_expiration, option_strike);
}
return rv;
}
#endregion
}
}
-78
View File
@@ -1,78 +0,0 @@
using ProtoBuf;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Media;
namespace mbts.spark {
// TODO move it out or replace it with Tuple
[Serializable]
public class Pair<F, S> {
public F first;
public S second;
public Pair() { }
public Pair(F f, S s) {
first = f;
second = s;
}
public Pair(KeyValuePair<F, S> kvp)
: this(kvp.Key, kvp.Value) { }
public override string ToString() {
return String.Format("{0},{1}", first != null ? first.ToString() : "NULL",
second != null ? second.ToString() : "NULL");
}
public override int GetHashCode() {
return ToString().GetHashCode();
}
public override bool Equals(object obj) {
return obj != null && obj is Pair<F, S> && ToString() == obj.ToString();
}
}
[Serializable]
public class Triplet<F, S, T> {
public F first;
public S second;
public T third;
public Triplet() { }
public Triplet(Tuple<F, S, T> tp) {
first = tp.Item1;
second = tp.Item2;
third = tp.Item3;
}
public Triplet(F f, S s, T t) {
first = f;
second = s;
third = t;
}
public static Triplet<F, S, T> from_tuple(Tuple<F, S, T> t) { return new Triplet<F, S, T>(t.Item1, t.Item2, t.Item3); }
public override string ToString() {
return String.Format("{0},{1},{2}", first != null ? first.ToString() : "NULL",
second != null ? second.ToString() : "NULL",
third != null ? third.ToString() : "NULL");
}
public override bool Equals(object obj) {
return obj != null && obj is Triplet<F, S, T> && ToString() == obj.ToString();
}
public override int GetHashCode() {
return ToString().GetHashCode();
}
}
}
@@ -1,78 +0,0 @@
using System;
using System.Collections.Generic;
using System.Drawing.Text;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using bts;
namespace mbts.spark {
public class PerfStatsLogger {
private class Entry {
public uint tot_count = 0;
public List<double> logs = new List<double>();
}
private Dictionary<string, Entry> _entry_map =
new Dictionary<string, Entry>();
private readonly int _log_period_updates, _max_size;
private DateTime _last_write_time = DateTime.Now;
private readonly string _default_id = String.Empty;
private readonly HighPerformanceTimer _defaut_timer = new HighPerformanceTimer();
public PerfStatsLogger() : this(100, 200) { }
/// <summary>
/// log_period_updates tells how often are the stats logged
/// max_size is the max size of the sample before it is cleaned out
/// </summary>
/// <param name="log_period_updates"></param>
/// <param name="max_size"></param>
public PerfStatsLogger(int log_period_updates, int max_size, string default_id = "") {
_log_period_updates = log_period_updates;
_max_size = max_size;
_default_id = default_id;
}
public void start_default_timer() {
_defaut_timer.start();
}
public void stop_default_timer() {
if (String.IsNullOrEmpty(_default_id))
return;
_defaut_timer.stop();
log(_default_id, _default_id, _defaut_timer.lastIntervalTime);
}
public void log_default(double time) {
log(_default_id, _default_id, time);
}
public void log(string id, string msg, double time) {
Entry entry = null;
if (!_entry_map.TryGetValue(id, out entry))
_entry_map.Add(id, entry = new Entry());
List<double> logs = entry.logs;
logs.Add(time);
entry.tot_count++;
if (logs.Count > 0 && logs.Count % _log_period_updates == 0) {
TimeSpan period = DateTime.Now - _last_write_time;
_last_write_time = DateTime.Now;
logs.Sort();
double sum = 0;
logs.ForEach(d => sum += d);
Log.Gen.info(String.Format("Perf: {0} sample_size: {1} min: {2:0.00} max: {3:0.00} " +
"mean: {4:0.00} median: {5:0.00} upate_period: {6:0.00} " +
"updates_per_sec: {7:0.00} tot_count: {8}", msg, logs.Count,
logs[0], logs[logs.Count - 1], sum / logs.Count,
logs[logs.Count / 2],
period.TotalMilliseconds,
1000.0 * logs.Count / period.TotalMilliseconds,
entry.tot_count));
logs.Clear();
}
}
}
}
Loaded 100 of 4231 files, more files were not shown because too many files have changed in this diff. Show more