[Mod]Change constant value from str to enum

This commit is contained in:
vn.py 2019-01-15 22:04:02 +08:00
parent 9c897d04af
commit 578544a3c3
6 changed files with 235 additions and 236 deletions

View File

@ -26,24 +26,7 @@ from futu import (
)
from vnpy.trader.gateway import BaseGateway
from vnpy.trader.constant import (
PRODUCT_EQUITY,
PRODUCT_INDEX,
PRODUCT_ETF,
PRODUCT_WARRANT,
PRODUCT_BOND,
DIRECTION_LONG,
DIRECTION_SHORT,
STATUS_SUBMITTING,
STATUS_NOTTRADED,
STATUS_PARTTRADED,
STATUS_ALLTRADED,
STATUS_CANCELLED,
STATUS_REJECTED,
EXCHANGE_SEHK,
EXCHANGE_HKFE,
EXCHANGE_SMART
)
from vnpy.trader.constant import Product, Direction, Status, Exchange
from vnpy.trader.object import (
TickData,
OrderData,
@ -58,34 +41,34 @@ from vnpy.trader.object import (
from vnpy.trader.event import EVENT_TIMER
EXCHANGE_VT2FUTU = {
EXCHANGE_SMART: "US",
EXCHANGE_SEHK: "HK",
EXCHANGE_HKFE: "HK_FUTURE"
Exchange.SMART: "US",
Exchange.SEHK: "HK",
Exchange.HKFE: "HK_FUTURE"
}
EXCHANGE_FUTU2VT = {v: k for k, v in EXCHANGE_VT2FUTU.items()}
PRODUCT_VT2FUTU = {
PRODUCT_EQUITY: "STOCK",
PRODUCT_INDEX: "IDX",
PRODUCT_ETF: "ETF",
PRODUCT_WARRANT: "WARRANT",
PRODUCT_BOND: "BOND"
Product.EQUITY: "STOCK",
Product.INDEX: "IDX",
Product.ETF: "ETF",
Product.WARRANT: "WARRANT",
Product.BOND: "BOND"
}
DIRECTION_VT2FUTU = {DIRECTION_LONG: TrdSide.BUY, DIRECTION_SHORT: TrdSide.SELL}
DIRECTION_VT2FUTU = {Direction.LONG: TrdSide.BUY, Direction.SHORT: TrdSide.SELL}
DIRECTION_FUTU2VT = {v: k for k, v in DIRECTION_VT2FUTU.items()}
STATUS_FUTU2VT = {
OrderStatus.NONE: STATUS_SUBMITTING,
OrderStatus.SUBMITTING: STATUS_SUBMITTING,
OrderStatus.SUBMITTED: STATUS_NOTTRADED,
OrderStatus.FILLED_PART: STATUS_PARTTRADED,
OrderStatus.FILLED_ALL: STATUS_ALLTRADED,
OrderStatus.CANCELLED_ALL: STATUS_CANCELLED,
OrderStatus.CANCELLED_PART: STATUS_CANCELLED,
OrderStatus.SUBMIT_FAILED: STATUS_REJECTED,
OrderStatus.FAILED: STATUS_REJECTED,
OrderStatus.DISABLED: STATUS_CANCELLED,
OrderStatus.NONE: Status.SUBMITTING,
OrderStatus.SUBMITTING: Status.SUBMITTING,
OrderStatus.SUBMITTED: Status.NOTTRADED,
OrderStatus.FILLED_PART: Status.PARTTRADED,
OrderStatus.FILLED_ALL: Status.ALLTRADED,
OrderStatus.CANCELLED_ALL: Status.CANCELLED,
OrderStatus.CANCELLED_PART: Status.CANCELLED,
OrderStatus.SUBMIT_FAILED: Status.REJECTED,
OrderStatus.FAILED: Status.REJECTED,
OrderStatus.DISABLED: Status.CANCELLED,
}
@ -110,7 +93,7 @@ class FutuGateway(BaseGateway):
self.trade_ctx = None
self.host = ""
self.ip = 0
self.port = 0
self.market = ""
self.password = ""
self.env = TrdEnv.SIMULATE
@ -255,7 +238,7 @@ class FutuGateway(BaseGateway):
price_type = OrderType.NORMAL # Only limit order is supported.
# Set price adjustment mode to inside adjustment.
if req.direction == DIRECTION_LONG:
if req.direction is Direction.LONG:
adjust_limit = 0.05
else:
adjust_limit = -0.05
@ -351,7 +334,7 @@ class FutuGateway(BaseGateway):
pos = PositionData(
symbol=symbol,
exchange=exchange,
direction=DIRECTION_LONG,
direction=Direction.LONG,
volume=float(row["qty"]),
frozen=(float(row["qty"]) - float(row["can_sell_qty"])),
price=float(row["pl_val"]),

View File

@ -30,77 +30,55 @@ from vnpy.trader.object import (
CancelRequest
)
from vnpy.trader.constant import (
PRODUCT_EQUITY,
PRODUCT_FOREX,
PRODUCT_SPOT,
PRODUCT_FUTURES,
PRODUCT_OPTION,
PRICETYPE_LIMIT,
PRICETYPE_MARKET,
DIRECTION_LONG,
DIRECTION_SHORT,
DIRECTION_NET,
EXCHANGE_SMART,
EXCHANGE_NYMEX,
EXCHANGE_GLOBEX,
EXCHANGE_IDEALPRO,
EXCHANGE_SEHK,
EXCHANGE_HKFE,
EXCHANGE_CME,
EXCHANGE_ICE,
CURRENCY_CNY,
CURRENCY_HKD,
CURRENCY_USD,
STATUS_SUBMITTING,
STATUS_NOTTRADED,
STATUS_PARTTRADED,
STATUS_ALLTRADED,
STATUS_CANCELLED,
STATUS_REJECTED,
OPTION_CALL,
OPTION_PUT
Product,
PriceType,
Direction,
Exchange,
Currency,
Status,
OptionType
)
PRICETYPE_VT2IB = {PRICETYPE_LIMIT: "LMT", PRICETYPE_MARKET: "MKT"}
PRICETYPE_VT2IB = {PriceType.LIMIT: "LMT", PriceType.MARKET: "MKT"}
PRICETYPE_IB2VT = {v: k for k, v in PRICETYPE_VT2IB.items()}
DIRECTION_VT2IB = {DIRECTION_LONG: "BUY", DIRECTION_SHORT: "SELL"}
DIRECTION_VT2IB = {Direction.LONG: "BUY", Direction.SHORT: "SELL"}
DIRECTION_IB2VT = {v: k for k, v in DIRECTION_VT2IB.items()}
DIRECTION_IB2VT["BOT"] = DIRECTION_LONG
DIRECTION_IB2VT["SLD"] = DIRECTION_SHORT
DIRECTION_IB2VT["BOT"] = Direction.LONG
DIRECTION_IB2VT["SLD"] = Direction.SHORT
EXCHANGE_VT2IB = {
EXCHANGE_SMART: "SMART",
EXCHANGE_NYMEX: "NYMEX",
EXCHANGE_GLOBEX: "GLOBEX",
EXCHANGE_IDEALPRO: "IDEALPRO",
EXCHANGE_CME: "CME",
EXCHANGE_ICE: "ICE",
EXCHANGE_SEHK: "SEHK",
EXCHANGE_HKFE: "HKFE"
Exchange.SMART: "SMART",
Exchange.NYMEX: "NYMEX",
Exchange.GLOBEX: "GLOBEX",
Exchange.IDEALPRO: "IDEALPRO",
Exchange.CME: "CME",
Exchange.ICE: "ICE",
Exchange.SEHK: "SEHK",
Exchange.HKFE: "HKFE"
}
EXCHANGE_IB2VT = {v: k for k, v in EXCHANGE_VT2IB.items()}
STATUS_IB2VT = {
"Submitted": STATUS_NOTTRADED,
"Filled": STATUS_ALLTRADED,
"Cancelled": STATUS_CANCELLED,
"PendingSubmit": STATUS_SUBMITTING,
"PreSubmitted": STATUS_NOTTRADED
"Submitted": Status.NOTTRADED,
"Filled": Status.ALLTRADED,
"Cancelled": Status.CANCELLED,
"PendingSubmit": Status.SUBMITTING,
"PreSubmitted": Status.NOTTRADED
}
PRODUCT_VT2IB = {
PRODUCT_EQUITY: "STK",
PRODUCT_FOREX: "CASH",
PRODUCT_SPOT: "CMDTY",
PRODUCT_OPTION: "OPT",
PRODUCT_FUTURES: "FUT"
Product.EQUITY: "STK",
Product.FOREX: "CASH",
Product.SPOT: "CMDTY",
Product.OPTION: "OPT",
Product.FUTURES: "FUT"
}
PRODUCT_IB2VT = {v: k for k, v in PRODUCT_VT2IB.items()}
OPTION_VT2IB = {OPTION_CALL: "CALL", OPTION_PUT: "PUT"}
OPTION_VT2IB = {OptionType.CALL: "CALL", OptionType.PUT: "PUT"}
CURRENCY_VT2IB = {CURRENCY_USD: "USD", CURRENCY_CNY: "CNY", CURRENCY_HKD: "HKD"}
CURRENCY_VT2IB = {Currency.USD: "USD", Currency.CNY: "CNY", Currency.HKD: "HKD"}
TICKFIELD_IB2VT = {
0: "bid_volume_1",
@ -274,7 +252,7 @@ class IbApi(EWrapper):
# Forex and spot product of IDEALPRO has no tick time and last price.
# We need to calculate locally.
exchange = self.tick_exchange[reqId]
if exchange == EXCHANGE_IDEALPRO:
if exchange is Exchange.IDEALPRO:
tick.last_price = (tick.bid_price_1 + tick.ask_price_1) / 2
tick.datetime = datetime.now()
self.gateway.on_tick(copy(tick))

View File

@ -2,67 +2,106 @@
General constant string used in VN Trader.
"""
DIRECTION_LONG = ""
DIRECTION_SHORT = ""
DIRECTION_NET = ""
from enum import Enum
OFFSET_OPEN = ""
OFFSET_CLOSE = ""
OFFSET_CLOSETODAY = "平今"
OFFSET_CLOSEYESTERDAY = "平昨"
STATUS_SUBMITTING = "提交中"
STATUS_NOTTRADED = "未成交"
STATUS_PARTTRADED = "部分成交"
STATUS_ALLTRADED = "全部成交"
STATUS_CANCELLED = "已撤销"
STATUS_REJECTED = "拒单"
class Direction(Enum):
"""
Direction of order/trade/position.
"""
LONG = ""
SHORT = ""
NET = ""
PRODUCT_EQUITY = "股票"
PRODUCT_FUTURES = "期货"
PRODUCT_OPTION = "期权"
PRODUCT_INDEX = "指数"
PRODUCT_FOREX = "外汇"
PRODUCT_SPOT = "现货"
PRODUCT_ETF = "ETF"
PRODUCT_BOND = "债券"
PRODUCT_WARRANT = "权证"
PRICETYPE_LIMIT = "限价"
PRICETYPE_MARKET = "市价"
PRICETYPE_FAK = "FAK"
PRICETYPE_FOK = "FOK"
class Offset(Enum):
"""
Offset of order/trade.
"""
OPEN = ""
CLOSE = ""
CLOSETODAY = "平今"
CLOSEYESTERDAY = "平昨"
OPTION_CALL = "看涨期权"
OPTION_PUT = "看跌期权"
EXCHANGE_SSE = "SSE"
EXCHANGE_SZSE = "SZSE"
EXCHANGE_CFFEX = "CFFEX"
EXCHANGE_SHFE = "SHFE"
EXCHANGE_CZCE = "CZCE"
EXCHANGE_DCE = "DCE"
EXCHANGE_INE = "INE"
EXCHANGE_SGE = "SGE"
class Status(Enum):
"""
Order status.
"""
SUBMITTING = "提交中"
NOTTRADED = "未成交"
PARTTRADED = "部分成交"
ALLTRADED = "全部成交"
CANCELLED = "已撤销"
REJECTED = "拒单"
EXCHANGE_SMART = "SMART"
EXCHANGE_NYMEX = "NYMEX"
EXCHANGE_GLOBEX = "GLOBEX"
EXCHANGE_IDEALPRO = "IDEALPRO"
EXCHANGE_CME = "CME"
EXCHANGE_ICE = "ICE"
EXCHANGE_SEHK = "SEHK"
EXCHANGE_HKFE = "HKFE"
CURRENCY_USD = "USD"
CURRENCY_HKD = "HKD"
CURRENCY_CNY = "CNY"
class Product(Enum):
"""
Product class.
"""
EQUITY = "股票"
FUTURES = "期货"
OPTION = "期权"
INDEX = "指数"
FOREX = "外汇"
SPOT = "现货"
ETF = "ETF"
BOND = "债券"
WARRANT = "权证"
INTERVAL_1M = "1分钟"
INTERVAL_5M = "5分钟"
INTERVAL_15M = "15分钟"
INTERVAL_30M = "30分钟"
INTERVAL_1H = "1小时"
INTERVAL_4H = "4小时"
INTERVAL_DAILY = "日线"
INTERVAL_WEEKLY = "周线"
class PriceType(Enum):
"""
Order price type.
"""
LIMIT = "限价"
MARKET = "市价"
FAK = "FAK"
FOK = "FOK"
class OptionType(Enum):
"""
Option type.
"""
CALL = "看涨期权"
PUT = "看跌期权"
class Exchange(Enum):
"""
Exchange.
"""
CFFEX = "CFFEX"
SHFE = "SHFE"
CZCE = "CZCE"
DCE = "DCE"
INE = "INE"
SSE = "SSE"
SZSE = "SZSE"
SGE = "SGE"
SMART = "SMART"
NYMEX = "NYMEX"
GLOBEX = "GLOBEX"
IDEALPRO = "IDEALPRO"
CME = "CME"
ICE = "ICE"
SEHK = "SEHK"
HKFE = "HKFE"
class Currency(Enum):
"""
Currency.
"""
USD = "USD"
HKD = "HKD"
CNY = "CNY"
class Interval(Enum):
MINUTE = "1分钟"
HOUR = "1小时"
DAILY = "日线"
WEEKLY = "周线"

View File

@ -6,9 +6,9 @@ from dataclasses import dataclass
from datetime import datetime
from logging import INFO
from .constant import (STATUS_SUBMITTING, STATUS_NOTTRADED, STATUS_PARTTRADED)
from .constant import Status, Exchange, Offset, Direction, Interval, Status
ACTIVE_STATUSES = set([STATUS_SUBMITTING, STATUS_NOTTRADED, STATUS_PARTTRADED])
ACTIVE_STATUSES = set([Status.SUBMITTING, Status.NOTTRADED, Status.PARTTRADED])
@dataclass
@ -29,7 +29,7 @@ class TickData(BaseData):
* intraday market statistics.
"""
symbol: str
exchange: str
exchange: Exchange
datetime: datetime
name: str = ""
@ -70,7 +70,7 @@ class TickData(BaseData):
def __post_init__(self):
""""""
self.vt_symbol = f"{self.symbol}.{self.exchange}"
self.vt_symbol = f"{self.symbol}.{self.exchange.value}"
@dataclass
@ -79,9 +79,9 @@ class BarData(BaseData):
Candlestick bar data of a certain trading period.
"""
symbol: str
exchange: str
exchange: Exchange
datetime: datetime
inteval: str
inteval: Interval
volume: float = 0
open_price: float = 0
@ -91,7 +91,7 @@ class BarData(BaseData):
def __post_init__(self):
""""""
self.vt_symbol = f"{self.symbol}.{self.exchange}"
self.vt_symbol = f"{self.symbol}.{self.exchange.value}"
@dataclass
@ -101,20 +101,20 @@ class OrderData(BaseData):
of a specific order.
"""
symbol: str
exchange: str
exchange: Exchange
orderid: str
direction: str = ""
offset: str = ""
direction: Direction = ""
offset: Offset = None
price: float = 0
volume: float = 0
traded: float = 0
status: str = ""
status: Status = Status.SUBMITTING
time: str = ""
def __post_init__(self):
""""""
self.vt_symbol = f"{self.symbol}.{self.exchange}"
self.vt_symbol = f"{self.symbol}.{self.exchange.value}"
self.vt_orderid = f"{self.gateway_name}.{self.orderid}"
def is_active(self):
@ -145,19 +145,19 @@ class TradeData(BaseData):
can have several trade fills.
"""
symbol: str
exchange: str
exchange: Exchange
orderid: str
tradeid: str
direction: Direction = ""
direction: str = ""
offset: str = ""
offset: Offset = None
price: float = 0
volume: float = 0
time: str = ""
def __post_init__(self):
""""""
self.vt_symbol = f"{self.symbol}.{self.exchange}"
self.vt_symbol = f"{self.symbol}.{self.exchange.value}"
self.vt_orderid = f"{self.gateway_name}.{self.orderid}"
self.vt_tradeid = f"{self.gateway_name}.{self.tradeid}"
@ -168,8 +168,8 @@ class PositionData(BaseData):
Positon data is used for tracking each individual position holding.
"""
symbol: str
exchange: str
direction: str
exchange: Exchange
direction: Direction
volume: float = 0
frozen: float = 0
@ -178,7 +178,7 @@ class PositionData(BaseData):
def __post_init__(self):
""""""
self.vt_symbol = f"{self.symbol}.{self.exchange}"
self.vt_symbol = f"{self.symbol}.{self.exchange.value}"
self.vt_positionid = f"{self.vt_symbol}.{self.direction}"
@ -218,7 +218,7 @@ class ContractData(BaseData):
Contract data contains basic information about each contract traded.
"""
symbol: str
exchange: str
exchange: Exchange
name: str
product: str
size: int
@ -231,7 +231,7 @@ class ContractData(BaseData):
def __post_init__(self):
""""""
self.vt_symbol = f"{self.symbol}.{self.exchange}"
self.vt_symbol = f"{self.symbol}.{self.exchange.value}"
@dataclass
@ -240,11 +240,11 @@ class SubscribeRequest:
Request sending to specific gateway for subscribing tick data update.
"""
symbol: str
exchange: str = ''
exchange: Exchange
def __post_init__(self):
""""""
self.vt_symbol = f"{self.symbol}.{self.exchange}"
self.vt_symbol = f"{self.symbol}.{self.exchange.value}"
@dataclass
@ -253,16 +253,16 @@ class OrderRequest:
Request sending to specific gateway for creating a new order.
"""
symbol: str
direction: str
direction: Direction
price_type: str
volume: float
exchange: str = ''
exchange: Exchange
price: float = 0
offset: str = ''
offset: Offset = ''
def __post_init__(self):
""""""
self.vt_symbol = f"{self.symbol}.{self.exchange}"
self.vt_symbol = f"{self.symbol}.{self.exchange.value}"
@dataclass
@ -271,9 +271,9 @@ class CancelRequest:
Request sending to specific gateway for canceling an existing order.
"""
orderid: str
symbol: str = ''
exchange: str = ''
symbol: str
exchange: Exchange
def __post_init__(self):
""""""
self.vt_symbol = f"{self.symbol}.{self.exchange}"
self.vt_symbol = f"{self.symbol}.{self.exchange.value}"

View File

@ -4,16 +4,12 @@ Basic widgets for VN Trader.
import csv
from typing import Any
from enum import Enum
from PyQt5 import QtWidgets, QtGui, QtCore
from vnpy.event import EventEngine, Event
from ..constant import (DIRECTION_LONG, DIRECTION_SHORT, DIRECTION_NET,
OFFSET_OPEN, OFFSET_CLOSE, OFFSET_CLOSETODAY, OFFSET_CLOSEYESTERDAY,
PRICETYPE_LIMIT, PRICETYPE_MARKET, PRICETYPE_FAK, PRICETYPE_FOK,
EXCHANGE_CFFEX, EXCHANGE_SHFE, EXCHANGE_DCE, EXCHANGE_CZCE, EXCHANGE_SSE,
EXCHANGE_SZSE, EXCHANGE_SGE, EXCHANGE_SEHK, EXCHANGE_HKFE, EXCHANGE_SMART,
EXCHANGE_ICE, EXCHANGE_CME, EXCHANGE_NYMEX, EXCHANGE_GLOBEX, EXCHANGE_IDEALPRO)
from ..constant import Direction, Offset, PriceType, Exchange
from ..engine import MainEngine
from ..event import (EVENT_TICK, EVENT_ORDER, EVENT_TRADE, EVENT_ACCOUNT,
EVENT_POSITION, EVENT_CONTRACT, EVENT_LOG)
@ -52,7 +48,24 @@ class BaseCell(QtWidgets.QTableWidgetItem):
return self._data
class DirectionCell(BaseCell):
class EnumCell(BaseCell):
"""
Cell used for showing enum data.
"""
def __init__(self, content: str, data: Any):
""""""
super(EnumCell, self).__init__(content, data)
def set_content(self, content: Any, data: Any):
"""
Set text using enum.constant.value.
"""
if content:
super(EnumCell, self).set_content(content.value, data)
class DirectionCell(EnumCell):
"""
Cell used for showing direction data.
"""
@ -67,7 +80,7 @@ class DirectionCell(BaseCell):
"""
super(DirectionCell, self).set_content(content, data)
if content == DIRECTION_SHORT:
if content is Direction.SHORT:
self.setForeground(COLOR_SHORT)
else:
self.setForeground(COLOR_LONG)
@ -319,7 +332,7 @@ class TickMonitor(BaseMonitor):
},
"exchange": {
"display": "交易所",
"cell": BaseCell,
"cell": EnumCell,
"update": False
},
"name": {
@ -438,7 +451,7 @@ class TradeMonitor(BaseMonitor):
},
"exchange": {
"display": "交易所",
"cell": BaseCell,
"cell": EnumCell,
"update": False
},
"direction": {
@ -448,7 +461,7 @@ class TradeMonitor(BaseMonitor):
},
"offset": {
"display": "开平",
"cell": BaseCell,
"cell": EnumCell,
"update": False
},
"price": {
@ -490,7 +503,7 @@ class OrderMonitor(BaseMonitor):
},
"exchange": {
"display": "交易所",
"cell": BaseCell,
"cell": EnumCell,
"update": False
},
"direction": {
@ -500,7 +513,7 @@ class OrderMonitor(BaseMonitor):
},
"offset": {
"display": "开平",
"cell": BaseCell,
"cell": EnumCell,
"update": False
},
"price": {
@ -520,7 +533,7 @@ class OrderMonitor(BaseMonitor):
},
"status": {
"display": "状态",
"cell": BaseCell,
"cell": EnumCell,
"update": True
},
"time": {
@ -569,7 +582,7 @@ class PositionMonitor(BaseMonitor):
},
"exchange": {
"display": "交易所",
"cell": BaseCell,
"cell": EnumCell,
"update": False
},
"direction": {
@ -726,6 +739,10 @@ class TradingWidget(QtWidgets.QWidget):
"""
signal_tick = QtCore.pyqtSignal(Event)
exchange_map = {exchange.value:exchange for exchange in Exchange}
direction_map = {direction.value:direction for direction in Direction}
offset_map = {offset.value:offset for offset in Offset}
price_type_map = {price_type.value:price_type for price_type in PriceType}
def __init__(self, main_engine: MainEngine, event_engine: EventEngine):
""""""
@ -745,22 +762,7 @@ class TradingWidget(QtWidgets.QWidget):
# Trading function area
self.exchange_combo = QtWidgets.QComboBox()
self.exchange_combo.addItems([
EXCHANGE_CFFEX,
EXCHANGE_SHFE,
EXCHANGE_DCE,
EXCHANGE_CZCE,
EXCHANGE_SSE,
EXCHANGE_SZSE,
EXCHANGE_SEHK,
EXCHANGE_HKFE,
EXCHANGE_SMART,
EXCHANGE_ICE,
EXCHANGE_CME,
EXCHANGE_NYMEX,
EXCHANGE_GLOBEX,
EXCHANGE_IDEALPRO
])
self.exchange_combo.addItems([exchange.value for exchange in Exchange])
self.symbol_line = QtWidgets.QLineEdit()
self.symbol_line.returnPressed.connect(self.set_vt_symbol)
@ -770,25 +772,15 @@ class TradingWidget(QtWidgets.QWidget):
self.direction_combo = QtWidgets.QComboBox()
self.direction_combo.addItems([
DIRECTION_LONG,
DIRECTION_SHORT
Direction.LONG.value,
Direction.SHORT.value
])
self.offset_combo = QtWidgets.QComboBox()
self.offset_combo.addItems([
OFFSET_OPEN,
OFFSET_CLOSE,
OFFSET_CLOSETODAY,
OFFSET_CLOSEYESTERDAY
])
self.offset_combo.addItems([offset.value for offset in Offset])
self.pricetype_combo = QtWidgets.QComboBox()
self.pricetype_combo.addItems([
PRICETYPE_LIMIT,
PRICETYPE_MARKET,
PRICETYPE_FAK,
PRICETYPE_FOK
])
self.price_type_combo = QtWidgets.QComboBox()
self.price_type_combo.addItems([price_type.value for price_type in PriceType])
double_validator = QtGui.QDoubleValidator()
double_validator.setBottom(0)
@ -814,7 +806,7 @@ class TradingWidget(QtWidgets.QWidget):
form1.addRow("名称", self.name_line)
form1.addRow("方向", self.direction_combo)
form1.addRow("开平", self.offset_combo)
form1.addRow("类型", self.pricetype_combo)
form1.addRow("类型", self.price_type_combo)
form1.addRow("价格", self.price_line)
form1.addRow("数量", self.volume_line)
form1.addRow("接口", self.gateway_combo)
@ -932,8 +924,8 @@ class TradingWidget(QtWidgets.QWidget):
return
# Generate vt_symbol from symbol and exchange
exchange = str(self.exchange_combo.currentText())
vt_symbol = f"{symbol}.{exchange}"
exchange_value = str(self.exchange_combo.currentText())
vt_symbol = f"{symbol}.{exchange_value}"
if vt_symbol == self.vt_symbol:
return
@ -957,7 +949,7 @@ class TradingWidget(QtWidgets.QWidget):
# Subscribe tick data
req = SubscribeRequest(
symbol=symbol,
exchange=exchange
exchange=self.exchange_map[exchange_value]
)
self.main_engine.subscribe(req, gateway_name)
@ -1020,14 +1012,19 @@ class TradingWidget(QtWidgets.QWidget):
else:
price = float(price_text)
exchange = self.exchange_map[str(self.exchange_combo.currentText())]
direction = self.direction_map[str(self.direction_combo.currentText())]
price_type = self.price_type_map[str(self.price_type_combo.currentText())]
offset = self.offset_map[str(self.offset_combo.currentText())]
req = OrderRequest(
symbol=symbol,
exchange=str(self.exchange_combo.currentText()),
direction=str(self.direction_combo.currentText()),
price_type=str(self.pricetype_combo.currentText()),
exchange=exchange,
direction=direction,
price_type=price_type,
volume=volume,
price=price,
offset=str(self.offset_combo.currentText())
offset=offset
)
gateway_name = str(self.gateway_combo.currentText())
@ -1139,7 +1136,11 @@ class ContractManager(QtWidgets.QWidget):
for row, contract in enumerate(contracts):
for column, name in enumerate(self.headers.keys()):
cell = BaseCell(getattr(contract, name), contract)
value = getattr(contract, name)
if isinstance(value, Enum):
cell = EnumCell(value, contract)
else:
cell = BaseCell(value, contract)
self.contract_table.setItem(row, column, cell)
self.contract_table.resizeColumnsToContents()

View File

@ -5,8 +5,6 @@ General utility functions.
import shelve
from pathlib import Path
from .constant import (STATUS_NOTTRADED, STATUS_PARTTRADED, STATUS_SUBMITTING)
class Singleton(type):
"""