WU Trading Library 0.2.0
A backtesting and trading strategy library
Loading...
Searching...
No Matches
csv.c
Go to the documentation of this file.
1#include <stdlib.h>
2#include <stdio.h>
3#include <string.h>
4#include "wu.h"
5
6static void trim_line(char* line) {
7 size_t len = strlen(line);
8 while (len > 0 && (line[len - 1] == '\r' || line[len - 1] == '\n')) {
9 line[--len] = '\0';
10 }
11}
12
13static bool read_line(WU_CsvReader reader) {
14 if (!reader->file) {
15 reader->last_error = WU_CSV_ERROR_PARSE;
16 return false;
17 }
18
19 if (!fgets(reader->line_buffer, WU_CSV_MAX_LINE_SIZE, reader->file)) {
20 reader->last_error = WU_CSV_ERROR_EOF;
21 return false;
22 }
23
24 trim_line(reader->line_buffer);
25 return true;
26}
27
28static void* read_candle(WU_CsvReader reader) {
29 if (!read_line(reader)) {
30 return NULL;
31 }
32
33 if (sscanf(reader->line_buffer, "%ld,%lf,%lf,%lf,%lf,%lf",
34 &(reader->data.candle.timestamp.mark),
35 &(reader->data.candle.open),
36 &(reader->data.candle.high),
37 &(reader->data.candle.low),
38 &(reader->data.candle.close),
39 &(reader->data.candle.volume)) != 6) {
40 reader->last_error = WU_CSV_ERROR_PARSE;
41 return NULL;
42 }
43
44 reader->data.candle.data_type = WU_DATA_TYPE_CANDLE;
45 reader->last_error = WU_CSV_OK;
46 return &reader->data.candle;
47}
48
49static void* read_trade(WU_CsvReader reader) {
50 if (!read_line(reader)) {
51 return NULL;
52 }
53
54 int side_value;
55 if (sscanf(reader->line_buffer, "%ld,%lf,%lf,%d",
56 &(reader->data.trade.timestamp.mark),
57 &(reader->data.trade.price),
58 &(reader->data.trade.volume),
59 &side_value) != 4) {
60 reader->last_error = WU_CSV_ERROR_PARSE;
61 return NULL;
62 }
63
64 reader->data.trade.side = (WU_Side)side_value;
65 reader->data.trade.data_type = WU_DATA_TYPE_TRADE;
66 reader->last_error = WU_CSV_OK;
67 return &reader->data.trade;
68}
69
70static void* read_single_value(WU_CsvReader reader) {
71 if (!read_line(reader)) {
72 return NULL;
73 }
74
75 if (sscanf(reader->line_buffer, "%ld,%lf",
76 &(reader->data.single_value.timestamp.mark),
77 &(reader->data.single_value.value)) != 2) {
78 reader->last_error = WU_CSV_ERROR_PARSE;
79 return NULL;
80 }
81
82 reader->data.single_value.data_type = WU_DATA_TYPE_SINGLE_VALUE;
83 reader->last_error = WU_CSV_OK;
84 return &reader->data.single_value;
85}
86
87static void wu_csv_reader_free(WU_CsvReader reader) {
88 if (!reader) return;
89 free(reader);
90}
91
92WU_CsvReader wu_csv_reader_new(FILE* file, WU_DataType data_type,
93 WU_TimeUnit time_units, bool has_headers) {
94 if (!file) return NULL;
95 WU_CsvReader reader = (WU_CsvReader)malloc(sizeof(struct WU_CsvReader_));
96 if (!reader) return NULL;
97 reader->file = file;
98 reader->has_headers = has_headers;
99 reader->data_type = data_type;
100 reader->last_error = WU_CSV_OK;
101
102 switch (data_type) {
104 reader->data.candle.timestamp.units = time_units;
105 reader->base.next = (void* (*)(struct WU_Reader_*))read_candle;
106 break;
108 reader->data.trade.timestamp.units = time_units;
109 reader->base.next = (void* (*)(struct WU_Reader_*))read_trade;
110 break;
112 reader->data.single_value.timestamp.units = time_units;
113 reader->base.next = (void* (*)(struct WU_Reader_*))read_single_value;
114 break;
115 default:
116 free(reader);
117 return NULL;
118 }
119 reader->base.delete = (void (*)(struct WU_Reader_*))wu_csv_reader_free;
120 if (has_headers) {
121 if (!fgets(reader->line_buffer, WU_CSV_MAX_LINE_SIZE, reader->file)) {
122 free(reader);
123 return NULL;
124 }
125 }
126
127 return reader;
128}
129
130
WU_CsvReader wu_csv_reader_new(FILE *file, WU_DataType data_type, WU_TimeUnit time_units, bool has_headers)
Definition csv.c:92
static void * read_candle(WU_CsvReader reader)
Definition csv.c:28
static void * read_single_value(WU_CsvReader reader)
Definition csv.c:70
static bool read_line(WU_CsvReader reader)
Definition csv.c:13
static void trim_line(char *line)
Definition csv.c:6
static void * read_trade(WU_CsvReader reader)
Definition csv.c:49
static void wu_csv_reader_free(WU_CsvReader reader)
Definition csv.c:87
@ WU_CSV_OK
Definition readers.h:34
@ WU_CSV_ERROR_EOF
Definition readers.h:35
@ WU_CSV_ERROR_PARSE
Definition readers.h:36
#define WU_CSV_MAX_LINE_SIZE
Definition readers.h:30
WU_CsvReader is a concrete implementation of the WU_Reader interface that reads data from a CSV file.
Definition readers.h:50
Base for a reader, which defines the minimal interface for reading the next data point from a data so...
Definition readers.h:16
WU_TimeUnit
WU_TimeUnit represents a unit of time used for time-based calculations such as time-weighted returns ...
Definition timeutils.h:10
WU_Side
WU_Side represents the direction of a signal or a trade.
Definition types.h:11
WU_DataType
WU_DataType represents the type of input data, which can be a candle, a trade, or a single value.
Definition types.h:24
@ WU_DATA_TYPE_TRADE
Definition types.h:26
@ WU_DATA_TYPE_SINGLE_VALUE
Definition types.h:27
@ WU_DATA_TYPE_CANDLE
Definition types.h:25