ExecuteDefs.h

source: wtcpp/folder98/folder01/folder3/folder2/file01.md

/*!
 * \file ExecuteDefs.h
 * \project	WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief 
 */
#pragma once
#include "../Includes/WTSDataDef.hpp"
#include "../Includes/WTSCollection.hpp"

NS_WTP_BEGIN
class WTSTickData;
class WTSHisTickData;
class WTSVariant;
class WTSCommodityInfo;
class WTSSessionInfo;

typedef std::vector<uint32_t> OrderIDs;
typedef WTSMap<uint32_t> OrderMap;

//////////////////////////////////////////////////////////////////////////
//执行环境基础类
class ExecuteContext
{
public:
	ExecuteContext(){}
	virtual ~ExecuteContext(){}

public:
	/*
	 *	获取tick数据
	 *	code	合约代码
	 *	count	数据条数
	 *	etime	截止时间, 0则为当前时间
	 *	
	 *	返回值	历史数据封装类指针
	 */
	virtual WTSTickSlice*	getTicks(const char* stdCode, uint32_t count, uint64_t etime = 0) = 0;

	/*
	 *	读取最近一笔Tick数据
	 *	code	合约代码
	 *	
	 *	返回值	WTSTickData指针
	 */
	virtual WTSTickData*	grabLastTick(const char* stdCode) = 0;

	/*
	 *	获取仓位
	 *	code		合约代码
	 *	validOnly	只读取可用持仓
	 *	flag		操作标记 1-多仓, 2-空仓, 3-多空轧平
	 *	
	 *	返回值	轧平后的仓位: 多仓>0, 空仓<0
	 */
	virtual double getPosition(const char* stdCode, bool validOnly = true, int32_t flag = 3) = 0;

	/*
	 *	获取未完成订单
	 *	code	合约代码
	 *
	 *	返回值	localid-WTSOrderInfo的映射
	 */
	virtual OrderMap* getOrders(const char* stdCode) = 0;

	/*
	 *	获取未完成数量
	 *	code	合约代码
	 *	
	 *	返回值	买卖轧平以后的未完成数量
	 */
	virtual double getUndoneQty(const char* stdCode) = 0;

	/*
	 *	买入接口
	 *	code	合约代码
	 *	price	委托价格, 0为市价单
	 *	qty		委托数量
	 *
	 *	返回值	本地订单号数组: 一个买入操作可能会拆成最多3个订单发出
	 */
	virtual OrderIDs buy(const char* stdCode, double price, double qty, bool bForceClose = false) = 0;

	/*
	*	卖出接口
	*	code	合约代码
	*	price	委托价格, 0为市价单
	*	qty		委托数量
	*
	*	返回值	本地订单号数组: 一个买入操作可能会拆成最多3个订单发出
	*/
	virtual OrderIDs sell(const char* stdCode, double price, double qty, bool bForceClose = false) = 0;

	/*
	 *	根据本地订单号撤单
	 *	localid 本地订单号
	 *
	 *	返回值	返回撤单指令是否发送成功
	 */
	virtual bool	cancel(uint32_t localid) = 0;

	/*
	 *	根据指定的方向和数量撤单
	 *	code 合约代码
	 *	qty	最少撤单数量, 如果有多个委托, 那么按照时间顺序一个一个撤单, 直到撤销的数量大于等于qty
	 *	这个一般用不到, 所以传0的时候, 就是把全部买单或者卖单撤销
	 *	isBuy 买单or卖单
	 *	
	 *	返回值 返回实际发送了撤单指令的数量
	 */
	virtual OrderIDs cancel(const char* stdCode, bool isBuy, double qty = 0) = 0;

	/*
	 *	写日志
	 */
	virtual void writeLog(const char* message) = 0;

	/*
	 *	获取品种参数
	 */
	virtual WTSCommodityInfo* getCommodityInfo(const char* stdCode) = 0;

	/*
	 *	获取交易时间模板信息
	 */
	virtual WTSSessionInfo* getSessionInfo(const char* stdCode) = 0;

	/*
	 *	获取当前时间,精确到毫秒,格式如20191127174139500
	 */
	virtual uint64_t	getCurTime() = 0;

	/*
	 *	注册定时器
	 *	@stdCode	合约代码
	 *	@elapse		时间间隔,单位毫秒
	 *
	 *	返回值		是否注册成功
	 */
	virtual bool		registerTimer(const char* stdCode, uint32_t elapse){ return false; }
};

//////////////////////////////////////////////////////////////////////////
//执行单元基础类
class ExecuteUnit
{
public:
	ExecuteUnit() :_ctx(NULL), _code(""){}
	virtual ~ExecuteUnit(){}

public:
	/*
	 *	执行单元名称
	 */
	virtual const char* getName() = 0;

	/*
	 *	所属执行器工厂名称
	 */
	virtual const char* getFactName() = 0;

	/*
	 *	初始化执行单元
	 *	ctx		执行单元运行环境
	 *	code	管理的合约代码
	 */
	virtual void init(ExecuteContext* ctx, const char* stdCode, WTSVariant* cfg){ _ctx = ctx; _code = stdCode; }

public:
	/*
	 *	设置新的目标仓位
	 *	stdCode	合约代码
	 *	newVol	新的目标仓位
	 */
	virtual void set_position(const char* stdCode, double newVol) = 0;

	/*
	 *	清理全部持仓,锁仓的情况下也要清理
	 *	stdCode	合约代码	
	 */
	virtual void clear_all_position(const char* stdCode){}

	/*
	 *	tick数据回调
	 *	newTick	最新的tick数据
	 */
	virtual void on_tick(WTSTickData* newTick) = 0;

	/*
	 *	成交回报
	 *	code	合约代码
	 *	isBuy	买or卖
	 *	vol		成交数量, 这里没有正负, 通过isBuy确定买入还是卖出
	 *	price	成交价格
	 */
	virtual void on_trade(uint32_t localid, const char* stdCode, bool isBuy, double vol, double price) = 0;

	/*
	 *	订单回报
	 *	localid	本地单号
	 *	code	合约代码
	 *	isBuy	买or卖
	 *	leftover	剩余数量
	 *	price	委托价格
	 *	isCanceled	是否已撤销
	 */
	virtual void on_order(uint32_t localid, const char* stdCode, bool isBuy, double leftover, double price, bool isCanceled) = 0;

	/*
	 *	
	 */
	virtual void on_entrust(uint32_t localid, const char* stdCode, bool bSuccess, const char* message) = 0;

	/*
	 *	交易通道就绪回调
	 */
	virtual void on_channel_ready() = 0;

	/*
	 *	交易通道丢失回调
	 */
	virtual void on_channel_lost() = 0;

protected:
	ExecuteContext*	_ctx;
	std::string		_code;
};

//////////////////////////////////////////////////////////////////////////
//执行单元工厂接口
typedef void(*FuncEnumUnitCallback)(const char* factName, const char* unitName, bool isLast);

class IExecuterFact
{
public:
	IExecuterFact(){}
	virtual ~IExecuterFact(){}

public:
	/*
	 *	获取工厂名
	 */
	virtual const char* getName() = 0;

	/*
	 *	枚举执行单元
	 */
	virtual void enumExeUnit(FuncEnumUnitCallback cb) = 0;

	/*
	 *	根据名称创建执行单元
	 */
	virtual ExecuteUnit* createExeUnit(const char* name) = 0;

	/*
	 *	删除执行单元
	 */
	virtual bool deleteExeUnit(ExecuteUnit* unit) = 0;
};

//创建执行工厂
typedef IExecuterFact* (*FuncCreateExeFact)();
//删除执行工厂
typedef void(*FuncDeleteExeFact)(IExecuterFact* &fact);

NS_WTP_END