class StockProcessor(object): ''' classdocs ''' def __init__(self, account_name, password): self.logger = logging.getLogger(__name__) self.stock_symbol_list = [] self.stock_process_index = 0 self.trade = Trade(account_name, password) return def login(self): """ Login GTJA web system """ self.trade.login() return def close(self): """ Close GTJA web system """ self.trade.close() return def set_stock_symbol_list(self, stock_symbol_list): """ set symbol list """ self.stock_symbol_list = stock_symbol_list return def get_stock_symbol_list(self): """ get symbol list """ return self.stock_symbol_list def keep_alive(self): """ keep alive method """ #self.trade.enter_stock_menu() self.trade.get_current_commission_list() return def get_one_stock(self): """ select one stock """ result = self.stock_symbol_list[self.stock_process_index] self.stock_process_index += 1 self.stock_process_index = \ self.stock_process_index % len(self.stock_symbol_list) return result def process_stock(self, stock_symbol): """ process the stock """ # get remaining cash for the stock stock_cash_table = StockCashTable() stock_cash = stock_cash_table.get_stock_cash_by_symbol(stock_symbol) # get current price of the stock stock_price = self.trade.get_stock_price(stock_symbol) print("process stock: " + stock_symbol) print("remaining_cash={0}".format(stock_cash.amount)) print("stock_price={0}".format(stock_price)) if abs(stock_price) < 0.005: return stock_price_range_table = StockPriceRangeTable() stock_price_range = \ stock_price_range_table.get_stock_stock_price_range_by_symbol( stock_symbol) price_low = stock_price_range.get_price_low() price_high = stock_price_range.get_price_high() simple_algorithm = SimpleAlgorithm(stock_symbol, price_low, price_high, stock_price) simple_algorithm.calculate() buy_or_sell = simple_algorithm.get_suggested_buy_or_sell() suggested_amount = simple_algorithm.get_suggested_amount() result = "Symbol: {0}\nBuy or Sell: {1}\nAmount: {2}".format( stock_symbol, buy_or_sell, suggested_amount) print(result) amount = int(suggested_amount/100) * 100 if amount >= 100: debug_msg = "stock_symbol: {0}\nbuy_or_sell: {1}\n" + \ "amount: {2}\nstock_price: {3}" debug_msg = debug_msg.format( stock_symbol, buy_or_sell, amount, stock_price) self.logger.debug(debug_msg) if buy_or_sell == "Buy": commission_id = self.trade.buy_stock( stock_symbol, stock_price, amount) time.sleep(3) commission_state = self.trade.get_commission_state( commission_id) if commission_state != "已成": result = self.trade.cancel_commission(commission_id) if result != 1: commission_state = self.trade.get_commission_state( commission_id) if commission_state == "已成": complete_buy_transaction(stock_symbol, stock_price, amount) else: print("Unknown error in canceling transaction") self.logger.debug( "Unknown error in canceling transaction.") else: complete_buy_transaction(stock_symbol, stock_price, amount) elif buy_or_sell == "Sell": lowest_buy_price = StockTransaction.\ get_lowest_buy_price(stock_symbol) lowest_buy_price_quantity = StockTransaction.\ get_lowest_buy_price_quantity( stock_symbol) lowest_gain = get_lowest_gain(stock_symbol) if lowest_gain is None: lowest_gain = 0.3 if stock_price - lowest_buy_price < lowest_gain: debug_msg = "stock_price is not high enough. {0} vs {1}" debug_msg = debug_msg.format( stock_price, lowest_buy_price) self.logger.debug(debug_msg) return if amount > lowest_buy_price_quantity: amount = lowest_buy_price_quantity commission_id = self.trade.sell_stock( stock_symbol, stock_price, amount) time.sleep(3) commission_state = self.trade.get_commission_state( commission_id) if commission_state != "已成": result = self.trade.cancel_commission(commission_id) if result != 1: commission_state = self.trade.get_commission_state( commission_id) if commission_state == "已成": complete_sell_transaction(stock_symbol, stock_price, amount) else: print("Unknown error in canceling transaction") self.logger.debug( "Unknown error in canceling transaction.") else: complete_sell_transaction(stock_symbol, stock_price, amount) else: print("Error!") return
class StockProcessor(object): ''' classdocs ''' def __init__(self, account_name, password): self.logger = logging.getLogger(__name__) self.stock_symbol_list = [] self.stock_process_index = 0 self.trade = Trade(account_name, password) return ''' Constructor ''' def login(self): self.trade.login() return def close(self): self.trade.close() return def set_stock_symbol_list(self, stock_symbol_list): self.stock_symbol_list =stock_symbol_list return def get_stock_symbol_list(self): return self.stock_symbol_list def keep_alive(self): self.trade.enter_stock_menu() return def get_one_stock(self): result = self.stock_symbol_list[self.stock_process_index] self.stock_process_index += 1 self.stock_process_index = self.stock_process_index % len(self.stock_symbol_list) return result def get_stock_current_value(self, symbol): stock_cash_table = StockCashTable() stock_cash = stock_cash_table.get_stock_cash_by_symbol(symbol) cash_amount = stock_cash.get_amount() stock_transaction_table = StockTransactionTable() stock_transaction_list = \ stock_transaction_table.get_stock_transaction_list_by_symbol(symbol) quantity = 0 for stock_transaction in stock_transaction_list: buy_or_sell = stock_transaction.get_buy_or_sell() if (buy_or_sell == "Buy"): quantity = quantity + stock_transaction.get_quantity() elif (buy_or_sell == "Sell"): quantity = quantity - stock_transaction.get_quantity() else: # Need to raise an error return None stock_price = 8.09 total = cash_amount + quantity*stock_price return total def update_cash_table(self, symbol, amount_offset): stock_cash_table = StockCashTable() stock_cash = stock_cash_table.get_stock_cash_by_symbol(symbol) new_amount = stock_cash.get_amount() + amount_offset stock_cash.set_amount(new_amount) stock_cash_table.update_stock_cash(stock_cash) return def add_transaction(self, symbol, buy_or_sell, quantity, price): stock_transaction = StockTransaction() stock_transaction.set_symbol(symbol) stock_transaction.set_buy_or_sell(buy_or_sell) stock_transaction.set_quantity(quantity) stock_transaction.set_price(price) stock_transaction.set_date(datetime.datetime.now()) stock_transaction_table = StockTransactionTable() stock_transaction_table.add_stock_transaction(stock_transaction) return def process_stock(self, stock_symbol): # get remaining cash for the stock stock_cash_table = StockCashTable() stock_cash = stock_cash_table.get_stock_cash_by_symbol(stock_symbol) # get current price of the stock stock_price = self.trade.get_stock_price(stock_symbol) print("process stock: " + stock_symbol) print("remaining_cash={0}".format(stock_cash.amount)) print("stock_price={0}".format(stock_price)) if(abs(stock_price) < 0.005): return stock_price_range_table = StockPriceRangeTable() stock_price_range = stock_price_range_table.get_stock_stock_price_range_by_symbol(stock_symbol) price_low = stock_price_range.get_price_low() price_high = stock_price_range.get_price_high() simple_algorithm = SimpleAlgorithm(stock_symbol, price_low, price_high, stock_price) simple_algorithm.calculate() buy_or_sell = simple_algorithm.get_suggested_buy_or_sell() suggested_amount = simple_algorithm.get_suggested_amount() result = "Symbol: {0}\nBuy or Sell: {1}\nAmount: {2}".format(stock_symbol, buy_or_sell, suggested_amount) print(result) amount = int(suggested_amount/100) * 100 # we suppost we need 10 for transaction service fee, which is a big enough number # for normal transaction if (buy_or_sell == "Buy"): cash_offset = -1 * (amount * stock_price + 10) else: cash_offset = amount * stock_price - 10 if (amount >= 100): debug_msg = "stock_symbol: {0}\nbuy_or_sell: {1}\namount: {2}\nstock_price: {3}".format(stock_symbol, buy_or_sell, amount, stock_price) self.logger.debug(debug_msg) debug_msg = "cash_offset: {0}".format(cash_offset) self.logger.debug(debug_msg) if (buy_or_sell == "Buy"): commission_id = self.trade.buy_stock(stock_symbol, stock_price, amount) time.sleep(3) commission_state = self.trade.get_commission_state(commission_id) if (commission_state != "已成"): result = self.trade.cancel_commission(commission_id) if (result != 1): commission_state = self.trade.get_commission_state(commission_id) if (commission_state == "已成"): self.add_transaction(stock_symbol, buy_or_sell, amount, stock_price) self.update_cash_table(stock_symbol, cash_offset) else: print("Unknown error in canceling transaction") self.logger.debug("Unknown error in canceling transaction.") else: self.add_transaction(stock_symbol, buy_or_sell, amount, stock_price) self.update_cash_table(stock_symbol, cash_offset) elif (buy_or_sell == "Sell"): commission_id = self.trade.sell_stock(stock_symbol, stock_price, amount) time.sleep(3) commission_state = self.trade.get_commission_state(commission_id) if (commission_state != "已成"): result = self.trade.cancel_commission(commission_id) if (result != 1): commission_state = self.trade.get_commission_state(commission_id) if (commission_state == "已成"): self.add_transaction(stock_symbol, buy_or_sell, amount, stock_price) self.update_cash_table(stock_symbol, cash_offset) else: print("Unknown error in canceling transaction") self.logger.debug("Unknown error in canceling transaction.") else: self.add_transaction(stock_symbol, buy_or_sell, amount, stock_price) self.update_cash_table(stock_symbol, cash_offset) else: print("Error!") return