Программирование - это просто
Advertisement
Главная arrow Биржевые роботы arrow Программирование в среде TEClient Alor arrow Программирование в среде TEClient Alor trade. Урок 1. Вывод "стакана" (Delphi, TSlot, TSlotTable, Ty
24.04.2024 г.
Главное меню
Главная
Интернет магазин
Программные продукты
Биржевые роботы
Искусственный интеллект
Математика и информатика
1С:Предприятие
Уроки C#
Уроки Delphi
Уроки программирования
Web-программирование
Дизайн и графика
Компьютер для блондинок
Исходники
Статьи
Платный раздел
Рассказы про компьютеры
Хитрости и секреты
Системный подход
Размышления
Наука для чайников
Друзья сайта
Excel-это не сложно
Все о финансах
.
Программирование в среде TEClient Alor trade. Урок 1. Вывод "стакана" (Delphi, TSlot, TSlotTable, Ty Печать E-mail
Автор megabax   
23.06.2010 г.
Урок 13. Управление шрифтами в CSS New Page 1

Программирование в среде TEClient Alor trade. Урок 1. Вывод "стакана" (Delphi, TSlot, TSlotTable, Type Library).

Все статьи по данной теме.

Исходники к уроку можно скачать здесь.

Для начала я расскажу, как создать палитру компонентов TEClient. В инструкции по установке TEClietn мы читаем:

"Для работы с библиотекой в среде разработки Delphi (5, 6, 7…) следует выбрать Project ® Import Type Library главного меню, а затем из списка доступных библиотек типов выбрать TEClient 1.0 Type Library, убрать отметку из опции Generate Component Wrapper и нажать кнопку Create Unit. Это приведет к созданию файла TEClientLib_TLB.PAS, содержащего интерфейс библиотеки TEClient. После чего необходимо добавить ссылку на этот файл в предложении Uses главного модуля проекта."

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

Шаг 1. Создадим палитру компонентов для TEClient. Для этого идем в меню Component -> Configure Palette*:

Программирование в среде TEClient Alor trade. Урок 1. Вывод "стакана" (Delphi, TSlot, TSlotTable, Type Library).

В открывшемся окне жмем кнопочку Add*:

Программирование в среде TEClient Alor trade. Урок 1. Вывод "стакана" (Delphi, TSlot, TSlotTable, Type Library).

Вводим имя палитры компонентов (например TEClientAlor) и она у нас появляется в списке*:

Программирование в среде TEClient Alor trade. Урок 1. Вывод "стакана" (Delphi, TSlot, TSlotTable, Type Library).

Шаг 2. Делаем все по инструкции, только не снимает галочку "Generate component wrapper"*:

Программирование в среде TEClient Alor trade. Урок 1. Вывод "стакана" (Delphi, TSlot, TSlotTable, Type Library).

После этого у вас должна появится закладка с компонентами TEClient*:

Программирование в среде TEClient Alor trade. Урок 1. Вывод "стакана" (Delphi, TSlot, TSlotTable, Type Library).

Если не появилось, то сделайте еще раз Import Type Library и нажмите кнопочку Install.

Если появились компоненты, то можно начинать писать робота.

Для начала мы напишем пример, как вывести "стакан".

И так, кладем на форму следующие компоненты:

Компонент Имя (свойство Name) Закладка Примечание
TSlot Slot TEClientAlor  
TButton btnConnect Standard Свойство Caption "Коннект"
TLabel lbConnectionResult Standard  
TLabel   Standard Свойство Caption "Логин"
TEdit edLogin Standard Очистить свойство Caption
TSlotTable SlotTable TEClientAlor  
TButton btnStrat Standard Свойство Caption "Старт"
TTimer Timer System Свойство "Interval" 1000
TLabel   Standard Свойство Caption "Пароль"
TEdit edPassword Standard Очистить свойство Caption, свойство PasswordChar сделать "*".
TStringGrid sgPrices Additional Свойство ColCount поставить 6

Вот что должно получиться в итоге*:

Программирование в среде TEClient Alor trade. Урок 1. Вывод "стакана" (Delphi, TSlot, TSlotTable, Type Library).

Теперь начнем программировать. Для начала в секцию private объявления формы (путь она будет у нас называться TfrmArbStockBot), вставим поля и методы:

private
{ Private declarations }
   FIsConnection:boolean;
   FIsTableOpened:boolean;
   FOrderBook:array of TOrdersBookStruct;
   FPricesCount:integer;
   procedure RedrawGrid;

Выше объявления TfrmArbStockBot объявим структуру TOrdersBookStruct:

TOrdersBookStruct=record
    ID:integer;
    SecBoard,SecCode,BuySell:string;
    Price,Quantity:double;
end;

Далее реализуем процедуру RedrawGrid:

procedure TfrmArbStockBot.RedrawGrid;
var i,j:integer;
begin
    sgPrices.RowCount:=FPricesCount+1;
    if FPricesCount>0 then sgPrices.FixedRows:=1;
    j:=1;
   sgPrices.Cols[0].Text:='ID';
   sgPrices.Cols[1].Text:='Рынок';
   sgPrices.Cols[2].Text:='Инструмент';
   sgPrices.Cols[3].Text:='Тип';
   sgPrices.Cols[4].Text:='Цена';
   sgPrices.Cols[5].Text:='Кол-во';
   for i:=1 to FPricesCount do
   begin
       if FOrderBook[i-1].ID=-1 then continue;
       if FOrderBook[i-1].BuySell='' then continue;
       sgPrices.Cells[0,j]:=IntToStr(FOrderBook[i-1].ID);
       sgPrices.Cells[1,j]:=FOrderBook[i-1].SecBoard;
       sgPrices.Cells[2,j]:=FOrderBook[i-1].SecCode;
       sgPrices.Cells[3,j]:=FOrderBook[i-1].BuySell;
       sgPrices.Cells[4,j]:=FloatToStr(FOrderBook[i-1].Price);
       sgPrices.Cells[5,j]:=FloatToStr(FOrderBook[i-1].Quantity);
       j:=j+1;
   end;
end;

Эта процедура у нас выводит в таблицу (компонент TStringGrid) содержимое стакана, загруженное ранее в массив FOrderBook.

Теперь напишем обработчик кнопки btnConnect:

procedure TfrmArbStockBot.btnConnectClick(Sender: TObject);
var s:WideString;
begin
    slot.Connect1('fut1.alor.ru',edLogin.Text,edPassword.Text,s);
    lbConnectionResult.Caption:=s;
end;

В этом обработчике мы вызываем метод Connect1  у компонента TSlot. В качестве параметров передаем адрес сервера, логин и пароль. Вместо 'fut1.alor.ru' может быть указан другой, например 'trade.alor.ru' или '213.181.12.52'.

Перейдем к компоненту TSlotTable. Напишем у него обработчик события OnOpened:

procedure TfrmArbStockBot.SlotTableOpened(ASender: TObject; OpenID: Integer);
begin
   FIsTableOpened:=true;
   messageDlg('Таблица открылась',mtInformation,[mbOk],0);
end;

Что бы мы знали, если по какой то причине открыть таблицу не удалось, напишем так же обработчик OnError:

procedure TfrmArbStockBot.SlotTableError(ASender: TObject; OpenID,Code: Integer; const Description: WideString);
begin
     messageDlg(Description,mtError,[mbOk],0);
end;

Теперь займемся реализацией событий "от стакана", а именно добавление, удаление и обновление строк в таблице.  Как вообще работает "стакан"? Периодически из него удаляются все строки, в этот момент компонент TSlotTable, который связан со стаканом, генерит событие OnClear. Затем "стакан" наполняется. При добавлении каждой строчки происходит событие OnAddRow. Аналогично, если строка удаляется или обновляется, то вызывается генерится событие OnDeleteRow и OnUpdateRow соответственно.

 Давайте все эти события реализуем:

procedure TfrmArbStockBot.SlotTableClear(ASender: TObject; OpenID: Integer);
begin
    FPricesCount:=0;
end;
 

procedure TfrmArbStockBot.SlotTableDeleteRow(ASender: TObject; OpenID, RowID: Integer);
var i:integer; isFind:boolean;
begin
   isFind:=false;
   for i:=Low(FOrderBook) to FPricesCount do
   if FOrderBook[i].ID=RowID then
   begin
      isFind:=true;
      break;
      FOrderBook[i].ID:=-1;
   end;
end;
 

procedure TfrmArbStockBot.SlotTableAddRow(ASender: TObject; OpenID, RowID: Integer; Fields: OleVariant);
var i:integer; isFind:boolean;
begin
   if FIsTableOpened then
   begin
      isFind:=false;
      for i:=Low(FOrderBook) to FPricesCount do
      if FOrderBook[i].ID=Fields[0] then
      begin
         isFind:=true;
         break;
      end;
     if not(isFind) then
     begin
        FPricesCount:=FPricesCount+1;
        i:=FPricesCount;
     end;
     if i>High(FOrderBook) then SetLength(FOrderBook,i+100);
        FOrderBook[i].ID:=Fields[0];
        FOrderBook[i].SecBoard:=Fields[1];
        FOrderBook[i].SecCode:=Fields[2];
        FOrderBook[i].BuySell:=Fields[3];
        FOrderBook[i].Price:=Fields[4];
        FOrderBook[i].Quantity:=Fields[5];
     end;
end;

procedure TfrmArbStockBot.SlotTableUpdateRow(ASender: TObject; OpenID, RowID: Integer; Fields: OleVariant);
var  i:integer;
begin
    for i:=Low(FOrderBook) to FPricesCount do
    if FOrderBook[i].ID=RowID then
    begin
        FOrderBook[i].SecBoard:=Fields[1];
        FOrderBook[i].SecCode:=Fields[2];
        FOrderBook[i].BuySell:=Fields[3];
        FOrderBook[i].Price:=Fields[4];
        FOrderBook[i].Quantity:=Fields[5];
        break;
    end;
end;

Очистка "стакана" происходи путем обнуления счетчика строк. Сам буфер при этом мы не очищаем - нет необходимости. При удалении строки мы ее не удаляем а просто метим на удаление, присваивая полб ID значение -1. Если надо добавить строку - ищем ее по ID, если не находим - добавляем в конец путем увеличения счетчика строк на единицу и записывая в буфер в ячейку, равную счетчику строк. Если размер буфера недостаточный - увеличиваем его.  При обновлении строки ищем ее по ID и обновляем.

Буфер у нас реализован на динамических массивах, подробнее о них здесь.

Что бы все это работало, нам необходимо открыть таблицу "стакана". Для этого реализуем обработчик  события OnClick кнопочки "Старт":

procedure TfrmArbStockBot.btnStratClick(Sender: TObject);
begin
     SlotTable.FieldNames:='ID,SecBoard,SecCode,BuySell,Price,Quantity';
     SlotTable.OpenOrderbook(0,'GAZR','GAZR-9.10                  ');
     SetLength(FOrderBook,100);
     FPricesCount:=0;
end;

Здесь мы задаем имена полей и вызываем метод OpenOrderbook - открыть "стакан". Обратите внимание, в последнем параметре после строки GAZR-9.10 идет 16 пробелов. Дело в том, что передавать нужно точное имя бумаги. Точные имена можно получить из таблицы Securities, но до нее мы еще дойдем в будущих уроках.

Так же мы инициализируем буфер и счетчик строк:

    SetLength(FOrderBook,100);
    FPricesCount:=0;

И, наконец, нам осталось реализовать обновление таблицы стакана на экране. Если обновлять каждый раз, когда происходит событие OnAddRow, OnDeleteRow или OnUpadateRow то таблица будет мерцать и дергаться. Очень мозолит глаза. Поэтому будем обновлять экран ежесекундно, для этого напишем обработчик события OnTime компонента TTimer:

procedure TfrmArbStockBot.TimerTimer(Sender: TObject);
begin
   if FIsTableOpened then RedrawGrid;
end;

Все, пример готов, можно его тестировать:

Программирование в среде TEClient Alor trade. Урок 1. Вывод "стакана" (Delphi, TSlot, TSlotTable, Type Library).

 


 Скриншоты, помеченные знаком* , являются цитатами и иллюстрациями   программного продукта "Borland Delphi", авторское право на который принадлежит Borland.

 

Исходники к уроку можно скачать здесь.

Последнее обновление ( 23.02.2013 г. )
 
« След.
 
© 2024 Программирование - это просто
Joomla! - свободное программное обеспечение, распространяемое по лицензии GNU/GPL.
Русская локализация © 2005-2008 Joom.Ru - Русский Дом Joomla!
Design by Mamboteam.com | Powered by Mambobanner.de
Я принимаю Яндекс.Деньги