Работа с OrderGrid и TradeGrid
Atom Ответить
31.01.2010


Здравствуйте!
Очень понравились компоненты OrderGrid и TradeGrid!
Подскажите, каким образом я могу изменить там цвет выделен бая или
села и каким образом туда можно добавить или удалить какой нибудь из
столбцов?
Спасибо!

Теги:


Спасибо:




16 Ответов
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
Ответить


Да, совершенно верно. Ошибка появлялась даже если я полностью
перезагружал робота и даже квик. И даже комп)

Автор топика
Спасибо:

AndreiFX

Фотография
Дата: 19.03.2010
Ответить


Ошибка вернулась)
В таблице "мои сделки" 50 ордеров, в таблице "Заявки" 80 ордеров. 23
стоп заявки
Включаю экспорт дде, экспортируются только стоп заявки, остальное
пусто.
Причем пробовал как своего робота, так и Ваши примеры..результат один.
Всяческие перезагрузки тоже результата не дали.
Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 19.03.2010
Ответить


Так может это просто потому, что в новой версии поменялся формат
таблиц Квика? Вы сейчас на какой версии?

Спасибо:

AndreiFX

Фотография
Дата: 19.03.2010
Ответить


Сейчас пробую все на 1.6
до 1.7 пока ничего не обновлял...
Автор топика
Спасибо:

AndreiFX

Фотография
Дата: 19.03.2010
Ответить


Забыл добавить, никаких ошибок квик и робот не выкидывают
Там где начинаем дде вывод сделал так

try
{

this.Trader.StartDde();
_isDdeStarted = true;
}
catch
{
MessageBox.Show("Не удалось запустить ДДе
сервер");
}

Никаких ошибок не возникает, мессадж бокс не выскакивает..
Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 19.03.2010
Ответить


QuikTrader.DdeError что пишет?

Спасибо:

AndreiFX

Фотография
Дата: 20.03.2010
Ответить


Не успел вчера проверить...
будем ждать следующего раза)
Автор топика
Спасибо:


Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy