forked from coinrising/okex-api-v5
-
Notifications
You must be signed in to change notification settings - Fork 0
/
function.py
240 lines (223 loc) · 8.54 KB
/
function.py
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
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
import pandas
import time
from tqsdk import tafunc
from tqsdk.ta import KDJ
#获取一天的kdj
from dingmsg import dingmessage
from okex.Key_Consts import API_KEY, SECRET_KEY, PASSPHRASE
from okex.consts import COIN_TYPE, CCY, PERROD
from utils import timeStampTostr, nowTime
import okex.Trade_api as Trade
crossUpSended :bool = False
crossDownSended :bool = False
lastTimeSendMsg :int = 0
messageMap : dict = {}
upStatus :bool = True
downStatus :bool = True
import time
from tqsdk import tafunc
from tqsdk.ta import KDJ
#获取一天的kdj
from dingmsg import dingmessage
from okex.consts import COIN_TYPE , CCY
from utils import timeStampTostr, nowTime
import okex.Trade_api as Trade
crossUpSended :bool = False
crossDownSended :bool = False
lastTimeSendMsg :int = 0
messageMap : dict = {}
upStatus :bool = True
downStatus :bool = True
last_k :float = 0
last_d :float = 0
debugStart:bool = True
def isCrossUp(kList,dList,msg_pre):
lenth :int = len(kList)
k = float(kList[lenth - 1])
k_1 = float(kList[lenth - 2])
last_k = k
d = float(dList[lenth - 1])
d_1 = float(dList[lenth - 2])
timeInt = int(nowTime())
print('nowTime:' + str(timeInt))
global lastTimeSendMsg
global upStatus,downStatus
# #状态校验,防止一个周期内
msg_3 = ' k:'+str(k)+' d:'+str(d)
#金叉
if(k_1 < d_1 and k > d) and upStatus:
downStatus = True
upStatus = False
handleCrossUp(msg_pre,timeInt,msg_3,True)
return
# msg = msg_pre + " jincha:"
# result_1 = closeTrade('short')
# result_2 = buy()
# msg = msg + str(result_1) + str(result_2)
# print(msg)
# dingmessage(msg)
# lastTimeSendMsg = int(timeInt)
#死叉
if (k_1 > d_1 and k < d) and downStatus:
upStatus = True
downStatus = False
handleCropssDown(msg_pre,timeInt,msg_3,True)
return
# msg = msg_pre + " sicha:"
# result_1 = closeTrade('long')
# result_2 = sell()
# msg = msg + str(result_1) + str(result_2)
# print(msg)
# dingmessage(msg)
# lastTimeSendMsg = int(timeInt)
# 一分钟之内不管,减少震荡,一分钟过后,立即检查反转,时间过久可能发生价格大幅变动,增加波动值
#只做状态纠正,不做交易操作
if timeInt - lastTimeSendMsg > PERROD * 60/3 :
# 一个周期之后,上周期发生了向上金叉,但是中间又发生向下死叉,d仍然大于k.需要将状态纠正过来,认为是突破状态,金叉状态
if (k_1 < d_1 and k < d) and downStatus:
msg_3 = 'reverse to upstatuse ,go to jincha:'
upStatus = True
downStatus = False
#handleCropssDown(msg_pre, timeInt, msg_3,True)
# 假突破后卖出买入的,等下次突破后再买
# 一个周期之后,上周期发生了,向下死叉,但是中间又发生向向上金叉,d仍然小于k.需将状态反转,并执行反向操作。
if (k_1 > d_1 and k > d) and upStatus:
msg_3 = 'reverse to upstatuse ,go to jincha:'
upStatus = False
downStatus = True
#handleCrossUp(msg_pre, timeInt, msg_3,True)
#假突破后卖出买入的,等下次突破后再买
print("klines k(n-2):"+str(k_1)+ ' d(n-2):'+str(d_1)+ ' k(n-1):'+ str(k) + ' d(n-1):'+str(d))
def handleCrossUp(msg_pre,timeInt,msg_3,needBuy):
msg = msg_pre + " jincha:"
result_2 = ''
orderDetail = ''
try:
result_1 = closeTrade('short')
orderDetail = getOrderInfo(COIN_TYPE, result_1['data']['pnl'])
except Exception:
print("except:")
try:
if needBuy:
result_2 = buy()
except Exception:
print("except:")
msg = msg + str(result_1) + str(result_2)+str(msg_3)+' 收益率:'+ str(orderDetail)
print(msg)
dingmessage(msg)
global lastTimeSendMsg
lastTimeSendMsg = int(timeInt)
def handleCropssDown(msg_pre,timeInt,msg_3,needBuy):
msg = msg_pre + " sicha:"
result_2 = ''
orderDetail = ''
try:
result_1 = closeTrade('long')
orderDetail = getOrderInfo(COIN_TYPE, result_1['data']['pnl'])
except Exception:
print("except:")
try:
if needBuy:
result_2 = sell()
except Exception:
print("except:")
msg = msg + str(result_1) + str(result_2)+str(msg_3) + ' 收益率:'+ str(orderDetail)
print(msg)
dingmessage(msg)
global lastTimeSendMsg
lastTimeSendMsg = int(timeInt)
def buy():
# flag是实盘与模拟盘的切换参数 flag is the key parameter which can help you to change between demo and real trading.
flag = '1' # 模拟盘 demo trading
flag = '0' # 实盘 real trading
# trade api
tradeAPI = Trade.TradeAPI(API_KEY, SECRET_KEY, PASSPHRASE, False, flag)
# 下单 Place Order
print('buy request_time:'+nowTimStr())
result = tradeAPI.place_order(instId= COIN_TYPE, tdMode='cross', side='buy',ccy=CCY,
ordType='market', sz='20',posSide='long')
print('buy success:'+nowTimStr())
print(result)
return result
def sell():
# flag是实盘与模拟盘的切换参数 flag is the key parameter which can help you to change between demo and real trading.
flag = '1' # 模拟盘 demo trading
flag = '0' # 实盘 real trading
# trade api
print('sell request_time:'+nowTimStr())
tradeAPI = Trade.TradeAPI(API_KEY, SECRET_KEY, PASSPHRASE, False, flag)
# 下单 Place Order
result = tradeAPI.place_order(instId= COIN_TYPE, tdMode='cross', side='sell',ccy=CCY,
ordType='market', sz='20',posSide='short')
print('sell success:'+nowTimStr())
print(result)
return result
def closeTrade(posSideStr : str):
# flag是实盘与模拟盘的切换参数 flag is the key parameter which can help you to change between demo and real trading.
flag = '1' # 模拟盘 demo trading
flag = '0' # 实盘 real trading
# trade api
tradeAPI = Trade.TradeAPI(API_KEY, SECRET_KEY, PASSPHRASE, False, flag)
# 下单 Place Order
print('closeTrade request_time:'+nowTimStr())
result = tradeAPI.close_positions(instId = COIN_TYPE, mgnMode = 'cross', posSide = posSideStr)
print('closeTrade success:'+nowTimStr())
print(result)
return result
def getOrderInfo(code :str,orderId: str):
tradeAPI = Trade.TradeAPI(API_KEY, SECRET_KEY, PASSPHRASE, False, '0')
result = tradeAPI.get_orders(code, str)
return result
def nowTimStr():
timeInt = int(nowTime())
print('nowTime:' + str(timeInt))
time = timeStampTostr(timeInt)
return time
def kdj(klines : pandas.DataFrame,code :str,period :int):
timeInt = int(nowTime())
print('nowTime:' + str(timeInt))
time = timeStampTostr(timeInt)
klines.rename(columns={ 0:'date',1:'open',2:'high',3:'low',4:'close', 5:'vol', 6:'volCcy'},inplace=True)
kdj = KDJ(klines, 9, 3, 3)
kList = list(kdj["k"])
dList = list(kdj["d"])
jList = list(kdj["j"])
msg_pre = code + ' period' + str(period) + ' time'+ time
isCrossUp(kList,dList,msg_pre)
crossup = tafunc.crossup(kdj["k"], kdj["d"])
crossDown = tafunc.crossdown(kdj["k"], kdj["d"])
crossUpList = list(crossup)
crossDownList = list(crossDown)
print("crossUpList:"+str(crossUpList))
print("crossDownList:"+str(crossDownList))
return
f = open(str(code)+'.txt', 'a')
try:
global lastTimeSendMsg
#timeInt = klines['date'][len(klines) - 1]
print('time:' + str(time))
if crossUpList[len(crossUpList) - 1] == 1:
msg = code +' period:'+str(period)+" time:" + str(time) + " kdj jincha\n"
global crossUpSended
if(int(timeInt) - lastTimeSendMsg > period*1000*60):
crossUpSended = False
if(crossUpSended == False):
print(msg)
dingmessage(msg)
f.write(msg)
crossUpSended = True
lastTimeSendMsg = int(timeInt)
if crossDownList[len(crossDownList) - 1] == 1:
msg = code +' period:'+str(period)+" time:" + str(time) + " kdj sicha\n"
global crossDownSended
if (int(timeInt) - lastTimeSendMsg > period*1000*60):
crossDownSended = False
if (crossDownSended == False):
print(msg)
dingmessage(msg)
f.write(msg)
f.close()
crossDownSended = True
lastTimeSendMsg = int(timeInt)
except IndexError as ie:
print(ie)