Реклама

среда, 10 ноября 2010 г.

Пишем робота Урок №10

Тестируем класс статистического анализа индикатора (momentum, МТС, Gauge).

Вот мы наконец то и добрались до тестирования. И так, берем пример из прошлых уроков (Урок 4, Урок 5) и переделываем его. В частности, положим на форму компонент TGauge (Если забыли где он находиться, загляните в урок 8), так же добавим к форме компонент TListBox, он у нас расположен на закладке Standart*:
Вот как у нас будет выглядеть после этого форма*:
Теперь переделаем обработчики события:
procedure TfrmMomentum.FormCreate(Sender: TObject);
begin
    FPriceSource:=nil;
    FIndicator:=nil;
    FDataStore:=nil;
    FStatAnalizMomentum:=nil;
end;

procedure TfrmMomentum.btnCalkClick(Sender: TObject);
begin
   if FIndicator<>nil then FreeAndNil(FIndicator);
   if FDataStore<>nil then FreeAndNil(FDataStore);
   if FStatAnalizMomentum<>nil then FreeAndNil(FStatAnalizMomentum);
   FIndicator:=TPASSMomentum.Create(seDT.Value,'Close');
   FIndicator.PriceSource:=FPriceSource;
   FDataStore:=TPASSStatStoreDataList.Create(lbResults.Items);
   FStatAnalizMomentum:=TPASSStatAnalizMomentum.Create(FIndicator,10,FDataStore);
   Gauge.MinValue:=0;
   Gauge.Progress:=0;
   Gauge.MaxValue:=FPriceSource.CountLoadedBars;
   FStatAnalizMomentum.Gauge:=Gauge;
   lbResults.Visible:=false;
   FStatAnalizMomentum.Test;
   lbResults.Visible:=true;
end;
 procedure TfrmMomentum.FormDestroy(Sender: TObject);
begin
   if FDataStore<>nil then FreeAndNil(FDataStore);
   if FIndicator<>nil then FreeAndNil(FIndicator);
   if FPriceSource<>nil then FreeAndNil(FPriceSource);
   if FStatAnalizMomentum<>nil then FreeAndNil(FStatAnalizMomentum);
end;
еще нам нужно добавить в объявление класса формы поля FDataStore и FStatAnalizMomentum (добавленные поля выделены красным):
TfrmMomentum = class(TForm)
   odOpenDialog: TOpenDialog;
   mmMenu: TMainMenu;
   itFile: TMenuItem;
   itLoad: TMenuItem;
   lbResult: TLabel;
   btnCalk: TButton;
   seDT: TSpinEdit;
   lbDateTime: TLabel;
   seCandle: TSpinEdit;
   sdTextFile: TSaveDialog;
   lbResults: TListBox;
   Gauge: TGauge;
   procedure itLoadClick(Sender: TObject);
   procedure FormCreate(Sender: TObject);
   procedure btnCalkClick(Sender: TObject);
   procedure seCandleChange(Sender: TObject);
   procedure FormDestroy(Sender: TObject);
private
   { Private declarations }
   FPriceSource:TPASSPriceSource;
   FIndicator:TPASSMomentum;
   FDataStore:TPASSStatStoreDataList;
   FStatAnalizMomentum:TPASSStatAnalizMomentum;

public
   { Public declarations }
end;
Все, теперь мы можем запустить программу и посмотреть, что она выдаст:
Тестируем класс статистического анализа индикатора (momentum, МТС, Gauge).
Теперь давайте проверим, правильно ли считает наша программа.  Для сперва сделаем таблицу расчета на каждую свечу, для ее формирования воспользуемся программой урока 6. Затем конвертируем в Excel тестовый файл котировок, который мы использовали для тестирования и вставим туда рассчитанное значение индикатора. После чего вручную выполним расчет сигналов и результатов**:
Желтая строчка - это сигнал. В качестве сигнальной цены берем следующую цену открытия (ниже желтой строки). Синяя строка - это противоположный сигнал. Так же считаем относительно той цены открытия, которая ниже этой выделенной строчки. Красным цветом у нас выделена строка, отсчитанная от сигнальной на 10, заданное количество свечей:
 FStatAnalizMomentum:=TPASSStatAnalizMomentum.Create(FIndicator,10,FDataStore);
 Именно до этой строки нужно найти максимум и минимум, я их обозначил зеленым и темно-красным цветом. Теперь, посмотрим расчетные формулы**:
И сравним результаты с тем, что выдала программа:
Как видим, результаты сходятся. Конечно, для верности надо бы проверить еще несколько сигналов, при чем разных, но это вы уже сделаете самостоятельно, я показал как. Сам я проверил пять сигналов, результаты сошлись.
На следующем уроке мы будем тестировать наши классы на утечку памяти. Для чего это надо? А представьте себе, что биржевой робот постоянно работает на сервере и жрет память не переставая? К чему это приведет? Правильно, рано или поздно глюканет так, что мало не покажется...

Скриншоты, помеченные знаком * , являются цитатами и иллюстрациями  в соответствии со ст. 1274 ГК РФ программного продукта "Delphi", авторское право на который принадлежит "Borland Software Corporation".
Скриншоты, помеченные знаком ** , являются цитатами и иллюстрациями  в соответствии со ст. 1274 ГК РФ программного продукта "Microsoft Excel", авторское право на который принадлежит "Корпорации Microsoft" 

Источник: http://easyprog.ru/index.php?option=com_content&task=view&id=159&Itemid=44