Экстремальный трейдинг

Программная оболочка для трейдерских приложений. Для создания робота/привода нужны только начальные знания программирования.

*****

XML Feed

***


28
Май

SmartComShell для чайников #2

На этом занятии мы создадим первую маленькую программку, которая будет соединяться с сервером. Протестируем, как система восстанавливает соединение с сервером после дисконнекта.
Приступим к написанию кода. Выполните двойной клик по заголовку окна Form1 и мы попадем в редактор кода, как показано на следующем рисунке.study02_01.JPG
Все классы библиотеки SmartComShell логически упорядочены в пространствах имен. Например, все классы, связанные с заявками, располагаются в пространстве имен SpreadMaster.SmartComShell.Orders. Для того чтобы получить полную ссылку на класс Order, нам пришлось бы написать такую строку SpreadMaster.SmartComShell.Orders.Order. Таких длинных записей можно избежать, импортировав соответствующие пространства имен. После импорта соответствующего пространства мы можем ссылаться на класс при помощи короткого имени класса. В нашем случае при помощи Order. Поэтому сначала импортируем набор пространств имен. Эти строки помещаем в самый верх программы.

study02_cod01.JPG

Обратите внимание на блок #Region “Imports” … #End Region. Такая связка позволяет скрывать целые блоки кода, т.к. строки с импортом пространств имен будут занимать много места, рекомендую сразу использовать директивы #Region … #End Region.
В библиотеке SmartComShell существует некий центральный класс ComServer. Через свойства и методы этого класса реализуются практически все основные функции библиотеки. Также есть и другие классы, которые не связаны с центральным объектом. Поэтому первым делом мы должны создать объект типа ComServer.

study02_cod02.png

Следующий кусок кода мы поместим в процедуру-обработчик события Load формы. Это событие возникает в момент загрузки формы и здесь удобно размещать код, выполняющий различные начальные действия программы. В нашем случае мы инициализируем объект m_ComServer, настроим конфигурацию, подпишемся на события и вызовем функцию Connect. #Region “Процедуры-обработчики событий формы и ее управляющих элементов”study02_cod03.png
Библиотека SmartComShell является оболочкой API - SmartCom, поэтому практически все функции и события SmartCom имеют свои аналоги в SmartComShell, но в более удобном виде. Кроме того, следует понимать, что SmartCom и SmartComShell реализуют асинхронную модель работы с данными. Это означает, что все данные с биржи к нам поступают асинхронно (не имеют определенной последовательности) в виде аргументов событий. Это означает, что в начале работы мы должны подписаться (назначить процедуры-обработчики) на события. Непосредственно подписка (и отписка) на события осуществляется во внутренней процедуре AddRemoveHandler(string). См. ниже. В качестве параметра мы передаем в подпрограмму строку «Add» - для подписки или «Remove» - для прекращения подписки.

Важно. В конце работы Вашей программы всегда нужно отписываться от событий.

В нашем примере мы отписываемся от событий Comserver в процедуре-обработчике события Closing формы.

study02_cod041.png

 study02_cod042.png

В SmartComShell есть специальный класс Configuration, предназначенный для конфигурирования программы, т.е. определения параметров соединения, номеров счетов, параметров ведения журнала и т.п. После подписки на события всегда нужно настроить параметры конфигурации. Это делается во внутренней процедуре SetConfiguration.
Обратите внимание на строки, конфигурирующие параметры журнала.

study02_cod05.png

Ведение журнала – это эффективный способ отладки Вашей программы. Записи журнала можно выводить в

  • файл (eTraceListenerType.TextFile),
  • на консоль (eTraceListenerType.Console),
  • в окно Вашего отладчика (eTraceListenerType.Default).

Чтобы сделать запись в журнал можно использовать стандартные команды трассировки:

study02_cod06.png

Или же функцию Log класса Logger. Эта функция имеет следующие аргументы.
         Logger.Log(location As String, message As String, traceLevel As TraceLevel)
location – место в программе, откуда вызвано сообщение в формате Имя класса.Имя подпрограммы/функции.
message – Ваше сообщение
traceLevel – уровень важности (детализации) сообщения.
Например, если Вы добавите в программу строку типа:
      Logger.Log(”Form1.Form1_Load”, “Connect is OK”, TraceLevel.Verbose),
то в журнале получите запись вроде:
     10.05.2010 15:20:51, Form1.Form1_Load, Connect is OK
Вы можете управлять записями в журнале при помощи настройки уровня важности сообщений. Существует несколько уровней важности:

  • Error
  • Warning
  • Info
  • Verbose

Самый важный уровень это Error, а самый низкий приоритет имеет уровень Verbose. В журнал будут попадать только сообщения, имеющие уровень важности не ниже, чем установлено в свойстве m_ComServer.Config.Logger.TraceLevel.
В SmartComShell все отладочные сообщения имеют уровень Verbose, а сообщения об ошибках - уровень Error. Следовательно, если Вы в своих отладочных сообщениях будете задавать уровень не ниже Info, то сможете отключить отладочные сообщения SmartComShell.
Вы можете вообще отключить ведение журнала вот таким способом
m_ComServer.Config.Logger.TraceLevel = TraceLevel.Off
Когда Вы начнете отладку своего робота, Вам придется просматривать километры отладочной информации, и Вы в полную мере ощутите важность правильной организации журнала. Опираясь на свой опыт, могу сказать, что данные удобнее записывать в длинные строки. Что я имею в виду… Допустим нужно записать в журнал информацию о параметрах заявки. Казалось бы, удобнее расположить информацию в отдельных строках, например, так.

OrderId – 5412789
Symbol – GAZP
Status – InOrderBook
IsPartial - False
Side - Buy
Price – 168.15
Quantity - 200

Если журнал небольшой, то возможно это так и есть. Но, скорее всего, в Вашем журнале будет несколько тысяч строк, поэтому эту информацию лучше разместить в виде «длинной» строки.
15.05.2010 15:12:32,Orders.OrderIdentification,Id-5412789;Smb-GAZP;Status–InOrderBook; IsPartial-False;Side-Buy;Price–168.15;Quantity-200
Построить такую строку можно при помощи следующего кода. 

study02_cod07.png

Теперь обратимся к параметрам восстановления соединения.

study02_cod08.png

Свойство ConnectTrialRate следует устанавливать не менее 7 сек (7000 мс) иначе таймер слишком часто вызывает команду Connect, что приводит к ошибкам.
В свойстве RecoveryItems мы определяем, какие «подписки» мы будем автоматически восстанавливать после реконнекта. При значении свойства равным eRecoveredItems.Accounts_Instruments будут восстанавливаться подписки на счета (ListenAccount) и инструменты (ListenSymbol).
Вернемся к нашей программе. Мы создали главный объект, подписались на события и настроили конфигурацию. Теперь нужно вызвать функцию ComServer.Initiate(). Эта функция инициализирует внутренние переменные m_ComServer. Обычно инициацию внутренних переменных проводят в конструкторах, но логика нашей библиотеки предполагает настройку некоторых свойств (конфигурирования) уже созданного объекта ComServer, а параметры конфигурации используются при инициировании других внутренних переменных. Поэтому и используется функция ComServer.Initiate().
Теперь обратимся к функции ComServer.Connect. Эта функция вызывает соединение с сервером. Если соединение прошло удачно, то возникает событие Connected. Многие функции SmartComShell можно использовать только, когда есть соединение с сервером. Поэтому некоторые функции лучше вызывать в процедуре-обработчике этого события. У нас эта процедура называется ComServer_Connected. Эта процедура имеет параметр IsReconnected, указывающий как возникло событие: в результате первичного соединения (значение параметра равно False), или в результате исполнения механизма восстановления соединения (True). Знание обстоятельств возникновения соединения позволяет нам избежать повторного вызова функций, включающих прослушку счетов и инструментов, т.к. при восстановлении соединения эти функции отрабатывают автоматически, и тем самым избежать ошибок.
Подключение счетов. Включение “прослушки” счетов означает активацию серии событий , поставляющих информацию по счету:

  • изменение денежного состояния (SetPortfolio),
  • изменение позиции (UpdatePosition),
  • движение заявок (UpdateOrder),
  • движение сделок (AddTrade).

При включении “прослушки” в событиях UpdatePosition и AddTrade поступает информация по всем заявкам  и сделкам текущей торговой сессии соответственно.
При подписке счет добавляется в коллекцию Accounts , а при отписке удаляется из нее. Подписка (отписка) на счета осуществляется при помощи метода ListenAccount. В SmartComShell имеется две «перегрузки» этого метода. Мы применим «перегрузку», которая подписывается на счета, чьи имена определенны при конфигурировании программы.
ListenAccount(eOnOff, eListenMode)
В этом варианте метода используются два параметра: первый параметр включает (eOnOff.On) или выключает (eOnOff.Off) прослушку, в качестве второго параметра всегда нужно использовать eListenMode.Standart.
Если Ваша программа должна только получать данные, и Вы не хотите знать состояние своего счета или выставлять заявки, то подписываться на счета не обязательно.
Подключение инструментов. Подписка на инструмент означает, что мы будем в параметрах соответствующих событий получать ценовую информацию с биржи. Подписка на инструмент выполняется при помощи метода ListenSymbol.
ListenSymbol(Instrument, eSymbolListenType, eOnOff, eListenMode)
Первый параметр метода имеет тип Instrument. Объект этого типа содержит всю статическую (имена, площадка, шаг цены и т.п.) и динамическую (цены сделок, объемы, стакан и т.п.) информацию об инструменте. Статическая информация появляется в объекте при его создании, а динамическая после подписки на инструмент. Статическая информация обо всех инструментах храниться в файле SymbolProperties.dat и обновляется посредством загрузки новых данных с сервера при помощи функции ComServer.GetSymbols().
Для создания объекта типа Instrument  используется функция GetInstrument(). В следующем примере при помощи этой функции создается объект Instrument для акций Сбербанка.

study02_cod09.png

Второй параметр – это перечисление eSymbolListenType - тип подписки:

  • None = 0 - Нет подписки
  • Ticks = 1 - Подписка на тики
  • Quotes = 2 - Подписка на квоты
  • Dom = 4 - Подписка на “стакан”
  • TicksAndQuotes = Ticks + Quotes - Подписка на тики и квоты
  • TicksAndDom = Ticks + Dom - Подписка на тики и “стакан”
  • QuotesAndDom = Quotes + Dom - Подписка на квоты и “стакан”
  • All = Ticks + Quotes + Dom - Подписка на все потоки

Третий параметр – это перечисление eOnOff – включить/выключить:
Четвертый параметр – это перечисление eListenMode – всегда нужно использовать eListenMode/Standart.
В случае удачной подписки инструмент добавляется в коллекцию Ins. Если прекращается подписка на все потоки данных по инструменту, то инструмент удаляется из коллекции Ins. Коллекция Ins позволяет нам обращаться к любому свойству подписанного инструмента по ключу. В качестве ключа используется системный код инструмента . В следующем примере мы присваиваем переменной значение цены лучшего аска акций Сбербанка.
Dim AskPrice As Double = m_ComServer.Ins(”SBER03″).Dom.Asks(0).Price
В случае удачной подписки инструмент не только добавляется в коллекцию Ins, но еще начинают генерироваться события потоков данных. В нашем примере мы подписываемся сразу на все потоки, поэтому будут генерироваться события TickChanged, QuoteChanged и DomChanged. Для каждого события в нашей программе созданы процедуры-обработчики: ComServer_TickChanged, ComServer_QuoteChanged и ComServer_DomChanged соответственно.
Процедура ComServer_TickChanged. В качестве параметра в эту процедуру передается параметр типа Tick. Класс Tick инкапсулирует данные по последней сделке по данному инструменту. Кроме того, этот класс имеет функционал для калькуляции ряда индикаторов «на лету».
Процедура ComServer_QuoteChanged. В эту процедуру передается параметр типа Quote. Класс Quote инкапсулирует информацию потока данных котировки.
Процедура ComServer_DomChanged. Эта процедура получает данные через параметр типа Dom. Класс Dom – это данные «стакана», а также функционал для ряда «стаканных» индикаторов.

study02_cod10.JPG
study02_cod101.JPG

В нашей маленькой программке осталось сделать последний штрих. Нам необходимо написать код завершающих действий программы. Во-первых, необходимо отписаться от «прослушки» счетов и инструментов, затем от событий, а в заключении вызвать процедуру, выполняющую завершающие действия SmartComShell. Эта процедура называется ShutDown.

Важно. Последним действием при выходе из программы должен быть вызов процедуры ShutDown.

Завершающие действия мы поместим в процедуру-обработчик события формы FormClosing. Это событие возникает при закрытии формы. Таким образом, чтобы правильно завершить работу программы нужно просто закрыть форму.
Теперь программу нужно испытать. Проект этой программы вы найдете по ссылке http://www.box.net/shared/zuvxlqcrvn. Разархивируйте файл проекта в отдельную папку и запустите файл SmartComShellTest.sln. Далее щелкните правой кнопкой в окне Обозреватель решений по узлу Form1.vb и выберите из контекстного меню пункт Перейти к коду. Откроется окно редактора кода. (см. рис. ниже) Здесь Вы можете просмотреть код, который мы только что написали. В комментариях Вы обнаружите дополнительную информацию.
 study02_02.JPG
Давайте запустим программу на выполнение в режиме отладки. Для этого щелкнем по зеленой стрелке на панели инструментов или нажмем клавишу F5. Возникает вопрос. Вроде бы мы написали энное количество кода, но никакую информацию на форму не выводим . Дело в том, что пока мы нашу программу будем запускать в режиме отладки (как говорят под дебагером) и всю информацию будем выводить в журнал и смотреть в окне Интерпретация. Вспомните строку которую мы написали при настройке конфигурации
.Logger.ListenerType = eTraceListenerType.Default
Устройством вывода по умолчанию журнала как раз и является окно Интерпретация .
При запуске программы это окно у  Вас появится автоматически внизу экрана. Но при завершении ее работы может исчезнуть. Вызвать это окно можно при помощи команды Отладка – Окна - Интерпретация. Обратите внимание на следующий рисунок. Там показано как вызвать окно Интерпретация и информацию, которую выводит в это окно наша программа.

study02_03.JPG
 
В заключении этого занятия давайте протестируем работу механизма восстановления соединения с сервером и подписок. При настройке конфигурации мы включили автоматическое восстановление соединения и подписок на счета и инструменты.
‘ Флаг - включение автоматического реконнекта
.Connect.IsAutoReconnect = True
‘ Какие подписки востанавливаем после реконнекта
.Connect.RecoveredItems = eRecoveredItems.Accounts_Instruments
Запустите программу. Дождитесь начала поступления данных. Отключите интернет, а затем заново включите. Понаблюдайте в окне Интерпретация, что будет происходить.

Все необходимые файлы Вы можете найти по ссылке http://www.box.net/shared/zuvxlqcrvn.

6 Responses to “SmartComShell для чайников #2”

  1. anton Says:

    Сергей, вечер добрый. Подскажите пожалуйста на каком языке вы писали spredmaster? шарпе или бэйсике? и почему выбор был в пользу одного?

  2. admin Says:

    На VB. Я в свое время много писал на FoxPro, а синтаксис FoxPro и VB сильно похож. Более того, я считаю, что синтаксис VB более дружественным. В нете между шарпом и VB разница только в синтаксисе. Экзешник мы все равно получаем на промежуточном языке.

  3. Richelle Says:

    hello…

    I preferred by way of thanking you with this piece of content .I by all odds liked every little bit of it. I have you bookmarked your internet site to determine in the modern stuff you post http://eveningdressesvuv.sweetcircles.com/2010/12/20/low-price…

  4. Kugenie Says:

    hello…

    Hi there just quality post! http://miranda.sunteu.ro/ ,i’d a great read.thank you for your article,My problem has been resolved….

  5. Hehmer Says:

    Great…

    love your blog, http://www.live-drive.ru/hitneyr/?p=7&preview=true ,Thanks again….

  6. Gander Says:

    Great One…

    I must say, its worth it! My link, http://militarysociety.com/blog.php?user=50320&blogentry_id=195719,thanks haha…

Leave a Reply

*

Anti-Spam Image


Powered by Wordpress 2YI.net Web Directory