From 47b256ea90e135edfc3ff05dacfd340cbb1bcb8b Mon Sep 17 00:00:00 2001 From: "vn.py" Date: Thu, 7 Nov 2019 10:41:35 +0800 Subject: [PATCH] [Mod] round float number position to desired decimals for inverse contracts --- vnpy/app/spread_trading/algo.py | 9 +++++++++ vnpy/app/spread_trading/base.py | 2 ++ vnpy/app/spread_trading/template.py | 16 ++++++++++++---- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/vnpy/app/spread_trading/algo.py b/vnpy/app/spread_trading/algo.py index db0aec8f..53f1ba41 100644 --- a/vnpy/app/spread_trading/algo.py +++ b/vnpy/app/spread_trading/algo.py @@ -2,6 +2,7 @@ from typing import Any from vnpy.trader.constant import Direction, Offset from vnpy.trader.object import (TickData, OrderData, TradeData) +from vnpy.trader.utility import round_to from .template import SpreadAlgoTemplate from .base import SpreadData @@ -111,19 +112,27 @@ class SpreadTakerAlgo(SpreadAlgoTemplate): # Calcualte spread volume to hedge active_leg = self.spread.active_leg active_traded = self.leg_traded[active_leg.vt_symbol] + active_traded = round_to(active_traded, self.spread.min_volume) hedge_volume = self.spread.calculate_spread_volume( active_leg.vt_symbol, active_traded ) + self.write_log( + f"active {active_leg.vt_symbol} traded: {active_traded} hedge_volume: {hedge_volume}") + # Calculate passive leg target volume and do hedge for leg in self.spread.passive_legs: passive_traded = self.leg_traded[leg.vt_symbol] + passive_traded = round_to(passive_traded, self.spread.min_volume) + passive_target = self.spread.calculate_leg_volume( leg.vt_symbol, hedge_volume ) + self.write_log( + f"hedge {leg.vt_symbol} traded: {passive_traded} target: {passive_target}") leg_order_volume = passive_target - passive_traded if leg_order_volume: diff --git a/vnpy/app/spread_trading/base.py b/vnpy/app/spread_trading/base.py index 3e3b5805..4c330b24 100644 --- a/vnpy/app/spread_trading/base.py +++ b/vnpy/app/spread_trading/base.py @@ -39,11 +39,13 @@ class LegData: # Contract data self.size: float = 0 self.net_position: bool = False + self.min_volume: float = 0 def update_contract(self, contract: ContractData): """""" self.size = contract.size self.net_position = contract.net_position + self.min_volume = contract.min_volume def update_tick(self, tick: TickData): """""" diff --git a/vnpy/app/spread_trading/template.py b/vnpy/app/spread_trading/template.py index c912be6c..0d8838f3 100644 --- a/vnpy/app/spread_trading/template.py +++ b/vnpy/app/spread_trading/template.py @@ -1,12 +1,11 @@ from collections import defaultdict from typing import Dict, List, Set -from math import floor, ceil from copy import copy from vnpy.trader.object import TickData, TradeData, OrderData, ContractData from vnpy.trader.constant import Direction, Status, Offset -from vnpy.trader.utility import virtual +from vnpy.trader.utility import virtual, floor_to, ceil_to, round_to from .base import SpreadData, calculate_inverse_volume @@ -204,6 +203,10 @@ class SpreadAlgoTemplate: else: volume = volume * price / size + # Round order volume to min_volume of contract + leg = self.spread.legs[vt_symbol] + volume = round_to(volume, leg.min_volume) + vt_orderids = self.algo_engine.send_order( self, vt_symbol, @@ -241,12 +244,17 @@ class SpreadAlgoTemplate: 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(adjusted_leg_traded) + adjusted_leg_traded = floor_to( + adjusted_leg_traded, self.spread.min_volume) else: - adjusted_leg_traded = ceil(adjusted_leg_traded) + adjusted_leg_traded = ceil_to( + adjusted_leg_traded, self.spread.min_volume) if not n: self.traded = adjusted_leg_traded