def create_statements(self, input_fields): """ Creates the records needed for Table.CURRENCY_EXCHANGE. """ try: dba = DatabaseAccess(self.config) statement_currency_exchange = Statement(T_CURRENCY_EXCHANGE) date_created = current_date() date_modified = current_date() records = 0 for fields in input_fields: records = records + 1 #NOTE: we don't need to query, because we always add a new #currency_exchange line. The same value can be used multiple #times, so it's not possible to query if one already exists. statement_currency_exchange.add( records, { 'currency_exchange_id': None, 'currency_from_id': dba.currency_id_from_currency( fields[Input.CURRENCY_FROM]), 'currency_to_id': dba.currency_id_from_currency( fields[Input.CURRENCY_TO]), 'exchange_rate': Decimal(fields[Input.EXCHANGE_RATE]), 'date_created': date_created, 'date_modified': date_modified } ) return statement_currency_exchange except Exception as ex: print Error.CREATE_STATEMENTS_TABLE_CURRENCY_EXCHANGE, ex finally: dba = None
def create_statements(self, input_fields): """ Creates the records needed for Table.FINANCE and returns them as a Statement object. """ try: dba = DatabaseAccess(self.config) date_created = current_date() date_modified = current_date() statement_finance = Statement(T_FINANCE) records = 0 currency_exchange_id = dba.first_currency_exchange_id_from_latest() rate_id = dba.first_rate_id_from_latest() for fields in input_fields: account_from_id = dba.account_id_from_account_name( fields[Input.ACCOUNT_FROM], True) account_to_id = dba.account_id_from_account_name( fields[Input.ACCOUNT_TO], False) #NOTE: in the database, the first values in the tables of the #below id's, are empty/dummy values, used for when we are not #dealing with stocks. rate_id = 1 if deals_with_commodities( fields[Input.ACCOUNT_FROM], fields[Input.ACCOUNT_TO] ): rate_id = dba.get_latest_rate_id() amount_value = fields[Input.AMOUNT] if is_negative_amount(fields[Input.ACCOUNT_FROM]): amount_value = Decimal(-1.0) * amount_value records = records + 1 statement_finance.add( records, { 'finance_id': None, 'date': fields[Input.DATE], 'year': fields[Input.DATE].year, 'month': fields[Input.DATE].month, 'day': fields[Input.DATE].day, 'account_from_id': account_from_id, 'account_to_id': account_to_id, 'amount': amount_value, 'comment': fields[Input.COMMENT], 'currency_exchange_id': currency_exchange_id, 'rate_id': rate_id, 'active': 1, 'date_created': date_created, 'date_modified': date_modified } ) currency_exchange_id = currency_exchange_id + 1 print 'test: ', statement_finance.statements_insert return statement_finance except Exception as ex: print Error.CREATE_STATEMENTS_TABLE_FINANCE, ex finally: dba = None
class Rate(CoreModule): """ Rate class. """ def __init__(self, config): """ Initialisation """ self.config = config self.statement_rate = Statement(T_RATE) self.commission = DEFAULT_DECIMAL self.tax = DEFAULT_DECIMAL self.date_created = DEFAULT_DATE self.date_modified = DEFAULT_DATE def create_statements(self, input_fields): """ Creates the records needed for Table.RATE and returns them as a Statement object. """ try: lib = CalculatorFinance() self.date_created = current_date() self.date_modified = current_date() records = 0 for fields in input_fields: if deals_with_commodities(fields[Input.ACCOUNT_FROM], fields[Input.ACCOUNT_TO]): records = records + 1 if fields[Input.AUTOMATIC_FLAG] == 0: self.commission = fields[Input.COMMISSION] self.tax = fields[Input.TAX] else: self.commission = lib.calculate_commission( TRADING_ACCOUNTS[0], fields[Input.MARKET_CODE], fields[Input.COMMODITY_NAME], fields[Input.PRICE], fields[Input.QUANTITY]) # TODO: make a calculate_tax function in the library? self.tax = fields[Input.TAX] self.add_to_statement(records, fields) return self.statement_rate except Exception as ex: print Error.CREATE_STATEMENTS_TABLE_RATE, ex finally: lib = None def add_to_statement(self, records, fields): """ Add the data to the statement list. """ self.statement_rate.add( records, { 'rate_id': None, 'commission': Decimal(self.commission), 'tax': Decimal(self.tax), 'automatic_flag': int(fields[Input.AUTOMATIC_FLAG]), 'date_created': self.date_created, 'date_modified': self.date_modified })
def __init__(self, config): """ Initialisation """ self.config = config self.statement_rate = Statement(T_RATE) self.commission = DEFAULT_DECIMAL self.tax = DEFAULT_DECIMAL self.date_created = DEFAULT_DATE self.date_modified = DEFAULT_DATE
def create_statements(self, input_fields): """ Creates the records needed for Table.CURRENCY_EXCHANGE. """ try: dba = DatabaseAccess(self.config) statement_currency_exchange = Statement(T_CURRENCY_EXCHANGE) date_created = current_date() date_modified = current_date() records = 0 for fields in input_fields: records = records + 1 #NOTE: we don't need to query, because we always add a new #currency_exchange line. The same value can be used multiple #times, so it's not possible to query if one already exists. statement_currency_exchange.add( records, { 'currency_exchange_id': None, 'currency_from_id': dba.currency_id_from_currency( fields[Input.CURRENCY_FROM]), 'currency_to_id': dba.currency_id_from_currency( fields[Input.CURRENCY_TO]), 'exchange_rate': Decimal(fields[Input.EXCHANGE_RATE]), 'date_created': date_created, 'date_modified': date_modified }) return statement_currency_exchange except Exception as ex: print Error.CREATE_STATEMENTS_TABLE_CURRENCY_EXCHANGE, ex finally: dba = None
class Rate(CoreModule): """ Rate class. """ def __init__(self, config): """ Initialisation """ self.config = config self.statement_rate = Statement(T_RATE) self.commission = DEFAULT_DECIMAL self.tax = DEFAULT_DECIMAL self.date_created = DEFAULT_DATE self.date_modified = DEFAULT_DATE def create_statements(self, input_fields): """ Creates the records needed for Table.RATE and returns them as a Statement object. """ try: lib = CalculatorFinance() self.date_created = current_date() self.date_modified = current_date() records = 0 for fields in input_fields: if deals_with_commodities( fields[Input.ACCOUNT_FROM], fields[Input.ACCOUNT_TO] ): records = records + 1 if fields[Input.AUTOMATIC_FLAG] == 0: self.commission = fields[Input.COMMISSION] self.tax = fields[Input.TAX] else: self.commission = lib.calculate_commission( TRADING_ACCOUNTS[0], fields[Input.MARKET_CODE], fields[Input.COMMODITY_NAME], fields[Input.PRICE], fields[Input.QUANTITY] ) # TODO: make a calculate_tax function in the library? self.tax = fields[Input.TAX] self.add_to_statement(records, fields) return self.statement_rate except Exception as ex: print Error.CREATE_STATEMENTS_TABLE_RATE, ex finally: lib = None def add_to_statement(self, records, fields): """ Add the data to the statement list. """ self.statement_rate.add( records, { 'rate_id': None, 'commission': Decimal(self.commission), 'tax': Decimal(self.tax), 'automatic_flag': int(fields[Input.AUTOMATIC_FLAG]), 'date_created': self.date_created, 'date_modified': self.date_modified } )
def __init__(self, config): """ Initialisation """ self.config = config self.statement_trade = Statement(T_TRADE) self.flag_insupdel = StatementType.INSERT self.trade_id = DEFAULT_INT self.market_id = DEFAULT_INT self.commodity_id = DEFAULT_INT self.commodity_name = '' self.date_buy = DEFAULT_DATE self.year_buy = DEFAULT_INT self.month_buy = DEFAULT_INT self.day_buy = DEFAULT_INT self.date_sell = DEFAULT_DATE self.year_sell = DEFAULT_INT self.month_sell = DEFAULT_INT self.day_sell = DEFAULT_INT self.long_flag = DEFAULT_INT self.price_buy = DEFAULT_DECIMAL self.price_buy_orig = DEFAULT_DECIMAL self.price_sell = DEFAULT_DECIMAL self.price_sell_orig = DEFAULT_DECIMAL self.shares_buy = DEFAULT_DECIMAL self.shares_sell = DEFAULT_DECIMAL self.commission_buy = DEFAULT_DECIMAL self.commission_sell = DEFAULT_DECIMAL self.tax_buy = DEFAULT_DECIMAL self.tax_sell = DEFAULT_DECIMAL self.risk_input = DEFAULT_DECIMAL self.risk_input_percent = DEFAULT_DECIMAL self.risk_initial = DEFAULT_DECIMAL self.risk_initial_percent = DEFAULT_DECIMAL self.risk_actual = DEFAULT_DECIMAL self.risk_actual_percent = DEFAULT_DECIMAL self.cost_total = DEFAULT_DECIMAL self.cost_other = DEFAULT_DECIMAL self.amount_buy = DEFAULT_DECIMAL self.amount_sell = DEFAULT_DECIMAL self.amount_buy_simple = DEFAULT_DECIMAL self.amount_sell_simple = DEFAULT_DECIMAL self.stoploss = DEFAULT_DECIMAL self.stoploss_orig = DEFAULT_DECIMAL self.profit_loss = DEFAULT_DECIMAL self.profit_loss_orig = DEFAULT_DECIMAL self.profit_loss_total = DEFAULT_DECIMAL self.profit_loss_total_percent = DEFAULT_DECIMAL self.r_multiple = DEFAULT_DECIMAL self.win_flag = DEFAULT_DECIMAL self.id_buy = DEFAULT_INT self.id_sell = DEFAULT_INT self.drawdown_id = DEFAULT_INT self.pool_at_start = DEFAULT_DECIMAL self.date_expiration = DEFAULT_DATE self.expired_flag = DEFAULT_INT self.spread = DEFAULT_INT self.active = DEFAULT_INT self.date_created = DEFAULT_DATE self.date_modified = DEFAULT_DATE self.trade_record = [] self.open_trade_position = -1
class Trade(CoreModule): """ Trade class. """ def __init__(self, config): """ Initialisation """ self.config = config self.statement_trade = Statement(T_TRADE) self.flag_insupdel = StatementType.INSERT self.trade_id = DEFAULT_INT self.market_id = DEFAULT_INT self.commodity_id = DEFAULT_INT self.commodity_name = '' self.date_buy = DEFAULT_DATE self.year_buy = DEFAULT_INT self.month_buy = DEFAULT_INT self.day_buy = DEFAULT_INT self.date_sell = DEFAULT_DATE self.year_sell = DEFAULT_INT self.month_sell = DEFAULT_INT self.day_sell = DEFAULT_INT self.long_flag = DEFAULT_INT self.price_buy = DEFAULT_DECIMAL self.price_buy_orig = DEFAULT_DECIMAL self.price_sell = DEFAULT_DECIMAL self.price_sell_orig = DEFAULT_DECIMAL self.shares_buy = DEFAULT_DECIMAL self.shares_sell = DEFAULT_DECIMAL self.commission_buy = DEFAULT_DECIMAL self.commission_sell = DEFAULT_DECIMAL self.tax_buy = DEFAULT_DECIMAL self.tax_sell = DEFAULT_DECIMAL self.risk_input = DEFAULT_DECIMAL self.risk_input_percent = DEFAULT_DECIMAL self.risk_initial = DEFAULT_DECIMAL self.risk_initial_percent = DEFAULT_DECIMAL self.risk_actual = DEFAULT_DECIMAL self.risk_actual_percent = DEFAULT_DECIMAL self.cost_total = DEFAULT_DECIMAL self.cost_other = DEFAULT_DECIMAL self.amount_buy = DEFAULT_DECIMAL self.amount_sell = DEFAULT_DECIMAL self.amount_buy_simple = DEFAULT_DECIMAL self.amount_sell_simple = DEFAULT_DECIMAL self.stoploss = DEFAULT_DECIMAL self.stoploss_orig = DEFAULT_DECIMAL self.profit_loss = DEFAULT_DECIMAL self.profit_loss_orig = DEFAULT_DECIMAL self.profit_loss_total = DEFAULT_DECIMAL self.profit_loss_total_percent = DEFAULT_DECIMAL self.r_multiple = DEFAULT_DECIMAL self.win_flag = DEFAULT_DECIMAL self.id_buy = DEFAULT_INT self.id_sell = DEFAULT_INT self.drawdown_id = DEFAULT_INT self.pool_at_start = DEFAULT_DECIMAL self.date_expiration = DEFAULT_DATE self.expired_flag = DEFAULT_INT self.spread = DEFAULT_INT self.active = DEFAULT_INT self.date_created = DEFAULT_DATE self.date_modified = DEFAULT_DATE self.trade_record = [] self.open_trade_position = -1 def create_statements(self, input_fields, statements_finance): """ Creates the records needed for Table.TRADE and returns them as a Statement object. """ #NOTE: price_buy will be fields['i_price'] #When we buy more, it will be overwritten! #Trading without adding to positions is assumed by this code! try: dba = DatabaseAccess(self.config) calc = CalculatorFinance() self.date_created = current_date() self.date_modified = current_date() records = 0 self.finance_id = dba.first_finance_id_from_latest() if self.finance_id != -1: for fields in input_fields: if deals_with_commodities(fields[Input.ACCOUNT_FROM], fields[Input.ACCOUNT_TO]): records = records + 1 # GENERAL INFO AT START self.general_info_at_start(dba, calc, fields) # UPDATE/INSERT print "test: invade_started = ", (self.open_trade_position > -1) if self.open_trade_position > -1: self.update_info(dba, calc, fields) else: self.insert_info(dba, calc, fields) # GENERAL VARIABLES THAT CAN BE CALCULATED # ON THE DATA WE HAVE self.general_info_at_end(dba, fields, self.trade_record) # TEST INFO #self.print_test_info() # ADDING THE STATEMENTS self.add_to_statement(records) self.finance_id = self.finance_id + 1 return self.statement_trade except Exception as ex: print Error.CREATE_STATEMENTS_TABLE_TRADE, ex finally: calc = None dba = None def general_info_at_start(self, dba, calc, fields): """ General info at the start of the trade. """ try: self.market_id = dba.market_id_from_market( fields[Input.MARKET_CODE]) self.commodity_id = dba.commodity_id_from_commodity_name( fields[Input.COMMODITY_NAME], self.market_id) self.open_trade_position = dba.open_trade_position( self.market_id, self.commodity_id, T_TRADE) self.finance_record = dba.get_finance_record(self.finance_id) self.trade_record = dba.get_trade_record(self.open_trade_position) self.long_flag = dba.get_long_flag_value( fields[Input.ACCOUNT_FROM], fields[Input.ACCOUNT_TO], self.trade_record) self.spread = fields[Input.SPREAD] except Exception as ex: print Error.CREATE_STATEMENTS_TABLE_TRADE, ex def update_info(self, dba, calc, fields): """ Update info. """ #NOTE: Correct way of updating = Supplier.query.filter(<your stuff here, or user filter_by, or whatever is in your where clause>).update(values) #e.g.: session.query(Supplier).filter_by(id=2).update({"name": u"Mayowa"}) #TABLE_TRADE.query.filter(market_name=...,commodity_name=...).update({"date_...": date_... etc.}) try: self.flag_insupdel = StatementType.UPDATE self.trade_id = self.trade_record['trade_id'] ## buy/sell related fields if (we_are_buying(fields[Input.ACCOUNT_FROM], fields[Input.ACCOUNT_TO]) and self.trade_record['id_buy'] == -1): self.id_buy = self.finance_id self.id_sell = self.trade_record['id_sell'] self.date_buy = fields[Input.DATE] self.date_sell = self.trade_record['date_sell'] self.price_buy = calc.convert_from_orig( fields[Input.PRICE], fields[Input.EXCHANGE_RATE]) self.price_buy_orig = fields[Input.PRICE] self.price_sell = self.trade_record['price_sell'] self.price_sell_orig = self.trade_record['price_sell_orig'] self.shares_buy = fields[Input.QUANTITY] self.shares_sell = self.trade_record['shares_sell'] self.commission_buy = fields[Input.COMMISSION] self.commission_sell = self.trade_record['commission_sell'] self.tax_buy = fields[Input.TAX] self.tax_sell = self.trade_record['tax_sell'] self.amount_buy = fields[Input.AMOUNT] self.amount_buy_simple = calc.calculate_amount_simple( calc.convert_from_orig(fields[Input.PRICE], fields[Input.EXCHANGE_RATE]), fields[Input.QUANTITY]) self.amount_sell = self.trade_record['amount_sell'] self.amount_sell_simple = self.trade_record[ 'amount_sell_simple'] elif (not we_are_buying(fields[Input.ACCOUNT_FROM], fields[Input.ACCOUNT_TO]) and self.trade_record['id_sell'] == -1): self.id_buy = self.trade_record['id_buy'] self.id_sell = self.finance_id self.date_buy = self.trade_record['date_buy'] self.date_sell = fields[Input.DATE] self.price_buy = self.trade_record['price_buy'] self.price_buy_orig = self.trade_record['price_buy_orig'] self.price_sell = calc.convert_from_orig( fields[Input.PRICE], fields[Input.EXCHANGE_RATE]) self.price_sell_orig = fields[Input.PRICE] self.shares_buy = self.trade_record['shares_buy'] self.shares_sell = fields[Input.QUANTITY] self.commission_buy = self.trade_record['commission_buy'] self.commission_sell = fields[Input.COMMISSION] self.tax_buy = self.trade_record['tax_buy'] self.tax_sell = fields[Input.TAX] self.amount_buy = self.trade_record['amount_buy'] self.amount_buy_simple = self.trade_record['amount_buy_simple'] self.amount_sell = fields[Input.AMOUNT] self.amount_sell_simple = calc.calculate_amount_simple( calc.convert_from_orig(fields[Input.PRICE], fields[Input.EXCHANGE_RATE]), fields[Input.QUANTITY]) else: raise Exception("{0} already contains a sell or buy record" " and you are trying to add one like it" " again?".format(T_TRADE)) self.stoploss = self.trade_record['stoploss'] self.stoploss_orig = self.trade_record['stoploss_orig'] self.profit_loss = calc.calculate_profit_loss( self.price_buy, self.shares_buy, self.price_sell, self.shares_sell, self.tax_buy, self.tax_sell, self.commission_buy, self.commission_sell, self.long_flag) self.profit_loss_orig = calc.convert_to_orig( self.profit_loss, fields[Input.EXCHANGE_RATE]) self.profit_loss_total = calc.calculate_profit_loss_total( self.price_buy, self.shares_buy, self.price_sell, self.shares_sell, self.tax_buy, self.tax_sell, self.commission_buy, self.commission_sell, self.long_flag) self.profit_loss_total_percent = ( self.profit_loss_total / self.amount_buy_simple) * Decimal(100.0) self.pool_at_start = self.trade_record['pool_at_start'] self.date_created = self.trade_record['date_created'] self.risk_input = self.trade_record['risk_input'] self.risk_input_percent = self.trade_record['risk_input_percent'] self.risk_initial = self.trade_record['risk_initial'] self.risk_initial_percent = ( self.risk_initial / self.amount_buy_simple) * Decimal(100.0) self.risk_actual = calc.calculate_risk_actual( self.price_buy, self.shares_buy, self.tax_buy, self.commission_buy, self.price_sell, self.shares_sell, self.tax_sell, self.commission_sell, self.stoploss, self.risk_initial, self.profit_loss, self.long_flag) self.risk_actual_percent = ( self.risk_actual / get_pool_without_margin( fields[Input.POOL], dba.get_margin_pool())) * Decimal(100.0) self.cost_total = calc.calculate_cost_total( self.tax_buy, self.commission_buy, self.tax_sell, self.commission_sell) self.cost_other = calc.calculate_cost_other( self.cost_total, self.profit_loss) self.win_flag = dba.get_win_flag_value(self.price_buy, self.price_sell) self.drawdown_id = self.trade_record['drawdown_id'] self.r_multiple = calc.calculate_r_multiple( self.profit_loss, self.risk_initial) self.date_expiration = self.trade_record['date_expiration'] # TODO: for investing, id_buy/sell is id_firstbuy and id_firstsell # and expiration flag should only be set at the end of the trade # when # the trade is closed. This means that date_buy and date_sell is not # enough to determine if a trade is closed or not. The total shares # should also be 0 when added up OR shares_buy = shares_sell. # So add: #if trade_closed: (or something like that) self.expired_flag = (1 if (self.date_sell > self.date_expiration) and (self.date_expiration != DEFAULT_DATE) else 0) except Exception as ex: print Error.CREATE_STATEMENTS_TABLE_TRADE, ex def insert_info(self, dba, calc, fields): """ Insert info. """ try: self.flag_insupdel = StatementType.INSERT self.trade_id = None # insert: new one created automatically ## buy/sell related fields if we_are_buying(fields[Input.ACCOUNT_FROM], fields[Input.ACCOUNT_TO]): self.id_buy = self.finance_id self.id_sell = -1 self.date_buy = fields[Input.DATE] self.date_sell = DEFAULT_DATE self.price_buy = calc.convert_from_orig( fields[Input.PRICE], fields[Input.EXCHANGE_RATE]) self.price_buy_orig = fields[Input.PRICE] self.price_sell = DEFAULT_DECIMAL self.price_sell_orig = DEFAULT_DECIMAL self.shares_buy = fields[Input.QUANTITY] self.shares_sell = DEFAULT_INT # TODO: commission and tax from T_RATE, # when fields[Input.AUTOMATIC_FLAG] is 1 self.commission_buy = fields[Input.COMMISSION] self.commission_sell = DEFAULT_DECIMAL self.amount_buy = fields[Input.AMOUNT] self.amount_sell = DEFAULT_DECIMAL self.amount_buy_simple = calc.calculate_amount_simple( calc.convert_from_orig(fields[Input.PRICE], fields[Input.EXCHANGE_RATE]), fields[Input.QUANTITY]) self.amount_sell_simple = DEFAULT_DECIMAL self.tax_buy = fields[Input.TAX] self.tax_sell = DEFAULT_DECIMAL self.risk_initial_percent = ( self.risk_initial / self.amount_buy_simple) * Decimal(100.0) else: self.id_buy = -1 self.id_sell = self.finance_id self.date_sell = fields[Input.DATE] self.date_buy = DEFAULT_DATE self.price_buy = DEFAULT_DECIMAL self.price_buy_orig = DEFAULT_DECIMAL self.price_sell = calc.convert_from_orig( fields[Input.PRICE], fields[Input.EXCHANGE_RATE]) self.price_sell_orig = fields[Input.PRICE] self.shares_buy = DEFAULT_INT self.shares_sell = fields[Input.QUANTITY] self.commission_buy = DEFAULT_DECIMAL # TODO: commission and tax from T_RATE (see also higher) self.commission_sell = fields[Input.COMMISSION] self.amount_buy = DEFAULT_DECIMAL self.amount_sell = fields[Input.AMOUNT] self.amount_buy_simple = DEFAULT_DECIMAL self.amount_sell_simple = calc.calculate_amount_simple( calc.convert_from_orig(fields[Input.PRICE], fields[Input.EXCHANGE_RATE]), fields[Input.QUANTITY]) self.tax_buy = DEFAULT_DECIMAL self.tax_sell = fields[Input.TAX] self.risk_initial_percent = Decimal( 100.0) * self.risk_initial / self.amount_sell_simple self.stoploss = calc.calculate_stoploss( calc.convert_from_orig(fields[Input.PRICE], fields[Input.EXCHANGE_RATE]), fields[Input.QUANTITY], fields[Input.TAX], fields[Input.COMMISSION], fields[Input.RISK], get_pool_without_margin(fields[Input.POOL], dba.get_margin_pool()), self.long_flag) self.stoploss_orig = calc.convert_to_orig( self.stoploss, fields[Input.EXCHANGE_RATE]) self.profit_loss = DEFAULT_DECIMAL #Only calculated at end of trade. self.profit_loss_orig = DEFAULT_DECIMAL self.profit_loss_total = DEFAULT_DECIMAL self.profit_loss_total_percent = DEFAULT_DECIMAL self.pool_at_start = fields[Input.POOL] self.risk_input = calc.calculate_risk_input( get_pool_without_margin(fields[Input.POOL], dba.get_margin_pool()), fields[Input.RISK]) self.risk_input_percent = fields[Input.RISK] self.risk_initial = calc.calculate_risk_initial( calc.convert_from_orig(fields[Input.PRICE], fields[Input.EXCHANGE_RATE]), fields[Input.QUANTITY], fields[Input.TAX], fields[Input.COMMISSION], self.stoploss, self.long_flag) self.risk_actual = DEFAULT_DECIMAL self.risk_actual_percent = DEFAULT_DECIMAL self.cost_total = DEFAULT_DECIMAL self.cost_other = DEFAULT_DECIMAL self.win_flag = -1 # not yet finished, we can not know it yet. self.drawdown_id = dba.new_drawdown_record() self.r_multiple = DEFAULT_DECIMAL self.date_expiration = fields[Input.DATE_EXPIRATION] self.expired_flag = DEFAULT_INT except Exception as ex: print Error.CREATE_STATEMENTS_TABLE_TRADE, ex def general_info_at_end(self, dba, fields, trade_record): """ General info at the end of the trade. """ try: self.profit_loss_percent = ( self.profit_loss / get_pool_without_margin( self.pool_at_start, dba.get_margin_pool())) self.year_buy = self.date_buy.year self.month_buy = self.date_buy.month self.day_buy = self.date_buy.day self.year_sell = self.date_sell.year self.month_sell = self.date_sell.month self.day_sell = self.date_sell.day except Exception as ex: print Error.CREATE_STATEMENTS_TABLE_TRADE, ex def add_to_statement(self, records): """ Add the data to the statement list. """ self.statement_trade.add( records, { 'trade_id': self.trade_id, 'market_id': int(self.market_id), 'commodity_id': int(self.commodity_id), 'date_buy': self.date_buy, 'year_buy': self.year_buy, 'month_buy': self.month_buy, 'day_buy': self.day_buy, 'date_sell': self.date_sell, 'year_sell': self.year_sell, 'month_sell': self.month_sell, 'day_sell': self.day_sell, 'long_flag': int(self.long_flag), 'price_buy': Decimal(self.price_buy), 'price_buy_orig': Decimal(self.price_buy_orig), 'price_sell': Decimal(self.price_sell), 'price_sell_orig': Decimal(self.price_sell_orig), 'shares_buy': int(self.shares_buy), 'shares_sell': int(self.shares_sell), 'commission_buy': Decimal(self.commission_buy), 'commission_sell': Decimal(self.commission_sell), 'tax_buy': Decimal(self.tax_buy), 'tax_sell': Decimal(self.tax_sell), 'amount_buy': Decimal(self.amount_buy), 'amount_sell': Decimal(self.amount_sell), 'amount_buy_simple': Decimal(self.amount_buy_simple), 'amount_sell_simple': Decimal(self.amount_sell_simple), 'risk_input': Decimal(self.risk_input), 'risk_input_percent': Decimal(self.risk_input_percent), 'risk_initial': Decimal(self.risk_initial), 'risk_initial_percent': Decimal(self.risk_initial_percent), 'risk_actual': Decimal(self.risk_actual), 'risk_actual_percent': Decimal(self.risk_actual_percent), 'cost_total': Decimal(self.cost_total), 'cost_other': Decimal(self.cost_other), 'stoploss': Decimal(self.stoploss), 'stoploss_orig': Decimal(self.stoploss_orig), 'profit_loss': Decimal(self.profit_loss), 'profit_loss_orig': Decimal(self.profit_loss_orig), 'profit_loss_total': Decimal(self.profit_loss_total), 'profit_loss_total_percent': Decimal(self.profit_loss_total_percent), 'r_multiple': Decimal(self.r_multiple), 'win_flag': int(self.win_flag), 'id_buy': int(self.id_buy), 'id_sell': int(self.id_sell), 'drawdown_id': int(self.drawdown_id), 'pool_at_start': Decimal(self.pool_at_start), 'date_expiration': self.date_expiration, 'expired_flag': self.expired_flag, 'spread': self.spread, 'active': 1, 'date_created': self.date_created, 'date_modified': self.date_modified }, self.flag_insupdel) def print_test_info(self): """ Print test info. """ print('<print>') print('market_id =', self.market_id) print('commodity_id =', self.commodity_id) print('date_buy =', self.date_buy) print('date_sell =', self.date_sell) print('long_flag =', self.long_flag) print('price_buy =', self.price_buy) print('price_sell =', self.price_sell) print('price_buy_orig =', self.price_buy_orig) print('price_sell_orig =', self.price_sell_orig) print('amount_buy_simple =', self.amount_buy_simple) print('amount_sell_simple =', self.amount_sell_simple) print('risk_input =', self.risk_input) print('risk_input_percent =', self.risk_input_percent) print('risk_initial =', self.risk_initial) print('risk_initial_percent =', self.risk_initial_percent) print('risk_actual =', self.risk_actual) print('risk_actual_percent =', self.risk_actual_percent) print('cost_total =', self.cost_total) print('cost_other =', self.cost_other) print('stoploss =', self.stoploss) print('profit_loss =', self.profit_loss) print('profit_loss_orig =', self.profit_loss_orig) print('profit_loss_total =', self.profit_loss_total) print('profit_loss_total_percent =', self.profit_loss_total_percent) print('r_multiple =', self.r_multiple) print('win_flag =', self.win_flag) print('id_buy =', self.id_buy) print('id_sell =', self.id_sell) print('drawdown_id =', self.drawdown_id) print('pool_at_start =', self.pool_at_start) print('spread=', self.spread) print('date_expiration =', self.date_expiration) print('expired_flag =', self.expired_flag) print('<\print>')
class Trade(CoreModule): """ Trade class. """ def __init__(self, config): """ Initialisation """ self.config = config self.statement_trade = Statement(T_TRADE) self.flag_insupdel = StatementType.INSERT self.trade_id = DEFAULT_INT self.market_id = DEFAULT_INT self.commodity_id = DEFAULT_INT self.commodity_name = '' self.date_buy = DEFAULT_DATE self.year_buy = DEFAULT_INT self.month_buy = DEFAULT_INT self.day_buy = DEFAULT_INT self.date_sell = DEFAULT_DATE self.year_sell = DEFAULT_INT self.month_sell = DEFAULT_INT self.day_sell = DEFAULT_INT self.long_flag = DEFAULT_INT self.price_buy = DEFAULT_DECIMAL self.price_buy_orig = DEFAULT_DECIMAL self.price_sell = DEFAULT_DECIMAL self.price_sell_orig = DEFAULT_DECIMAL self.shares_buy = DEFAULT_DECIMAL self.shares_sell = DEFAULT_DECIMAL self.commission_buy = DEFAULT_DECIMAL self.commission_sell = DEFAULT_DECIMAL self.tax_buy = DEFAULT_DECIMAL self.tax_sell = DEFAULT_DECIMAL self.risk_input = DEFAULT_DECIMAL self.risk_input_percent = DEFAULT_DECIMAL self.risk_initial = DEFAULT_DECIMAL self.risk_initial_percent = DEFAULT_DECIMAL self.risk_actual = DEFAULT_DECIMAL self.risk_actual_percent = DEFAULT_DECIMAL self.cost_total = DEFAULT_DECIMAL self.cost_other = DEFAULT_DECIMAL self.amount_buy = DEFAULT_DECIMAL self.amount_sell = DEFAULT_DECIMAL self.amount_buy_simple = DEFAULT_DECIMAL self.amount_sell_simple = DEFAULT_DECIMAL self.stoploss = DEFAULT_DECIMAL self.stoploss_orig = DEFAULT_DECIMAL self.profit_loss = DEFAULT_DECIMAL self.profit_loss_orig = DEFAULT_DECIMAL self.profit_loss_total = DEFAULT_DECIMAL self.profit_loss_total_percent = DEFAULT_DECIMAL self.r_multiple = DEFAULT_DECIMAL self.win_flag = DEFAULT_DECIMAL self.id_buy = DEFAULT_INT self.id_sell = DEFAULT_INT self.drawdown_id = DEFAULT_INT self.pool_at_start = DEFAULT_DECIMAL self.date_expiration = DEFAULT_DATE self.expired_flag = DEFAULT_INT self.spread = DEFAULT_INT self.active = DEFAULT_INT self.date_created = DEFAULT_DATE self.date_modified = DEFAULT_DATE self.trade_record = [] self.open_trade_position = -1 def create_statements(self, input_fields, statements_finance): """ Creates the records needed for Table.TRADE and returns them as a Statement object. """ #NOTE: price_buy will be fields['i_price'] #When we buy more, it will be overwritten! #Trading without adding to positions is assumed by this code! try: dba = DatabaseAccess(self.config) calc = CalculatorFinance() self.date_created = current_date() self.date_modified = current_date() records = 0 self.finance_id = dba.first_finance_id_from_latest() if self.finance_id != -1: for fields in input_fields: if deals_with_commodities( fields[Input.ACCOUNT_FROM], fields[Input.ACCOUNT_TO] ): records = records + 1 # GENERAL INFO AT START self.general_info_at_start(dba, calc, fields) # UPDATE/INSERT print "test: invade_started = ", (self.open_trade_position > -1) if self.open_trade_position > -1: self.update_info(dba, calc, fields) else: self.insert_info(dba, calc, fields) # GENERAL VARIABLES THAT CAN BE CALCULATED # ON THE DATA WE HAVE self.general_info_at_end(dba, fields, self.trade_record) # TEST INFO #self.print_test_info() # ADDING THE STATEMENTS self.add_to_statement(records) self.finance_id = self.finance_id + 1 return self.statement_trade except Exception as ex: print Error.CREATE_STATEMENTS_TABLE_TRADE, ex finally: calc = None dba = None def general_info_at_start(self, dba, calc, fields): """ General info at the start of the trade. """ try: self.market_id = dba.market_id_from_market( fields[Input.MARKET_CODE]) self.commodity_id = dba.commodity_id_from_commodity_name( fields[Input.COMMODITY_NAME], self.market_id) self.open_trade_position = dba.open_trade_position( self.market_id, self.commodity_id, T_TRADE) self.finance_record = dba.get_finance_record(self.finance_id) self.trade_record = dba.get_trade_record(self.open_trade_position) self.long_flag = dba.get_long_flag_value(fields[Input.ACCOUNT_FROM], fields[Input.ACCOUNT_TO], self.trade_record) self.spread = fields[Input.SPREAD] except Exception as ex: print Error.CREATE_STATEMENTS_TABLE_TRADE, ex def update_info(self, dba, calc, fields): """ Update info. """ #NOTE: Correct way of updating = Supplier.query.filter(<your stuff here, or user filter_by, or whatever is in your where clause>).update(values) #e.g.: session.query(Supplier).filter_by(id=2).update({"name": u"Mayowa"}) #TABLE_TRADE.query.filter(market_name=...,commodity_name=...).update({"date_...": date_... etc.}) try: self.flag_insupdel = StatementType.UPDATE self.trade_id = self.trade_record['trade_id'] ## buy/sell related fields if ( we_are_buying( fields[Input.ACCOUNT_FROM], fields[Input.ACCOUNT_TO] ) and self.trade_record['id_buy'] == -1 ): self.id_buy = self.finance_id self.id_sell = self.trade_record['id_sell'] self.date_buy = fields[Input.DATE] self.date_sell = self.trade_record['date_sell'] self.price_buy = calc.convert_from_orig( fields[Input.PRICE], fields[Input.EXCHANGE_RATE]) self.price_buy_orig = fields[Input.PRICE] self.price_sell = self.trade_record['price_sell'] self.price_sell_orig = self.trade_record['price_sell_orig'] self.shares_buy = fields[Input.QUANTITY] self.shares_sell = self.trade_record['shares_sell'] self.commission_buy = fields[Input.COMMISSION] self.commission_sell = self.trade_record['commission_sell'] self.tax_buy = fields[Input.TAX] self.tax_sell = self.trade_record['tax_sell'] self.amount_buy = fields[Input.AMOUNT] self.amount_buy_simple = calc.calculate_amount_simple( calc.convert_from_orig( fields[Input.PRICE], fields[Input.EXCHANGE_RATE] ), fields[Input.QUANTITY] ) self.amount_sell = self.trade_record['amount_sell'] self.amount_sell_simple = self.trade_record['amount_sell_simple'] elif ( not we_are_buying( fields[Input.ACCOUNT_FROM], fields[Input.ACCOUNT_TO] ) and self.trade_record['id_sell'] == -1 ): self.id_buy = self.trade_record['id_buy'] self.id_sell = self.finance_id self.date_buy = self.trade_record['date_buy'] self.date_sell = fields[Input.DATE] self.price_buy = self.trade_record['price_buy'] self.price_buy_orig = self.trade_record['price_buy_orig'] self.price_sell = calc.convert_from_orig( fields[Input.PRICE], fields[Input.EXCHANGE_RATE] ) self.price_sell_orig = fields[Input.PRICE] self.shares_buy = self.trade_record['shares_buy'] self.shares_sell = fields[Input.QUANTITY] self.commission_buy = self.trade_record['commission_buy'] self.commission_sell = fields[Input.COMMISSION] self.tax_buy = self.trade_record['tax_buy'] self.tax_sell = fields[Input.TAX] self.amount_buy = self.trade_record['amount_buy'] self.amount_buy_simple = self.trade_record['amount_buy_simple'] self.amount_sell = fields[Input.AMOUNT] self.amount_sell_simple = calc.calculate_amount_simple( calc.convert_from_orig( fields[Input.PRICE], fields[Input.EXCHANGE_RATE] ), fields[Input.QUANTITY] ) else: raise Exception( "{0} already contains a sell or buy record" " and you are trying to add one like it" " again?".format(T_TRADE)) self.stoploss = self.trade_record['stoploss'] self.stoploss_orig = self.trade_record['stoploss_orig'] self.profit_loss = calc.calculate_profit_loss( self.price_buy, self.shares_buy, self.price_sell, self.shares_sell, self.tax_buy, self.tax_sell, self.commission_buy, self.commission_sell, self.long_flag) self.profit_loss_orig = calc.convert_to_orig( self.profit_loss, fields[Input.EXCHANGE_RATE] ) self.profit_loss_total = calc.calculate_profit_loss_total( self.price_buy, self.shares_buy, self.price_sell, self.shares_sell, self.tax_buy, self.tax_sell, self.commission_buy, self.commission_sell, self.long_flag) self.profit_loss_total_percent = ( self.profit_loss_total / self.amount_buy_simple ) * Decimal(100.0) self.pool_at_start = self.trade_record['pool_at_start'] self.date_created = self.trade_record['date_created'] self.risk_input = self.trade_record['risk_input'] self.risk_input_percent = self.trade_record['risk_input_percent'] self.risk_initial = self.trade_record['risk_initial'] self.risk_initial_percent = ( self.risk_initial / self.amount_buy_simple ) * Decimal(100.0) self.risk_actual = calc.calculate_risk_actual( self.price_buy, self.shares_buy, self.tax_buy, self.commission_buy, self.price_sell, self.shares_sell, self.tax_sell, self.commission_sell, self.stoploss, self.risk_initial, self.profit_loss, self.long_flag) self.risk_actual_percent = ( self.risk_actual / get_pool_without_margin( fields[Input.POOL], dba.get_margin_pool()) ) * Decimal(100.0) self.cost_total = calc.calculate_cost_total( self.tax_buy, self.commission_buy, self.tax_sell, self.commission_sell) self.cost_other = calc.calculate_cost_other( self.cost_total, self.profit_loss) self.win_flag = dba.get_win_flag_value( self.price_buy, self.price_sell) self.drawdown_id = self.trade_record['drawdown_id'] self.r_multiple = calc.calculate_r_multiple( self.profit_loss, self.risk_initial) self.date_expiration = self.trade_record['date_expiration'] # TODO: for investing, id_buy/sell is id_firstbuy and id_firstsell # and expiration flag should only be set at the end of the trade # when # the trade is closed. This means that date_buy and date_sell is not # enough to determine if a trade is closed or not. The total shares # should also be 0 when added up OR shares_buy = shares_sell. # So add: #if trade_closed: (or something like that) self.expired_flag = ( 1 if (self.date_sell > self.date_expiration) and (self.date_expiration != DEFAULT_DATE) else 0 ) except Exception as ex: print Error.CREATE_STATEMENTS_TABLE_TRADE, ex def insert_info(self, dba, calc, fields): """ Insert info. """ try: self.flag_insupdel = StatementType.INSERT self.trade_id = None # insert: new one created automatically ## buy/sell related fields if we_are_buying( fields[Input.ACCOUNT_FROM], fields[Input.ACCOUNT_TO] ): self.id_buy = self.finance_id self.id_sell = -1 self.date_buy = fields[Input.DATE] self.date_sell = DEFAULT_DATE self.price_buy = calc.convert_from_orig( fields[Input.PRICE], fields[Input.EXCHANGE_RATE] ) self.price_buy_orig = fields[Input.PRICE] self.price_sell = DEFAULT_DECIMAL self.price_sell_orig = DEFAULT_DECIMAL self.shares_buy = fields[Input.QUANTITY] self.shares_sell = DEFAULT_INT # TODO: commission and tax from T_RATE, # when fields[Input.AUTOMATIC_FLAG] is 1 self.commission_buy = fields[Input.COMMISSION] self.commission_sell = DEFAULT_DECIMAL self.amount_buy = fields[Input.AMOUNT] self.amount_sell = DEFAULT_DECIMAL self.amount_buy_simple = calc.calculate_amount_simple( calc.convert_from_orig( fields[Input.PRICE], fields[Input.EXCHANGE_RATE] ), fields[Input.QUANTITY] ) self.amount_sell_simple = DEFAULT_DECIMAL self.tax_buy = fields[Input.TAX] self.tax_sell = DEFAULT_DECIMAL self.risk_initial_percent = ( self.risk_initial / self.amount_buy_simple ) * Decimal(100.0) else: self.id_buy = -1 self.id_sell = self.finance_id self.date_sell = fields[Input.DATE] self.date_buy = DEFAULT_DATE self.price_buy = DEFAULT_DECIMAL self.price_buy_orig = DEFAULT_DECIMAL self.price_sell = calc.convert_from_orig(fields[Input.PRICE], fields[Input.EXCHANGE_RATE]) self.price_sell_orig = fields[Input.PRICE] self.shares_buy = DEFAULT_INT self.shares_sell = fields[Input.QUANTITY] self.commission_buy = DEFAULT_DECIMAL # TODO: commission and tax from T_RATE (see also higher) self.commission_sell = fields[Input.COMMISSION] self.amount_buy = DEFAULT_DECIMAL self.amount_sell = fields[Input.AMOUNT] self.amount_buy_simple = DEFAULT_DECIMAL self.amount_sell_simple = calc.calculate_amount_simple( calc.convert_from_orig(fields[Input.PRICE], fields[Input.EXCHANGE_RATE]) , fields[Input.QUANTITY]) self.tax_buy = DEFAULT_DECIMAL self.tax_sell = fields[Input.TAX] self.risk_initial_percent = Decimal(100.0)*self.risk_initial/self.amount_sell_simple self.stoploss = calc.calculate_stoploss( calc.convert_from_orig(fields[Input.PRICE], fields[Input.EXCHANGE_RATE]), fields[Input.QUANTITY], fields[Input.TAX], fields[Input.COMMISSION], fields[Input.RISK], get_pool_without_margin( fields[Input.POOL], dba.get_margin_pool()), self.long_flag) self.stoploss_orig = calc.convert_to_orig(self.stoploss, fields[Input.EXCHANGE_RATE]) self.profit_loss = DEFAULT_DECIMAL #Only calculated at end of trade. self.profit_loss_orig = DEFAULT_DECIMAL self.profit_loss_total = DEFAULT_DECIMAL self.profit_loss_total_percent = DEFAULT_DECIMAL self.pool_at_start = fields[Input.POOL] self.risk_input = calc.calculate_risk_input( get_pool_without_margin( fields[Input.POOL], dba.get_margin_pool()), fields[Input.RISK]) self.risk_input_percent = fields[Input.RISK] self.risk_initial = calc.calculate_risk_initial( calc.convert_from_orig( fields[Input.PRICE], fields[Input.EXCHANGE_RATE] ), fields[Input.QUANTITY], fields[Input.TAX], fields[Input.COMMISSION], self.stoploss, self.long_flag) self.risk_actual = DEFAULT_DECIMAL self.risk_actual_percent = DEFAULT_DECIMAL self.cost_total = DEFAULT_DECIMAL self.cost_other = DEFAULT_DECIMAL self.win_flag = -1 # not yet finished, we can not know it yet. self.drawdown_id = dba.new_drawdown_record() self.r_multiple = DEFAULT_DECIMAL self.date_expiration = fields[Input.DATE_EXPIRATION] self.expired_flag = DEFAULT_INT except Exception as ex: print Error.CREATE_STATEMENTS_TABLE_TRADE, ex def general_info_at_end(self, dba, fields, trade_record): """ General info at the end of the trade. """ try: self.profit_loss_percent = ( self.profit_loss / get_pool_without_margin( self.pool_at_start, dba.get_margin_pool()) ) self.year_buy = self.date_buy.year self.month_buy = self.date_buy.month self.day_buy = self.date_buy.day self.year_sell = self.date_sell.year self.month_sell = self.date_sell.month self.day_sell = self.date_sell.day except Exception as ex: print Error.CREATE_STATEMENTS_TABLE_TRADE, ex def add_to_statement(self, records): """ Add the data to the statement list. """ self.statement_trade.add( records, { 'trade_id': self.trade_id, 'market_id': int(self.market_id), 'commodity_id': int(self.commodity_id), 'date_buy': self.date_buy, 'year_buy': self.year_buy, 'month_buy': self.month_buy, 'day_buy': self.day_buy, 'date_sell': self.date_sell, 'year_sell': self.year_sell, 'month_sell': self.month_sell, 'day_sell': self.day_sell, 'long_flag': int(self.long_flag), 'price_buy': Decimal(self.price_buy), 'price_buy_orig': Decimal(self.price_buy_orig), 'price_sell': Decimal(self.price_sell), 'price_sell_orig': Decimal(self.price_sell_orig), 'shares_buy': int(self.shares_buy), 'shares_sell': int(self.shares_sell), 'commission_buy': Decimal(self.commission_buy), 'commission_sell': Decimal(self.commission_sell), 'tax_buy': Decimal(self.tax_buy), 'tax_sell': Decimal(self.tax_sell), 'amount_buy': Decimal(self.amount_buy), 'amount_sell': Decimal(self.amount_sell), 'amount_buy_simple': Decimal(self.amount_buy_simple), 'amount_sell_simple': Decimal(self.amount_sell_simple), 'risk_input': Decimal(self.risk_input), 'risk_input_percent': Decimal(self.risk_input_percent), 'risk_initial': Decimal(self.risk_initial), 'risk_initial_percent': Decimal(self.risk_initial_percent), 'risk_actual': Decimal(self.risk_actual), 'risk_actual_percent': Decimal(self.risk_actual_percent), 'cost_total': Decimal(self.cost_total), 'cost_other': Decimal(self.cost_other), 'stoploss': Decimal(self.stoploss), 'stoploss_orig': Decimal(self.stoploss_orig), 'profit_loss': Decimal(self.profit_loss), 'profit_loss_orig': Decimal(self.profit_loss_orig), 'profit_loss_total': Decimal(self.profit_loss_total), 'profit_loss_total_percent': Decimal( self.profit_loss_total_percent), 'r_multiple': Decimal(self.r_multiple), 'win_flag': int(self.win_flag), 'id_buy': int(self.id_buy), 'id_sell': int(self.id_sell), 'drawdown_id': int(self.drawdown_id), 'pool_at_start': Decimal(self.pool_at_start), 'date_expiration': self.date_expiration, 'expired_flag': self.expired_flag, 'spread': self.spread, 'active': 1, 'date_created': self.date_created, 'date_modified': self.date_modified }, self.flag_insupdel ) def print_test_info(self): """ Print test info. """ print('<print>') print('market_id =', self.market_id) print('commodity_id =', self.commodity_id) print('date_buy =', self.date_buy) print('date_sell =', self.date_sell) print('long_flag =', self.long_flag) print('price_buy =', self.price_buy) print('price_sell =', self.price_sell) print('price_buy_orig =', self.price_buy_orig) print('price_sell_orig =', self.price_sell_orig) print('amount_buy_simple =', self.amount_buy_simple) print('amount_sell_simple =', self.amount_sell_simple) print('risk_input =', self.risk_input) print('risk_input_percent =', self.risk_input_percent) print('risk_initial =', self.risk_initial) print('risk_initial_percent =', self.risk_initial_percent) print('risk_actual =', self.risk_actual) print('risk_actual_percent =', self.risk_actual_percent) print('cost_total =', self.cost_total) print('cost_other =', self.cost_other) print('stoploss =', self.stoploss) print('profit_loss =', self.profit_loss) print('profit_loss_orig =', self.profit_loss_orig) print('profit_loss_total =', self.profit_loss_total) print('profit_loss_total_percent =', self.profit_loss_total_percent) print('r_multiple =', self.r_multiple) print('win_flag =', self.win_flag) print('id_buy =', self.id_buy) print('id_sell =', self.id_sell) print('drawdown_id =', self.drawdown_id) print('pool_at_start =', self.pool_at_start) print('spread=', self.spread) print('date_expiration =', self.date_expiration) print('expired_flag =', self.expired_flag) print('<\print>')