Урок 17. Биржевой симулятор на Delphi: доработка класса TESBAccount (акции, покупка, продажа). |
![]() |
![]() |
Автор megabax | ||||||||||||||||||||||||||||||||||||||||
25.03.2010 г. | ||||||||||||||||||||||||||||||||||||||||
Биржевой симулятор: доработка класса TESBAccount (акции, покупка, продажа).Исходники к уроку можно скачать здесь. Это последний урок из серии "Создаем биржевого робота на Delphi", публикуемый в бесплатном разделе. Начиная со следующего, публикация уроков будет продолжена в платном разделе. В бесплатном же разделе будут публиковать некоторые статьи, посвященные идеям технического анализа и их автоматизации. Анонсы платного раздела уроков по биржевому роботу находятся здесь. Мы уже разработали заготовку класса для симуляции биржевого счета и симуляции покупки (продажи) акций. Теперь пришло время соединить их. Сначала вспомним материалы предыдущих уроков (урок 14, урок 15, урок 16), либо скачаем пример, созданный на прошлом уроке. Теперь приступим к программированию. На этом уроке мы внесем изменения в класс TESBAccount. Вот как его новое объявление:
Как видите, у нас добавляется новое свойство Instruments, в связи с чем в секцию private так же добавляем поле FInstruments и функцию Get для чтения значения свойства. Оно у нас read only, поэтому реализовывать метод записи не нужно. Свойство Instruments у нас является списком, поэтому на необходим метод добавления AddInstrument и удаления DeleteInstrument. Для определения количества доступных ценных бумаг добавляем к классу свойство InstrumetnsCount, так же read only и функцию для чтения этого свойства GetCount. Еще у класса появляться новые методы Buy и Sell для симуляции покупки и продажу ценных бумаг соответственно. В качестве параметров этих методов номер ценной бумаги в списке и количество. Ну и наконец, для более грамотной симулции, приближенной к реальным условием, вводим такое понятие как технические расходы (свойство TechCosts, его поле в секции private FTechCosts). Теперь займемся реализацией. пойдем по порядку. Функции Get и GetCount реализуются довольно элементарно, мы просто обращаемся к соответствующим свойствам FInstruments:
Нам нужно обязательно внести изменение в конструктор Crate, так как у нас появилось новое приватное поле FInstruments, требующее создание объекта:
Методы Serialize и Unserialize пока не будем реализовывать, оставим их без изменения, для начала мы состряпаем симулятор "на коленке", а потом будем его улучшать, добавлять функционал и делать в программе разные "красивости". Перейдем к следующим методам: AddInstrument и DeleteInstrument, они тоже программируются довольно просто:
Для симуляции покупки мы реализуем метод Buy:
Как видим, и тут ничего сложного: запрашиваем лимит денежных средств (может быть нуль, а может и отрицательное число - если есть кредитное плечо. Так же может быть положительным, если денежные средства на счете заблокированы, но это к сведению). Затем мы вычисляем, сколько стоят купленные ацкии и эту сумму вычитаем из наличных средств, предварительно проверив, хватает ли у нас денег для совершения сделки. Ну, и для увеличения числа акций вызываем метод Buy соответствующего объекта класса TESBInstrument, который мы реализовывали на уроке 16. Теперь перейдем к методу Sell:
Тут еще проще - вычисляем стоимость проданных акций, прибавляем их к нашим наличным и вызываем для соответствующего объекта метод sell. На возможность шортить, как вы помните из урока 16, проверит уже сам этот метод. У нас остался деструктор и метод GetCashLimit. Во втором ставим пока просто заглушки, пока не будем заморачится с плечами и деривативами:
Вот добрались и до деструктора:
Несколько комментариев к коду: сначала мы очистим каждый элемент списка FInstruments, включая связанный с ним объект класса TPASSPriceSource, так как мы предполагаем, что каждый раз будем создавать экземпляр данного класса, когда будем добавлять инструмент в список. Затем мы уничтожаем сам объект списка и вызываем родительский деструктор. Все, теперь пишем тестовый пример. Начнем с того, что немножко преобразуем форму, удалим с нее лишние компоненты и добавим новые. Она должна приобрести такой вид*: Сетку (TStringGrid) в левой части формы мы назовем sgInstrs, этот компонент находиться у нас на закладке Additional*: Теперь о кнопках. Кнопки (TButton) у нас на закладке Standard, кстати, там же и метка (TLabel)*: Ниже приведена соответствия текса на кнопке (Caption) и их идентификаторов (свойство Name):
поле ввода edCount должно нас остаться с предыдущего примера. Диалоги выбора файлов - тоже. А метку lbPrice мы переименуем в lbCash. Теперь займемся программированием. Для начала нужно поставить на все пункты меню заглушки, закомментив предыдущий текст*: изменим немного определение класса формы:
Реализуем метод CreateGrid:
В ней мы настраиваем вид таблицы - заголовки и ширину столбцов. Для того, что бы обновлять таблицу при изменении данных реализуем метод RedrawGrid:
Данный метод устанавливает у компонента TStringGrid столько строк, сколько у нас в таблице и выводит в эти строки сведения о количестве и ценах акций. Так же он обновляет информации о наличных деньгах. Теперь перейдем к кнопочкам. Обработчик события OnClick кнопки btnAdd - "Добавить акцию в список":
Данный обработчик вызывает диалог выбора файла для открытия, если в этом диалоге пользователь нажал ОК, то загружаем из выбранного файла котировки (котировки должны храниться в файле в текстовой формате, их можно скачать с Интернета, например, с финама). Загруженные котировки хранятся в объекте класса TPASSPRiceSource, ссылка на который добавляется в объект класса TESBInstrument, который у нас, в свою очередь, добавляется в Account. После этого перерисовывем таблицу методом RedrawGrid. Что бы работал данный обработчик, нам понадобиться еще создать класс TfrmInstrumEdit - это диалоговая форма. Для того, что бы создать ее, войдем в меню "File" -> "New" -> "Form"*: созданную форму сохраним в файле под именем InstrumEdit, значение поле Name у формы так же установим в InstrumEdit* Теперь придадим полученной форме вот такой вид*: Элементам диалога установим следующие имена (свойство Name)
Так же к основному модулю подключим модуль созданной нами формы*:
Все, с добавлением акций закончили, переходим к следующим кнопкам. Кнопка "Купить". Вот ее обработчик OnClick
Как видим, данный обработчик просто вызывает уже написанный нами метод Buy класса TESBAccount и процедуру обновления таблицы. Кнопка "Продать". Аналогично:
Кнопка "След. свеча". Так же вызываем уже написанный метод:
Все, теперь нам осталось запустить программу и протестировать ее. Тестируем по следующей схеме: 1. Добавляем акцию в список, лучше несколько и с разными вариантами галочки "Можно ли вставать в шорт". 2. Тестируем кнопки "Купить", "Продать" и "След свеча": Если при покупке (продаже) у вас соответственно меняется количество акций и денежных средств, при чем с учетом технических расходов, а при нажатии на кнопку "След. свеча" в таблицу встает цена следующего интервала, то класс TESBAccount работает правильно. Исходники к уроку можно скачать здесь. Скриншоты, помеченные знаком * , являются цитатами и иллюстрациями программного продукта "Delphi", авторское право на который принадлежит "Borland Software Corporation, (a Micro Focus Company).
|
||||||||||||||||||||||||||||||||||||||||
Последнее обновление ( 17.07.2013 г. ) |
« След. | Пред. » |
---|