Получаем котировки акции с помощью GET-запроса в формате JSON и подключаем их к FastReport VCL 6

07.05.2020

logo FR      logo FR

Сегодня мы рассмотрим способ получения котировок акций с помощью GET-запроса по протоколу HTTPS и публичного API tradingviewapi.docs.apiary.io

Согласно документации https://tradingviewapi.docs.apiary.io/ для получения котировок акций нужно использовать GET-запрос history

GET history

https://api.bcs.ru/udfdatafeed/v1/history?symbol=BRENT&resolution=60&from=1450772216&to=1450858616

URI PARAMETERS

Name

Example

Description

symbol

BRENT

currency pair

resolution

D

discreteness of candles, possible values: 1, 5, 15, 30, 45, 60, 120, 180, 240, D, W, M

from

1450772216

beginning of period

to

1450858616

end of period

Создадим приложение и добавим на форму компоненты:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 frxReport1: TfrxReport;
 JSON_DS: TfrxUserDataSet;
 ButtonConnectToJSON: TButton;
 Label1: TLabel;
 Label2: TLabel;
 Label3: TLabel;
 ComboBoxName: TComboBox;
 ComboBoxResolution: TComboBox;
 DateTimePickerFrom: TDateTimePicker;
 Label4: TLabel;
 DateTimePickerTo: TDateTimePicker;
 ButtonShowReport: TButton;
 Image1: TImage;
 Label5: TLabel;
 StatusBar1: TStatusBar;
 ButtonDesign: TButton;
 frxDesigner1: TfrxDesigner;
 frxChartObject1: TfrxChartObject;
 frxPDFExport1: TfrxPDFExport;

DemoJSON_form

Добавим пункты в ComboBoxName и ComboBoxResolution

1
2
ComboBoxName.Items := 'GAZP SBER BRENT MOEX ROSN YNDX RUAL';
ComboBoxResolution.Items := '1 5 15 30 45 60 120 180 240 D W M';

Добавим глобальные переменные

1
2
3
4
5
6
7
8
var
 tHTTP: TfrxTransportHTTP;
 frxJSON: TfrxJSON;
 Res: String;
 Symbol,Resolution,FromCandlesHistory,ToCandlesHistory : String;
 frxJSONArrayT,frxJSONArrayC,frxJSONArrayO,
 frxJSONArrayH,frxJSONArrayL,frxJSONArrayV: TfrxJSONArray;
 S: TStringStream;

В событии Click кнопки ButtonConnectToJSON напишем следующий код:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
procedure TFormJSON.ButtonConnectToJSONClick(Sender: TObject);
begin
 frxReport1.LoadFromFile('ChartJSON.fr3');
 JSON_DS.RangeEnd := reCount;
 Symbol := ComboBoxName.Items[ComboBoxName.ItemIndex];
 Resolution := ComboBoxResolution.Items[ComboBoxResolution.ItemIndex];
 FromCandlesHistory := DateTimeToUnix(DateTimePickerFrom.DateTime).ToString;
 ToCandlesHistory := DateTimeToUnix(DateTimePickerTo.DateTime).ToString;
 
//Создание объекта TfrxTransportHTTP для GET-запроса по протоколу HTTPS
 
 tHTTP := TfrxTransportHTTP.Create(nil);
 try
 
//Формируем строку GET-запроса и получаем ответ в формате JSON
 
 Res := tHTTP.Get('https://api.bcs.ru/udfdatafeed/v1/history?symbol='
  +Symbol+
  '&resolution='+Resolution +
  '&from='+ FromCandlesHistory+
 '&to='+ToCandlesHistory);
 
// если JSON получен некорректно, то загружаем его из файла и выводим сообщение в StatusBar
 
  if (Res = '') or (pos('"s":"ok"',Res) = 0) then
  begin
 StatusBar1.SimpleText := 'Error loading JSON';
 S := TStringStream.Create('', TEncoding.UTF8);
  try
 S.LoadFromFile('JSON/'+Symbol+'.json');
  finally
 Res:= S.DataString;
 FreeAndNil(S);
 end;
 StatusBar1.SimpleText := 'Successful JSON loading from file '+Symbol+'.json';
 end
  else
  begin
 StatusBar1.SimpleText := 'Successful JSON('+Symbol+') loading';
  end;
 
// Загружаем полученный JSON из строки Res в объект frxJSON :TfrxJSON
 
 frxJSON := TfrxJSON.Create(Res);
 try
 if frxJSON.IsValid then
 begin
 StatusBar1.SimpleText :=StatusBar1.SimpleText +' /JSON is Valid';
 
// Считываем массивы
 
 if frxJSON.IsNameExists('t') then
 frxJSONArrayT := TfrxJSONArray.Create(frxJSON.ObjectByName('t'));
 frxJSONArrayC := TfrxJSONArray.Create(frxJSON.ObjectByName('c'));
 frxJSONArrayO := TfrxJSONArray.Create(frxJSON.ObjectByName('o'));
 frxJSONArrayH := TfrxJSONArray.Create(frxJSON.ObjectByName('h'));
 frxJSONArrayL := TfrxJSONArray.Create(frxJSON.ObjectByName('l'));
 frxJSONArrayV := TfrxJSONArray.Create(frxJSON.ObjectByName('v'));
// Подготавливаем JSON_DS, очищая и добавляя поля
 JSON_DS.Fields.Clear;
 JSON_DS.Fields.Add('Ticker');
 JSON_DS.Fields.Add('Date');
 JSON_DS.Fields.Add('Time');
 JSON_DS.Fields.Add('Open');
 JSON_DS.Fields.Add('Close');
 JSON_DS.Fields.Add('High');
 JSON_DS.Fields.Add('Low');
 JSON_DS.Fields.Add('Vol');
 JSON_DS.RangeEndCount := frxJSONArrayT.Count;
 end
 else StatusBar1.SimpleText :=StatusBar1.SimpleText +' /JSON is Invalid';
 finally
 end;
 finally
 end;
end;

Для получения данных при формировании отчета из массивов frxJSONArrayT, frxJSONArrayC, frxJSONArrayO, frxJSONArrayH, frxJSONArrayL, frxJSONArrayV через компонент JSON_DS: TfrxUserDataSet , нам необходимо использовать событие OnGetValue:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
procedure TFormJSON.JSON_DSGetValue(const VarName: string; var Value: Variant);
var
 Item: string;
 Time : string;
begin
 Item := frxJSONArrayT.GetString(JSON_DS.RecNo);
 DateTimeToString(Time, 't', UnixToDateTime(StrToInt64(Item)));
 
 if VarName = 'Ticker' then
 begin
 Value := Symbol;
 exit;
 end
 else if VarName = 'Date' then
 begin
 Value := DateToStr(UnixToDateTime(StrToInt64(Item)))+' '+Time;
 exit;
 end
 else if VarName = 'Time' then
 begin
 Value := Time;
 exit;
 end
 else if VarName = 'Open' then
 Item := frxJSONArrayO.GetString(JSON_DS.RecNo)
 else if VarName = 'Close' then
 Item := frxJSONArrayC.GetString(JSON_DS.RecNo)
 else if VarName = 'High' then
 Item := frxJSONArrayH.GetString(JSON_DS.RecNo)
 else if VarName = 'Low' then
 Item := frxJSONArrayL.GetString(JSON_DS.RecNo)
 else if VarName = 'Vol' then
 Item := frxJSONArrayV.GetString(JSON_DS.RecNo);
 
 Value := Item;
end;

Далее создадим шаблон в дизайнере, назовём его ChartJSON.fr3 и подключим к нему JSON_DS

Для отображения графика используем Candle Series из пакета TeeChart Pro VCL и также подключаем к JSON_DS

Далее добавляем для остающихся кнопок обработчики событий Click:

1
2
3
4
5
6
7
8
9
10
procedure TFormJSON.ButtonDesignClick(Sender: TObject);
begin
 if (Res = '') then ButtonConnectToJSON.Click;
 frxReport1.DesignReport();
end;

procedure TFormJSON.ButtonShowReportClick(Sender: TObject); begin if (Res = '') then ButtonConnectToJSON.Click; frxReport1.ShowReport(); end;

Также добавляем обработчики событий Change для ComboBoxName, DateTimePickerFrom и DateTimePickerTo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
procedure TFormJSON.ComboBoxNameChange(Sender: TObject);
begin
 ButtonConnectToJSON.Click;
end;
 
procedure TFormJSON.DateTimePickerFromChange(Sender: TObject);
begin
 ButtonConnectToJSON.Click;
end;
 
procedure TFormJSON.DateTimePickerToChange(Sender: TObject);
begin
 ButtonConnectToJSON.Click;
end;

Также при закрытии приложения не забываем освободить память использованных объектов.

1
2
3
4
5
6
7
8
9
10
11
procedure TFormJSON.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 tHTTP.Free;
 frxJSON.Free;
 frxJSONArrayT.Free;
 frxJSONArrayC.Free;
 frxJSONArrayO.Free;
 frxJSONArrayH.Free;
 frxJSONArrayL.Free;
 frxJSONArrayV.Free;
end;

Далее запускаем приложение

В данном приложении вы можете выбрать нужные акции

А также можно выбрать нужный диапазон дат с помощью календаря

Подключение к JSON происходит при нажатии на кнопки "Connect to JSON", "Show Report" или "D", а также при смене дат или имен акций, и выводит сообщение о статусе подключения.  

При нажатии на кнопку "Show Report" строится отчет и показывается Preview отчета

Поздравляю вы получили котировки акций в формате JSON с помощью GET-запроса, подключили JSON к FastReport VCL 6 и построили отчет.

Ссылка для скачивания демо: DemoJSON.zip

20 ноября 2024

Локализация и смена языков в FastReport VCL

FastReport VCL поддерживает 40 языков для локализации интерфейса и позволяет изменять язык на лету через меню или код, без перекомпиляции.
11 декабря 2023

Новый транспорт S3 (Amazon) в FastReport VCL

В этой статье мы рассмотрим новый транспорт в S3 (Amazon) для FastReport VCL, являющийся объектным хранилищем файлов и бакетов.
26 сентября 2023

Новый транспорт NextCloud в FastReport VCL

Подробная инструкция по использованию нового транспорта для подключения к NextCloud чтобы сохранять построенные отчёты в облако.