← Zurück

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

Здравствуйте. В примере "Экспорт произвольных таблиц" 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>());
  }
};

War dieses Thema hilfreich?

Thema teilen

Kommentare (10)

Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen

Mikhail Sukhov
Mikhail Sukhov

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

RyleT
RyleT Autor

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

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

Mikhail Sukhov
Mikhail Sukhov

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

http://stocksharp.com/doc/help/html/a0a4c8df-2bba-4e1e-8ba9-e1fa98728f92.htm

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

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

kas
kas

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

kas
kas

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

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

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

Lunokhod
Lunokhod

Коллеги!

Подскажите, а есть ли возможность в 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
esper

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

Lunokhod
Lunokhod

esper:

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

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

esper
esper

Можно:

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

esper: Можно:

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

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