def gen_trades(): session = db_get_session() for i in session.query(OptionActivity).order_by(OptionActivity.ref_date): if i.action_id == ActionType.BUY_TO_OPEN: logger.debug("OPENING OPTION TRADE: %s %s", i.symbol, i.description) q = session.query(OptionTrade).filter( OptionTrade.status_id==TradeStatus.OPEN).filter( OptionTrade.symbol==i.symbol) t = q.first() if (t is None): t = OptionTrade(i.symbol, i.description, i.ref_date) # TODO: need to adjust this later if there are multiple entries. t.entry_price = i.price else: logger.debug("*************** EXISTING OPEN TRADE " "**********************") t.num_opens += 1 t.entry_quantity += i.quantity t.brokerage += i.brokerage t.fees += i.fees t.net_total_cost += (i.net_total_cost * -1) t.gross_total_cost += (i.gross_total_cost * -1) session.add(t) session.commit() i.trade_id = t.id session.commit() elif i.is_closing_action(): logger.debug("CLOSING OPTION TRADE: %s %s", i.symbol, i.description) q = session.query(OptionTrade).filter( OptionTrade.status_id==TradeStatus.OPEN).filter( OptionTrade.symbol==i.symbol) t = q.first() if (t is None): logger.error("*** NO EXISTING OPEN TRADE FOUND " "FOR CLOSING TRADE! **********************") else: t.num_closes += 1 t.exit_quantity += i.quantity if t.exit_quantity > t.entry_quantity: logger.error("*** Exit quantity greater than " "entry quantity! *******************") elif t.entry_quantity - t.exit_quantity == 0: logger.debug("\tTRADE CLOSED") t.status_id = TradeStatus.CLOSED t.close_date = i.ref_date else: logger.warn("*** Trade not yet closed, " "could have multiple parcels. ***********") # This is adjusted later if there are multiple closes. t.exit_price = i.price t.brokerage += i.brokerage t.fees += i.fees t.net_total_cost += i.net_total_cost t.gross_total_cost += i.gross_total_cost i.trade_id = t.id session.commit() else: logger.debug("\tTODO: %s %s", i.symbol, i.description) # # Find any trades with more than one closing trade, and adjust exit price. # for t in session.query(OptionTrade).filter( OptionTrade.status_id==TradeStatus.CLOSED).filter( OptionTrade.num_closes>1): logger.debug("*** Adjusting exit price, %d closes for OPTION trade: %s %s", t.num_closes, t.symbol, t.description) q = session.query(OptionActivity).filter( OptionActivity.action_id==ActionType.SELL_TO_CLOSE).filter( OptionActivity.trade_id==t.id) l = q.all() if len(l) == 0: logger.error("*** No closing trades found!!! ******") continue if len(l) != t.num_closes: logger.error("*** Number of closing trades does not match " "num_closes value!!! ******") t.exit_price = decimal.Decimal(0) for a in l: t.exit_price += a.price t.exit_price /= t.num_closes session.commit()
from eto.util import init_logging from eto.models import OptionActivity, ModelsError, db_get_session init_logging(logging.DEBUG) logger = logging.getLogger(__file__) logger.info("IMPORTING ETO DATA: " + str(datetime.datetime.now())) if (len(sys.argv) > 1): input_filename = sys.argv[1] logger.info("Using input file: " + input_filename) else: sys.exit("Usage: import_activity.py <inputfile>") session = db_get_session() with open(input_filename, 'rb') as csvfile: reader = csv.reader(csvfile) for row in reader: logger.debug("[%s %s %s]", row[0], row[1], row[2]) try: a = OptionActivity(row) session.add(a) except ModelsError as e: logger.error("****** ACTIVITY ERROR AT LINE %d" % (reader.line_num)) logger.error("****** " + e.msg) session.commit()