[Add] support for float spread bid/ask volume
This commit is contained in:
parent
c1151dc8fc
commit
bc489d9fab
@ -4,6 +4,7 @@ from datetime import datetime
|
|||||||
|
|
||||||
from vnpy.trader.object import TickData, PositionData, TradeData
|
from vnpy.trader.object import TickData, PositionData, TradeData
|
||||||
from vnpy.trader.constant import Direction, Offset, Exchange
|
from vnpy.trader.constant import Direction, Offset, Exchange
|
||||||
|
from vnpy.trader.utility import floor_to
|
||||||
|
|
||||||
|
|
||||||
EVENT_SPREAD_DATA = "eSpreadData"
|
EVENT_SPREAD_DATA = "eSpreadData"
|
||||||
@ -94,6 +95,8 @@ class SpreadData:
|
|||||||
self.active_leg: LegData = None
|
self.active_leg: LegData = None
|
||||||
self.passive_legs: List[LegData] = []
|
self.passive_legs: List[LegData] = []
|
||||||
|
|
||||||
|
self.min_volume = 0.1
|
||||||
|
|
||||||
# For calculating spread price
|
# For calculating spread price
|
||||||
self.price_multipliers: Dict[str, int] = price_multipliers
|
self.price_multipliers: Dict[str, int] = price_multipliers
|
||||||
|
|
||||||
@ -168,15 +171,23 @@ class SpreadData:
|
|||||||
leg.ask_volume, leg.ask_price, leg.size)
|
leg.ask_volume, leg.ask_price, leg.size)
|
||||||
|
|
||||||
if trading_multiplier > 0:
|
if trading_multiplier > 0:
|
||||||
adjusted_bid_volume = floor(
|
adjusted_bid_volume = floor_to(
|
||||||
leg_bid_volume / trading_multiplier)
|
leg_bid_volume / trading_multiplier,
|
||||||
adjusted_ask_volume = floor(
|
self.min_volume
|
||||||
leg_ask_volume / trading_multiplier)
|
)
|
||||||
|
adjusted_ask_volume = floor_to(
|
||||||
|
leg_ask_volume / trading_multiplier,
|
||||||
|
self.min_volume
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
adjusted_bid_volume = floor(
|
adjusted_bid_volume = floor_to(
|
||||||
leg_bid_volume / abs(trading_multiplier))
|
leg_bid_volume / abs(trading_multiplier),
|
||||||
adjusted_ask_volume = floor(
|
self.min_volume
|
||||||
leg_ask_volume / abs(trading_multiplier))
|
)
|
||||||
|
adjusted_ask_volume = floor_to(
|
||||||
|
leg_ask_volume / abs(trading_multiplier),
|
||||||
|
self.min_volume
|
||||||
|
)
|
||||||
|
|
||||||
# For the first leg, just initialize
|
# For the first leg, just initialize
|
||||||
if not n:
|
if not n:
|
||||||
|
@ -128,11 +128,13 @@ class SpreadDataEngine:
|
|||||||
for leg in spread.legs.values():
|
for leg in spread.legs.values():
|
||||||
price_multiplier = spread.price_multipliers[leg.vt_symbol]
|
price_multiplier = spread.price_multipliers[leg.vt_symbol]
|
||||||
trading_multiplier = spread.trading_multipliers[leg.vt_symbol]
|
trading_multiplier = spread.trading_multipliers[leg.vt_symbol]
|
||||||
|
inverse_contract = spread.inverse_contracts[leg.vt_symbol]
|
||||||
|
|
||||||
leg_setting = {
|
leg_setting = {
|
||||||
"vt_symbol": leg.vt_symbol,
|
"vt_symbol": leg.vt_symbol,
|
||||||
"price_multiplier": price_multiplier,
|
"price_multiplier": price_multiplier,
|
||||||
"trading_multiplier": trading_multiplier
|
"trading_multiplier": trading_multiplier,
|
||||||
|
"inverse_contract": inverse_contract
|
||||||
}
|
}
|
||||||
leg_settings.append(leg_setting)
|
leg_settings.append(leg_setting)
|
||||||
|
|
||||||
@ -268,7 +270,7 @@ class SpreadDataEngine:
|
|||||||
legs.append(leg)
|
legs.append(leg)
|
||||||
price_multipliers[vt_symbol] = leg_setting["price_multiplier"]
|
price_multipliers[vt_symbol] = leg_setting["price_multiplier"]
|
||||||
trading_multipliers[vt_symbol] = leg_setting["trading_multiplier"]
|
trading_multipliers[vt_symbol] = leg_setting["trading_multiplier"]
|
||||||
inverse_contracts[vt_symbol] = leg_setting.get("inverse_contracts", False)
|
inverse_contracts[vt_symbol] = leg_setting.get("inverse_contract", False)
|
||||||
|
|
||||||
spread = SpreadData(
|
spread = SpreadData(
|
||||||
name,
|
name,
|
||||||
|
@ -7,6 +7,7 @@ import logging
|
|||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import Callable, Dict
|
from typing import Callable, Dict
|
||||||
from decimal import Decimal
|
from decimal import Decimal
|
||||||
|
from math import floor
|
||||||
|
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import talib
|
import talib
|
||||||
@ -124,6 +125,16 @@ def round_to(value: float, target: float) -> float:
|
|||||||
return rounded
|
return rounded
|
||||||
|
|
||||||
|
|
||||||
|
def floor_to(value: float, target: float) -> float:
|
||||||
|
"""
|
||||||
|
Similar to math.floor function, but to target float number.
|
||||||
|
"""
|
||||||
|
value = Decimal(str(value))
|
||||||
|
target = Decimal(str(target))
|
||||||
|
result = float(int(floor(value / target)) * target)
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
class BarGenerator:
|
class BarGenerator:
|
||||||
"""
|
"""
|
||||||
For:
|
For:
|
||||||
|
Loading…
Reference in New Issue
Block a user