Compare commits

...
31 Commits
Author SHA1 Message Date
Kevin Darby a364ebdbaf move subrepo pointers 2019-08-14 15:22:03 -04:00
Jake Norbut 41bc4f7950 re-generated conf with SOM and latest from CME ftp 2019-08-14 11:51:07 -05:00
Jake Norbut 963bd15b35 adding SOM manual list; CME does not publish SOM data in their ftp 2019-08-14 11:50:24 -05:00
pfisher 282e10cba3 fixed update.txt test 2019-08-13 12:04:11 -04:00
Kevin Darby fa1b436fb3 added sticky button release notes 2019-08-09 10:53:02 -04:00
Kevin Darby 191518d8bc Merged in fix_algo_docs (pull request #316)
removing duplicate mark down describing algos

Approved-by: Michael Harding <michael.harding@bluetradesys.com>
2019-08-08 20:26:11 +00:00
Kevin Darby 50768750d6 removing duplicate mark down describing algos 2019-08-08 16:14:49 -04:00
Jake Norbut 450ef7dd56 Merged in SP-128 (pull request #312)
SP-128 - Allow for configurable stickyness on Algo Favorites

Approved-by: Kevin Darby <kevin.darby@bluetradesys.com>
2019-08-08 19:26:03 +00:00
Jake Norbut 89a4f9264a LadderSaveState now at version 2; implementing upgrade mechanism for migrating existing favorite algos to stickied algos 2019-08-08 13:03:26 -05:00
Jake Norbut 55ade15574 provide upgrade mechanism when loading IShellWindow 2019-08-08 13:01:19 -05:00
Kevin Darby 36b8b35e47 Merged in fix_tooltips2 (pull request #315)
fix non-dynamic and non-generic tooltips

Approved-by: Jake Norbut <jake.norbut@bluetradesys.com>
2019-08-08 16:18:29 +00:00
Kevin Darby 23bb872052 fix non-dynamic and non-generic tooltips 2019-08-08 12:09:48 -04:00
Jake Norbut bf8df1d396 always push Limit onto the algo stack; henceforth known as the anchor 2019-08-06 10:24:59 -05:00
John Colvin d064af817c remove unreferenced '_sticky_algos' field 2019-08-05 15:51:21 -05:00
John Colvin 7b3c4b76bc LadderVM/OrderPropertiesEditorVM sticky/stack behavior 2019-08-05 15:36:57 -05:00
John Colvin 5de431f279 make LadderVM.send_order_command an IAsyncCommand 2019-08-05 15:36:57 -05:00
John Colvin 7b63d951f0 ShellSettingsDialogVM profilevm resets 'is_dirty' whenever the internal vm's resultant value equals the target value 2019-08-05 15:36:57 -05:00
John Colvin 018887980b LadderSettingsVM 'sticky buttons' impl reacts to FavoriteAlgoItem's value (algo) changes 2019-08-05 15:06:39 -05:00
John Colvin 8b4d649bd4 ExecuteAsync should return the Task directly (no need to await internally) 2019-08-05 15:06:39 -05:00
Jake Norbut 441d3c886b fixing improper use of is 2019-08-05 15:06:39 -05:00
Jake Norbut 472e32f558 removing empty new lines; leftovers from Dispatcher debugging 2019-08-05 15:06:39 -05:00
Jake Norbut 472c9252f9 adding Stay Enabled (sticky) checkbox to Favorites UI 2019-08-05 15:06:39 -05:00
Jake Norbut 98a9ad3ef2 reset order type after non-sticky order entry 2019-08-05 15:06:39 -05:00
Jake Norbut 7b237fedea adding sticky-related bits 2019-08-05 15:06:39 -05:00
Jake Norbut 7281aa8ff1 adding is_sticky property 2019-08-05 15:06:39 -05:00
Jake Norbut d915e2f064 setting algo_def_vm.is_sticky via CollectionChanged event (hmm) 2019-08-05 15:06:39 -05:00
Jake Norbut beb5d855b1 Dispatcher debuggering with John; think does not appear to work since the if condition is never met, but commiting this part of the pair-debugging experience 2019-08-05 15:06:39 -05:00
Jake Norbut 120b86aaae popuplating stickied algo keys for persistence/restoration state 2019-08-05 15:06:39 -05:00
Jake Norbut 44eeff98e7 adding is_sticky member to which the view will Databind 2019-08-05 15:06:39 -05:00
Jake Norbut dc420a097a adding stickied_algos ProtoMember for persistence 2019-08-05 15:06:39 -05:00
Jake Norbut 69ee85dea9 misc - adding OnDispatcher after discussing with John 2019-08-05 15:06:39 -05:00
22 changed files with 292 additions and 154 deletions

No files matched your search

+1
View File
@@ -16,6 +16,7 @@ insert_anchor_links = "right"
selected by default
- Increased width of login panel to better show login error messages
- Added optional 'Maker/Taker' pricing to Spreader algo
- Algo buttons in ladder can now be made to deactivate after launching an algo or remain 'sticky'
### Internal changes
- Made it easier to generate simple UI's for new order types
### API Changes
@@ -10,7 +10,7 @@ using System.Reactive.Disposables;
namespace mbts.spark {
static class AlgoParamRowsHelper {
public static IDisposable connect(AlgoDefinitionVM algo, ObservableAggregateCollection<AlgoParamRowVM> rows, bool include_algo_type_rows) =>
algo == null ? null : new CompositeDisposable(algo.observe_algo_root().SubscribeEach(a => {
algo == null ? null : new CompositeDisposable(algo.observe_algo_root().OnDispatcher().SubscribeEach(a => {
rows.clear_collections();
if (a == null)
return Disposable.empty;
@@ -77,7 +77,7 @@ namespace mbts.spark {
include_algo_type_rows ?
(ObservableCollection<AlgoParamRowVM>)new ObservableAppendCollection<AlgoParamRowVM>(child_rows, selector_wrapper) :
child_rows,
s.subscribe_selected_algo().SubscribeEach(a => {
s.subscribe_selected_algo().OnDispatcher().SubscribeEach(a => {
s.value = a;
child_rows.clear_collections();
return _wrap_rows(a, selector_wrapper, child_rows, include_algo_type_rows);
@@ -194,20 +194,27 @@ namespace mbts.spark {
readonly bts.persist.algo.AlgoPersistedKey[] _favorite_algos;
[ProtoMember(2)]
public readonly int column_count;
[ProtoMember(3)]
readonly bts.persist.algo.AlgoPersistedKey[] _stickied_algos;
public LadderFavoriteAlgosSettings(AlgoKey[] favorite_algos, int column_count)
: this(ArrayHelper.safe_convert(favorite_algos, k => new bts.persist.algo.AlgoPersistedKey(k.persisted)), column_count) { }
public LadderFavoriteAlgosSettings(AlgoKey[] favorite_algos, int column_count, AlgoKey[] stickied_algos)
: this(ArrayHelper.safe_convert(favorite_algos, k => new bts.persist.algo.AlgoPersistedKey(k.persisted)),
column_count,
ArrayHelper.safe_convert(stickied_algos, k => new bts.persist.algo.AlgoPersistedKey(k.persisted))) { }
LadderFavoriteAlgosSettings(bts.persist.algo.AlgoPersistedKey[] favorite_algos, int column_count) {
LadderFavoriteAlgosSettings(bts.persist.algo.AlgoPersistedKey[] favorite_algos, int column_count, bts.persist.algo.AlgoPersistedKey[] stickied_algos) {
_favorite_algos = favorite_algos;
this.column_count = column_count;
_stickied_algos = stickied_algos;
}
public IReadOnlyList<AlgoKey> favorite_algos => ArrayHelper.safe_convert(_favorite_algos, k => k.to_algo_key());
public IReadOnlyList<AlgoKey> stickied_algos => ArrayHelper.safe_convert(_stickied_algos, k => k.to_algo_key());
public bool Equals(LadderFavoriteAlgosSettings other) =>
column_count == other.column_count &&
favorite_algos.SequenceEqual(other.favorite_algos);
favorite_algos.SequenceEqual(other.favorite_algos) &&
stickied_algos.SequenceEqual(other.stickied_algos);
public override bool Equals(object obj) =>
EqualityComparer.equals_obj(this, obj);
@@ -215,7 +222,8 @@ namespace mbts.spark {
public override int GetHashCode() =>
EqualityComparer.aggregate_hash(
column_count,
EqualityComparer.aggregate_hash_limited(favorite_algos));
EqualityComparer.aggregate_hash_limited(favorite_algos),
EqualityComparer.aggregate_hash_limited(stickied_algos));
public static bool operator ==(LadderFavoriteAlgosSettings a, LadderFavoriteAlgosSettings b) => a.Equals(b);
public static bool operator !=(LadderFavoriteAlgosSettings a, LadderFavoriteAlgosSettings b) => !a.Equals(b);
@@ -273,7 +281,7 @@ namespace mbts.spark {
order_entry_panel_initial_width = _default_order_entry_panel_width;
zoom_factor = _default_zoom_factor;
use_defaults = true;
favorite_algos = new LadderFavoriteAlgosSettings(null, 2);
favorite_algos = new LadderFavoriteAlgosSettings(null, 2, null);
show_warn_on_cross = _default_show_warn_on_cross;
}
@@ -11,6 +11,7 @@ using ProtoBuf;
using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.IO;
using System.Linq;
using System.Reactive.Linq;
using System.Reactive.Subjects;
@@ -22,6 +23,7 @@ using LadderSettings = mbts.spark.LadderSettings;
namespace bts.shell {
class LadderWindowFactory : ShellWindowFactory<LadderSaveState> {
const string _window_type = "ladder";
const int _version_where_stickied_algos_introduced = 2;
readonly LadderConfig _ladder_conf;
readonly IBus _bus;
readonly IWindowManager _wm;
@@ -38,7 +40,7 @@ namespace bts.shell {
OrdersModel orders_model,
MBOService mbo)
: base(owner, "SparkLadder") {
: base(owner, "SparkLadder", 2) {
_bus = bus;
_wm = wm;
_settings_hub = settings_hub;
@@ -60,6 +62,16 @@ namespace bts.shell {
return null;
}
protected override Task<IShellWindow> try_upgrade_state(Stream load_stream, int version) {
var state = ProtoBuf.Serializer.DeserializeWithLengthPrefix<LadderSaveState>(load_stream, ProtoBuf.PrefixStyle.Fixed32);
if (version < _version_where_stickied_algos_introduced) {
// We want to assign any existing favorite algos to stickied algos upon setting upgrade
var favorite_algos_array = state.settings.favorite_algos.favorite_algos.ToArray();
state.settings.favorite_algos = new LadderFavoriteAlgosSettings(favorite_algos_array, state.settings.favorite_algos.column_count, favorite_algos_array);
}
return load(state);
}
LadderSaveState _get_state(LadderVM vm, uint id) {
LadderSettings s = vm.get_save_state();
if (id != 0) {
@@ -2,6 +2,7 @@
using bts.api;
using bts.api.orderman;
using bts.collections;
using bts.persist.algo;
using bts.shell.orderbook;
using bts.utils;
using mbts.collections;
@@ -723,12 +724,15 @@ namespace mbts.spark {
readonly IObservableCollection<AlgoDefinitionVM> _algo_definitions;
readonly ObservableCollection<FavoriteAlgoItem> _raw_items = new ObservableCollection<FavoriteAlgoItem>();
int _column_count = 2;
HashSet<AlgoPersistedKey> _sticky_algo_keys;
IDisposable _sticky_algos_hook;
public FavoriteAlgosVM(IObservableCollection<AlgoDefinitionVM> algo_definitions) {
_algo_definitions = algo_definitions;
items = new ObservableAggregateCollection<FavoriteAlgoItem>(_raw_items, new ObservableCollection<FavoriteAlgoItem> { FavoriteAlgoItem.AddButtonPlaceholderItem });
add_item_cmd = new DelegateCommand(() => _raw_items.Add(_item_factory()));
remove_item_cmd = new DelegateCommand<FavoriteAlgoItem>(fai => _raw_items.Remove(fai));
_dispose = Disposable.Create(() => Disposable.dispose(ref _sticky_algos_hook));
}
public ObservableCollection<FavoriteAlgoItem> items { get; }
@@ -745,6 +749,17 @@ namespace mbts.spark {
fai.selector.try_select(k);
return fai;
}));
_sticky_algo_keys = new HashSet<AlgoPersistedKey>(value.stickied_algos.Where(k => k.is_persisted).Select(x => new AlgoPersistedKey(x.persisted)));
Disposable.replace(ref _sticky_algos_hook,
ObservableAutoWrapper.connect_item_hooks(_raw_items, x =>
x.selector.subscribe_value().Subscribe(algo => {
if (algo != null &&
algo.key.is_persisted &&
(x.is_sticky = _sticky_algo_keys.Remove(new AlgoPersistedKey(algo.key.persisted))) &&
_sticky_algo_keys.Count == 0)
//
Disposable.dispose(ref _sticky_algos_hook);
})));
}
public LadderFavoriteAlgosSettings create() =>
@@ -753,7 +768,13 @@ namespace mbts.spark {
.Where(k => k.HasValue && k.Value.is_persisted)
.Select(k => k.Value)
.ToArray(),
column_count);
column_count,
_raw_items
.Where(fai => fai.is_sticky)
.Select(fai => fai.algo_definition?.key ?? fai.selector.desired_key)
.Where(k => k.HasValue && k.Value.is_persisted)
.Select(k => k.Value)
.ToArray());
FavoriteAlgoItem _item_factory() =>
new FavoriteAlgoItem(_algo_definitions, new ListCollectionView<AlgoDefinitionVM>(_algo_definitions) {
@@ -766,6 +787,7 @@ namespace mbts.spark {
public static readonly FavoriteAlgoItem AddButtonPlaceholderItem = new _AddButtonPlaceholderItem();
internal readonly KeyedItemSelector<AlgoDefinitionVM, AlgoKey> selector;
bool _is_sticky;
protected FavoriteAlgoItem() { }
@@ -776,6 +798,7 @@ namespace mbts.spark {
public ICollectionView<AlgoDefinitionVM> algo_definitions_view { get; }
public AlgoDefinitionVM algo_definition { get => selector.value; set => selector.value = value; }
public bool is_sticky { get => _is_sticky; set => Set(ref _is_sticky, value); }
class _AddButtonPlaceholderItem : FavoriteAlgoItem, ITemplateSelectorKey {
public string key => LadderSettingsView.FavoriteAlgoAddButtonTemplateKey;
@@ -1,9 +1,11 @@
using bts.api;
using bts.api.orderman;
using bts.collections;
using bts.shell;
using bts.spark;
using bts.utils;
using mbts.co2;
using mbts.spark.utilities;
using mbts.ui;
using mbts.ui.shell;
using mbts.utils;
@@ -32,6 +34,7 @@ namespace mbts.spark {
_show_tif, _show_order_type, _show_size_preset, _show_auto_clear, _show_clear, _show_cancel_buys,
_show_cancel_sells, _show_cancel_all, _show_zoom;
readonly PropertyAutoWrapper<LadderSettings, Brush> _bid_background, _bid_foreground, _ask_background, _ask_foreground;
readonly HashSet<AlgoKey> _sticky_algos = new HashSet<AlgoKey>();
double _position, _day_position;
bool _show_account_position, _show_day_position;
ulong _misc_time = 0;
@@ -133,7 +136,7 @@ namespace mbts.spark {
//_window_height = backing(nameof(window_height), settings_manager.subscribe_current().OnDispatcher().Select(s => s.zoom_factor), (scale) => scale * 600);
//_window_width = backing(nameof(window_width), settings_manager.subscribe_current().OnDispatcher().Select(s => s.zoom_factor), (scale) => scale * 420);
position_click_command = new DelegateCommand(() => size_calculator.value = DoubleHelper.safe_convert_to_uint(Math.Abs(_show_day_position ? day_position : position)));
send_order_command = new DelegateCommand<(double price, Side? side, MouseButton button)>(send_order);
send_order_command = new AsyncCommand<(double price, Side? side, MouseButton button)>(send_order_async);
cancel_command = new AsyncCommand<LadderModel.CancelType>(_model.cancel_orders, true);
show_book_command = new DelegateCommand(_show_book);
show_ticket_command = new DelegateCommand(_show_ticket);
@@ -223,7 +226,10 @@ namespace mbts.spark {
.SelectManyInSeries(a => _model.order_gateway.on_security_positions(security.Id)
.Select(table => table.state.Values.FirstOrDefault(pos => pos.Item2.Account == a, tup => tup.Item2, (bts.api.position.PositionUnitImmutable?)null)));
return Disposable.Create(
settings.OnDispatcher().Subscribe(s => order_properties_vm.on_favorite_algos(s.favorite_algos)),
settings.OnDispatcher().Subscribe(s => {
_sticky_algos.SetItems(s.favorite_algos.stickied_algos);
order_properties_vm.on_favorite_algos(s.favorite_algos);
}),
order_properties_vm,
position_src.OnDispatcher().Subscribe(pos => {
double total, day;
@@ -400,20 +406,19 @@ namespace mbts.spark {
settings_invalidated?.Invoke();
}
public void send_order((double price, Side? side, MouseButton button) args) {
if (order_properties_vm == null || args.button == MouseButton.Middle)
return;
var size_from_alternate = args.button == MouseButton.Right;
if (DoubleHelper.IsNaNOrInfinity(args.price) || !args.side.HasValue || HasErrors || order_properties_vm.HasErrors || (size_from_alternate && current_settings.alternate_order_size == 0)) {
return;
}
if (!size_from_alternate && (!size_calculator.value.HasValue || size_calculator.value.Value == 0)) {
size_calculator.flash_error();
}
else {
uint size = size_from_alternate ? current_settings.alternate_order_size : (uint)Math.Abs(size_calculator.value ?? 0);
send_order_async(args.side.Value, size, args.price).ignore();
public Task send_order_async((double price, Side? side, MouseButton button) args) {
if (order_properties_vm != null && args.button != MouseButton.Middle) {
var size_from_alternate = args.button == MouseButton.Right;
if (!DoubleHelper.IsNaNOrInfinity(args.price) && args.side.HasValue && !HasErrors && !order_properties_vm.HasErrors && (!size_from_alternate || current_settings.alternate_order_size > 0)) {
if (!size_from_alternate && (!size_calculator.value.HasValue || size_calculator.value.Value == 0)) {
size_calculator.flash_error();
} else {
uint size = size_from_alternate ? current_settings.alternate_order_size : (uint)Math.Abs(size_calculator.value ?? 0);
return send_order_async(args.side.Value, size, args.price);
}
}
}
return Task.CompletedTask;
}
public async Task send_order_async(Side side, uint size, double price) {
@@ -433,6 +438,13 @@ namespace mbts.spark {
await _model.order_gateway.send_order(order, price, size);
if (auto_clear)
size_calculator.value = 0;
var fav_algo = order_properties_vm.selected_favorite_algo_definition;
if (fav_algo != null && !_sticky_algos.Contains(fav_algo.key) && !order_properties_vm.try_pop_selected_algo_definition()) {
var key = new AlgoKey(OrderDataHelper.get_default_algo(OrderDataHelper.get_algo_format(security.ContractCase)));
if (order_properties_vm.try_get_algo_definition(key, out var r)) {
order_properties_vm.selected_algo_definition = r;
}
}
}
void _update_header() {
@@ -805,6 +805,7 @@
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" SharedSizeGroup="c0"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto" SharedSizeGroup="c1"/>
</Grid.ColumnDefinitions>
<Button Command="{Binding DataContext.remove_item_cmd, RelativeSource={RelativeSource AncestorType=ItemsControl}}" CommandParameter="{Binding}" Style="{StaticResource RoundCloseButton}"/>
<ComboBox Grid.Column="1" ItemsSource="{Binding algo_definitions_view}" SelectedItem="{Binding algo_definition}">
@@ -814,6 +815,7 @@
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
<CheckBox Grid.Column="2" VerticalAlignment="Center" VerticalContentAlignment="Center" IsChecked="{Binding is_sticky}"> Stay Enabled?</CheckBox>
</Grid>
</DataTemplate>
</u:KeyedTemplateSelector.Default>
@@ -823,6 +825,7 @@
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" SharedSizeGroup="c0"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto" SharedSizeGroup="c1"/>
</Grid.ColumnDefinitions>
<Button Grid.Column="1" HorizontalAlignment="Stretch" Command="{Binding DataContext.add_item_cmd, RelativeSource={RelativeSource AncestorType=ItemsControl}}">Add</Button>
</Grid>
@@ -60,6 +60,7 @@ namespace mbts.spark {
readonly ListCollectionView<AlgoDefinitionVM> _algo_definitions_view, _favorite_algo_definitions_view;
readonly TableUpdateBuffer<AlgoData, AlgoKey> _definitions_buffer = new TableUpdateBuffer<AlgoData, AlgoKey>(d => d.key);
readonly ObservableAggregateCollection<AlgoParamRowVM> _algo_param_rows = new ObservableAggregateCollection<AlgoParamRowVM>();
readonly AlgoDefinitionVM the_anchor_algo_def_vm;
IReadOnlyDictionary<AlgoKey, AlgoDefinitionMetadata> _algo_metadata = DictionaryHelper.empty<AlgoKey, AlgoDefinitionMetadata>();
IReadOnlyDictionary<AlgoKey, int> _favorite_algos_index = DictionaryHelper.empty<AlgoKey, int>();
IDisposable _algo_param_rows_hook;
@@ -68,6 +69,7 @@ namespace mbts.spark {
public OrderPropertiesEditorVM(OrdersModel model, IObservable<SecurityMD> security_md_source, IObservable<InlineOrderProperties> order_properties) {
_model = model;
the_anchor_algo_def_vm = AlgoDefinitionVM.create(_model, OrderDataHelper.Defaults.AlgoData(CustomOrderDefinition.CustomOneofCase.Limit));
var security_source = security_md_source.Select(smd => smd.security);
_security = backing(nameof(security), security_source, SecurityDataHelper.Defaults.SecurityImmutable);
security_source = _security.observe_current(true);
@@ -237,11 +239,15 @@ namespace mbts.spark {
void _selected_algo_definition_Changed(AlgoDefinitionVM old_value, AlgoDefinitionVM new_value, SelectionReason reason) {
Disposable.dispose(ref _algo_param_rows_hook);
if (old_value != null)
// Taha feels that we should always revert to a Limit order either when the user explicity unchecks a sticky button
// or when a non-sticky button is pressed. Rather than completely remove the stack at this time (b/c it may be come
// back in the future), let's just always push a specfic def_vm.key onto it [Limit] ;)
//_selected_algo_stack.Push(old_value.key);
_selected_algo_stack.Push(the_anchor_algo_def_vm.key);
if (new_value != null) {
if (use_algo_param_grid)
_algo_param_rows_hook = _connect_algo_param_rows(new_value, _algo_param_rows);
if (reason != SelectionReason.Explicit)
_selected_algo_stack.Push(new_value.key);
}
if (open_algo_popup_on_select) {
if (reason == SelectionReason.UserSelectedNewValue && new_value?.algo_root is IAlgoVM ar && ar.can_expand)
@@ -277,6 +283,18 @@ namespace mbts.spark {
get => _selected_algo_definition.selected_item;
set => _selected_algo_definition.selected_item = value;
}
public bool try_get_algo_definition(AlgoKey a, out AlgoDefinitionVM result) =>
_algo_definitions.TryGetValue(a, out result);
public bool try_pop_selected_algo_definition() {
if (_selected_algo_stack.TryPop(out AlgoKey k) && _algo_definitions.TryGetValue(k, out AlgoDefinitionVM vm)) {
_selected_algo_definition.select_explicit(vm);
return true;
}
return false;
}
public AlgoDefinitionVM selected_favorite_algo_definition {
get => selected_algo_definition?.is_favorite ?? false ? selected_algo_definition : null;
set {
@@ -353,6 +371,7 @@ namespace mbts.spark {
d.favorite_index = _get_favorite_algo_index(d.key);
}
favorite_algos_column_count = value.column_count;
RaisePropertyChanged(nameof(selected_favorite_algo_definition));
}
static IDisposable _connect_algo_param_rows(AlgoDefinitionVM def, ObservableAggregateCollection<AlgoParamRowVM> rows) =>
@@ -371,4 +390,4 @@ namespace mbts.spark {
algo_definitions_view.Refresh();
}
}
}
}
@@ -34,13 +34,14 @@ namespace bts.shell {
Disposable.dispose(ref _dispose);
}
public abstract Task<IShellWindow> load(T state);
protected virtual Task<IShellWindow> try_upgrade_state(Stream load_stream, int version) => null;
public Task<IShellWindow> load_window(Stream load_stream, int version) {
if (version == this.version) {
var t = ProtoBuf.Serializer.DeserializeWithLengthPrefix<T>(load_stream, ProtoBuf.PrefixStyle.Fixed32);
return load(t);
}
return null;
return try_upgrade_state(load_stream, version);
}
public void save(T data, Stream output) {
var header = new ShellSerializationHeader() {
@@ -687,7 +687,10 @@
<ColumnDefinition Width="{Binding Source={StaticResource HorizontalPush3}}"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock VerticalAlignment="Center">Tick Offset</TextBlock>
<StackPanel Orientation="Horizontal">
<TextBlock VerticalAlignment="Center" >Tick Offset</TextBlock>
<c:HelpButton Margin="{StaticResource Margin.LP1}" ToolTip="How many ticks off the inside market to deploy the order, this guards against crossing the market inadventently" />
</StackPanel>
<c:TickUpDownUInt x:Name="PART_TickOffsetOnDeploy_TickUpDownUInt" Grid.Column="2" Value="{Binding tick_offset_on_deploy}"/>
<uag:AlgoPickerNodeView
x:Name="PART_Child_AlgoPickerNodeView"
@@ -905,7 +908,10 @@
<ColumnDefinition Width="{Binding Source={StaticResource HorizontalPush1}}" MaxWidth="{Binding Source={StaticResource HorizontalPush1}}"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock HorizontalAlignment="Left" VerticalAlignment="Center" Margin="{StaticResource Margin.LP3}">Max Show Quantity</TextBlock>
<StackPanel Orientation="Horizontal">
<TextBlock VerticalAlignment="Center" Margin="{StaticResource Margin.LP3}">Max Show Quantity</TextBlock>
<c:HelpButton Margin="{StaticResource Margin.LP3}" ToolTip="Maximum size to show on GLBX, this is the exchange provided iceberg" />
</StackPanel>
<c:TickUpDownNullableUInt x:Name="PART_MaxShowQuantity_TickUpDownNullableUInt" Grid.Column="2" HorizontalAlignment="Stretch" Value="{Binding max_show_quantity}"/>
</Grid>
</DataTemplate>
@@ -944,7 +950,10 @@
<ColumnDefinition Width="{Binding Source={StaticResource HorizontalPush1}}" MaxWidth="{Binding Source={StaticResource HorizontalPush1}}"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock HorizontalAlignment="Left" VerticalAlignment="Center" Margin="{StaticResource Margin.LP3}">Show Quantity</TextBlock>
<StackPanel Orientation="Horizontal">
<TextBlock HorizontalAlignment="Left" VerticalAlignment="Center" Margin="{StaticResource Margin.LP3}">Show Quantity</TextBlock>
<c:HelpButton Margin="{StaticResource Margin.LP3}" ToolTip="Maximum size to show on exchange, this is the BTS provided iceberg" />
</StackPanel>
<c:TickUpDownDouble x:Name="PART_ShowQuantity_TickUpDownDouble" Grid.Column="2" HorizontalAlignment="Stretch" Value="{Binding show_quantity}"/>
<uag:AlgoPickerNodeView
x:Name="PART_Child_AlgoPickerNodeView"
@@ -1022,9 +1031,16 @@
<ColumnDefinition Width="{Binding Source={StaticResource HorizontalPush1}}" MaxWidth="{Binding Source={StaticResource HorizontalPush1}}"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Row="0" Grid.Column="0" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="{StaticResource Margin.LP3}">Expose Quantity</TextBlock>
<StackPanel Orientation="Horizontal" Grid.Row="0" >
<TextBlock Grid.Row="0" Grid.Column="0" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="{StaticResource Margin.LP3}">Expose Quantity</TextBlock>
<c:HelpButton Margin="4,0,0,0" ToolTip="The quantity we want visible on the exchange" />
</StackPanel>
<c:TickUpDownUInt Grid.Column="2" HorizontalAlignment="Stretch" Value="{Binding exposed}"/>
<TextBlock Grid.Row="1" Grid.Column="0" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="{StaticResource Margin.LP3}">Max Order Quantity</TextBlock>
<StackPanel Orientation="Horizontal" Grid.Row="1" >
<TextBlock Grid.Row="1" Grid.Column="0" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="{StaticResource Margin.LP3}">Max Order Quantity</TextBlock>
<c:HelpButton Margin="{StaticResource Margin.LP3}" ToolTip="No single order will have a quantity greater than this quantity (Clip Size)" />
</StackPanel>
<c:TickUpDownUInt Grid.Row="1" Grid.Column="2" HorizontalAlignment="Stretch" Value="{Binding max_order_qty}"/>
<uag:AlgoPickerNodeView
x:Name="PART_Child_AlgoPickerNodeView"
@@ -236,12 +236,12 @@ namespace mbts.ui {
throw new NotImplementedException("This ICommand does not implement IRaiseCanExecuteChanged");
}
public static async Task ExecuteAsync(this ICommand command, object parameter) {
public static Task ExecuteAsync(this ICommand command, object parameter) {
ExceptionAssert.Argument.NotNull(command, nameof(command));
if (command is IAsyncCommand acmd)
await acmd.Execute(parameter);
return acmd.Execute(parameter);
else
await Task.Run(() => command.Execute(parameter));
return Task.Run(() => command.Execute(parameter));
}
public static void TryExecuteIfCan(this ICommand command, object parameter) {
@@ -136,8 +136,8 @@ namespace mbts.spark {
var skip_local = profiles.WrapSkip(1);
var skip_local_wrapper = skip_local.WrapSelector(
p => new SettingsProfile<T>(p.id, p.name, p.value.create(), p.security_criteria),
ns => new ProfileVM(ns.id, vm_factory(ns.value), ns.name, ns.security_criteria));
profiles.Add(_local_profile = new ProfileVM(0, vm_factory(init), "Custom", template_key: ShellSettingsDialog.LocalProfileItemTemplateKey));
ns => new ProfileVM(ns.id, vm_factory(ns.value), ns.name, ns.security_criteria, target_value: ns.value));
profiles.Add(_local_profile = new ProfileVM(0, vm_factory(init), "Custom", template_key: ShellSettingsDialog.LocalProfileItemTemplateKey, target_value: init));
_selected_profile = backing(nameof(selected_profile), _local_profile);
// dialog skirt items
_apply_item = new DialogSkirtItem("Apply", new DelegateCommand(apply));
@@ -325,26 +325,37 @@ namespace mbts.spark {
//
SecurityCriteria _security_criteria;
SettingsProfile<T> _committed, _last_result;
T _target_value;
string _name, _template_key;
bool _is_selected;
IDisposable _dispose;
public ProfileVM(uint id, TVM value, string name, SecurityCriteria security_criteria = null, string template_key = null) {
public ProfileVM(uint id, TVM value, string name, SecurityCriteria security_criteria = null, string template_key = null, T target_value = null) {
this.id = id;
this.value = value;
_name = name;
_security_criteria = security_criteria;
_template_key = template_key;
_target_value = target_value;
_committed = _last_result = create();
_is_dirty = backing(nameof(is_dirty), () => !_last_result.Equals(_committed));
_refresh_is_dirty = new DeferrableActionWrapper(_is_dirty.refresh);
var sub = value.Subscribe(v => {
_last_result = _last_result.with(value: v);
_refresh_is_dirty.execute();
_on_value_changed();
});
_dispose = value is IDisposable d ? Disposable.Create(sub, d) : sub;
}
void _on_value_changed() {
if (_target_value != null && is_dirty && _last_result.value.Equals(_target_value)) {
_target_value = null;
_committed = _last_result;
_refresh_is_dirty.execute();
}
}
public uint id { get; }
public TVM value { get; }
public string name {
@@ -380,21 +391,26 @@ namespace mbts.spark {
/// assign directly to <see cref="_last_result"/>, to capture props that aren't visible in the dialog (i.e., props that are manipulated in the main window)
_last_result = data;
}
_on_value_changed();
}
public void load_value_from(T value) {
using (_refresh_is_dirty.defer_execution())
this.value.load_from(value);
_on_value_changed();
}
public void commit(SettingsProfile<T> data) {
using (_refresh_is_dirty.defer_execution())
_load_from(_committed = data);
_on_value_changed();
}
public void commit_current() {
_committed = _last_result;
_target_value = _committed.value;
_refresh_is_dirty.execute();
_on_value_changed();
}
public void revert() {
@@ -402,6 +418,7 @@ namespace mbts.spark {
_load_from(_committed);
_last_result = _committed;
}
_on_value_changed();
}
public IObservable<bool> subscribe_is_dirty() => _is_dirty.observe_current(true);
@@ -414,6 +431,7 @@ namespace mbts.spark {
public override string ToString() => _name;
void _load_from(SettingsProfile<T> data) {
_target_value = data.value;
name = data.name;
security_criteria = data.security_criteria;
value.load_from(data.value);
+129 -53
View File
@@ -90,8 +90,6 @@ CppConfig
cpp_entry { key: "8D" value: 1000 }
cpp_entry { key: "8W" value: 1000 }
cpp_entry { key: "8XN" value: 2500 }
cpp_entry { key: "8ZN" value: 2500 }
cpp_entry { key: "9FN" value: 2500 }
cpp_entry { key: "9Q" value: 1000 }
cpp_entry { key: "A0D" value: 100 }
cpp_entry { key: "A0F" value: 100 }
@@ -163,6 +161,7 @@ CppConfig
cpp_entry { key: "AAW" value: 42000 }
cpp_entry { key: "AB3" value: 80 }
cpp_entry { key: "AB7" value: 1000 }
cpp_entry { key: "ABF" value: 100 }
cpp_entry { key: "ABH" value: 42000 }
cpp_entry { key: "ABI" value: 1000 }
cpp_entry { key: "ABS" value: 1000 }
@@ -170,6 +169,7 @@ CppConfig
cpp_entry { key: "ABX" value: 1000 }
cpp_entry { key: "ABY" value: 1000 }
cpp_entry { key: "AC0" value: 42000 }
cpp_entry { key: "ACB" value: 1000 }
cpp_entry { key: "ACD" value: 200000 }
cpp_entry { key: "ACM" value: 1000 }
cpp_entry { key: "ACT" value: 1000 }
@@ -183,7 +183,7 @@ CppConfig
cpp_entry { key: "AE5" value: 1000 }
cpp_entry { key: "AE8" value: 5 }
cpp_entry { key: "AE9" value: 80 }
cpp_entry { key: "AEJ" value: 960 }
cpp_entry { key: "AEB" value: 1000 }
cpp_entry { key: "AEP" value: 25 }
cpp_entry { key: "AET" value: 1000 }
cpp_entry { key: "AEZ" value: 42000 }
@@ -222,7 +222,6 @@ CppConfig
cpp_entry { key: "AJB" value: 1000 }
cpp_entry { key: "AJJ" value: 5 }
cpp_entry { key: "AJL" value: 42000 }
cpp_entry { key: "AJP" value: 960 }
cpp_entry { key: "AJR" value: 1000 }
cpp_entry { key: "AJS" value: 42000 }
cpp_entry { key: "AJU" value: 42000 }
@@ -346,7 +345,6 @@ CppConfig
cpp_entry { key: "BCF" value: 50 }
cpp_entry { key: "BCH" value: 50 }
cpp_entry { key: "BDB" value: 1000 }
cpp_entry { key: "BDI" value: 100 }
cpp_entry { key: "BDS" value: 1000 }
cpp_entry { key: "BFR" value: 100 }
cpp_entry { key: "BG" value: 1000 }
@@ -357,13 +355,12 @@ CppConfig
cpp_entry { key: "BOO" value: 6350 }
cpp_entry { key: "BOS" value: 250 }
cpp_entry { key: "BR7" value: 1000 }
cpp_entry { key: "BSW" value: 136 }
cpp_entry { key: "BSF" value: 25 }
cpp_entry { key: "BTC" value: 5 }
cpp_entry { key: "BTT" value: 50 }
cpp_entry { key: "BUB" value: 1000 }
cpp_entry { key: "BUC" value: 42000 }
cpp_entry { key: "BUS" value: 20 }
cpp_entry { key: "BUW" value: 20 }
cpp_entry { key: "BWF" value: 50 }
cpp_entry { key: "BWH" value: 50 }
cpp_entry { key: "BZ" value: 1000 }
@@ -394,6 +391,7 @@ CppConfig
cpp_entry { key: "CFB" value: 1000 }
cpp_entry { key: "CFC" value: 1000 }
cpp_entry { key: "CGB" value: 42000 }
cpp_entry { key: "CHB" value: 1000 }
cpp_entry { key: "CHI" value: 250 }
cpp_entry { key: "CHL" value: 100000 }
cpp_entry { key: "CHP" value: 50000000 }
@@ -406,9 +404,11 @@ CppConfig
cpp_entry { key: "CL" value: 1000 }
cpp_entry { key: "CL1" value: 1000 }
cpp_entry { key: "CL2" value: 1000 }
cpp_entry { key: "CLD" value: 1000 }
cpp_entry { key: "CLL" value: 1000 }
cpp_entry { key: "CLS" value: 1000 }
cpp_entry { key: "CLT" value: 1000 }
cpp_entry { key: "CMB" value: 1000 }
cpp_entry { key: "CMF" value: 1000 }
cpp_entry { key: "CNH" value: 100000 }
cpp_entry { key: "COL" value: 80 }
@@ -431,7 +431,6 @@ CppConfig
cpp_entry { key: "CUS" value: 250 }
cpp_entry { key: "CY" value: 1000 }
cpp_entry { key: "CZK" value: 4000000 }
cpp_entry { key: "CZN" value: 2500 }
cpp_entry { key: "D0" value: 20 }
cpp_entry { key: "D0X" value: 20 }
cpp_entry { key: "D0Z" value: 20 }
@@ -461,9 +460,9 @@ CppConfig
cpp_entry { key: "DDO" value: 1000 }
cpp_entry { key: "DEB" value: 744 }
cpp_entry { key: "DEN" value: 250 }
cpp_entry { key: "DEP" value: 252 }
cpp_entry { key: "DEP" value: 264 }
cpp_entry { key: "DFL" value: 100 }
cpp_entry { key: "DFT" value: 100 }
cpp_entry { key: "DFN" value: 100 }
cpp_entry { key: "DG2" value: 100 }
cpp_entry { key: "DG3" value: 100 }
cpp_entry { key: "DGH" value: 1000 }
@@ -472,7 +471,6 @@ CppConfig
cpp_entry { key: "DGT" value: 100 }
cpp_entry { key: "DHA" value: 80 }
cpp_entry { key: "DHI" value: 1000 }
cpp_entry { key: "DIH" value: 2500 }
cpp_entry { key: "DJR" value: 100 }
cpp_entry { key: "DKR" value: 1000 }
cpp_entry { key: "DMB" value: 100 }
@@ -503,7 +501,6 @@ CppConfig
cpp_entry { key: "EAC" value: 80 }
cpp_entry { key: "EAD" value: 125000 }
cpp_entry { key: "EAE" value: 5 }
cpp_entry { key: "EAF" value: 1000 }
cpp_entry { key: "EAW" value: 80 }
cpp_entry { key: "EBE" value: 1000 }
cpp_entry { key: "ECD" value: 125000 }
@@ -542,7 +539,6 @@ CppConfig
cpp_entry { key: "EST" value: 50 }
cpp_entry { key: "ETT" value: 100 }
cpp_entry { key: "EUB" value: 80 }
cpp_entry { key: "EUL" value: 1000 }
cpp_entry { key: "EURADC" value: 1 }
cpp_entry { key: "EURBPC" value: 1 }
cpp_entry { key: "EURBPN" value: 1 }
@@ -668,17 +664,24 @@ CppConfig
cpp_entry { key: "H4X" value: 20 }
cpp_entry { key: "H4Z" value: 20 }
cpp_entry { key: "H5" value: 20 }
cpp_entry { key: "H5B" value: 1000 }
cpp_entry { key: "H5F" value: 1000 }
cpp_entry { key: "H5G" value: 1000 }
cpp_entry { key: "H5L" value: 80 }
cpp_entry { key: "H5X" value: 20 }
cpp_entry { key: "H5Z" value: 20 }
cpp_entry { key: "HB" value: 2500 }
cpp_entry { key: "HBC" value: 1000 }
cpp_entry { key: "HBR" value: 1000 }
cpp_entry { key: "HCL" value: 1000 }
cpp_entry { key: "HDB" value: 1000 }
cpp_entry { key: "HE" value: 400 }
cpp_entry { key: "HET" value: 400 }
cpp_entry { key: "HG" value: 25000 }
cpp_entry { key: "HG0" value: 25000 }
cpp_entry { key: "HGB" value: 1000 }
cpp_entry { key: "HGF" value: 25000 }
cpp_entry { key: "HGK" value: 25000 }
cpp_entry { key: "HGS" value: 25000 }
cpp_entry { key: "HGT" value: 25000 }
cpp_entry { key: "HH" value: 10000 }
@@ -703,11 +706,16 @@ CppConfig
cpp_entry { key: "HQX" value: 20 }
cpp_entry { key: "HQZ" value: 20 }
cpp_entry { key: "HRC" value: 20 }
cpp_entry { key: "HRP" value: 20 }
cpp_entry { key: "HS" value: 20 }
cpp_entry { key: "HSX" value: 20 }
cpp_entry { key: "HSZ" value: 20 }
cpp_entry { key: "HTA" value: 1000 }
cpp_entry { key: "HTB" value: 1000 }
cpp_entry { key: "HTC" value: 1000 }
cpp_entry { key: "HTE" value: 1000 }
cpp_entry { key: "HTI" value: 1000 }
cpp_entry { key: "HTM" value: 1000 }
cpp_entry { key: "HTT" value: 1000 }
cpp_entry { key: "HUF" value: 30000000 }
cpp_entry { key: "HWA" value: 80 }
@@ -719,7 +727,6 @@ CppConfig
cpp_entry { key: "ICI" value: 1000 }
cpp_entry { key: "IDL" value: 5 }
cpp_entry { key: "IH" value: 50 }
cpp_entry { key: "ILB" value: 1750 }
cpp_entry { key: "ILS" value: 1000000 }
cpp_entry { key: "IN" value: 2500 }
cpp_entry { key: "IP" value: 50 }
@@ -727,11 +734,12 @@ CppConfig
cpp_entry { key: "IPT" value: 10 }
cpp_entry { key: "IS" value: 50 }
cpp_entry { key: "ITB" value: 744 }
cpp_entry { key: "ITP" value: 252 }
cpp_entry { key: "ITP" value: 264 }
cpp_entry { key: "IW" value: 50 }
cpp_entry { key: "J4L" value: 80 }
cpp_entry { key: "J7" value: 6250000 }
cpp_entry { key: "JA" value: 1000 }
cpp_entry { key: "JCC" value: 1000 }
cpp_entry { key: "JDL" value: 80 }
cpp_entry { key: "JE" value: 42000 }
cpp_entry { key: "JET" value: 42000 }
@@ -740,7 +748,7 @@ CppConfig
cpp_entry { key: "JKB" value: 10000 }
cpp_entry { key: "JKF" value: 10000 }
cpp_entry { key: "JKM" value: 10000 }
cpp_entry { key: "JML" value: 200 }
cpp_entry { key: "JML" value: 480 }
cpp_entry { key: "JNC" value: 1000 }
cpp_entry { key: "JNG" value: 10000 }
cpp_entry { key: "JNL" value: 80 }
@@ -809,6 +817,9 @@ CppConfig
cpp_entry { key: "LSW" value: 1000 }
cpp_entry { key: "LT" value: 42000 }
cpp_entry { key: "LWB" value: 1000 }
cpp_entry { key: "M1B" value: 10 }
cpp_entry { key: "M2K" value: 5 }
cpp_entry { key: "M35" value: 10 }
cpp_entry { key: "M5F" value: 10 }
cpp_entry { key: "M6A" value: 10000 }
cpp_entry { key: "M6B" value: 6250 }
@@ -839,10 +850,11 @@ CppConfig
cpp_entry { key: "MEB" value: 100 }
cpp_entry { key: "MEE" value: 100 }
cpp_entry { key: "MEF" value: 10 }
cpp_entry { key: "MEL" value: 840 }
cpp_entry { key: "MEO" value: 100 }
cpp_entry { key: "MES" value: 5 }
cpp_entry { key: "MEW" value: 100 }
cpp_entry { key: "MFB" value: 1000 }
cpp_entry { key: "MFC" value: 100 }
cpp_entry { key: "MFD" value: 100 }
cpp_entry { key: "MFF" value: 1000 }
cpp_entry { key: "MFP" value: 100 }
@@ -879,6 +891,7 @@ CppConfig
cpp_entry { key: "MNE" value: 100 }
cpp_entry { key: "MNG" value: 2500 }
cpp_entry { key: "MNH" value: 10000 }
cpp_entry { key: "MNQ" value: 2 }
cpp_entry { key: "MNS" value: 635 }
cpp_entry { key: "MNT" value: 80 }
cpp_entry { key: "MO" value: 1000 }
@@ -910,6 +923,7 @@ CppConfig
cpp_entry { key: "MXB" value: 35000 }
cpp_entry { key: "MXL" value: 5 }
cpp_entry { key: "MXR" value: 35000 }
cpp_entry { key: "MYM" value: 0.5 }
cpp_entry { key: "N1B" value: 1000 }
cpp_entry { key: "N1R" value: 10 }
cpp_entry { key: "N1T" value: 10 }
@@ -927,7 +941,6 @@ CppConfig
cpp_entry { key: "NCF" value: 100 }
cpp_entry { key: "NCO" value: 5 }
cpp_entry { key: "NCP" value: 100 }
cpp_entry { key: "NEN" value: 2500 }
cpp_entry { key: "NEO" value: 5 }
cpp_entry { key: "NEP" value: 80 }
cpp_entry { key: "NFC" value: 1000 }
@@ -941,10 +954,14 @@ CppConfig
cpp_entry { key: "NHN" value: 2500 }
cpp_entry { key: "NHO" value: 5 }
cpp_entry { key: "NHP" value: 80 }
cpp_entry { key: "NIM" value: 500 }
cpp_entry { key: "NIT" value: 500 }
cpp_entry { key: "NIY" value: 500 }
cpp_entry { key: "NJ" value: 2500 }
cpp_entry { key: "NKD" value: 5 }
cpp_entry { key: "NKM" value: 5 }
cpp_entry { key: "NKN" value: 2500 }
cpp_entry { key: "NKT" value: 5 }
cpp_entry { key: "NL" value: 2500 }
cpp_entry { key: "NLS" value: 42000 }
cpp_entry { key: "NMO" value: 5 }
@@ -984,7 +1001,7 @@ CppConfig
cpp_entry { key: "NYR" value: 42000 }
cpp_entry { key: "NYT" value: 1000 }
cpp_entry { key: "NZDUSC" value: 1 }
cpp_entry { key: "NZN" value: 2500 }
cpp_entry { key: "NZDUSD" value: 1 }
cpp_entry { key: "OAD" value: 1 }
cpp_entry { key: "ODO" value: 1000 }
cpp_entry { key: "OFF" value: 5 }
@@ -1000,6 +1017,7 @@ CppConfig
cpp_entry { key: "OVL" value: 5 }
cpp_entry { key: "PA" value: 100 }
cpp_entry { key: "PAL" value: 80 }
cpp_entry { key: "PAM" value: 10 }
cpp_entry { key: "PAT" value: 100 }
cpp_entry { key: "PBO" value: 5 }
cpp_entry { key: "PBP" value: 80 }
@@ -1020,7 +1038,6 @@ CppConfig
cpp_entry { key: "PHF" value: 5 }
cpp_entry { key: "PHO" value: 5 }
cpp_entry { key: "PHP" value: 80 }
cpp_entry { key: "PIO" value: 500 }
cpp_entry { key: "PJY" value: 125000 }
cpp_entry { key: "PKP" value: 80 }
cpp_entry { key: "PL" value: 50 }
@@ -1082,6 +1099,8 @@ CppConfig
cpp_entry { key: "R2T" value: 10 }
cpp_entry { key: "R2V" value: 50 }
cpp_entry { key: "R53" value: 1000 }
cpp_entry { key: "R5B" value: 1000 }
cpp_entry { key: "R5E" value: 1000 }
cpp_entry { key: "R5F" value: 1000 }
cpp_entry { key: "R5M" value: 100 }
cpp_entry { key: "R5O" value: 10 }
@@ -1091,6 +1110,7 @@ CppConfig
cpp_entry { key: "RBF" value: 100 }
cpp_entry { key: "RBG" value: 42000 }
cpp_entry { key: "RBL" value: 42000 }
cpp_entry { key: "RBM" value: 100 }
cpp_entry { key: "RBS" value: 42000 }
cpp_entry { key: "RBT" value: 42000 }
cpp_entry { key: "REX" value: 100 }
@@ -1119,13 +1139,15 @@ CppConfig
cpp_entry { key: "RYA" value: 42000 }
cpp_entry { key: "S1U" value: 1000 }
cpp_entry { key: "S53" value: 1000 }
cpp_entry { key: "S5B" value: 1000 }
cpp_entry { key: "S5F" value: 1000 }
cpp_entry { key: "S5M" value: 100 }
cpp_entry { key: "S5O" value: 10 }
cpp_entry { key: "SBM" value: 100 }
cpp_entry { key: "SBT" value: 50 }
cpp_entry { key: "SD" value: 1000 }
cpp_entry { key: "SDA" value: 250 }
cpp_entry { key: "SDD" value: 1600 }
cpp_entry { key: "SDD" value: 1760 }
cpp_entry { key: "SDG" value: 250 }
cpp_entry { key: "SDI" value: 1000 }
cpp_entry { key: "SDM" value: 100 }
@@ -1157,12 +1179,14 @@ CppConfig
cpp_entry { key: "SMT" value: 100 }
cpp_entry { key: "SMU" value: 1000 }
cpp_entry { key: "SMW" value: 100 }
cpp_entry { key: "SOM" value: 500 }
cpp_entry { key: "SON" value: 2500 }
cpp_entry { key: "SP" value: 250 }
cpp_entry { key: "SR1" value: 4167 }
cpp_entry { key: "SR3" value: 2500 }
cpp_entry { key: "SR5" value: 1000 }
cpp_entry { key: "SRT" value: 1600 }
cpp_entry { key: "SRB" value: 1000 }
cpp_entry { key: "SRT" value: 1760 }
cpp_entry { key: "SSI" value: 1000 }
cpp_entry { key: "SSP" value: 5000 }
cpp_entry { key: "SSW" value: 1000 }
@@ -1173,25 +1197,31 @@ CppConfig
cpp_entry { key: "STY" value: 1000 }
cpp_entry { key: "SU" value: 250 }
cpp_entry { key: "SUT" value: 250 }
cpp_entry { key: "T02" value: 800 }
cpp_entry { key: "T03" value: 800 }
cpp_entry { key: "T04" value: 800 }
cpp_entry { key: "T06" value: 800 }
cpp_entry { key: "T07" value: 800 }
cpp_entry { key: "T08" value: 800 }
cpp_entry { key: "T09" value: 800 }
cpp_entry { key: "T12" value: 800 }
cpp_entry { key: "T13" value: 800 }
cpp_entry { key: "T14" value: 800 }
cpp_entry { key: "T17" value: 800 }
cpp_entry { key: "T18" value: 800 }
cpp_entry { key: "T15" value: 800 }
cpp_entry { key: "T16" value: 800 }
cpp_entry { key: "T19" value: 800 }
cpp_entry { key: "T1U" value: 1000 }
cpp_entry { key: "T20" value: 800 }
cpp_entry { key: "T21" value: 800 }
cpp_entry { key: "T24" value: 800 }
cpp_entry { key: "T22" value: 800 }
cpp_entry { key: "T23" value: 800 }
cpp_entry { key: "T26" value: 800 }
cpp_entry { key: "T27" value: 800 }
cpp_entry { key: "T28" value: 800 }
cpp_entry { key: "T29" value: 800 }
cpp_entry { key: "T2B" value: 1000 }
cpp_entry { key: "T2D" value: 1000 }
cpp_entry { key: "T2M" value: 100 }
cpp_entry { key: "T31" value: 800 }
cpp_entry { key: "T30" value: 800 }
cpp_entry { key: "T3B" value: 1000 }
cpp_entry { key: "T3L" value: 80 }
cpp_entry { key: "T4B" value: 1000 }
@@ -1207,6 +1237,7 @@ CppConfig
cpp_entry { key: "TC" value: 2500 }
cpp_entry { key: "TC6" value: 1000 }
cpp_entry { key: "TC9" value: 1000 }
cpp_entry { key: "TCS" value: 1000 }
cpp_entry { key: "TD3" value: 1000 }
cpp_entry { key: "TD8" value: 1000 }
cpp_entry { key: "TEX" value: 1000 }
@@ -1216,6 +1247,7 @@ CppConfig
cpp_entry { key: "THB" value: 1000 }
cpp_entry { key: "THD" value: 10000 }
cpp_entry { key: "TIC" value: 500 }
cpp_entry { key: "TIL" value: 1000 }
cpp_entry { key: "TIO" value: 500 }
cpp_entry { key: "TK" value: 1000 }
cpp_entry { key: "TKB" value: 1000 }
@@ -1252,7 +1284,6 @@ CppConfig
cpp_entry { key: "TUT" value: 1000 }
cpp_entry { key: "TUX" value: 1000 }
cpp_entry { key: "TW" value: 1000 }
cpp_entry { key: "TXN" value: 2500 }
cpp_entry { key: "TYT" value: 1000 }
cpp_entry { key: "TYX" value: 1000 }
cpp_entry { key: "TZ6" value: 2500 }
@@ -1262,10 +1293,12 @@ CppConfig
cpp_entry { key: "UB" value: 1000 }
cpp_entry { key: "UCM" value: 100 }
cpp_entry { key: "UDL" value: 80 }
cpp_entry { key: "UFB" value: 100 }
cpp_entry { key: "UFE" value: 100 }
cpp_entry { key: "UFG" value: 100 }
cpp_entry { key: "UFN" value: 100 }
cpp_entry { key: "UFU" value: 100 }
cpp_entry { key: "UFZ" value: 100 }
cpp_entry { key: "UFV" value: 100 }
cpp_entry { key: "UGG" value: 42000 }
cpp_entry { key: "UKG" value: 310 }
cpp_entry { key: "ULB" value: 42000 }
@@ -1276,10 +1309,12 @@ CppConfig
cpp_entry { key: "UNB" value: 1000 }
cpp_entry { key: "UNS" value: 1000 }
cpp_entry { key: "UR" value: 1000 }
cpp_entry { key: "USC" value: 1000 }
cpp_entry { key: "USDBRL" value: 1 }
cpp_entry { key: "USDCAC" value: 1 }
cpp_entry { key: "USDCAD" value: 1 }
cpp_entry { key: "USDCAN" value: 1 }
cpp_entry { key: "USDCHF" value: 10 }
cpp_entry { key: "USDCKC" value: 1 }
cpp_entry { key: "USDCLP" value: 1 }
cpp_entry { key: "USDCNY" value: 1 }
@@ -1309,6 +1344,7 @@ CppConfig
cpp_entry { key: "USDTLC" value: 1 }
cpp_entry { key: "USDTWD" value: 1 }
cpp_entry { key: "USDZRC" value: 1 }
cpp_entry { key: "USE" value: 1000 }
cpp_entry { key: "UV" value: 1000 }
cpp_entry { key: "UX" value: 250 }
cpp_entry { key: "V3L" value: 5 }
@@ -1338,6 +1374,7 @@ CppConfig
cpp_entry { key: "WTA" value: 1000 }
cpp_entry { key: "WTD" value: 1000 }
cpp_entry { key: "WTI" value: 1000 }
cpp_entry { key: "WTL" value: 1000 }
cpp_entry { key: "WTS" value: 1000 }
cpp_entry { key: "WTT" value: 1000 }
cpp_entry { key: "X0" value: 1000 }
@@ -1390,6 +1427,7 @@ CppConfig
cpp_entry { key: "YWE" value: 80 }
cpp_entry { key: "YWF" value: 5 }
cpp_entry { key: "YWK" value: 5 }
cpp_entry { key: "Z00000" value: 1000 }
cpp_entry { key: "Z1B" value: 100 }
cpp_entry { key: "Z3N" value: 2000 }
cpp_entry { key: "Z4" value: 1000 }
@@ -1507,8 +1545,6 @@ CmeSymbolMics
cme_mic { key: "8D" value: NYMEX }
cme_mic { key: "8W" value: NYMEX }
cme_mic { key: "8XN" value: NYMEX }
cme_mic { key: "8ZN" value: NYMEX }
cme_mic { key: "9FN" value: NYMEX }
cme_mic { key: "9Q" value: NYMEX }
cme_mic { key: "A0D" value: NYMEX }
cme_mic { key: "A0F" value: NYMEX }
@@ -1580,6 +1616,7 @@ CmeSymbolMics
cme_mic { key: "AAW" value: NYMEX }
cme_mic { key: "AB3" value: NYMEX }
cme_mic { key: "AB7" value: NYMEX }
cme_mic { key: "ABF" value: NYMEX }
cme_mic { key: "ABH" value: NYMEX }
cme_mic { key: "ABI" value: NYMEX }
cme_mic { key: "ABS" value: NYMEX }
@@ -1587,6 +1624,7 @@ CmeSymbolMics
cme_mic { key: "ABX" value: NYMEX }
cme_mic { key: "ABY" value: NYMEX }
cme_mic { key: "AC0" value: NYMEX }
cme_mic { key: "ACB" value: NYMEX }
cme_mic { key: "ACD" value: CME }
cme_mic { key: "ACM" value: NYMEX }
cme_mic { key: "ACT" value: NYMEX }
@@ -1600,7 +1638,7 @@ CmeSymbolMics
cme_mic { key: "AE5" value: NYMEX }
cme_mic { key: "AE8" value: NYMEX }
cme_mic { key: "AE9" value: NYMEX }
cme_mic { key: "AEJ" value: NYMEX }
cme_mic { key: "AEB" value: NYMEX }
cme_mic { key: "AEP" value: COMEX }
cme_mic { key: "AET" value: NYMEX }
cme_mic { key: "AEZ" value: NYMEX }
@@ -1639,7 +1677,6 @@ CmeSymbolMics
cme_mic { key: "AJB" value: NYMEX }
cme_mic { key: "AJJ" value: NYMEX }
cme_mic { key: "AJL" value: NYMEX }
cme_mic { key: "AJP" value: NYMEX }
cme_mic { key: "AJR" value: NYMEX }
cme_mic { key: "AJS" value: NYMEX }
cme_mic { key: "AJU" value: NYMEX }
@@ -1763,7 +1800,6 @@ CmeSymbolMics
cme_mic { key: "BCF" value: CBT }
cme_mic { key: "BCH" value: CBT }
cme_mic { key: "BDB" value: NYMEX }
cme_mic { key: "BDI" value: CME }
cme_mic { key: "BDS" value: DME }
cme_mic { key: "BFR" value: NYMEX }
cme_mic { key: "BG" value: NYMEX }
@@ -1774,13 +1810,12 @@ CmeSymbolMics
cme_mic { key: "BOO" value: NYMEX }
cme_mic { key: "BOS" value: CME }
cme_mic { key: "BR7" value: NYMEX }
cme_mic { key: "BSW" value: CBT }
cme_mic { key: "BSF" value: CBT }
cme_mic { key: "BTC" value: CME }
cme_mic { key: "BTT" value: CME }
cme_mic { key: "BUB" value: CBT }
cme_mic { key: "BUC" value: NYMEX }
cme_mic { key: "BUS" value: NYMEX }
cme_mic { key: "BUW" value: NYMSW }
cme_mic { key: "BWF" value: CBT }
cme_mic { key: "BWH" value: CBT }
cme_mic { key: "BZ" value: NYMEX }
@@ -1811,6 +1846,7 @@ CmeSymbolMics
cme_mic { key: "CFB" value: NYMEX }
cme_mic { key: "CFC" value: NYMEX }
cme_mic { key: "CGB" value: NYMEX }
cme_mic { key: "CHB" value: NYMEX }
cme_mic { key: "CHI" value: CME }
cme_mic { key: "CHL" value: CME }
cme_mic { key: "CHP" value: CME }
@@ -1823,9 +1859,11 @@ CmeSymbolMics
cme_mic { key: "CL" value: NYMEX }
cme_mic { key: "CL1" value: NYMEX }
cme_mic { key: "CL2" value: NYMEX }
cme_mic { key: "CLD" value: NYMEX }
cme_mic { key: "CLL" value: NYMEX }
cme_mic { key: "CLS" value: NYMEX }
cme_mic { key: "CLT" value: NYMEX }
cme_mic { key: "CMB" value: NYMEX }
cme_mic { key: "CMF" value: NYMEX }
cme_mic { key: "CNH" value: CME }
cme_mic { key: "COL" value: NYMEX }
@@ -1848,7 +1886,6 @@ CmeSymbolMics
cme_mic { key: "CUS" value: CME }
cme_mic { key: "CY" value: NYMEX }
cme_mic { key: "CZK" value: CME }
cme_mic { key: "CZN" value: NYMEX }
cme_mic { key: "D0" value: CME }
cme_mic { key: "D0X" value: CME }
cme_mic { key: "D0Z" value: CME }
@@ -1880,7 +1917,7 @@ CmeSymbolMics
cme_mic { key: "DEN" value: CME }
cme_mic { key: "DEP" value: NYMEX }
cme_mic { key: "DFL" value: CBT }
cme_mic { key: "DFT" value: CBT }
cme_mic { key: "DFN" value: CBT }
cme_mic { key: "DG2" value: CBT }
cme_mic { key: "DG3" value: CBT }
cme_mic { key: "DGH" value: DME }
@@ -1889,7 +1926,6 @@ CmeSymbolMics
cme_mic { key: "DGT" value: CBT }
cme_mic { key: "DHA" value: NYMEX }
cme_mic { key: "DHI" value: DME }
cme_mic { key: "DIH" value: NYMEX }
cme_mic { key: "DJR" value: CBT }
cme_mic { key: "DKR" value: DME }
cme_mic { key: "DMB" value: DME }
@@ -1920,7 +1956,6 @@ CmeSymbolMics
cme_mic { key: "EAC" value: NYMEX }
cme_mic { key: "EAD" value: CME }
cme_mic { key: "EAE" value: NYMEX }
cme_mic { key: "EAF" value: NYMEX }
cme_mic { key: "EAW" value: NYMEX }
cme_mic { key: "EBE" value: NYMEX }
cme_mic { key: "ECD" value: CME }
@@ -1959,7 +1994,6 @@ CmeSymbolMics
cme_mic { key: "EST" value: CME }
cme_mic { key: "ETT" value: CME }
cme_mic { key: "EUB" value: NYMEX }
cme_mic { key: "EUL" value: NYMEX }
cme_mic { key: "EURADC" value: CME }
cme_mic { key: "EURBPC" value: CME }
cme_mic { key: "EURBPN" value: CME }
@@ -2085,17 +2119,24 @@ CmeSymbolMics
cme_mic { key: "H4X" value: CME }
cme_mic { key: "H4Z" value: CME }
cme_mic { key: "H5" value: CME }
cme_mic { key: "H5B" value: NYMEX }
cme_mic { key: "H5F" value: NYMEX }
cme_mic { key: "H5G" value: NYMEX }
cme_mic { key: "H5L" value: NYMEX }
cme_mic { key: "H5X" value: CME }
cme_mic { key: "H5Z" value: CME }
cme_mic { key: "HB" value: NYMEX }
cme_mic { key: "HBC" value: NYMEX }
cme_mic { key: "HBR" value: NYMEX }
cme_mic { key: "HCL" value: NYMEX }
cme_mic { key: "HDB" value: NYMEX }
cme_mic { key: "HE" value: CME }
cme_mic { key: "HET" value: CME }
cme_mic { key: "HG" value: COMEX }
cme_mic { key: "HG0" value: COMEX }
cme_mic { key: "HGB" value: NYMEX }
cme_mic { key: "HGF" value: COMEX }
cme_mic { key: "HGK" value: COMEX }
cme_mic { key: "HGS" value: COMEX }
cme_mic { key: "HGT" value: COMEX }
cme_mic { key: "HH" value: NYMEX }
@@ -2120,11 +2161,16 @@ CmeSymbolMics
cme_mic { key: "HQX" value: CME }
cme_mic { key: "HQZ" value: CME }
cme_mic { key: "HRC" value: NYMEX }
cme_mic { key: "HRP" value: COMEX }
cme_mic { key: "HS" value: CME }
cme_mic { key: "HSX" value: CME }
cme_mic { key: "HSZ" value: CME }
cme_mic { key: "HTA" value: NYMEX }
cme_mic { key: "HTB" value: NYMEX }
cme_mic { key: "HTC" value: NYMEX }
cme_mic { key: "HTE" value: NYMEX }
cme_mic { key: "HTI" value: NYMEX }
cme_mic { key: "HTM" value: NYMEX }
cme_mic { key: "HTT" value: NYMEX }
cme_mic { key: "HUF" value: CME }
cme_mic { key: "HWA" value: NYMEX }
@@ -2136,7 +2182,6 @@ CmeSymbolMics
cme_mic { key: "ICI" value: NYMEX }
cme_mic { key: "IDL" value: NYMEX }
cme_mic { key: "IH" value: MGE }
cme_mic { key: "ILB" value: NYMEX }
cme_mic { key: "ILS" value: CME }
cme_mic { key: "IN" value: NYMEX }
cme_mic { key: "IP" value: MGE }
@@ -2149,6 +2194,7 @@ CmeSymbolMics
cme_mic { key: "J4L" value: NYMEX }
cme_mic { key: "J7" value: CME }
cme_mic { key: "JA" value: NYMEX }
cme_mic { key: "JCC" value: NYMEX }
cme_mic { key: "JDL" value: NYMEX }
cme_mic { key: "JE" value: NYMEX }
cme_mic { key: "JET" value: NYMEX }
@@ -2226,6 +2272,9 @@ CmeSymbolMics
cme_mic { key: "LSW" value: NYMEX }
cme_mic { key: "LT" value: NYMEX }
cme_mic { key: "LWB" value: NYMEX }
cme_mic { key: "M1B" value: NYMEX }
cme_mic { key: "M2K" value: CME }
cme_mic { key: "M35" value: NYMEX }
cme_mic { key: "M5F" value: NYMEX }
cme_mic { key: "M6A" value: CME }
cme_mic { key: "M6B" value: CME }
@@ -2256,10 +2305,11 @@ CmeSymbolMics
cme_mic { key: "MEB" value: NYMEX }
cme_mic { key: "MEE" value: NYMEX }
cme_mic { key: "MEF" value: NYMEX }
cme_mic { key: "MEL" value: NYMEX }
cme_mic { key: "MEO" value: NYMEX }
cme_mic { key: "MES" value: CME }
cme_mic { key: "MEW" value: NYMEX }
cme_mic { key: "MFB" value: NYMEX }
cme_mic { key: "MFC" value: CBT }
cme_mic { key: "MFD" value: NYMEX }
cme_mic { key: "MFF" value: NYMEX }
cme_mic { key: "MFP" value: NYMEX }
@@ -2296,6 +2346,7 @@ CmeSymbolMics
cme_mic { key: "MNE" value: NYMEX }
cme_mic { key: "MNG" value: NYMEX }
cme_mic { key: "MNH" value: CME }
cme_mic { key: "MNQ" value: CME }
cme_mic { key: "MNS" value: NYMEX }
cme_mic { key: "MNT" value: NYMEX }
cme_mic { key: "MO" value: NYMEX }
@@ -2327,6 +2378,7 @@ CmeSymbolMics
cme_mic { key: "MXB" value: NYMEX }
cme_mic { key: "MXL" value: NYMEX }
cme_mic { key: "MXR" value: NYMEX }
cme_mic { key: "MYM" value: CBT }
cme_mic { key: "N1B" value: NYMEX }
cme_mic { key: "N1R" value: CME }
cme_mic { key: "N1T" value: CME }
@@ -2344,7 +2396,6 @@ CmeSymbolMics
cme_mic { key: "NCF" value: NYMEX }
cme_mic { key: "NCO" value: NYMEX }
cme_mic { key: "NCP" value: NYMEX }
cme_mic { key: "NEN" value: NYMEX }
cme_mic { key: "NEO" value: NYMEX }
cme_mic { key: "NEP" value: NYMEX }
cme_mic { key: "NFC" value: NYMEX }
@@ -2358,10 +2409,14 @@ CmeSymbolMics
cme_mic { key: "NHN" value: NYMEX }
cme_mic { key: "NHO" value: NYMEX }
cme_mic { key: "NHP" value: NYMEX }
cme_mic { key: "NIM" value: CME }
cme_mic { key: "NIT" value: CME }
cme_mic { key: "NIY" value: CME }
cme_mic { key: "NJ" value: NYMEX }
cme_mic { key: "NKD" value: CME }
cme_mic { key: "NKM" value: CME }
cme_mic { key: "NKN" value: NYMEX }
cme_mic { key: "NKT" value: CME }
cme_mic { key: "NL" value: NYMEX }
cme_mic { key: "NLS" value: NYMEX }
cme_mic { key: "NMO" value: NYMEX }
@@ -2401,7 +2456,7 @@ CmeSymbolMics
cme_mic { key: "NYR" value: NYMEX }
cme_mic { key: "NYT" value: NYMEX }
cme_mic { key: "NZDUSC" value: CME }
cme_mic { key: "NZN" value: NYMEX }
cme_mic { key: "NZDUSD" value: FXS }
cme_mic { key: "OAD" value: NYMEX }
cme_mic { key: "ODO" value: DME }
cme_mic { key: "OFF" value: NYMEX }
@@ -2417,6 +2472,7 @@ CmeSymbolMics
cme_mic { key: "OVL" value: NYMEX }
cme_mic { key: "PA" value: NYMEX }
cme_mic { key: "PAL" value: NYMEX }
cme_mic { key: "PAM" value: NYMEX }
cme_mic { key: "PAT" value: NYMEX }
cme_mic { key: "PBO" value: NYMEX }
cme_mic { key: "PBP" value: NYMEX }
@@ -2437,7 +2493,6 @@ CmeSymbolMics
cme_mic { key: "PHF" value: NYMEX }
cme_mic { key: "PHO" value: NYMEX }
cme_mic { key: "PHP" value: NYMEX }
cme_mic { key: "PIO" value: NYMEX }
cme_mic { key: "PJY" value: CME }
cme_mic { key: "PKP" value: NYMEX }
cme_mic { key: "PL" value: NYMEX }
@@ -2499,6 +2554,8 @@ CmeSymbolMics
cme_mic { key: "R2T" value: CME }
cme_mic { key: "R2V" value: CME }
cme_mic { key: "R53" value: NYMEX }
cme_mic { key: "R5B" value: NYMEX }
cme_mic { key: "R5E" value: NYMEX }
cme_mic { key: "R5F" value: NYMEX }
cme_mic { key: "R5M" value: NYMEX }
cme_mic { key: "R5O" value: NYMEX }
@@ -2508,6 +2565,7 @@ CmeSymbolMics
cme_mic { key: "RBF" value: NYMEX }
cme_mic { key: "RBG" value: NYMEX }
cme_mic { key: "RBL" value: NYMEX }
cme_mic { key: "RBM" value: NYMEX }
cme_mic { key: "RBS" value: NYMEX }
cme_mic { key: "RBT" value: NYMEX }
cme_mic { key: "REX" value: CBT }
@@ -2536,9 +2594,11 @@ CmeSymbolMics
cme_mic { key: "RYA" value: NYMEX }
cme_mic { key: "S1U" value: CBT }
cme_mic { key: "S53" value: NYMEX }
cme_mic { key: "S5B" value: NYMEX }
cme_mic { key: "S5F" value: NYMEX }
cme_mic { key: "S5M" value: NYMEX }
cme_mic { key: "S5O" value: NYMEX }
cme_mic { key: "SBM" value: NYMEX }
cme_mic { key: "SBT" value: CBT }
cme_mic { key: "SD" value: NYMEX }
cme_mic { key: "SDA" value: CME }
@@ -2574,11 +2634,13 @@ CmeSymbolMics
cme_mic { key: "SMT" value: CME }
cme_mic { key: "SMU" value: NYMEX }
cme_mic { key: "SMW" value: NYMEX }
cme_mic { key: "SOM" value: CBT }
cme_mic { key: "SON" value: CME }
cme_mic { key: "SP" value: CME }
cme_mic { key: "SR1" value: CME }
cme_mic { key: "SR3" value: CME }
cme_mic { key: "SR5" value: NYMEX }
cme_mic { key: "SRB" value: NYMEX }
cme_mic { key: "SRT" value: NYMEX }
cme_mic { key: "SSI" value: NYMEX }
cme_mic { key: "SSP" value: COMEX }
@@ -2590,25 +2652,31 @@ CmeSymbolMics
cme_mic { key: "STY" value: NYMEX }
cme_mic { key: "SU" value: CME }
cme_mic { key: "SUT" value: CME }
cme_mic { key: "T02" value: NYMEX }
cme_mic { key: "T03" value: NYMEX }
cme_mic { key: "T04" value: NYMEX }
cme_mic { key: "T06" value: NYMEX }
cme_mic { key: "T07" value: NYMEX }
cme_mic { key: "T08" value: NYMEX }
cme_mic { key: "T09" value: NYMEX }
cme_mic { key: "T12" value: NYMEX }
cme_mic { key: "T13" value: NYMEX }
cme_mic { key: "T14" value: NYMEX }
cme_mic { key: "T17" value: NYMEX }
cme_mic { key: "T18" value: NYMEX }
cme_mic { key: "T15" value: NYMEX }
cme_mic { key: "T16" value: NYMEX }
cme_mic { key: "T19" value: NYMEX }
cme_mic { key: "T1U" value: CBT }
cme_mic { key: "T20" value: NYMEX }
cme_mic { key: "T21" value: NYMEX }
cme_mic { key: "T24" value: NYMEX }
cme_mic { key: "T22" value: NYMEX }
cme_mic { key: "T23" value: NYMEX }
cme_mic { key: "T26" value: NYMEX }
cme_mic { key: "T27" value: NYMEX }
cme_mic { key: "T28" value: NYMEX }
cme_mic { key: "T29" value: NYMEX }
cme_mic { key: "T2B" value: NYMEX }
cme_mic { key: "T2D" value: NYMEX }
cme_mic { key: "T2M" value: NYMEX }
cme_mic { key: "T31" value: NYMEX }
cme_mic { key: "T30" value: NYMEX }
cme_mic { key: "T3B" value: NYMEX }
cme_mic { key: "T3L" value: NYMEX }
cme_mic { key: "T4B" value: NYMEX }
@@ -2624,6 +2692,7 @@ CmeSymbolMics
cme_mic { key: "TC" value: NYMEX }
cme_mic { key: "TC6" value: NYMEX }
cme_mic { key: "TC9" value: NYMEX }
cme_mic { key: "TCS" value: NYMEX }
cme_mic { key: "TD3" value: NYMEX }
cme_mic { key: "TD8" value: NYMEX }
cme_mic { key: "TEX" value: CBT }
@@ -2633,6 +2702,7 @@ CmeSymbolMics
cme_mic { key: "THB" value: NYMEX }
cme_mic { key: "THD" value: NYMEX }
cme_mic { key: "TIC" value: NYMEX }
cme_mic { key: "TIL" value: NYMEX }
cme_mic { key: "TIO" value: NYMEX }
cme_mic { key: "TK" value: NYMEX }
cme_mic { key: "TKB" value: NYMEX }
@@ -2669,7 +2739,6 @@ CmeSymbolMics
cme_mic { key: "TUT" value: CBT }
cme_mic { key: "TUX" value: CBT }
cme_mic { key: "TW" value: NYMEX }
cme_mic { key: "TXN" value: NYMEX }
cme_mic { key: "TYT" value: CBT }
cme_mic { key: "TYX" value: CBT }
cme_mic { key: "TZ6" value: NYMEX }
@@ -2679,10 +2748,12 @@ CmeSymbolMics
cme_mic { key: "UB" value: CBT }
cme_mic { key: "UCM" value: NYMEX }
cme_mic { key: "UDL" value: NYMEX }
cme_mic { key: "UFB" value: CBT }
cme_mic { key: "UFE" value: CBT }
cme_mic { key: "UFG" value: CBT }
cme_mic { key: "UFN" value: CBT }
cme_mic { key: "UFU" value: CBT }
cme_mic { key: "UFZ" value: CBT }
cme_mic { key: "UFV" value: CBT }
cme_mic { key: "UGG" value: NYMEX }
cme_mic { key: "UKG" value: NYMEX }
cme_mic { key: "ULB" value: NYMEX }
@@ -2693,10 +2764,12 @@ CmeSymbolMics
cme_mic { key: "UNB" value: NYMEX }
cme_mic { key: "UNS" value: NYMEX }
cme_mic { key: "UR" value: NYMEX }
cme_mic { key: "USC" value: NYMEX }
cme_mic { key: "USDBRL" value: CME }
cme_mic { key: "USDCAC" value: CME }
cme_mic { key: "USDCAD" value: FXS }
cme_mic { key: "USDCAN" value: CME }
cme_mic { key: "USDCHF" value: FXS }
cme_mic { key: "USDCKC" value: CME }
cme_mic { key: "USDCLP" value: CME }
cme_mic { key: "USDCNY" value: CME }
@@ -2726,6 +2799,7 @@ CmeSymbolMics
cme_mic { key: "USDTLC" value: CME }
cme_mic { key: "USDTWD" value: CME }
cme_mic { key: "USDZRC" value: CME }
cme_mic { key: "USE" value: NYMEX }
cme_mic { key: "UV" value: NYMEX }
cme_mic { key: "UX" value: NYMEX }
cme_mic { key: "V3L" value: NYMEX }
@@ -2755,6 +2829,7 @@ CmeSymbolMics
cme_mic { key: "WTA" value: NYMEX }
cme_mic { key: "WTD" value: NYMEX }
cme_mic { key: "WTI" value: NYMEX }
cme_mic { key: "WTL" value: NYMEX }
cme_mic { key: "WTS" value: NYMEX }
cme_mic { key: "WTT" value: NYMEX }
cme_mic { key: "X0" value: NYMEX }
@@ -2807,6 +2882,7 @@ CmeSymbolMics
cme_mic { key: "YWE" value: NYMEX }
cme_mic { key: "YWF" value: NYMEX }
cme_mic { key: "YWK" value: NYMEX }
cme_mic { key: "Z00000" value: CME }
cme_mic { key: "Z1B" value: NYMEX }
cme_mic { key: "Z3N" value: CBT }
cme_mic { key: "Z4" value: NYMEX }
-5
View File
@@ -150,11 +150,6 @@ In gdb:
```
(gdb) break order_plugin_example.cpp:366
```
#### In Depth Algo Descriptions
* [Spark Algo Descriptions](doc/algos.md)
* Send us an email for help: api_support@bluetradesys.com
#### Spark windows client
* Download spark windows executable here: <spark_client>
-46
View File
@@ -1,46 +0,0 @@
+++
title = "BTS Basic Algos"
weight = 3
sort_by = "weight"
insert_anchor_links = "right"
+++
## Lean
The goal of the lean order is to watch the opposite-inside market size and cross when that size goes below the threshold (this also implies a cross if that size goes to zero and the market trades away from you) If the market trades toward you, you can opt into several different behaviors
##### Parameters
* Cross Thresh - size thresh in absolute or ratio terms
* Max Chase Ticks - max levels to pay up, in ticks
## Join
The goal of the join order is to watch the opposite-inside market and join when the market flips (that is, when the best offer becomes the best bid) and has at least threshold size.
##### Parameters
* Join Thresh - size thresh in absolute or ratio terms
## Top
The goal of the top order is to not trade by yourself, but the intent at the time of order entry is to get filled.If the order is on the market (say current bid price) AND the quantity on that bid price is below top thresh then cancel the order else remain working.
##### Parameters
* Top Thresh - size thresh in absolute or ratio terms
## Cover
A Cover order’s purpose is to fire a hedge order (of any type) in response to fills from it’s child order on the opposite side of the market N ticks away
##### Parameters
* Profit Ticks - ticks above or below fill price to place profit / cover order
## OCO
An OCO order creates a relationship between a child order and a 'stop' or 'other' order such that when one of these is cancelled, both cancel, or when one is filled, the other order's size is debited in the amount of the fill.
Composing this order with Cover simulates scalping functionality
##### Parameters
* Stop Ticks - ticks below or above main order to place stop / other order
Regular → Executable
View File
File mode changed.
+5 -5
View File
@@ -1,14 +1,14 @@
qa_sprint_id=18
qa_sprint_id=20
testers=(
#'pedro.pinto'
# 'eric.harding'
'jake.norbut'
'michael.harding'
# 'jake.norbut'
# 'michael.harding'
'karl.ellefsen'
'pete.fisher'
'taha.afzal'
'john.colvin'
# 'taha.afzal'
# 'john.colvin'
'kevin.darby'
'brian.muhr'
)
+2 -3
View File
@@ -20,10 +20,9 @@ On Toward=No Change
5. Select all the lean orders and change the Trade Toward Behavior to Cancel (don't commit yet).
As the parameter is changed its name should turn Green along with a *. Revert back and it should go to
No Change. Select a few of the leans and make sure Trade Toward Behavior is No Change. Now Change it
to Cancel and commit. Make sure it is set to Cancel for all the lean orders.
to Cancel and commit. Make sure it is set to Cancel for all the lean orders. This should cancel all the lean orders.
6. Move the ask book to 20.040. This should cancel all the leans (verifies the change
in 5 made through). Move the market back to 20.050
6. Move the market back to 20.050
7. Enter 2 leans, 4 and 6 lots (configured like 3) at 20.025 and 20.020 respectively. In the orderbook
select both and make sure the Price and Size show as - (since they are different). Change the Trade Toward
Regular → Executable
View File
File mode changed.
+1
View File
@@ -28,3 +28,4 @@ Sym,Mult,Exch
"BOB",1000,CBT
"BUB",1000,CBT
"FNU",1000,CBT
"SOM",500,CBT
1 Sym Mult Exch
28 BOB 1000 CBT
29 BUB 1000 CBT
30 FNU 1000 CBT
31 SOM 500 CBT