def update_position(self, current_position, order_amount, current_price, order_type, timestamp): """ :param timestamp: :type timestamp: :param current_position: :type current_position: Position :param order_amount: :type order_amount: :param current_price: :type current_price: :param order_type: :type order_type: """ if order_type == ORDER_TYPE_LONG: need_money = (order_amount * current_price) * (1 + self.slippage + self.buy_cost) if self.account.cash < need_money: if self.rich_mode: self.input_money() else: raise NotEnoughMoneyError() self.account.cash -= need_money # 计算平均价 long_amount = current_position.long_amount + order_amount if long_amount == 0: current_position.average_long_price = 0 current_position.average_long_price = ( current_position.average_long_price * current_position.long_amount + current_price * order_amount) / long_amount current_position.long_amount = long_amount if current_position.trading_t == 0: current_position.available_long += order_amount elif order_type == ORDER_TYPE_SHORT: need_money = (order_amount * current_price) * (1 + self.slippage + self.buy_cost) if self.account.cash < need_money: if self.rich_mode: self.input_money() else: raise NotEnoughMoneyError() self.account.cash -= need_money short_amount = current_position.short_amount + order_amount current_position.average_short_price = ( current_position.average_short_price * current_position.short_amount + current_price * order_amount) / short_amount current_position.short_amount = short_amount if current_position.trading_t == 0: current_position.available_short += order_amount elif order_type == ORDER_TYPE_CLOSE_LONG: self.account.cash += (order_amount * current_price * (1 - self.slippage - self.sell_cost)) # FIXME:如果没卖完,重新计算计算平均价 current_position.available_long -= order_amount current_position.long_amount -= order_amount elif order_type == ORDER_TYPE_CLOSE_SHORT: self.account.cash += 2 * (order_amount * current_position.average_short_price) self.account.cash -= order_amount * current_price * ( 1 + self.slippage + self.sell_cost) current_position.available_short -= order_amount current_position.short_amount -= order_amount # save the order info to db order_id = '{}_{}_{}_{}'.format( self.trader_name, order_type, current_position.entity_id, to_time_str(timestamp, TIME_FORMAT_ISO8601)) order = Order(id=order_id, timestamp=to_pd_timestamp(timestamp), trader_name=self.trader_name, entity_id=current_position.entity_id, order_price=current_price, order_amount=order_amount, order_type=order_type, level=self.level.value, status='success') self.session.add(order) self.session.commit()
def update_position(self, current_position, order_amount, current_price, order_type, timestamp): """ :param timestamp: :type timestamp: :param current_position: :type current_position: Position :param order_amount: :type order_amount: :param current_price: :type current_price: :param order_type: :type order_type: """ if order_type == ORDER_TYPE_LONG: need_money = (order_amount * current_price) * (1 + self.slippage + self.buy_cost) if self.latest_account['cash'] < need_money: raise NotEnoughMoneyError() self.latest_account['cash'] -= need_money # 计算平均价 long_amount = current_position['long_amount'] + order_amount current_position['average_long_price'] = ( current_position['average_long_price'] * current_position['long_amount'] + current_price * order_amount) / long_amount current_position['long_amount'] = long_amount if current_position['trading_t'] == 0: current_position['available_long'] += order_amount elif order_type == ORDER_TYPE_SHORT: need_money = (order_amount * current_price) * (1 + self.slippage + self.buy_cost) if self.latest_account['cash'] < need_money: raise NotEnoughMoneyError() self.latest_account['cash'] -= need_money short_amount = current_position['short_amount'] + order_amount current_position['average_short_price'] = ( current_position['average_short_price'] * current_position['short_amount'] + current_price * order_amount) / short_amount current_position['short_amount'] = short_amount if current_position['trading_t'] == 0: current_position['available_short'] += order_amount elif order_type == ORDER_TYPE_CLOSE_LONG: self.latest_account['cash'] += ( order_amount * current_price * (1 - self.slippage - self.sell_cost)) current_position['available_long'] -= order_amount current_position['long_amount'] -= order_amount elif order_type == ORDER_TYPE_CLOSE_SHORT: self.latest_account['cash'] += 2 * ( order_amount * current_position['average_short_price']) self.latest_account['cash'] -= order_amount * current_price * ( 1 + self.slippage + self.sell_cost) current_position['available_short'] -= order_amount current_position['short_amount'] -= order_amount # save the order info to db order_id = '{}_{}_{}_{}'.format( self.trader_name, order_type, current_position['entity_id'], to_time_str(timestamp, TIME_FORMAT_ISO8601)) order = Order(id=order_id, timestamp=to_pd_timestamp(timestamp), trader_name=self.trader_name, entity_id=current_position['entity_id'], order_price=current_price, order_amount=order_amount, order_type=order_type, level=self.level.value, status='success') self.session.add(order) self.session.commit()