Возможно, у вас есть торговая стратегия, которая
предусматривает работу с несколькими инструментами одновременно. Вы хотите
протестировать ее на очень большом периоде времени, но имеющаяся у вас история
по каждому инструменту начинается с разных дат, к тому же, ваша сисема допускает
так же неликвидные инструменты, у которых могут быть пропущены в истории
отельные свечи. Ясно дело, в этом случае вам потребуется синхронизация
этих инструментов. Для этого мы добавим в класса TESBInstrument новые свойства и
методы, в частности свойство Active и метод
PositionToDate(ADateTime:TDateTime), кроме того, для чтения значения поля
FCurrentCandle добавим свойство CurrentCandle. Вот как теперь будет выглядеть
объявления класса (новые поля выделены красным)...
...
...Свойство Active показывает, активен
ли в данный момент инструмент, можно ли им торговать. А торговать им можно (в
том понимании, в каком мы понимаем тестирование стратегии) тогда, когда в
истории на текущую дату есть котировки. Но за этим у нас будет следить класс
TESBAccount.
И так, прежде чем реализовать метод PositionToDate, давайте
сначала внесем небольшие изменения в методы CurrentPrice, Buy и .Sell...
...
... Теперь приступим к тестированию. Для этого открываем
предыдущий пример (если у вас его нет то
пример биржевого робота из урока 17 можно скачать здесь) и добавляем к нему
кнопочку "В начало", обозвав ее btnFirst. Так же у сетки сделаем чуть больше
колонок - 8. И еще добавим метку lbCurDate:
procedure TfrmStockBot.RedrawGrid; var i,cn,curCandle:integer; begin cn:=Account.InstrumetnsCount; sgInstrs.RowCount:=cn+1; for i:=1 to cn
do begin sgInstrs.Cells[0,i]:=IntToStr(i); sgInstrs.Cells[1,i]:=Account.Instruments[i-1].Name; sgInstrs.Cells[2,i]:=FloatToStr(Account.Instruments[i-1].CurrentPrice); sgInstrs.Cells[3,i]:=IntToStr(Account.Instruments[i-1].Count); sgInstrs.Cells[4,i]:=FloatToStr(Account.Instruments[i-1].Count*Account.Instruments[i-1].CurrentPrice); curCandle:=Account.Instruments[i-1].CurrentCandle; sgInstrs.Cells[5,i]:=DateTimeToStr(Account.Instruments[i-1].PriceSource.GetBarDataByIndex(curCandle).DateTime); sgInstrs.Cells[6,i]:=IntToStr(curCandle); if Account.Instruments[i-1].Active
then sgInstrs.Cells[7,i]:='Да' else sgInstrs.Cells[7,i]:='Нет'; end; lbCash.Caption:='Деньги '+FloatToStr(Account.Cash); lbcurDate.Caption:=DatetimeToStr(Account.CurrentDateTime); end;
Ну, и наконец, обработчик нажатия кнопочки "В начало":
procedure
TfrmStockBot.btnFirstClick(Sender: TObject); begin
Account.First;
RedrawGrid; end;
Теперь можно запустить симулятор на тестирование:
Свои
замечания и пожелания по рассылке можете оставлять
здесь
или по e-mail:
richway@rambler.ru. Если вы не хотите, чтобы я публиковал ваши
письма и ответы на них в рассылке, пожалуйста, пишите об этом в письме.