def process_order(self, event, order): return create_transaction( event, order, event.price + (self.spread / 2.0 * order.direction), order.amount, )
def process_order(self, event, order): max_volume = self.volume_limit * event.volume # price impact accounts for the total volume of transactions # created against the current minute bar # 价格影响占当前分钟栏创建的交易总量 remaining_volume = max_volume - self.volume_for_bar if remaining_volume < 1: # we can't fill any more transactions raise LiquidityExceeded() # the current order amount will be the min of the # volume available in the bar or the open amount. cur_volume = int(min(remaining_volume, abs(order.open_amount))) if cur_volume < 1: return # tally the current amount into our total amount ordered. # total amount will be used to calculate price impact total_volume = self.volume_for_bar + cur_volume volume_share = min(total_volume / event.volume, self.volume_limit) simulated_impact = volume_share ** 2 \ * math.copysign(self.price_impact, order.direction) \ * event.open if order.give_price==None: impacted_price = event.close + simulated_impact else: impacted_price = order.give_price+simulated_impact print u'收盘价',event.close,u'给定价',order.give_price,u'here里面' #print simulated_impact,u'滑点情况' #impacted_price = event.close + simulated_impact #print event ,u'event 情况' #raw_input() if order.limit: # this is tricky! if an order with a limit price has reached # the limit price, we will try to fill the order. do not fill # these shares if the impacted price is worse than the limit # price. return early to avoid creating the transaction. # buy order is worse if the impacted price is greater than # the limit price. sell order is worse if the impacted price # is less than the limit price if (order.direction > 0 and impacted_price > order.limit) or \ (order.direction < 0 and impacted_price < order.limit): return return create_transaction( event, order, impacted_price, math.copysign(cur_volume, order.direction) )
def process_order(self, event, order): max_volume = self.volume_limit * event.volume # price impact accounts for the total volume of transactions # created against the current minute bar remaining_volume = max_volume - self.volume_for_bar if remaining_volume < 1: # we can't fill any more transactions raise LiquidityExceeded() # the current order amount will be the min of the # volume available in the bar or the open amount. cur_volume = int(min(remaining_volume, abs(order.open_amount))) if cur_volume < 1: return # tally the current amount into our total amount ordered. # total amount will be used to calculate price impact total_volume = self.volume_for_bar + cur_volume volume_share = min(total_volume / event.volume, self.volume_limit) simulated_impact = volume_share ** 2 \ * math.copysign(self.price_impact, order.direction) \ * event.open impacted_price = event.open + simulated_impact if order.limit: # this is tricky! if an order with a limit price has reached # the limit price, we will try to fill the order. do not fill # these shares if the impacted price is worse than the limit # price. return early to avoid creating the transaction. # buy order is worse if the impacted price is greater than # the limit price. sell order is worse if the impacted price # is less than the limit price if (order.direction > 0 and impacted_price > order.limit) or \ (order.direction < 0 and impacted_price < order.limit): return return create_transaction( event, order, impacted_price, math.copysign(cur_volume, order.direction) )
def simulate(self, data, asset, orders_for_asset): self._volume_for_bar = 0 volume = data.current(asset, "volume") if volume == 0: return # can use the close price, since we verified there's volume in this # bar. price = data.current(asset, "close") # BEGIN # # Remove this block after fixing data to ensure volume always has # corresponding price. if isnull(price): return # END dt = data.current_dt for order in orders_for_asset: if order.open_amount == 0: continue order.check_triggers(price, dt) if not order.triggered: continue txn = None try: execution_price, execution_volume = \ self.process_order(data, order) if execution_price is not None: txn = create_transaction( order, data.current_dt, execution_price, execution_volume ) except LiquidityExceeded: break if txn: self._volume_for_bar += abs(txn.amount) yield order, txn
def simulate(self, data, asset, orders_for_asset): self._volume_for_bar = 0 volume = data.current(asset, "volume") if volume == 0: pass # GD meant to avoid delayed executions based on volume checks # return # can use the close price, since we verified there's volume in this # bar. price = data.current(asset, "close") dt = data.current_dt for order in orders_for_asset: if order.open_amount == 0: continue order.check_triggers(price, dt) if not order.triggered: continue txn = None try: execution_price, execution_volume = \ self.process_order(data, order) if execution_price is not None: txn = create_transaction( order, data.current_dt, execution_price, execution_volume ) except LiquidityExceeded: break if txn: self._volume_for_bar += abs(txn.amount) yield order, txn
def simulate(self, data, asset, orders_for_asset): self._volume_for_bar = 0 volume = data.current(asset, "volume") if volume == 0: return # can use the close price, since we verified there's volume in this # bar. # yuusha note: sell at bid, buy at ask dt = data.current_dt for order in orders_for_asset: if order.open_amount == 0: continue if order.amount > 0: price = data.current(order.asset, "ask") else: price = data.current(order.asset, "bid") order.check_triggers(price, dt) if not order.triggered: continue txn = None try: execution_price, execution_volume = \ self.process_order(data, order) if execution_price is not None: txn = create_transaction(order, data.current_dt, execution_price, execution_volume) except LiquidityExceeded: break if txn: self._volume_for_bar += abs(txn.amount) yield order, txn