@@ -1678,6 +1678,10 @@ cdef class BacktestDataIterator:
1678
1678
self._is_single_data = False
1679
1679
1680
1680
cpdef void add_data(self, str data_name, list data_list, bint append_data=True):
1681
+ # closures inside cpdef functions not yet supported
1682
+ self._add_data(data_name, data_list, append_data)
1683
+
1684
+ cdef void _add_data(self, str data_name, list data_list, bint append_data=True):
1681
1685
if len(data_list) == 0:
1682
1686
return
1683
1687
@@ -1687,24 +1691,25 @@ cdef class BacktestDataIterator:
1687
1691
data_priority = self._data_priority[data_name]
1688
1692
self.remove_data(data_name)
1689
1693
else:
1690
- # heapq is a min priority data so lower number means higher priority
1694
+ # heapq is a min priority queue so lower number means higher priority
1691
1695
data_priority = (1 if append_data else -1) * self._next_data_priority
1692
1696
self._next_data_priority += 1
1693
1697
1694
1698
if self._is_single_data:
1695
1699
self._deactivate_single_data()
1696
1700
1697
- self._data[data_priority] = data_list
1701
+ self._data[data_priority] = sorted( data_list, key=lambda data: data.ts_init)
1698
1702
self._data_name[data_priority] = data_name
1699
1703
self._data_priority[data_name] = data_priority
1700
1704
self._data_len[data_priority] = len(data_list)
1701
1705
self._data_index[data_priority] = 0
1702
- self._push_data(data_priority, 0)
1703
1706
1704
1707
if len(self._data) == 1:
1705
1708
self._activate_single_data()
1706
1709
return
1707
1710
1711
+ self._push_data(data_priority, 0)
1712
+
1708
1713
cpdef void remove_data(self, str data_name):
1709
1714
if data_name not in self._data_priority:
1710
1715
return
@@ -1767,11 +1772,17 @@ cdef class BacktestDataIterator:
1767
1772
1768
1773
return object_to_return
1769
1774
1770
- cursor = self._single_data_index
1775
+ if self._single_data_index >= self._single_data_len:
1776
+ return None
1777
+
1778
+ object_to_return = self._single_data[self._single_data_index]
1771
1779
self._single_data_index += 1
1772
1780
1773
- if cursor < self._single_data_len:
1774
- return self._single_data[cursor]
1781
+ if self._single_data_index >= self._single_data_len:
1782
+ if self._empty_data_callback is not None:
1783
+ self._empty_data_callback(self._single_data_name, self._single_data[-1].ts_init)
1784
+
1785
+ return object_to_return
1775
1786
1776
1787
cpdef void _push_data(self, int data_priority, int data_index):
1777
1788
cdef uint64_t ts_init
@@ -1812,11 +1823,14 @@ cdef class BacktestDataIterator:
1812
1823
self._reset_heap()
1813
1824
1814
1825
cpdef bint is_done(self):
1815
- return (self._is_single_data and self._single_data_index >= self._single_data_len) or not self._heap
1826
+ if self._is_single_data:
1827
+ return self._single_data_index >= self._single_data_len
1828
+ else:
1829
+ return not self._heap
1816
1830
1817
1831
cpdef dict all_data(self):
1818
1832
# we assume dicts are ordered by order of insertion
1819
- return {data_name:data for data_name, data in zip( self._data_name.values(), self._data.values() )}
1833
+ return {data_name:self._data[data_priority] for data_priority, data_name in self._data_name.items( )}
1820
1834
1821
1835
cpdef list data(self, str data_name):
1822
1836
return self._data[self._data_priority[data_name]]
0 commit comments