Экспорт произвольных таблиц. Вопрос касательно примера
Atom Ответить
27.04.2011


Здравствуйте. В примере "Экспорт произвольных таблиц" SampleDdeCustomTable идет заполнение экземпляра класса ThreadSafeObservableCollection значениями из произвольной таблицы реализованной на QPILE, который автоматически попадает в свойство ItemSource компонента ListView. Но сделано это так, что с каждым пересчетом таблицы в Quik'e в экземпляр класса ThreadSafeObservableCollection добавляется новая порция строк устремляя их количество к бесконечности:

Код
this.Trader.NewCustomTables += (type, objects) =>
{
    // нас интересует только QuikCandle
    if (type == typeof(QuikCandle))
        _candlesWindow.Candles.AddRange(objects.Cast<QuikCandle>());
};


Подскажите пожалуйста как изменить код так, чтобы новые строки не добавлялись, а заменяли существующие.
Мой вариант решения меня не совсем устраивает, так как после каждой второй операции экспорта ListView остается пустым:

Код
this.Trader.NewCustomTables += (type, objects) =>
{
if (type == typeof(QuikCandle))
{
if (this.Candles.Count > 0)
this.Candles.Clear();
if (this.Candles.Count == 0)
this.Candles.AddRange(objects.Cast<QuikCandle>());
}
};


Теги:


Спасибо:




10 Ответов
Mikhail Sukhov

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


Идентифицируйте свечки по времени.
Спасибо:

RyleT

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


Расскажите почему, если делать подряд Clear, а потом AddRange без проверки Count, то выскакивает исключение TargetIvokationException. Может вы предложите вариант решения?

Идентификация по времени мне не подходит, я планирую экспортировать не свечи, а свою таблицу написанную на QPILE, которая обновляется каждую секунду. На текущем этапе я бы хотел, чтобы точно такая же таблица точно также отображалась в окне моей программы написанной на C# с применением S#.
Автор топика
Спасибо:

Mikhail Sukhov

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


RyleT Перейти
Расскажите почему, если делать подряд Clear, а потом AddRange без проверки Count, то выскакивает исключение TargetIvokationException. Может вы предложите вариант решения?


https://stocksharp.ru/do...1e-8ba9-e1fa98728f92.htm

RyleT Перейти
Идентификация по времени мне не подходит, я планирую экспортировать не свечи, а свою таблицу написанную на QPILE, которая обновляется каждую секунду. На текущем этапе я бы хотел, чтобы точно такая же таблица точно также отображалась в окне моей программы написанной на C# с применением S#.


У таблица без уникального поля?
Спасибо:

kas

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


Тоже интересен данный вопрос. Хочу не добавлять строчки а заменять их. Я так понимаю нужно вызывать событие QuikTrader.CustomTablesChanged. В документации написано что одно из полей должно быть помечено аттрибутом IdentityAttribute, но как это все сделать я сам разобраться не смог. Вы не могли бы пояснить как это сделать? Примерчик небольшой дать?
Спасибо:

kas

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


Так, похоже что-то получилось...
Прописал атрибут IdentityAttribute у своей таблицы так

[DdeCustomColumn("Базовый актив", Order = 0)]
[Identity()]
public string BazAct { get; set; }

Событие CustomTablesChanged вызывается. Правда пока не понял как заменить изменившиеся строки, и не могу понять чем вообще это событие отличается от NewCustomTables, вроде бы в него также приходит обновившаяся строка?
И еще кто-нибудь знает как обновлять свою коллекцию раз в заданный промежуток времени. Я ради обучения экспортирую таблицу с параметрами опционов, и мне достаточно обновляться раз в секунду, а там событие обновления происходит десятки раз за секунду.
Спасибо:

Lunokhod

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


Коллеги!

Подскажите, а есть ли возможность в S# идентифицировать таблицу, строки которой передаются в событиях NewCustomTables и CustomTablesChanged ?
Дело в том, что у меня возникла необходимость передать роботу таблицы часовых свечек по нескольким инструментам одновременно.
В Квике открыто несколько таблиц со свечками, сделанными при помощи модификации файла CHARTS.QPL из примера к библиотеке S#.
Все таблицы имеют разные заголовки. Загрузка производится примерно таким кодом :

Код

public void AddCandleTable(String caption)
{
    DdeCustomTable ct = new DdeCustomTable(typeof(QuikCandle)); ;

    try
    {
        ct.TableName = caption;
        trader.CustomTables.Add(ct);
        trader.StartExport(ct);
    }
    catch (Exception ex)
    {
        PrintDebugMessage(ex.Message, Cl.T_DEBUG, true);
    }
}


Где caption - заголовок таблицы в Квике

Но когда приходят события NewCustomTables или CustomTablesChanged, то в качестве аргумента передаются только тип строк и массив собственно строк.
А как понять к какой таблице они относятся, если тип строк(QuikCandle) во всех случаях одинаков ?
Спасибо:

esper

Фотография
Программист
Дата: 13.11.2012
Ответить


Lunokhod Перейти
А как понять к какой таблице они относятся, если тип строк(QuikCandle) во всех случаях одинаков ?

А каким образом вы экспортируете разные таблицы с использованием одного типа? В примере, у QuikCandle есть атрибут [DdeCustomTable("Исторические свечки")], который явно задает название таблицы.
Спасибо:

Lunokhod

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


esper Перейти
Lunokhod Перейти
А как понять к какой таблице они относятся, если тип строк(QuikCandle) во всех случаях одинаков ?

А каким образом вы экспортируете разные таблицы с использованием одного типа? В примере, у QuikCandle есть атрибут [DdeCustomTable("Исторические свечки")], который явно задает название таблицы.


Обратите внимание на строку ct.TableName = caption;
Таким образом мы можем указать любое имя таблицы через параметр TableName. А имя "Исторические свечки" назначается по умолчанию при создании экземпляра класса DdeCustomTable, если мы указываем в качестве аргумента в конструкторе тип QuikCandle.
Функцию, которая приведена в коде выше, можно выполнять многократно с разными именами таблиц. И все прекрасно экспортируется.
Спасибо:

esper

Фотография
Программист
Дата: 13.11.2012
Ответить


Можно:
1. В таблицы добавить столбец с названием инструмента
2. Сделать разные классы для разных таблиц
Спасибо:

Lunokhod

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


esper Перейти
Можно:
1. В таблицы добавить столбец с названием инструмента
2. Сделать разные классы для разных таблиц


Собственно, в результате я и сделал по первому пункту : добавил два столбца, секьюрити код и код класса инструмента.
Второй пункт, полагаю, реализовать будет весьма проблематично в моем случае, поскольку в QPL-файлы для каждой таблицы отличаются только таймфреймом и инструментом.
Спасибо:


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

loading
clippy