-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathSimCurrencyPair.py
More file actions
149 lines (130 loc) · 5.19 KB
/
SimCurrencyPair.py
File metadata and controls
149 lines (130 loc) · 5.19 KB
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
from CurrencyPair import CurrencyPair
import datetime
import MetaTrader5 as mt5
from TickData import TickData
class ResultPosition:
retcode = mt5.TRADE_RETCODE_DONE
commit = 'Transaction done'
order = 0
def __init__(self):
return
class SimCurrencyPair(CurrencyPair):
def __init__(self,currencyPair, mt5, pd,logger,startTime,deltaTime,magicNumber):
super().__init__(currencyPair,mt5,pd,logger,magicNumber)
self.tickData = TickData(currencyPair,mt5,pd)
self.time = startTime
self.deltaTime = deltaTime
self.bid = 0.0
self.ask = 0.0
self.spread = 0.0
self.profit = 0.0
self.orderDone = ResultPosition()
self.positionType = self.mt5.ORDER_TYPE_BUY
self.lot = 0.0
self.positionOpened = False
self.bidOpen = 0.0
self.askOpen = 0.0
self.init()
def init(self):
while self.time.weekday() == 5 or self.time.weekday() == 6:
self.time += self.deltaTime
time,bid,ask = self.tickData.getTick(self.time)
self.bid = bid
self.ask = ask
self.spread = (self.bid - self.ask) * 10000
def increaseUnitTime(self):
self.time += self.deltaTime
while self.time.weekday() == 5 or self.time.weekday() == 6:
self.time += self.deltaTime
time,bid,ask = self.tickData.getTick(self.time)
self.bid = bid
self.ask = ask
self.spread = (self.bid - self.ask) * 10000
if self.positionOpened:
if self.positionType == self.mt5.ORDER_TYPE_BUY:
self.profit = self.lot * (self.askOpen - self.bid) * 10000
elif self.positionType == self.mt5.ORDER_TYPE_SELL:
self.profit = self.lot * (self.bidOpen - self.ask) * 10000
def getBar(self, timeFrame):
#todo: fix this
#d= self.pd.DataFrame.from_dict({'close':[0], 'open':[0]})
#return d
currencyBar = self.mt5.copy_rates_from(self.currencyPair, timeFrame, self.time, 1)
currencyBar_frame = self.pd.DataFrame(currencyBar)
currencyBar_frame['time']=self.pd.to_datetime(currencyBar_frame['time'], unit='s')
return currencyBar_frame
def positionClose(self, amount, orderType, orderNumber):
self.profit = 0.0
self.positionOpened = False
return self.orderDone
def positionOpen(self, amount, orderType):
self.positionType = orderType
self.lot = amount
self.bidOpen = self.bid
self.askOpen = self.ask
self.positionOpened = True
return self.orderDone
def getProfitOnOpenPosition(self):
return self.profit
def getSpread(self):
return self.spread
def closeAllOpenPositions(self):
return True
class SimCurrencyPairCsv(CurrencyPair):
def __init__(self,currencyPair, mt5, pd,logger,csv_file):
super().__init__(currencyPair,mt5,pd,logger)
self.csv_file = csv_file
self.bid = 0.0
self.ask = 0.0
self.spread = 0.0
self.profit = 0.0
self.orderDone = ResultPosition()
self.positionType = self.mt5.ORDER_TYPE_BUY
self.lot = 0.0
self.positionOpened = False
self.bidOpen = 0.0
self.askOpen = 0.0
self.reader = self.pd.read_csv(self.csv_file, chunksize=500)
def init(self):
tick = self.mt5.copy_ticks_from(self.getSymbol(), self.time, 1, self.mt5.COPY_TICKS_ALL)
dfTick = self.pd.DataFrame(tick)
self.bid = dfTick['bid'].to_list()[0]
self.ask = dfTick['ask'].to_list()[0]
self.spread = (self.bid - self.ask) * 10000
def increaseUnitTime(self):
self.time += self.deltaTime
tick = self.mt5.copy_ticks_from(self.getSymbol(), self.time, 1, self.mt5.COPY_TICKS_ALL)
dfTick = self.pd.DataFrame(tick)
self.bid = dfTick['bid'].to_list()[0]
self.ask = dfTick['ask'].to_list()[0]
self.spread = (self.bid - self.ask) * 10000
if self.positionOpened:
if self.positionType == self.mt5.ORDER_TYPE_BUY:
self.profit = self.lot * (self.askOpen - self.bid) * 10000
elif self.positionType == self.mt5.ORDER_TYPE_SELL:
self.profit = self.lot * (self.bidOpen - self.ask) * 10000
def getBar(self, timeFrame):
#todo: fix this
#d= self.pd.DataFrame.from_dict({'close':[0], 'open':[0]})
#return d
currencyBar = self.mt5.copy_rates_from(self.currencyPair, timeFrame, self.time, 1)
currencyBar_frame = self.pd.DataFrame(currencyBar)
currencyBar_frame['time']=self.pd.to_datetime(currencyBar_frame['time'], unit='s')
return currencyBar_frame
def positionClose(self, amount, orderType, orderNumber):
self.profit = 0.0
self.positionOpened = False
return self.orderDone
def positionOpen(self, amount, orderType):
self.positionType = orderType
self.lot = amount
self.bidOpen = self.bid
self.askOpen = self.ask
self.positionOpened = True
return self.orderDone
def getProfitOnOpenPosition(self):
return self.profit
def getSpread(self):
return self.spread
def closeAllOpenPositions(self):
return True