Mikhail Sukhov
|
Дата: 01.02.2010
|
|
|
|
Создать свой собственный контрол. Те, что входят в S# такого не умеют. И я пока не думаю их развивать. Фактически, они появились благодаря тому, что они потребовались в нескольких примерах. Вот код OrderGird:
<ListView x:Name="_orders" IsSynchronizedWithCurrentItem="True" EcngXaml:GridViewSort.AutoSort="True" HorizontalAlignment="Stretch" SelectionChanged="_orders_SelectionChanged" ItemsSource="{Binding ElementName=_orderGrid, Path=Orders}"> <ListView.View> <GridView> <GridViewColumn Width="70" Header="Номер" DisplayMemberBinding="{Binding Path=Id}" EcngXaml:GridViewSort.PropertyName="Id" /> <GridViewColumn Width="70" Header="Время" DisplayMemberBinding="{Binding Path=Time, Converter={StaticResource valueConverter}, ConverterParameter='\{0:HH:mm:ss\}'}" EcngXaml:GridViewSort.PropertyName="Time" /> <GridViewColumn Width="45" Header="Объем" EcngXaml:GridViewSort.PropertyName="Volume"> <GridViewColumn.CellTemplate> <DataTemplate> <TextBlock Text="{Binding Path=Volume}" TextAlignment="Right" /
</DataTemplate> </GridViewColumn.CellTemplate> </GridViewColumn> <GridViewColumn Width="45" Header="Баланс" EcngXaml:GridViewSort.PropertyName="Balance"> <GridViewColumn.CellTemplate> <DataTemplate> <TextBlock Text="{Binding Path=Balance}" TextAlignment="Right" /
</DataTemplate> </GridViewColumn.CellTemplate> </GridViewColumn> <GridViewColumn Width="60" Header="Цена" EcngXaml:GridViewSort.PropertyName="Price"> <GridViewColumn.CellTemplate> <DataTemplate> <TextBlock Text="{Binding Path=Price}" TextAlignment="Right" /> </DataTemplate> </GridViewColumn.CellTemplate> </GridViewColumn> <GridViewColumn Width="60" Header="Тип" EcngXaml:GridViewSort.PropertyName="Direction"> <GridViewColumn.CellTemplate> <DataTemplate> <TextBlock x:Name="DirectionCtrl" Text="{Binding Path=Direction}" TextAlignment="Center" /> <DataTemplate.Triggers> <DataTrigger Binding="{Binding Path=Direction}" Value="Sell"> <Setter TargetName="DirectionCtrl" Property="Foreground" Value="Blue"/> </DataTrigger> <DataTrigger Binding="{Binding Path=Direction}" Value="Buy"> <Setter TargetName="DirectionCtrl" Property="Foreground" Value="Red"/> </DataTrigger> </DataTemplate.Triggers> </DataTemplate> </GridViewColumn.CellTemplate> </GridViewColumn> <GridViewColumn Width="80" Header="Статус" EcngXaml:GridViewSort.PropertyName="State"> <GridViewColumn.CellTemplate> <DataTemplate> <TextBlock x:Name="StateCtrl" Text="{Binding Path=State}" TextAlignment="Center" /> <DataTemplate.Triggers> <DataTrigger Binding="{Binding Path=State}" Value="None"> <Setter TargetName="StateCtrl" Property="Foreground" Value="Black"/> </DataTrigger> <DataTrigger Binding="{Binding Path=State}" Value="Active"> <Setter TargetName="StateCtrl" Property="Foreground" Value="Red"/> </DataTrigger> <DataTrigger Binding="{Binding Path=State}" Value="Cancelled"> <Setter TargetName="StateCtrl" Property="Foreground" Value="Blue"/> </DataTrigger> <DataTrigger Binding="{Binding Path=State}" Value="Matched"> <Setter TargetName="StateCtrl" Property="Foreground" Value="Green"/> </DataTrigger> </DataTemplate.Triggers> </DataTemplate> </GridViewColumn.CellTemplate> </GridViewColumn> </GridView> </ListView.View> </ListView>
/// <summary> /// Визуальный контрол-таблица, отображающая заявки (коллекцию объектов класса <see cref="Order"/>). /// </summary> public partial class OrderGrid { /// <summary> /// Создать объект класса <see cref="OrderGrid"/>. /// </summary> public OrderGrid() { this.Orders = new SynchronisedObservableList<Order>(); InitializeComponent(); }
/// <summary> /// Коллекция заявок, которые необходимо отобразить. /// </summary> public IList<Order> Orders { get; private set; }
/// <summary> /// Происходит при новом выделении заявки. /// </summary> public event EventHandler<EventArgs> OrderSelected;
/// <summary> /// Выбранная заявка. /// </summary> public Order SelectedOrder { get { return this.SelectedOrders.FirstOrDefault(); } }
/// <summary> /// Выбранный заявки. /// </summary> public IEnumerable<Order> SelectedOrders { get { return _orders.SelectedItems.Cast<Order>(); } }
private void _orders_SelectionChanged(object sender, SelectionChangedEventArgs e) { this.OrderSelected.SafeInvoke(this); } }
|
|
Спасибо:
|
|
|
|
|
AndreiFX
|
Дата: 01.02.2010
Спасибо. А может быть исходник этого компонента сможете выложить? Впервые сталкиваюсь с созданием компонентов в шарпе,потому исходник компонента очень поможет в разборе ситуации....
|
|
Спасибо:
|
|
|
|
|
AndreiFX
|
Дата: 02.02.2010
Хотя уже не надо, разобрался. Спасибо
|
|
Спасибо:
|
|
|
|
|
Mikhail Sukhov
|
Дата: 02.02.2010
А это и был исходник.
|
|
Спасибо:
|
|
|
|
|
AndreiFX
|
Дата: 23.02.2010
Теперь вот какая ошибка появилась, которая возникает при дде экспорте данных если имеется много ордеров
Необработанное исключение типа "System.StackOverflowException" произошло в Ecng.Xaml.dll
Подскажите, в чем может быть дело?
|
|
Спасибо:
|
|
|
|
|
AndreiFX
|
Дата: 23.02.2010
Теперь возниклает вот какая проблема Когда много ордеров имею, то выскакивает вот эта ошибка при включении дде экспорта:
Необработанное исключение типа "System.StackOverflowException" произошло в Ecng.Xaml.dll
Подскажите, где копать?
|
|
Спасибо:
|
|
|
|
|
Mikhail Sukhov
|
Дата: 25.02.2010
Судя по всему, переполнение стека (много вызовов). А что сделали? Можете локализовать и послать исходники с багой?
|
|
Спасибо:
|
|
|
|
|
AndreiFX
|
Дата: 25.02.2010
|
|
|
|
Эта ошибка возникла из за моей ошибки: робот начинает открывать очень большое количество ордеров(это мой баг), соответственно в таблице "мои сделки" очень много строк и из за этого возникает данная ошибка. Вот код моей вредоносной процедуры(не исправленной) Эту процедуру делал для закрытия ордеров к определенному времени, она вызывается на каждом тике после заданного времени. И косяк здесь в том, что пока робот открывает рыночный ордер, противоположный тому, что сейчас есть в рынке, эта процедура заново вызывается и открывается еще один противоположный и таким образом получается очень много сделок, привод зависает, а когда заново его включаю и начинаю делать дде вывод, то появляется вышеописанная ошибка. Она же, я полагаю может появиться если просто будет очень много сделок и сделаем заново вывод по дде.
private void CloseAllOrd() {
for (int i = Limits.Count() - 1; i >= 0; i--) { Order ord = Limits[i]; if (ord.State == OrderStates.Active) CancelOrder(ord); } for (int i = this.StopOrders.Count() - 1; i >= 0; i--) { Order ord = this.StopOrders[i]; if (ord.State == OrderStates.Active) CancelOrder(ord); }
count = 0; foreach (MyOrderss x in Trades) { if (x.Direction == OrderDirections.Buy) count += x.Volume; if (x.Direction == OrderDirections.Sell) count -= x.Volume; }
if (count > 0) { var order = new Order { Account = acc, Volume = count, Security = secur, Price = secur.BestBid - otst * secur.MinStepSize, Direction = OrderDirections.Sell, Type = OrderTypes.Limit, }; this.Trader.RegisterOrder(order); ВремяОтмены = DateTime.Now; } if (count < 0) {
var order = new Order { Account = acc, Volume = -count, Security = secur, Price = secur.BestAsk + otst * secur.MinStepSize, Direction = OrderDirections.Buy, Type = OrderTypes.Limit, }; this.Trader.RegisterOrder(order);
} }
|
|
Спасибо:
|
|
|
|
|
Mikhail Sukhov
|
Дата: 25.02.2010
Я правильно понял, что ошибка появляется не только в процессе работы (продолжительной или не совсем), а даже тогда, когда Вы перезапустили робота (вот тут уточняю, робота или ДДЕ) и сразу же получили ошибку?
Насчет большого объема заявок - не думаю. Таблица всех сделок содержит такое количество заявок, что никакому роботу не создать такое количество. И ничего, у все экспортируется на раз. Тем более, что при перезапуске ДДЕ сделки, которые уже вызывались через событие NewTrades, не будут более вызываться.
|
|
Спасибо:
|
|
|
|
|
AndreiFX
|
Дата: 01.03.2010
Да, совершенно верно. Ошибка появлялась даже если я полностью перезагружал робота и даже квик. И даже комп)
|
|
Спасибо:
|
|
|
|