Для изменения размера нажмите или перетащите
Экспорт дополнительных колонок

QuikTrader в целях оптимизации экспортирует только минимальный набор данных из стандартных таблиц (Инструменты, Заявки и т.д.). Если для алгоритма необходимы данные из дополнительных колонок (или же требуется изменить порядок колонок, например, в таблице Инструменты размер лота идет сразу за название инструмента), то для этого существуют 2 варианта решения:

  1. Добавить отдельную таблицу в Quik, которая будет дублировать существующую. Такую таблицу можно менять полностью, и это не отразиться на экспорте DDE, так как экспорт будет идти по первой таблице. Единственное ограничение такого подхода - такие таблицы не должны иметь одинаковый заголовок.
  2. Поменять существующую таблицу. А так же изменить метаданные, описывающие экспорт DDE. Ниже рассмотрен пример такого сценария.
Предварительные условия

Экспорт дополнительных колонок

  1. Пример работает с фьючерсными и опционными контрактами, и показывает как экспортировать колонки Волатильность, Теоретическая Цена, Базовый актив и Стоимость шага цены (пункт). Дополнительно, пример работает с расширенным стаканом, получая информацию о собственных объемах в котировках.

    Примечание Примечание

    Исходные коды примера лежат в папке Samples\Quik\DDE\SampleDdeExtendedInfo. Файл настроек для Quik называется info_extended.wnd.

  2. Вначале, необходимо настроить таблицу Инструменты:

    Инструменты (расширенные).
  3. А так же окно со стаканом:

    Стакан (расширенный).
    Примечание Примечание
    Пример работает с инструментом Лукойл. Для использования других инструментов необходимо настроить окна со стаканами по аналогии.
  4. Далее, необходимо изменить метаданные для инструментов и стаканов. Это делается через таблицу DdeTable. Для каждого типа торгового объекта существует своя отдельная таблица с метаданными, которые получаются через QuikTrader:

    Через QuikTraderSecuritiesTable и QuikTraderQuotesTable добавляются требуемые колонки в том порядке, в которым они были добавлены в Quik:

    C#
    // добавляем на экспорт необходимые колонки
    this.Trader.SecuritiesTable.Columns.Add(DdeSecurityColumns.Volatility);
    this.Trader.SecuritiesTable.Columns.Add(DdeSecurityColumns.TheorPrice);
    this.Trader.SecuritiesTable.Columns.Add(DdeSecurityColumns.BaseSecurity);
    this.Trader.SecuritiesTable.Columns.Add(DdeSecurityColumns.MinStepPrice);
    
    // добавляем экспорт дополнительных колонок из стакана (своя продажа и покупка)
    this.Trader.QuotesTable.Columns.Add(DdeQuoteColumns.OwnAskVolume);
    this.Trader.QuotesTable.Columns.Add(DdeQuoteColumns.OwnBidVolume);

    Если колонки добавляются не в конец, а перемешаны с основными колонками, то необходимо вставлять колонки относительно их порядка следования друг за другом в таблице:

    C#
    // вставить колонку волатильность, чтобы она была 5-ой с начала (нумерация идет с нуля)
    // все последующие колонки за волатильностью автоматически перестраивают свой порядковый номер
    this.Trader.SecuritiesTable.Columns.Insert(4, DdeSecurityColumns.Volatility);
  5. После этого, через события IConnectorNewSecurities и IConnectorSecuritiesChanged будут приходить объекты Security, содержащие расширенную информацию. Чтобы ее получить в коде, необходимо воспользоваться свойством SecurityExtensionInfo:

    C#
    Trader.NewSecurities += securities => this.GuiAsync(() => _securitiesWindow.Securities.AddRange(securities));
    Примечание Примечание

    Security имеет ряд свойств, которые упрощают доступ к расширенной информации. Это свойства OpenPrice, ClosePrice, HighPrice, LowPrice, MaxPrice, MinPrice, StepPrice, MarginBuy, MarginSell, ExpiryDate и SettlementDate. Поэтому в примере Стоимость шага цены берется не через SecurityExtensionInfo, а через SecurityStepPrice

  6. Для стакана данные по собственным объемам будут содержаться в QuoteExtensionInfo, которые в примере для удобства копируются в структуру SampleQuote:

    C#
    public class SampleQuote
    {
        public SampleQuote(Quote quote)
        {
            if (quote == null)
                throw new ArgumentNullException("quote");
    
            this.Price = quote.Price;
    
            if (quote.OrderDirection == OrderDirections.Buy)
            {
                this.Bid = quote.Volume.ToString();
    
                // копируем информацию о собственном объеме на покупку
                this.OwnVolume = (decimal)quote.ExtensionInfo[DdeQuoteColumns.OwnBidVolume];
            }
            else
            {
                this.Ask = quote.Volume.ToString();
    
                // копируем информацию о собственном объеме на продажу
                this.OwnVolume = (decimal)quote.ExtensionInfo[DdeQuoteColumns.OwnAskVolume];
            }
        }
    }
  7. В итоге должно получиться следующее:

    Пример экспорта расширенных инструментов.

    И для стакана Лукойл:

    Пример экспорта расширенного стакана.
Следующие шаги