实现策略核心交易逻辑
This commit is contained in:
+40
-13
@@ -1,12 +1,15 @@
|
||||
# coding:utf-8
|
||||
from os import popen
|
||||
import time, sys
|
||||
|
||||
from peewee import ModelSelect
|
||||
sys.stdout.reconfigure(encoding='utf-8') # 设置标准输出编码为UTF-8
|
||||
import strategy_db
|
||||
import sfgrid_constants
|
||||
from sfgrid_trade_controller import StockTradeController
|
||||
from util import getInstrumentName, getStockPosition
|
||||
from xtquant.xttrader import XtQuantTrader
|
||||
from xtquant.xttype import StockAccount, XtOrder
|
||||
from xtquant.xttype import StockAccount, XtOrder, XtTrade
|
||||
from xtquant import xtdata
|
||||
from xtquant.xttrader import XtQuantTraderCallback
|
||||
import datetime
|
||||
@@ -51,7 +54,9 @@ class SFGridController(XtQuantTraderCallback):
|
||||
grid_index=0,
|
||||
last_trade_price=0.0,
|
||||
current_buy_price=0.0,
|
||||
current_sell_price=0.0
|
||||
current_buy_order_no='',
|
||||
current_sell_price=0.0,
|
||||
current_sell_order_no=''
|
||||
)
|
||||
new_target.save()
|
||||
print(f'新增交易标的 {stock_code} {stock_name}, {new_target.id}')
|
||||
@@ -59,13 +64,21 @@ class SFGridController(XtQuantTraderCallback):
|
||||
pos = getStockPosition(stock_code, self.xt_trader, self.account)
|
||||
strategy_db.TradeTarget.update(current_position=pos).where(strategy_db.TradeTarget.stock_code == stock_code).execute()
|
||||
# 更新标的池
|
||||
self.instrument_pool = strategy_db.TradeTarget.select()
|
||||
self.refresh_targets()
|
||||
# 添加交易控制器
|
||||
stockTradeController = StockTradeController(new_target, self.xt_trader, self.account, new_target.enabled)
|
||||
self.stock_trade_ctrl[stock_code] = stockTradeController
|
||||
|
||||
except Exception as e:
|
||||
print(f'新增交易标的失败 {stock_code} {e}')
|
||||
|
||||
|
||||
def del_trade_target(self, index:int):
|
||||
target: strategy_db.TradeTarget = self.instrument_pool[index]
|
||||
# self.stock_trade_ctrl.
|
||||
del self.stock_trade_ctrl[target.stock_code]
|
||||
target.delete_instance()
|
||||
self.refresh_targets()
|
||||
|
||||
def init_trader(self, path):
|
||||
session_id = int(time.time())
|
||||
@@ -79,14 +92,20 @@ class SFGridController(XtQuantTraderCallback):
|
||||
self.account= StockAccount(account_id, account_type)
|
||||
print(f'- 交易账号对象初始化完成, 账号: {self.account.account_id}')
|
||||
|
||||
|
||||
def init_instrument_pool(self):
|
||||
self.instrument_pool = strategy_db.TradeTarget.select()
|
||||
self.refresh_targets()
|
||||
|
||||
for tradeTarget in self.instrument_pool:
|
||||
stockTradeController = StockTradeController(tradeTarget, self.xt_trader, self.account, tradeTarget.enabled)
|
||||
self.stock_trade_ctrl[tradeTarget.stock_code] = stockTradeController
|
||||
|
||||
print(f'- 初始化标的池初始化完成 , 共 {len(self.instrument_pool)} 个标的')
|
||||
|
||||
|
||||
def refresh_targets(self):
|
||||
# 更新标的池
|
||||
self.instrument_pool:ModelSelect = strategy_db.TradeTarget.select()
|
||||
self.print_pool()
|
||||
|
||||
def print_pool(self):
|
||||
@@ -170,19 +189,26 @@ class SFGridController(XtQuantTraderCallback):
|
||||
# ====== 市场回调方法 -- 以下方法由XtQuantData调用 ======
|
||||
def onDataUpdate(self, data):
|
||||
# 遍历股池
|
||||
# for stock_code, data in data.items():
|
||||
# if data['lastPrice'] == 10.0:
|
||||
# print(f'target = {stock_code} - {getInstrumentName(stock_code)} {data['lastPrice']}')
|
||||
# self.add_trade_target(stock_code)
|
||||
# self.stock_trade_ctrl[stock_code].enabledTrading(True)
|
||||
|
||||
|
||||
# if stock_code not in self.stock_trade_ctrl:
|
||||
# self.add_trade_target(stock_code)
|
||||
# self.stock_trade_ctrl[stock_code].onDataUpdate(data)
|
||||
for target in self.instrument_pool:
|
||||
stock_code = target.stock_code
|
||||
# 如果存在对应的StockTradeController,则调用其onDataUpdate方法
|
||||
if stock_code not in self.stock_trade_ctrl:
|
||||
print(f"股票代码 {stock_code} 未在交易控制器中找到,跳过处理。\n")
|
||||
continue
|
||||
if stock_code not in data:
|
||||
print(f"股票代码 {stock_code} 未在行情数据中找到,跳过处理。\n")
|
||||
if stock_code not in self.stock_trade_ctrl or stock_code not in data:
|
||||
# print(f"股票代码 {stock_code} 未在交易控制器中找到,跳过处理。\n")
|
||||
continue
|
||||
stock_controller: StockTradeController = self.stock_trade_ctrl[stock_code]
|
||||
stock_controller.onDataUpdate(data)
|
||||
|
||||
|
||||
|
||||
# ====== 市场回调方法 -- 以下方法由XtQuantTrader调用 ======
|
||||
def on_connected(self):
|
||||
"""
|
||||
@@ -205,11 +231,12 @@ class SFGridController(XtQuantTraderCallback):
|
||||
"""
|
||||
stockCode = order.stock_code
|
||||
# 如果存在对应的StockTradeController,则调用其onDataUpdate方法
|
||||
if stockCode not in self.stock_trade_ctrl:
|
||||
self.stock_trade_ctrl[stockCode].onOrderUpdate(order)
|
||||
if stockCode in self.stock_trade_ctrl:
|
||||
ctrl:StockTradeController = self.stock_trade_ctrl[stockCode]
|
||||
ctrl.onOrderUpdate(order)
|
||||
print(datetime.datetime.now(), '委托回调 投资备注', order.order_remark)
|
||||
|
||||
def on_stock_trade(self, trade):
|
||||
def on_stock_trade(self, trade:XtTrade):
|
||||
"""
|
||||
成交变动推送
|
||||
:param trade: XtTrade对象
|
||||
|
||||
Reference in New Issue
Block a user