пятница, 6 ноября 2009 г.

Особенность построения МТС под Quik, использую Ecng.Trading

Довольно много пришло писем на почту (как-то народ не очень любит писать в комменты, вопрос - почему) с разного рода ошибками. Об ошибках, в которых повинен я, писать не буду, потому как я их буду устранять по мере появления. А вот о тех, которые я устранить не могу (например, особенности работы Квика), я напишу.

1. "System.BadImageFormatException was unhandled" (если установлен .NET Framework русской версии то сообщение будет такое "Была сделана попытка загрузить программу, имеющую неверный формат."). Эта ошибка говорит о том, что запускается программа как 64 битовое приложение. Библиотека же Trans2Quik.dll написана только под 32 битовые приложения. А на дворе уже 21 век, и найти не 64 битовые компьютеры все сложнее и сложнее. Поэтому и возникает подобная путаница. Поэтому, преждем чем начать создавать своего робота на .NET под Квик, нужно зайти в свойства проекта, раздел Build и выставить Platform target в x86:


2. При торговле на FORTS у Security всегда нулевое значение свойства LastTrade. Это происходит потому, что в таблице инструментов Квик для FORST не показывает время последней сделки. Но он умеет показывать время последнего изменения. Ecng.Trading не опирается на названия колонок в таблице при экспорте через DDE, но учитывает порядковый номер. Поэтому, чтобы получать значение последней сделки в Security, нужно заменить колонку "Время последней сделки" на "Время последнего изменения".

3. Неправильно настроены таблицы в Квике. Под пример, который идет в архиве вместе с Ecng.Trading, я выкладываю файл с настройками для Квика скачать. В нем есть различные фильтры, наподобие того, что показаны только A1 ММВБ и пара фьючерсов, но я думаю, отменить этот фильтр в Квике не составит труда.

4. Когда запускается экспорт Всех сделок через DDE, компьютер может подтормаживать. Это связанно с количеством сделок, которое грузится в первый раз (актуально, когда робот запускается не в начале торговой сессии). Так вот, в программе лучше прописать алгоритм так, чтобы он ждал пока все сделки не подгрузятся. Например, брать тот же Security.LastTrade и ждать, пока он не придет через событие ITrader.NewTrades. Или же заставить пользователя смотреть за процессором в Task Manager.

5. "Что умеет моя программа?". Ничего! Потому что у меня не программа. У меня библиотека с API для разработки этих самых программ. Скриншоты с мой якобы программой являются скриншотами примера, которого я создал специально продемонстрировать, что умеет моя библиотека.

13 комментариев:

  1. Здравствийте.
    Я вам скажу работа сделана хорошая и нужная.
    Отделно спасибо за это.
    А можно ли добавить новие таблицы, для вывода по DDE? Например "Позиции по клиентским счетам"

    Спасибо.

    ОтветитьУдалить
  2. Можно. Давайте обсудим, какие параметры необходимы.

    ОтветитьУдалить
  3. Спасибо за помощь.

    Иногда при вызове Конструктора
    _trader = new QuikTrader(this.Path.Text, "wrapper", "Вывод через DDE сервер", "инструменты","все сделки", "заявки", "мои сделки", "{0} котировки");
    Вылезает ошибка
    System.InvalidOperationException was unhandled
    The service is not registered.

    И как вы понимайте try{} тут не поможет.
    Пожалуйста подскажите в чем проблемма.

    Тут проблемма по моему в регистрации DDE сервера NDDE. Но при использовании NDDE, я ранше не сталкивался с той же проблеммой.
    Спасибо.

    ОтветитьУдалить
  4. Да, допустил ошибку при релизе. Новую версию выложу на выходных. К сожалению, пока не знаю, как Вам обойти ошибку. В качестве положительного момента ожидания скажу, в новой версии появяться новые виды свечек.

    ОтветитьУдалить
  5. Опять спасибо. :)
    Тут я сталкнулся с еще одной проблеммой.
    У меня время локолюное МСК+1
    И когда я пытаюсь полихить StockTime из класса QuikTrader она мне возвращает не время на Сервере а локалюное время.
    Это так должно быть или StockTime выдает локалюное время на компютере клиента?
    Будем ждать обновленей.
    Эсли нужна какая нибудь помощ насчет проекта, всегда рад помоч.
    Спасибо за работу.

    ОтветитьУдалить
  6. Да, локальное. Проблема кроется в Квике - у него нет точки доступа для получения времени биржи. Поэтому, сделал DateTime.Now. Как решение - в начале работы программы создавать offset и применять его в дальнейшем c ITrader.StockTime.

    ОтветитьУдалить
  7. Оффсет не самое лудшее ришение здесь.
    Я использую портфель QPILE для получения времени сервера.
    Эсли интересно погу поделится QPILE файлом.
    И если можно/возможно добавьте Таблицу
    "Время сервера" с одной колонкой "Время сервера" с возможностью вывода по DDE.

    ОтветитьУдалить
  8. Если Вы найдете такую таблицу в Квике, я передам ее по DDE.

    ОтветитьУдалить
  9. При первом же знакомстве столкнулся с проблемой, что при неподключенном Quik к серверу, не создается экземпляр класса QuikTrader и выдается ошибка. Осмысленно заниматься программой получается только по выходным, когда сервера глухи. Есть ли возможность обойти вообще наличие Quik, т.к. в тестовом режиме можно посылать данные из других приложений. Так понимаю в данном варианте имеется жесткая привязка к конкретным таблицам Quik, может есть смысл код добавления необходимых таблиц сделать открытым.

    ОтветитьУдалить
  10. На выходных можете использоват Учебный Quik.
    Учебные сервера глухи только с 2:00-3:00 МСК времени.

    ОтветитьУдалить
  11. Mika. Во время Debug режима видны классы со странными названиями, например класс чертик, или класс квадратик, класс ветикальная черта. Вы можете исправить имена этим классам, чтобы легче было понимать что происходит Runtime?
    Спасибо.

    ОтветитьУдалить
  12. Этот комментарий был удален автором.

    ОтветитьУдалить
  13. Здорово, но не понятно.
    У меня почему-то события для Trader не происходят, кроме connect. А конструктор QuikTrader имеет не более 3 аргументов. Скачивал stocksharp2.0.
    Что я делаю не так?
    Спасибо заранее.

    ОтветитьУдалить