-
Notifications
You must be signed in to change notification settings - Fork 0
/
Main.py
175 lines (150 loc) · 5.44 KB
/
Main.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
import json
import numpy
import talib
import websocket
from binance.client import Client
from binance.enums import *
from playsound import playsound
from API_CONFIG import config
#from Binanace_functions import order, account_balance, profit, quantity_to_buy
# define strategy variables that will be used to seek out and define entry and exit points
sym = 'ethusdt'
intval = '1m'
rsi_period = 14
rsi_overbought = 70
rsi_oversold = 30
# define websockets connections
socket = "wss://stream.binance.com:9443/ws/" + sym + "@kline_" + intval
# define api client
client = Client(config.api_key, config.api_secret)
# variables to hold price data on purchases and sell orders
initial_price = 0
final_price = 0
# define whether in position state or not
position = False
# variable to hold quanity amount
quantity_amount = 0
# create a array that holds data
closes = []
# fast over slow
macd_over_sig = False
def order(side, quantity, symbol, order_type=ORDER_TYPE_MARKET):
try:
print("sending order")
order = client.create_order(symbol=symbol, side=side, quantity=quantity)
print(order)
except Exception as e:
print('an exception occurred -{}'.format(e))
return False
return True
# define a account balance lookup function
def account_balance():
status = client.get_account_api_trading_status()
balance = client.get_asset_balance(asset='CAD')
return status, balance
# define a calculated buy quantity function based on account balance we want to
def quantity_to_buy(balance, close, percent_of_balance=5):
if balance is None:
return ("balance is equal to None, check account balance, and check asset settings")
else:
balance = float(balance)
price_per = float(close)
percent_of_balance = float(percent_of_balance) / 100
quantity = price_per / balance * percent_of_balance
return quantity
# define profit from transaction
def profit(initial=initial_price, final=final_price):
profit = final - initial
profit_percentage = profit / initial * 100
return profit, profit_percentage
# MAIN CALLED FUNCTION
if __name__ == "__main__":
def on_open(ws):
print('Account Status information:')
print(account_balance()[0])
playsound('audio_clips/HorseRace.mp3')
print("open connection")
def on_close(ws):
playsound('audio_clips/ManOutWindow.mp3')
print("close connection")
def on_message(ws, message):
global position, macd_over_sig, rsi
# JSON interpretation from message
json_message = json.loads(message)
# define candle state for strategy
candle = json_message['k']
# print(candle)
is_closed = candle['x']
# define closed candle
if candle['x']:
close = candle['c']
closes.append(float(close))
np_closes = numpy.array(closes, dtype=float)
# print(np_closes[len(np_closes) - 1])
close_EMA12 = talib.EMA(np_closes, timeperiod=12)
close_EMA26 = talib.EMA(np_closes, timeperiod=26)
close_macd = talib.MACD(np_closes, fastperiod=12, slowperiod=26, signalperiod=9)
macd_line = close_macd[0]
macd_signal = close_macd[1]
macd_hist = close_macd[2]
if len(closes) > rsi_period:
rsi = talib.RSI(np_closes, rsi_period)
# define if state represents a buy signal
if macd_line[-1] > macd_signal[-1]:
macd_over_sig = True
print(np_closes[len(np_closes) - 1])
print('macd_over_sig equals')
print(macd_over_sig, macd_line[-1], macd_signal[-1])
if rsi[-1] < 55:
print('RSI under 55')
print(rsi[-1])
if position is False:
# account balance lookup
balance = account_balance()[-1]
# quantity to buy lookup
quantity = quantity_to_buy(balance=balance, close=np_closes[len(np_closes) - 1])
# order = buy(quantity to buy)
order = order(buy, quantity=quantity, symbol=sym)
if order is True:
print('position is false')
# if position = False
print('buy buy buy')
# order(buy)
position = True
playsound('audio_clips/Triplebuy.mp3')
print(np_closes[len(np_closes) - 1])
print("position equals")
print(position)
else:
print('order not fufilled')
else:
print(rsi[-1])
print('order not made, RSI is over 55')
else:
macd_over_sig = False
print(np_closes[len(np_closes) - 1])
print('macd_over_sig equals')
print(macd_over_sig, macd_line[-1], macd_signal[-1])
# define if state represents a sell signal
if rsi > 70:
print('rsi over 70')
if position is True:
print('position is true')
# if state represents a sell signal and in_position = True
# using same quantity from buy order
# order = sell(quantity amount)
order = order(sell, quantity=quantity, symbol=sym)
if order is True:
print('Sell')
position = False
playsound('audio_clips/SELLSELLSELL.mp3')
print(np_closes[len(np_closes) - 1])
print("position equals")
print(position)
else:
print('order not fufilled')
# define profit from transaction = sell price - bought price
else:
print('RSI over 70 but you do not have anything to sell')
ws = websocket.WebSocketApp(socket, on_open=on_open, on_close=on_close, on_message=on_message)
ws.run_forever()