23
23
from CerebroEnhanced import *
24
24
25
25
import sys , os
26
+
27
+ from dataManager import DataManager
26
28
sys .path .append (os .path .dirname (os .path .realpath (__file__ )) + '/observers' )
27
29
sys .path .append (os .path .dirname (os .path .realpath (__file__ )) + '/strategies' )
28
30
sys .path .append (os .path .dirname (os .path .realpath (__file__ )) + '/../finplot' )
34
36
35
37
from observers .SkinokObserver import SkinokObserver
36
38
from wallet import Wallet
39
+ from userConfig import UserConfig
37
40
38
41
class SkinokBacktraderUI :
39
42
@@ -64,6 +67,42 @@ def __init__(self):
64
67
# Timeframes
65
68
self .timeFrameIndex = {"M1" : 0 , "M5" : 10 , "M15" : 20 , "M30" : 30 , "H1" :40 , "H4" :50 , "D" :60 , "W" :70 }
66
69
70
+ self .dataManager = DataManager ()
71
+
72
+ # Restore previous session for faster tests
73
+ self .loadConfig ()
74
+
75
+ pass
76
+
77
+ def loadConfig (self ):
78
+
79
+ userConfig = UserConfig ()
80
+ userConfig .loadConfigFile ()
81
+
82
+ isEmpty = True
83
+
84
+ # Load previous data files
85
+ for timeframe in self .timeFrameIndex .keys ():
86
+
87
+ if timeframe in userConfig .data .keys ():
88
+
89
+ filePath = userConfig .data [timeframe ]['filePath' ]
90
+ timeFormat = userConfig .data [timeframe ]['timeFormat' ]
91
+ separator = userConfig .data [timeframe ]['separator' ]
92
+
93
+ fileName = os .path .basename (filePath )
94
+
95
+ df , errorMessage = self .dataManager .loadDataFile (filePath ,timeFormat , separator )
96
+
97
+ if df is not None :
98
+ self .dataframes [fileName ] = df
99
+ isEmpty = False
100
+ else :
101
+ print (f" Error loading user data file : { errorMessage } " )
102
+
103
+ if not isEmpty :
104
+ self .importData ()
105
+
67
106
pass
68
107
69
108
def resetCerebro (self ):
@@ -97,53 +136,16 @@ def resetCerebro(self):
97
136
98
137
pass
99
138
100
- # Return True if loading is successfull & the error string if False
101
- def loadData (self , dataPath , datetimeFormat , separator ):
102
139
103
- # Try importing data file
104
- # We should code a widget that ask for options as : separators, date format, and so on...
105
- try :
106
- fileName = os .path .basename (dataPath )
107
-
108
- # Python contains
109
- if not dataPath in self .dataframes :
110
- if pd .__version__ < '2.0.0' :
111
- self .dataframes [fileName ] = pd .read_csv (dataPath ,
112
- sep = separator ,
113
- parse_dates = [0 ],
114
- date_parser = lambda x : pd .to_datetime (x , format = datetimeFormat ),
115
- skiprows = 0 ,
116
- header = 0 ,
117
- names = ["Time" , "Open" , "High" , "Low" , "Close" , "Volume" ],
118
- index_col = 0 )
119
- else :
120
- self .dataframes [fileName ] = pd .read_csv (dataPath ,
121
- sep = separator ,
122
- parse_dates = [0 ],
123
- date_format = datetimeFormat ,
124
- skiprows = 0 ,
125
- header = 0 ,
126
- names = ["Time" , "Open" , "High" , "Low" , "Close" , "Volume" ],
127
- index_col = 0 )
128
-
129
- except ValueError as err :
130
- return False , "ValueError error:" + str (err )
131
- except AttributeError as err :
132
- return False , "AttributeError error:" + str (err )
133
- except IndexError as err :
134
- return False , "IndexError error:" + str (err )
135
- except :
136
- return False , "Unexpected error:" + str (sys .exc_info ()[0 ])
137
-
138
- return True , ""
139
-
140
- def importData (self , fileNames ):
140
+ def importData (self ):
141
141
142
142
try :
143
+
144
+ fileNames = list (self .dataframes .keys ())
143
145
144
146
# Sort data by timeframe
145
147
# For cerebro, we need to add lower timeframes first
146
- fileNames .sort ( key = lambda x : self .timeFrameIndex [self .findTimeFrame (self .dataframes [x ])])
148
+ fileNames .sort ( key = lambda x : self .timeFrameIndex [self .dataManager . findTimeFrame (self .dataframes [x ])] )
147
149
148
150
# Files should be loaded in the good order
149
151
for fileName in fileNames :
@@ -160,7 +162,7 @@ def importData(self, fileNames):
160
162
self .cerebro .adddata (self .data ) # Add the data feed
161
163
162
164
# Find timeframe
163
- timeframe = self .findTimeFrame (df )
165
+ timeframe = self .dataManager . findTimeFrame (df )
164
166
165
167
# Create the chart window for the good timeframe (if it does not already exists?)
166
168
self .interface .createChartDock (timeframe )
@@ -182,29 +184,7 @@ def importData(self, fileNames):
182
184
return False
183
185
pass
184
186
185
- def findTimeFrame (self , df ):
186
-
187
- if len (df .index ) > 2 :
188
- dtDiff = df .index [1 ] - df .index [0 ]
189
-
190
- if dtDiff .total_seconds () == 60 :
191
- return "M1"
192
- elif dtDiff .total_seconds () == 300 :
193
- return "M5"
194
- elif dtDiff .total_seconds () == 900 :
195
- return "M15"
196
- elif dtDiff .total_seconds () == 1800 :
197
- return "M30"
198
- elif dtDiff .total_seconds () == 3600 :
199
- return "H1"
200
- elif dtDiff .total_seconds () == 14400 :
201
- return "H4"
202
- elif dtDiff .total_seconds () == 86400 :
203
- return "D"
204
- elif dtDiff .total_seconds () == 604800 :
205
- return "W"
206
187
207
- pass
208
188
209
189
def addStrategy (self , strategyName ):
210
190
0 commit comments