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

Ecng.Trading - новое название проекта QuikWrapper

Обновление! Рекомендую после данного сообщения прочитать это.

Вот с такого названия пишу новое сообщение в блоге. Потому как вторая версия (качать отсюда) QuikWrapper-а получилась с настолько большим изменением, и настолько много я запрограммировал вспомогательных программ (утилит) с этой библиотекой, что по мере разработок новых и новых программ, я стал больше понимать, что нужно разделять мух от котлет. А именно, я решил разделить все, что относится к интернет-трейдингу и МТС, и конкретно Quik реализацию на разные библиотеки.

В последствии, я даже удивился, насколько это стало удобным. Например, у меня дома есть сервис с историческими данными. Эти данные я использую в программе тестирования стратегий. Так вот, очень удобно использовать Ecng.Trading для тестирования, но не очень удобно тянуть при этом Quik обертку. Зачем она, ведь я пока не торгую!? Вот и получилось, что написал я на C# с помощью библиотеки стратегию, подключил исторические данные, потестировал, подключил QuikWrapper, и уже начал торговать. И все эти шаги без переписывания кода. Я думаю, многие меня поймут, когда начинают писать прототип своей торговой системы сначала на одном языке, например на AmiBroker скрипте (или еще хуже, на Excel VBA), а затем переписывают на Delphi или .NET, так как нужна большая скорость и гибкость. Как в рекламе, зачем платить в два раза больше, если есть Ecng.Trading!

Изменение номер раз. Термины интернет-трейдинга (классы Security, Order, Trade и т.д.) перекочевали в сборку Ecng.Trading.BusinessEntities. Это полностью независимая сборка, и ее можно использовать везде, назависимо, разрабатывается ли программа под Quik или нет.

Изменение номер два. Добавились новые термины Candle, который представляет собой свечку, и Unit. Последнее собой представляет значения для хранения абсолютного или процентного значения. Поддерживаются базовые арифметически операции (+/-/*/:).

Изменение номер три. Появился интерфейс ITrader. Сам я создал только одну реализацию - QuikTrader, но если кто-то программирует под другие системы (например, Smart), пишите, попробуем добавить еще одну реализацию.

Изменение номер четыре. Базовые классы BaseTask и BaseTradeProcess для создания стратегий выделил в отдельную сборку - Ecng.Trading.Algo.

Изменение номер пять. В QuikTrader (который раньше назывался Trader) я добавил, во-первых, функционал по получению свечек, во-вторых, обработка стакана котировок, в-третьих, работа с DDE (запуск из своей программы DDE экспорт в Quik-e, которые, что важно отметить, само правильно выставляет найтроки в DDE окна Quik-а):

/// <summary>
/// Реализация интерфейса <see cref="ITrader"/>, предоставляющая шлюз взаимодействия с системой Quik.
/// </summary>
public class QuikTrader
{
/// <summary>
/// Инициализация класса <see cref="QuikTrader"/>.
/// </summary>
/// <param name="path">Путь к директории, где установлен Quik.</param>
/// <param name="ddeServer">Название DDE сервера.</param>
/// <param name="ddeWindowCaption">Заголовок окна экспорта через DDE в 
/// Quik-е. В русской версии окно имеет заголовок "Вывод через DDE сервер".</param>
/// <param name="securitiesTableCaption">Названия таблицы инструментов в Quik-е (в русской версии имеет название "Инструменты").
/// Необходимо DDE экспорту для поиска окон по заголовкам.</param>
/// <param name="tradesTableCaption">То же самое, что и securitiesTableCaption, только для всех сделок.</param>
/// <param name="ordersTableCaption">То же самое, что и securitiesTableCaption, только для заявок.</param>
/// <param name="myTradesTableCaption">То же самое, что и securitiesTableCaption, только для моих сделок.</param>
/// <param name="stockTableCaptionFormat">Формат заголовка онка с котировнками.</param>
public QuikTrader(string path, string ddeServer, string ddeWindowCaption,
string securitiesTableCaption, string tradesTableCaption,
string ordersTableCaption, string myTradesTableCaption,
string stockTableCaptionFormat);

/// <summary>
/// Запустить экспорт через DDE по всем таблицам (инструменты, сделки, заявки, мои сделки).
/// </summary>
public void StartDde();

/// <summary>
/// Запустить экспорт через DDE по таблицам, указанных параметром ddeTables.
/// </summary>
/// <example>
/// // запускаем экспорт по таблице инструментов и заявкам.
/// _trader.StartDde(DdeTables.Securities | DdeTables.Orders);
/// </example>
/// <param name="ddeTables">Таблицы, для которых необходимо запустить экспорт через DDE.</param>
public void StartDde(DdeTables ddeTables);

/// <summary>
/// Запустить для заданного инструмента экспорт через DDE стакана котировок.
/// </summary>
/// <param name="security">Инструмент, котировки которого необходимо выводить.</param>
public void StartDde(Security security);

/// <summary>
/// Остановить экспорт  DDE по всем таблицам (инструменты, сделки, заявки, мои сделки).
/// </summary>
public void StopDde();

/// <summary>
/// Остановить экспорт DDE по таблицам, указанных параметром ddeTables.
/// </summary>
/// <param name="ddeTables">Таблицы, для которых необходимо остановить экспорт через DDE.</param>
public void StopDde(DdeTables ddeTables);


/// <summary>
/// Остановить для заданного инструмента экспорт DDE стакана котировок.
/// </summary>
/// <param name="security">Инструмент, для которого необходимо остановить экспорт котировок.</param>
public void StopDde(Security security);
}


Изменение номер шесть, последнее. QuikTrader теперь поддерживает обработку по DDE стакана котировок, и получить эти котировки можно через метод GetQuotes.

Для всех нововведений приведу еще раз скриншотами настройки для DDE (новые, старые, изменившиеся):

Инструменты


Все сделки


Заявки


Мои сделки


Стакан (на примере, для LKOH)

Для закрепления того, о чем я писал выше, я создал программу-пример. На этот раз это визуальное приложение под Windows, которые представляет собой простейший привод для торговли:

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

  1. Супер! Вы ndde настроили для работы с квиком? Я сейчас пытаюсь перевести свою торговую систему на C# (параллельно изучая его) и во весь рост встала проблема ДДЕ из квика))

    ОтветитьУдалить
  2. На висте64 при нажатии кнопки Connect выдает ошибку
    Была сделана попытка загрузить программу, имеющую неверный формат. (Исключение из HRESULT: 0x8007000B)

    в строке _trader = new QuikTrader(this.Path.Text, "wrapper", "Вывод через DDE сервер", "инструменты", "все сделки", "заявки", "мои сделки", "{0} котировки");

    ОтветитьУдалить
  3. Это ограничение Trans2Quik.dll. Она есть только в 32 битовой редакции. Поэтому, свое приложение необходимо компилировать не как Any CPU, а как x86.

    ОтветитьУдалить
  4. Спасибо. Но пока все-таки не работает. Что я не так делаю:
    1. Компилирую под x86
    2. Запускаю, ввожу путь к квику и счет
    3. Коннект, становятся доступны все кнопки
    4. Настраиваю таблицы в квике
    5. Дальше пробовал по разному, сначала нажимать кнопку ДДЕ, а потом запускать экспорт таблиц из квика, или наоборот, но результат одинаковый - экспорт таблиц из квика запускается, а при нажатии одноименных кнопок в программе, открываются акна с пустыми таблицами, хотя в соответствующих таблицах квика есть данные

    ОтветитьУдалить
  5. Здравствуйте! Есть простой вопрос. Можно ли вашу программу использовать только в качестве получения стаканов нескольких фьючей из квика?

    ОтветитьУдалить
  6. Илья, добрый день!

    Конечно. Я еще раз хочу подчеркнуть, у меня не готовая программа. У меня библиотека, с помощью которой можно создавать свои собственные программы. Хотите делать только стаканы для инструментов - делаете только стакана. Хотитеторгующий алгоритм - делаете и его. Все зависит от способностей в программировании МТС.

    ОтветитьУдалить
  7. Добрый день, Mika
    У меня какая-то странная ошибка. Программа не может найти quik (QuikTerminalNotFound). Путь точно верный и квик запущен.
    Я использую visual studio 2008 и Windows Vista. Может быть в этом дело?

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