def calculate_traded(self): """""" # Calculate traded volume self.traded = 0 for n, leg in enumerate(self.spread.legs.values()): leg_traded = self.leg_traded[leg.vt_symbol] trading_multiplier = self.spread.trading_multipliers[leg.vt_symbol] adjusted_leg_traded = leg_traded / trading_multiplier adjusted_leg_traded = round_to(adjusted_leg_traded, self.spread.min_volume) if adjusted_leg_traded > 0: adjusted_leg_traded = floor_to(adjusted_leg_traded, self.spread.min_volume) else: adjusted_leg_traded = ceil_to(adjusted_leg_traded, self.spread.min_volume) if not n: self.traded = adjusted_leg_traded else: if adjusted_leg_traded > 0: self.traded = min(self.traded, adjusted_leg_traded) elif adjusted_leg_traded < 0: self.traded = max(self.traded, adjusted_leg_traded) else: self.traded = 0 self.traded_volume = abs(self.traded) if self.target > 0 and self.traded >= self.target: self.status = Status.ALLTRADED elif self.target < 0 and self.traded <= self.target: self.status = Status.ALLTRADED elif not self.traded: self.status = Status.NOTTRADED else: self.status = Status.PARTTRADED # Calculate traded price self.traded_price = 0 for n, leg in enumerate(self.spread.legs.values()): # If any leg is not traded yet, set spread trade price to 0 leg_traded = self.leg_traded[leg.vt_symbol] if not leg_traded: self.traded_price = 0 break leg_cost = self.leg_cost[leg.vt_symbol] leg_price = leg_cost / leg_traded price_multiplier = self.spread.price_multipliers[leg.vt_symbol] self.traded_price += leg_price * price_multiplier self.traded_price = round_to(self.traded_price, self.spread.pricetick)
def calculate_spread_volume(self, vt_symbol: str, leg_volume: float) -> float: """""" leg = self.legs[vt_symbol] trading_multiplier = self.trading_multipliers[leg.vt_symbol] spread_volume = leg_volume / trading_multiplier if spread_volume > 0: spread_volume = floor_to(spread_volume, self.min_volume) else: spread_volume = ceil_to(spread_volume, self.min_volume) return spread_volume
def calculate_traded_volume(self): """""" self.traded = 0 spread = self.spread n = 0 for leg in spread.legs.values(): leg_traded = self.leg_traded[leg.vt_symbol] trading_multiplier = spread.trading_multipliers[leg.vt_symbol] if not trading_multiplier: continue adjusted_leg_traded = leg_traded / trading_multiplier adjusted_leg_traded = round_to(adjusted_leg_traded, spread.min_volume) if adjusted_leg_traded > 0: adjusted_leg_traded = floor_to(adjusted_leg_traded, spread.min_volume) else: adjusted_leg_traded = ceil_to(adjusted_leg_traded, spread.min_volume) if not n: self.traded = adjusted_leg_traded else: if adjusted_leg_traded > 0: self.traded = min(self.traded, adjusted_leg_traded) elif adjusted_leg_traded < 0: self.traded = max(self.traded, adjusted_leg_traded) else: self.traded = 0 n += 1 self.traded_volume = abs(self.traded) if self.target > 0 and self.traded >= self.target: self.status = Status.ALLTRADED elif self.target < 0 and self.traded <= self.target: self.status = Status.ALLTRADED elif not self.traded: self.status = Status.NOTTRADED else: self.status = Status.PARTTRADED
def calculate_pos(self): """""" long_pos = 0 short_pos = 0 for n, leg in enumerate(self.legs.values()): leg_long_pos = 0 leg_short_pos = 0 trading_multiplier = self.trading_multipliers[leg.vt_symbol] if not trading_multiplier: continue inverse_contract = self.inverse_contracts[leg.vt_symbol] if not inverse_contract: net_pos = leg.net_pos else: net_pos = calculate_inverse_volume(leg.net_pos, leg.net_pos_price, leg.size) adjusted_net_pos = net_pos / trading_multiplier if adjusted_net_pos > 0: adjusted_net_pos = floor_to(adjusted_net_pos, self.min_volume) leg_long_pos = adjusted_net_pos else: adjusted_net_pos = ceil_to(adjusted_net_pos, self.min_volume) leg_short_pos = abs(adjusted_net_pos) if not n: long_pos = leg_long_pos short_pos = leg_short_pos else: long_pos = min(long_pos, leg_long_pos) short_pos = min(short_pos, leg_short_pos) if long_pos > 0: self.net_pos = long_pos else: self.net_pos = -short_pos