Example #1
0
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()
Example #2
0
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()