Не могу справиться с DdeCustomTable
Atom Ответить
16.11.2010


Масса благодарностей за библиотеку!

Создал класс
Код
[DdeCustomTable("Деривативы")]
    //[Ignore(FieldName = "IsDisposed")]
    public class DerivativesDDETable
    {
        [DdeCustomColumn("Бумага сокр.", Order = 0)]
        //[Identity]
        public string SecurityName { get; set; }

        [DdeCustomColumn("Код бумаги", Order = 1)]
        public string SecurityCode { get; set; }

        [DdeCustomColumn("До погашения", Order = 2)]
        public int TillExpiration { get; set; }

        [DdeCustomColumn("Шаг цены", Order = 3)]
        public double PriceStep { get; set; }

        [DdeCustomColumn("Ст. шага цены", Order = 4)]
        public double PriceStepPice { get; set; }

        [DdeCustomColumn("Страйк", Order = 5)]
        public double Strike { get; set; }

        [DdeCustomColumn("Баз. актив", Order = 6)]
        public string Asset { get; set; }

        [DdeCustomColumn("ГО покупателя", Order = 7)]
        public double BuyerMargin { get; set; }

        [DdeCustomColumn("ГО продавца", Order = 8)]
        public double SellerMargin { get; set; }

        [DdeCustomColumn("Дата исп.", Order = 9)]
        public DateTime FinalExpiration { get; set; }

        [DdeCustomColumn("Погашение", Order = 10)]
        public DateTime Expiration { get; set; }

        [DdeCustomColumn("Пред. оц", Order = 11)]
        public DateTime RC { get; set; }
    }


После
Код
protected override void OnConnect()
        {
            ProcessCustomTables += (type, objects) =>
            {
                // нас интересует только CustomPortfolio
                if (type == typeof(DerivativesDDETable))
                {
                    
                }
            };
            Terminal.StartDde("Деривативы");
            Terminal.StartDde(ListenedTables);

            base.OnConnect();
        }


на ProcessDataError приходит ArgumentOutOfRangeException

Деривативы
Имя параметра: category

Что это значит? Пытался работать только с одной колонкой - то же самое. По форуму ничего не нашел =(

Теги:


Спасибо:




38 Ответов
1 2  >
Mikhail Sukhov

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


А пункт 3 https://stocksharp.ru/do...76-9895-cffb6342203f.htm выполнили?
Спасибо:

Foxbow

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


Спасибо, прошу прощения за невнимательность =)
Автор топика
Спасибо:

a.dobryn

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


Тоже есть вопрос. При создании описания портфеля имеют значения названия полей? Они должны быть такими же, как и в Quik?
У меня так:
Описание полей на QPile:

Код
PARAMETER DATE;
PARAMETER_TITLE Дата;
PARAMETER_DESCRIPTION Дата сделки;
PARAMETER_TYPE STRING(32);
END
    
PARAMETER TIME;
PARAMETER_TITLE Время;
PARAMETER_DESCRIPTION Время;
PARAMETER_TYPE String(32);
END    

PARAMETER PRICE;
PARAMETER_TITLE Цена;
PARAMETER_DESCRIPTION Цена;
PARAMETER_TYPE Numeric(14,2);
END

PARAMETER seccode;
PARAMETER_TITLE Код;
PARAMETER_DESCRIPTION Код;
PARAMETER_TYPE String(32);
END    


описание полей на S#:
Код
[DdeCustomColumn("Дата", Order = 0)]
public string Data { get; set; }

[DdeCustomColumn("Время", Order = 1)]
public string Time { get; set; }

[DdeCustomColumn("Цена", Order = 2)]
public double Price { get; set; }

[DdeCustomColumn("Код", Order = 3)]
public string Code { get; set; }


В итоге после показа портфеля в программе окно есть, но пустое. Соединение происходит нормально.
Спасибо:

Mikhail Sukhov

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


D_Alex
В итоге после показа портфеля в программе окно есть, но пустое. Соединение происходит нормально.


В начале QuikTrader.ProcessCustomTables вызывается? QuikTrader.ProcessDataError что-нибудь пишет?
Спасибо:

a.dobryn

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


Mikhail Sukhov
В начале QuikTrader.ProcessCustomTables вызывается? QuikTrader.ProcessDataError что-нибудь пишет?


ProcessCustomTables вызывается, как в примере

Код
this.Trader.ProcessCustomTables += (type, objects) =>
{                    
    if (type == typeof(CustomPortfolio))
        _portfolioWindow.Portfolios.AddRange(objects.Cast<CustomPortfolio>());
};


а как использовать ProcessDataError?
Спасибо:

Mikhail Sukhov

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


D_Alex
Mikhail Sukhov
В начале QuikTrader.ProcessCustomTables вызывается? QuikTrader.ProcessDataError что-нибудь пишет?


ProcessCustomTables вызывается, как в примере

Код
this.Trader.ProcessCustomTables += (type, objects) =>
{                    
    if (type == typeof(CustomPortfolio))
        _portfolioWindow.Portfolios.AddRange(objects.Cast<CustomPortfolio>());
};


а как использовать ProcessDataError?


Прочитайте как использовать события в C# и для чего они нужны. После этого станет значительно понятнее как используется ProcessCustomTables и что такое +=
Спасибо:

a.dobryn

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


С событиями вроде разобралась, что такое += поняла, как подписываться на ошибки тоже. Только где именно надо использовать ProcessDataError? есть еще ConnectionError. Какие именно функции надо проверять и где?
Спасибо:

Mikhail Sukhov

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


D_Alex
С событиями вроде разобралась, что такое += поняла, как подписываться на ошибки тоже. Только где именно надо использовать ProcessDataError? есть еще ConnectionError. Какие именно функции надо проверять и где?


Это не функции, а обработчики событий.

Подпишитесь на событие ITrader.ProcessDataError, и, если в его обработчик что-нибудь придет, сохраните ошибку (или просто запустите под Debug и поставьте точку останова).

ConnectionError - это другое событие, связанное с ошибкой соединения. Вы подключиться смогли к Квик?
Спасибо:

a.dobryn

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


Да, обработчики, я не совсем правильно сформулировала вопрос =) нужно подписаться на это событие, но где? В какой момент? К квику подключилась. Есть функция Connect_Click, но, раз подключение успешно выполняется, но надо это делать не там? Хотя работа с портфелем вроде осуществляется там, до старта DDE

Код

private void Connect_Click(object sender, RoutedEventArgs e)
        {
            if (!_isConnected)
            {
if (this.Path.Text.IsEmpty())
                    MessageBox.Show(this, "Путь к Quik не выбран");
                else
                {
                    if (this.Trader == null)
                    {
                        // создаем шлюз
                        this.Trader = new QuikTrader(this.Path.Text);

                        // возводим флаг, что соединение установлено
                        _isConnected = true;

                        // подписываемся на событие ошибки соединения
                        this.Trader.ConnectionError += error => this.GuiAsync(() => MessageBox.Show(this, error.ToString()));

                        // добавляем тип CustomPortfolio для преобразования строчки из таблица в Портфель в объект CustomPortfolio
                        this.Trader.AddCustomTableMapping(typeof(CustomPortfolio));

                        this.Trader.ProcessCustomTables += (type, objects) =>
                        {
                            // нас интересует только CustomPortfolio
                            if (type == typeof(CustomPortfolio))
                                _portfolioWindow.Portfolios.AddRange(objects.Cast<CustomPortfolio>());
                        };

                        this.Trader.Connected += () => this.GuiAsync(() =>
                        {
                            this.ShowPortfolio.IsEnabled = true;
                            this.ExportDde.IsEnabled = true;

                            _isConnected = true;
                            this.ConnectBtn.Content = "Отключиться";
                        });

                        this.Trader.Disconnected += () => this.GuiAsync(() =>
                        {
                            _isConnected = false;
                            this.ConnectBtn.Content = "Подключиться";
                        });
                    }

                    this.Trader.Connect();
                }
            }
            else
                this.Trader.Disconnect();
        }


Извиняюсь за столь глупые вопросы, пытаюсь понять все с наскока :-[
Спасибо:

MCTuTeJ|19951995

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


Попробуйте там же где Вы на все остальные подписываетесь.
Спасибо:

a.dobryn

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


MCTuTeJ|19951995
Попробуйте там же где Вы на все остальные подписываетесь.

спасибо, так и сделала =)

в итоге получилось это:
Цитата:

Message "Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index"


текст целиком (не вытащить во время дебага, у error'а столько всего внутри)


все равно не понимаю - мы подписываемся на событие ProcessDataError в функции коннекта к quik'у, а ошибка вылезает при начале DDE, как оно так?
Спасибо:

a.dobryn

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


Хм, переделала это дело под другую таблицу, и оно внезапно заработало, без нареканий.
Спасибо:

a.dobryn

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


Только данные не обновляются после обновления таблицы в quick - где нужно проверить?
Спасибо:

Mikhail Sukhov

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


D_Alex
Хм, переделала это дело под другую таблицу, и оно внезапно заработало, без нареканий.


Я посмотрел причину такой ошибки. Она может быть только в том случае, если у колонки индекс больше допустимого. Например, пришло меньше полей по ДДЕ.
Спасибо: a.dobryn

Mikhail Sukhov

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


D_Alex
Только данные не обновляются после обновления таблицы в quick - где нужно проверить?


Посмотрите соседний топик. Я думаю такая же ситуация.
Спасибо:

a.dobryn

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


Mikhail Sukhov

Я посмотрел причину такой ошибки. Она может быть только в том случае, если у колонки индекс больше допустимого. Например, пришло меньше полей по ДДЕ.

скорее всего, наверное, неправильно описала саму структуру портфеля.

Mikhail Sukhov
D_Alex
Только данные не обновляются после обновления таблицы в quick - где нужно проверить?

Посмотрите соседний топик. Я думаю такая же ситуация.


Посмотрела - там немного другая ситуация, уже полученные данные не меняются, должны добавляться новые.


upd:

Оказалось, не описан NotifyPropertyChanged (да уж, а еще жду от программы чего-то)

Делаю, как в примере

Код
private PropertyChangedEventHandler _propertyChanged;

event PropertyChangedEventHandler INotifyPropertyChanged.PropertyChanged
{
add { _propertyChanged += value; }
remove { _propertyChanged -= value; }
}
private void NotifyPropertyChanged(string info)
{
if (_propertyChanged != null)
_propertyChanged(this, new PropertyChangedEventArgs(info));
}



Вылезает такая штука:
Код
'TFromQuik.CustomPortfolio.INotifyPropertyChanged.PropertyChanged': containing type does not implement interface 'System.ComponentModel.INotifyPropertyChanged'
Спасибо:

MCTuTeJ|19951995

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


Сталкивался с такой штукой - класс нужно отнаследовать от INotifyPropertyChanged
Спасибо:

a.dobryn

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


Сделала =) Закомпилилось, работает. Вроде обновляется (у меня сейчас одна колонка с данными, ползунок ползет), но данные те же самые! Ничего не понимаю.

код в итоге такой
Код
public class CustomPortfolio : INotifyPropertyChanged
{
[DdeCustomColumn("Цена", Order = 0)]
public double Price { get; set; }

private PropertyChangedEventHandler _propertyChanged;

event PropertyChangedEventHandler INotifyPropertyChanged.PropertyChanged
{
add { _propertyChanged += value; }
remove { _propertyChanged -= value; }
}
private void NotifyPropertyChanged(string info)
{
if (_propertyChanged != null)
_propertyChanged(this, new PropertyChangedEventArgs(info));
}
}


Причем при каждом запуске ощущение такое, что данные одни и те же, хотя в квике они давно поменялись.
Спасибо:

MCTuTeJ|19951995

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


Какой ползунок ? А где проверяете обновление данных ? Если в ProcessCustomTables то оно не приходит при изменении существующих данных.
Спасибо:

MCTuTeJ|19951995

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


Михаил, а Вы не подскажете нормальный источник где можно про технологию DDE почитать ?
Спасибо:

a.dobryn

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


MCTuTeJ|19951995
Какой ползунок ? А где проверяете обновление данных ? Если в ProcessCustomTables то оно не приходит при изменении существующих данных.

Ползунок на самой форме с данными =) там и проверяю. Существующие данные не меняются, появляются новые.
Спасибо:

MCTuTeJ|19951995

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


Как Вы определяете что не меняются данные ? А NotifyPropertyChanged вызывается ? Где храните полученные данные ?
Спасибо:

a.dobryn

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


MCTuTeJ|19951995
Как Вы определяете что не меняются данные ? А NotifyPropertyChanged вызывается ? Где храните полученные данные ?

смотрю на них =) они те же самые. Сделала даже скрин, сверила.
ой, кстати, да. А где вызывать NotifyPropertyChanged? Храню вроде бы в this.Portfolios
Спасибо:

MCTuTeJ|19951995

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


я ничего не понимаю .... Привязку данных делаете ? this.Portfolios это что ? Какой компонент используете для вывода данных ?
Спасибо:

a.dobryn

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


Привязку делаю, данные выводятся в GridView.
Спасибо:
1 2  >

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

loading
clippy