Skip to content

Commit bd1708b

Browse files
authored
Merge pull request #53 from LukeWang01/dev
Dev Version: 0.1.6
2 parents 41bbbe5 + c3a691e commit bd1708b

14 files changed

+649
-202
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,4 +115,4 @@ https://j.moomoo.com/011Pu5
115115
- Luke
116116
- Angus
117117

118-
Dev Version: 0.1.3
118+
Dev Version: 0.1.6

brokers/base_broker.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -132,9 +132,9 @@ def broker_make_trade(self, direction: str, called_by: str, stock: str, quantity
132132
if ret_status_code == self.ret_ok_code:
133133
data = f"{get_current_time()}: Market Buy: {stock}, {quantity}, {price}, order placed successfully, please check account. by: {called_by}"
134134
print(data)
135-
print(order_data)
135+
# print(order_data)
136136
self.logger.info(data)
137-
self.logger.info(order_data)
137+
# self.logger.info(order_data) # for privacy, not logging the order data, updated 01-13-2025
138138
else:
139139
data = f"⚠️⚠️⚠️{get_current_time()}: Market Buy: {stock}, {quantity}, {price} Failed, please check broker side or app, by: {called_by}⚠️⚠️⚠️"
140140
print(data)
@@ -147,9 +147,9 @@ def broker_make_trade(self, direction: str, called_by: str, stock: str, quantity
147147
if ret_status_code == self.ret_ok_code:
148148
data = f"{get_current_time()}: Limit Buy: {stock}, {quantity}, {price}, order placed successfully, please check account, by: {called_by}"
149149
print(data)
150-
print(order_data)
150+
# print(order_data)
151151
self.logger.info(data)
152-
self.logger.info(order_data)
152+
# self.logger.info(order_data) # for privacy, not logging the order data, updated 01-13-2025
153153
else:
154154
data = f"⚠️⚠️⚠️{get_current_time()}: Limit Buy: {stock}, {quantity}, {price} Failed, please check broker side or app, by: {called_by}⚠️⚠️⚠️"
155155
print(data)
@@ -186,9 +186,9 @@ def broker_make_trade(self, direction: str, called_by: str, stock: str, quantity
186186
if ret_status_code == self.ret_ok_code:
187187
data = f"{get_current_time()}: Market Sell: {stock}, {quantity}, {price}, order placed successfully, please check account., by: {called_by}"
188188
print(data)
189-
print(order_data)
189+
# print(order_data)
190190
self.logger.info(data)
191-
self.logger.info(order_data)
191+
# self.logger.info(order_data) # for privacy, not logging the order data, updated 01-13-2025
192192
else:
193193
# order failed
194194
data = f"⚠️⚠️⚠️{get_current_time()}: Market Sell: {stock}, {quantity}, {price}, order failed, please check broker side or app, by: {called_by}⚠️⚠️⚠️"
@@ -200,9 +200,9 @@ def broker_make_trade(self, direction: str, called_by: str, stock: str, quantity
200200
if ret_status_code == self.ret_ok_code:
201201
data = f"{get_current_time()}: Limit Sell: {stock}, {quantity}, {price}, order placed successfully, please check account., by: {called_by}"
202202
print(data)
203-
print(order_data)
203+
# print(order_data)
204204
self.logger.info(data)
205-
self.logger.info(order_data)
205+
# self.logger.info(order_data) # for privacy, not logging the order data, updated 01-13-2025
206206
else:
207207
# order failed
208208
data = f"⚠️⚠️⚠️{get_current_time()}: Limit Sell: {stock}, {quantity}, {price}, order failed, please check broker side or app, by: {called_by}⚠️⚠️⚠️"

brokers/broker_factory.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from brokers.moomoo_futu_broker import MooMooFutuBroker
66
from brokers.schwab_broker import SchwabBroker
77
from brokers.webull_broker import WebullBroker
8+
from brokers.tiger_broker import TigerBroker
89

910

1011
class BrokerFactory:
@@ -24,7 +25,8 @@ def _create_broker(cls, broker_name: str) -> BaseBroker:
2425
'WEBULL': WebullBroker,
2526
'MooMoo': MooMooFutuBroker,
2627
'Futu': MooMooFutuBroker,
27-
'SCHWAB': SchwabBroker, # Add Schwab to the broker map
28+
'SCHWAB': SchwabBroker,
29+
'TIGER': TigerBroker
2830
}
2931

3032
if broker_name not in broker_map:

brokers/ibkr_broker.py

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import nest_asyncio
1616

1717
from trading_settings import TRADING_ALLOW_PRE_POST_MARKET_ORDER
18+
from utils.wall_api_client import print_status
1819

1920
nest_asyncio.apply()
2021

@@ -39,7 +40,7 @@
3940
'''
4041
Step 3: Set up the trading information
4142
'''
42-
# TODO: Set up the trading information for pre post market trading
43+
# use global variable to control the trading settings
4344
FILL_OUTSIDE_MARKET_HOURS = TRADING_ALLOW_PRE_POST_MARKET_ORDER # enable if order fills on extended hours
4445

4546
""" ⏫ Broker Setup ⏫ """
@@ -82,7 +83,8 @@ def get_account_info(self):
8283
self.connect()
8384
if not self.ib.isConnected():
8485
self.logger.error(f"Trader: Get Account Info failed: not connected")
85-
print("Trader: Get Account Info failed: not connected")
86+
# print("Trader: Get Account Info failed: not connected")
87+
print_status("Trader", "Get Account Info failed: not connected", "ERROR")
8688
return self.ret_error_code, None
8789

8890
try:
@@ -100,16 +102,13 @@ def get_cash_balance(self):
100102
self.connect()
101103
if not self.ib.isConnected():
102104
self.logger.error(f"Trader: Get Cash Balance failed: not connected")
103-
print("Trader: Get Cash Balance failed: not connected")
105+
# print("Trader: Get Cash Balance failed: not connected")
106+
print_status("Trader", "Get Cash Balance failed: not connected", "ERROR")
104107
return self.ret_error_code, None
105108

106109
try:
107110
account_values = self.ib.accountValues(IBKR_ACCOUNT_NUMBER)
108-
is_margin_account = next((True for v in account_values if v.tag == 'DayTradesRemaining'), False)
109-
if is_margin_account:
110-
available_funds = next((v.value for v in account_values if v.tag == 'CashBalance'), None)
111-
else:
112-
available_funds = next((v.value for v in account_values if v.tag == 'SettledCash'), None)
111+
available_funds = next((v.value for v in account_values if v.tag == 'CashBalance' and v.currency == 'USD'), None)
113112
self.logger.info(f"Retrieved cash balance: {available_funds}")
114113
return self.ret_ok_code, float(available_funds)
115114
except Exception as e:
@@ -125,7 +124,8 @@ def get_positions(self):
125124
self.connect()
126125
if not self.ib.isConnected():
127126
self.logger.error(f"Trader: Get Positions failed: not connected")
128-
print("Trader: Get Positions failed: not connected")
127+
# print("Trader: Get Positions failed: not connected")
128+
print_status("Trader", "Get Positions failed: not connected", "ERROR")
129129
return self.ret_error_code, None
130130

131131
try:
@@ -150,7 +150,8 @@ def market_sell(self, stock: str, quantity: int, price: float):
150150
self.connect()
151151
if not self.ib.isConnected():
152152
self.logger.error(f"Trader: Market Sell failed: not connected")
153-
print("Trader: Market Sell failed: not connected")
153+
# print("Trader: Market Sell failed: not connected")
154+
print_status("Trader", "Market Sell failed: not connected", "ERROR")
154155
return self.ret_error_code, None
155156

156157
try:
@@ -168,7 +169,8 @@ def market_buy(self, stock: str, quantity: int, price: float):
168169
self.connect()
169170
if not self.ib.isConnected():
170171
self.logger.error(f"Trader: Market Buy failed: not connected")
171-
print("Trader: Market Buy failed: not connected")
172+
# print("Trader: Market Buy failed: not connected")
173+
print_status("Trader", "Market Buy failed: not connected", "ERROR")
172174
return self.ret_error_code, None
173175

174176
try:
@@ -186,7 +188,8 @@ def limit_sell(self, stock: str, quantity: int, price: float):
186188
self.connect()
187189
if not self.ib.isConnected():
188190
self.logger.error(f"Trader: Limit Sell failed: not connected")
189-
print("Trader: Limit Sell failed: not connected")
191+
# print("Trader: Limit Sell failed: not connected")
192+
print_status("Trader", "Limit Sell failed: not connected", "ERROR")
190193
return self.ret_error_code, None
191194

192195
try:
@@ -204,7 +207,8 @@ def limit_buy(self, stock: str, quantity: int, price: float):
204207
self.connect()
205208
if not self.ib.isConnected():
206209
self.logger.error(f"Trader: Limit Buy failed: not connected")
207-
print("Trader: Limit Buy failed: not connected")
210+
# print("Trader: Limit Buy failed: not connected")
211+
print_status("Trader", "Limit Buy failed: not connected", "ERROR")
208212
return self.ret_error_code, None
209213

210214
try:

brokers/moomoo_futu_broker.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ def init_context(self):
8989
self.logger.info('MooMoo/Futu Trader: Init Context success!')
9090
return True
9191
except Exception as e:
92-
self.logger.error('MooMoo/Futu Trader: Init Context failed: ', e)
92+
self.logger.error(f'MooMoo/Futu Trader: Init Context failed: {e}')
9393
self.logger.error('MooMoo/Futu Trader: Please check the OpenD host IP and port number!')
9494
print_status("MooMoo/Futu Trader", "Init Context failed, please check the OpenD host IP and port number!",
9595
"ERROR")
@@ -116,7 +116,7 @@ def market_sell(self, stock, quantity, price):
116116
order_type=OrderType.MARKET, trd_env=TRADING_ENVIRONMENT)
117117
if ret != RET_OK:
118118
print_status("MooMoo/Futu Trader", "Market Sell failed", "ERROR")
119-
self.logger.warning('Trader: Market Sell failed: ', data)
119+
self.logger.warning(f'Trader: Market Sell failed: {data}')
120120
self.close_context()
121121
return ret, data
122122
print_status("MooMoo/Futu Trader", "Market Sell success", "SUCCESS")
@@ -138,11 +138,11 @@ def market_buy(self, stock, quantity, price):
138138
order_type=OrderType.MARKET, trd_env=TRADING_ENVIRONMENT)
139139
if ret != RET_OK:
140140
print_status("MooMoo/Futu Trader", "Market Buy failed", "ERROR")
141-
self.logger.warning('Trader: Market Buy failed: ', data)
141+
self.logger.warning(f'Trader: Market Buy failed: {data}')
142142
self.close_context()
143143
return self.ret_error_code, data
144144
print_status("MooMoo/Futu Trader", "Market Buy success", "SUCCESS")
145-
self.logger.info('Trader: Market Buy success!', data)
145+
self.logger.info('Trader: Market Buy success!')
146146
self.close_context()
147147
return self.ret_ok_code, data
148148
else:
@@ -161,11 +161,11 @@ def limit_sell(self, stock, quantity, price):
161161
fill_outside_rth=FILL_OUTSIDE_MARKET_HOURS)
162162
if ret != RET_OK:
163163
print_status("MooMoo/Futu Trader", "Limit Sell failed", "ERROR")
164-
self.logger.warning('Trader: Limit Sell failed: ', data)
164+
self.logger.warning(f'Trader: Limit Sell failed: {data}')
165165
self.close_context()
166166
return self.ret_error_code, data
167167
print_status("MooMoo/Futu Trader", "Limit Sell success", "SUCCESS")
168-
self.logger.info('Trader: Limit Sell success!', data)
168+
self.logger.info('Trader: Limit Sell success!')
169169
self.close_context()
170170
return self.ret_ok_code, data
171171
else:
@@ -184,11 +184,11 @@ def limit_buy(self, stock, quantity, price):
184184
fill_outside_rth=FILL_OUTSIDE_MARKET_HOURS)
185185
if ret != RET_OK:
186186
print_status("MooMoo/Futu Trader", "Limit Buy failed", "ERROR")
187-
self.logger.warning('Trader: Limit Buy failed: ', data)
187+
self.logger.warning(f'Trader: Limit Buy failed: {data}')
188188
self.close_context()
189189
return self.ret_error_code, data
190190
print_status("MooMoo/Futu Trader", "Limit Buy success", "SUCCESS")
191-
self.logger.info('Trader: Limit Buy success!', data)
191+
self.logger.info('Trader: Limit Buy success!')
192192
self.close_context()
193193
return self.ret_ok_code, data
194194
else:
@@ -207,7 +207,7 @@ def get_account_info(self):
207207
ret, data = self.trade_context.accinfo_query(currency=Currency.USD)
208208
if ret != RET_OK:
209209
print_status("MooMoo/Futu Trader", "Get Account Info failed", "ERROR")
210-
self.logger.warning('Trader: Get Account Info failed: ', data)
210+
self.logger.warning(f'Trader: Get Account Info failed: {data}')
211211
self.close_context()
212212
return self.ret_error_code, data
213213

@@ -235,7 +235,7 @@ def get_positions(self):
235235
ret, data = self.trade_context.position_list_query()
236236
if ret != RET_OK:
237237
print_status("MooMoo/Futu Trader", "Get Positions failed", "ERROR")
238-
self.logger.warning('Trader: Get Positions failed: ', data)
238+
self.logger.warning(f'Trader: Get Positions failed: {data}')
239239
self.close_context()
240240
return self.ret_error_code, data
241241
# refactor the data

0 commit comments

Comments
 (0)