Hikyuu
TradeManager.h
浏览该文件的文档.
1 /*
2  * TradeManager.h
3  *
4  * Created on: 2013-2-13
5  * Author: fasiondog
6  */
7 
8 #ifndef TRADEMANAGER_H_
9 #define TRADEMANAGER_H_
10 
11 #include <boost/tuple/tuple.hpp>
12 #include "../utilities/Parameter.h"
13 #include "../utilities/util.h"
14 #include "TradeRecord.h"
15 #include "PositionRecord.h"
16 #include "BorrowRecord.h"
17 #include "FundsRecord.h"
18 #include "LoanRecord.h"
19 #include "OrderBrokerBase.h"
20 #include "crt/TC_Zero.h"
21 
22 #if HKU_SUPPORT_SERIALIZATION
23 #include <boost/serialization/map.hpp>
24 #include <boost/serialization/vector.hpp>
25 #include <boost/serialization/list.hpp>
26 #endif
27 
28 namespace hku {
29 
44 
45 public:
46  TradeManager(const Datetime& datetime = Datetime(199001010000LL),
47  price_t initcash = 100000.0,
48  const TradeCostPtr& costfunc = TC_Zero(),
49  const string& name = "SYS");
50  virtual ~TradeManager();
51 
53  void reset();
54 
59  void regBroker(const OrderBrokerPtr& broker);
60 
64  void clearBroker();
65 
67  Datetime getBrokerLastDatetime() const { return m_broker_last_datetime; }
68 
70  void setBrokerLastDatetime(const Datetime& date) {
71  m_broker_last_datetime = date;
72  }
73 
74  shared_ptr<TradeManager> clone();
75 
81  double getMarginRate(const Datetime& datetime, const Stock& stock);
82 
84  string name() const { return m_name; }
85 
87  void name(const string& name) { m_name = name; }
88 
90  price_t initCash() const { return m_init_cash; }
91 
93  Datetime initDatetime() const { return m_init_datetime; }
94 
96  Datetime firstDatetime() const;
97 
100  return m_trade_list.empty()
101  ? m_init_datetime : m_trade_list.back().datetime;
102  }
103 
105  bool reinvest() const { return getParam<bool>("reinvest"); }
106 
108  int precision() const { return getParam<int>("precision"); }
109 
111  TradeCostPtr costFunc() const { return m_costfunc; }
112 
114  void costFunc(const TradeCostPtr& func) { m_costfunc = func; }
115 
120  price_t currentCash() const { return m_cash; }
121 
126  price_t cash(const Datetime& datetime, KQuery::KType ktype = KQuery::DAY);
127 
134  bool have(const Stock& stock) const{
135  return m_position.count(stock.id()) ? true : false;
136  }
137 
144  bool haveShort(const Stock& stock) const{
145  return m_short_position.count(stock.id()) ? true : false;
146  }
147 
149  size_t getStockNumber() const { return m_position.size(); }
150 
152  size_t getShortStockNumber() const { return m_short_position.size(); }
153 
155  size_t getHoldNumber(const Datetime& datetime, const Stock& stock);
156 
158  size_t getShortHoldNumber(const Datetime& datetime, const Stock& stock);
159 
161  size_t getDebtNumber(const Datetime& datetime, const Stock& stock);
162 
164  price_t getDebtCash(const Datetime& datetime);
165 
167  const TradeRecordList& getTradeList() const { return m_trade_list; }
168 
175  TradeRecordList getTradeList(const Datetime& start, const Datetime& end) const;
176 
178  PositionRecordList getPositionList() const;
179 
182  return m_position_history;
183  }
184 
186  PositionRecordList getShortPositionList() const;
187 
190  return m_short_position_history;
191  }
192 
194  PositionRecord getPosition(const Stock&) const;
195 
197  PositionRecord getShortPosition(const Stock&) const;
198 
200  BorrowRecordList getBorrowStockList() const;
201 
210  CostRecord getBuyCost(const Datetime& datetime, const Stock& stock,
211  price_t price, size_t num) const{
212  return m_costfunc
213  ? m_costfunc->getBuyCost(datetime, stock, price, num)
214  : CostRecord();
215  }
216 
225  CostRecord getSellCost(const Datetime& datetime, const Stock& stock,
226  price_t price, size_t num) const{
227  return m_costfunc
228  ? m_costfunc->getSellCost(datetime, stock, price, num)
229  : CostRecord();
230  }
231 
237  CostRecord getBorrowCashCost(const Datetime& datetime, price_t cash) {
238  return m_costfunc
239  ? m_costfunc->getBorrowCashCost(datetime, cash)
240  : CostRecord();
241  }
242 
249  CostRecord getReturnCashCost(const Datetime& borrow_datetime,
250  const Datetime& return_datetime,
251  price_t cash) {
252  return m_costfunc
253  ? m_costfunc->getReturnCashCost(borrow_datetime,
254  return_datetime, cash)
255  : CostRecord();
256  }
257 
266  const Stock& stock, price_t price, size_t num) {
267  return m_costfunc
268  ? m_costfunc->getBorrowStockCost(datetime, stock, price, num)
269  : CostRecord();
270  }
271 
280  CostRecord getReturnStockCost(const Datetime& borrow_datetime,
281  const Datetime& return_datetime,
282  const Stock& stock, price_t price, size_t num) {
283  return m_costfunc
284  ? m_costfunc->getReturnStockCost(borrow_datetime,
285  return_datetime, stock, price, num)
286  : CostRecord();
287  }
288 
295  bool checkin(const Datetime& datetime, price_t cash);
296 
303  bool checkout(const Datetime& datetime, price_t cash);
304 
313  bool checkinStock(const Datetime& datetime, const Stock& stock,
314  price_t price, size_t number);
315 
325  bool checkoutStock(const Datetime& datetime, const Stock& stock,
326  price_t price, size_t number);
327 
340  TradeRecord buy(const Datetime& datetime, const Stock& stock,
341  price_t realPrice, size_t number,
342  price_t stoploss = 0.0,
343  price_t goalPrice = 0.0,
344  price_t planPrice = 0.0,
345  SystemPart from = PART_INVALID);
346 
359  TradeRecord sell(const Datetime& datetime, const Stock& stock,
360  price_t realPrice,
361  size_t number = Null<size_t>(),
362  price_t stoploss = 0.0,
363  price_t goalPrice = 0.0,
364  price_t planPrice = 0.0,
365  SystemPart from = PART_INVALID);
366 
379  TradeRecord sellShort(const Datetime& datetime, const Stock& stock,
380  price_t realPrice, size_t number,
381  price_t stoploss = 0.0,
382  price_t goalPrice = 0.0,
383  price_t planPrice = 0.0,
384  SystemPart from = PART_INVALID);
385 
398  TradeRecord buyShort(const Datetime& datetime, const Stock& stock,
399  price_t realPrice,
400  size_t number = Null<size_t>(),
401  price_t stoploss = 0.0,
402  price_t goalPrice = 0.0,
403  price_t planPrice = 0.0,
404  SystemPart from = PART_INVALID);
405 
412  bool borrowCash(const Datetime& datetime, price_t cash);
413 
420  bool returnCash(const Datetime& datetime, price_t cash);
421 
430  bool borrowStock(const Datetime& datetime, const Stock& stock,
431  price_t price, size_t number);
432 
441  bool returnStock(const Datetime& datetime, const Stock& stock,
442  price_t price, size_t number);
443 
449  FundsRecord getFunds(KQuery::KType ktype = KQuery::DAY) const;
450 
458  FundsRecord getFunds(const Datetime& datetime,
459  KQuery::KType ktype = KQuery::DAY);
460 
467  PriceList getFundsCurve(const DatetimeList& dates,
468  KQuery::KType ktype = KQuery::DAY);
469 
476  PriceList getProfitCurve(const DatetimeList& dates,
477  KQuery::KType ktype = KQuery::DAY);
478 
485  bool addTradeRecord(const TradeRecord& tr);
486 
488  string toString() const;
489 
494  void tocsv(const string& path);
495 
496 private:
497  //根据权息信息,更新交易记录及持仓
498  void _update(const Datetime&);
499 
500  //以脚本的形式保存交易动作,便于修正和校准
501  void _saveAction(const TradeRecord&);
502 
503  bool _add_init_tr(const TradeRecord&);
504  bool _add_buy_tr(const TradeRecord&);
505  bool _add_sell_tr(const TradeRecord&);
506  bool _add_gift_tr(const TradeRecord&);
507  bool _add_bonus_tr(const TradeRecord&);
508  bool _add_checkin_tr(const TradeRecord&);
509  bool _add_checkout_tr(const TradeRecord&);
510  bool _add_checkin_stock_tr(const TradeRecord&);
511  bool _add_checkout_stock_tr(const TradeRecord&);
512  bool _add_borrow_cash_tr(const TradeRecord&);
513  bool _add_return_cash_tr(const TradeRecord&);
514  bool _add_borrow_stock_tr(const TradeRecord&);
515  bool _add_return_stock_tr(const TradeRecord&);
516  bool _add_sell_short_tr(const TradeRecord&);
517  bool _add_buy_short_tr(const TradeRecord&);
518 
519 private:
520  string m_name; //账户名称
521  Datetime m_init_datetime; //账户建立日期
522  price_t m_init_cash; //初始资金
523  TradeCostPtr m_costfunc; //成本算法
524 
525  price_t m_cash; //当前现金
526  price_t m_checkin_cash; //累计存入资金,初始资金视为存入
527  price_t m_checkout_cash; //累计取出资金
528  price_t m_checkin_stock; //累计存入股票价值
529  price_t m_checkout_stock; //累计取出股票价值
530  price_t m_borrow_cash; //当前借入资金,负债
531 
532  list<LoanRecord> m_loan_list; //当前融资情况
533 
534  typedef map<hku_uint64, BorrowRecord> borrow_stock_map_type;
535  borrow_stock_map_type m_borrow_stock; //当前借入的股票及其数量
536 
537  TradeRecordList m_trade_list; //交易记录
538 
539  typedef map<hku_uint64, PositionRecord > position_map_type;
540  position_map_type m_position; //当前持仓交易对象的持仓记录 ["sh000001"-> ]
541  PositionRecordList m_position_history; //持仓历史记录
542  position_map_type m_short_position; //空头仓位记录
543  PositionRecordList m_short_position_history; //空头仓位历史记录
544 
545  list<OrderBrokerPtr> m_broker_list; //订单代理列表
546  Datetime m_broker_last_datetime; //订单代理最近一次执行操作的时刻
547 
548  list<string> m_actions; //记录交易动作,便于修改或校准实盘时的交易
549 
550 //==================================================
551 // 支持序列化
552 //==================================================
553 #if HKU_SUPPORT_SERIALIZATION
554 private:
555  friend class boost::serialization::access;
556  template<class Archive>
557  void save(Archive & ar, const unsigned int version) const {
558  string name(GBToUTF8(m_name));
559  ar & boost::serialization::make_nvp("m_name", name);
560  ar & BOOST_SERIALIZATION_NVP(m_params);
561  ar & BOOST_SERIALIZATION_NVP(m_init_datetime);
562  ar & BOOST_SERIALIZATION_NVP(m_init_cash);
563  ar & BOOST_SERIALIZATION_NVP(m_costfunc);
564  ar & BOOST_SERIALIZATION_NVP(m_cash);
565  ar & BOOST_SERIALIZATION_NVP(m_checkin_cash);
566  ar & BOOST_SERIALIZATION_NVP(m_checkout_cash);
567  ar & BOOST_SERIALIZATION_NVP(m_checkin_stock);
568  ar & BOOST_SERIALIZATION_NVP(m_checkout_stock);
569  ar & BOOST_SERIALIZATION_NVP(m_borrow_cash);
570  ar & BOOST_SERIALIZATION_NVP(m_loan_list);
571  namespace bs = boost::serialization;
572  BorrowRecordList borrow = getBorrowStockList();
573  ar & bs::make_nvp<BorrowRecordList>("m_borrow_stock", borrow);
574  PositionRecordList position = getPositionList();
575  ar & bs::make_nvp<PositionRecordList>("m_position", position);
576  ar & BOOST_SERIALIZATION_NVP(m_position_history);
577  position = getShortPositionList();
578  ar & bs::make_nvp<PositionRecordList>("m_short_position", position);
579  ar & BOOST_SERIALIZATION_NVP(m_short_position_history);
580  ar & BOOST_SERIALIZATION_NVP(m_trade_list);
581  ar & BOOST_SERIALIZATION_NVP(m_actions);
582  }
583 
584  template<class Archive>
585  void load(Archive & ar, const unsigned int version) {
586  string name;
587  ar & boost::serialization::make_nvp("m_name", name);
588  m_name = UTF8ToGB(name);
589  ar & BOOST_SERIALIZATION_NVP(m_params);
590  ar & BOOST_SERIALIZATION_NVP(m_init_datetime);
591  ar & BOOST_SERIALIZATION_NVP(m_init_cash);
592  ar & BOOST_SERIALIZATION_NVP(m_costfunc);
593  ar & BOOST_SERIALIZATION_NVP(m_cash);
594  ar & BOOST_SERIALIZATION_NVP(m_checkin_cash);
595  ar & BOOST_SERIALIZATION_NVP(m_checkout_cash);
596  ar & BOOST_SERIALIZATION_NVP(m_checkin_stock);
597  ar & BOOST_SERIALIZATION_NVP(m_checkout_stock);
598  ar & BOOST_SERIALIZATION_NVP(m_borrow_cash);
599  ar & BOOST_SERIALIZATION_NVP(m_loan_list);
600  namespace bs = boost::serialization;
601  BorrowRecordList borrow;
602  ar & bs::make_nvp<BorrowRecordList>("m_borrow_stock", borrow);
603  BorrowRecordList::const_iterator bor_iter = borrow.begin();
604  for (; bor_iter != borrow.end(); ++bor_iter) {
605  m_borrow_stock[bor_iter->stock.id()] = *bor_iter;
606  }
607  PositionRecordList position;
608  ar & bs::make_nvp<PositionRecordList>("m_position", position);
609  PositionRecordList::const_iterator iter = position.begin();
610  for (; iter != position.end(); ++iter) {
611  m_position[iter->stock.id()] = *iter;
612  }
613  ar & BOOST_SERIALIZATION_NVP(m_position_history);
614 
615  position.clear();
616  ar & bs::make_nvp<PositionRecordList>("m_short_position", position);
617  iter = position.begin();
618  for (; iter != position.end(); ++iter) {
619  m_short_position[iter->stock.id()] = *iter;
620  }
621  ar & BOOST_SERIALIZATION_NVP(m_short_position_history);
622  ar & BOOST_SERIALIZATION_NVP(m_trade_list);
623  ar & BOOST_SERIALIZATION_NVP(m_actions);
624  }
625 
626  BOOST_SERIALIZATION_SPLIT_MEMBER()
627 #endif /* HKU_SUPPORT_SERIALIZATION */
628 };
629 
630 
635 typedef shared_ptr<TradeManager> TradeManagerPtr;
636 typedef shared_ptr<TradeManager> TMPtr;
637 
638 HKU_API std::ostream & operator<<(std::ostream &, const TradeManager&);
639 HKU_API std::ostream & operator<<(std::ostream &, const TradeManagerPtr&);
640 
641 } /* namespace hku */
642 #endif /* TRADEMANAGER_H_ */
Datetime lastDatetime() const
最后一笔交易日期,注意和交易类型无关,如未发生交易返回账户建立日期
Definition: TradeManager.h:99
size_t getStockNumber() const
当前持有的证券种类数量
Definition: TradeManager.h:149
shared_ptr< OrderBrokerBase > OrderBrokerPtr
客户程序应使用此类型进行实际操作
Definition: OrderBrokerBase.h:110
CostRecord getBorrowCashCost(const Datetime &datetime, price_t cash)
计算计入现金时的费用成本
Definition: TradeManager.h:237
提供size_t的Null值
Definition: Null.h:88
const PositionRecordList & getHistoryPositionList() const
获取全部历史持仓记录,即已平仓记录
Definition: TradeManager.h:181
Datetime initDatetime() const
账户建立日期
Definition: TradeManager.h:93
vector< TradeRecord > TradeRecordList
Definition: TradeRecord.h:142
const PositionRecordList & getShortHistoryPositionList() const
获取全部空头历史仓位记录
Definition: TradeManager.h:189
vector< price_t > PriceList
Definition: DataType.h:66
int precision() const
交易精度
Definition: TradeManager.h:108
交易记录
Definition: TradeRecord.h:60
无效值
Definition: SystemPart.h:31
void setBrokerLastDatetime(const Datetime &date)
设置开始订单代理操作的时刻
Definition: TradeManager.h:70
日期类型
Definition: Datetime.h:33
#define GBToUTF8(s)
Definition: util.h:55
shared_ptr< TradeCostBase > TradeCostPtr
交易成本算法指针
Definition: TradeCostBase.h:169
Stock基类,Application中一般使用StockPtr进行操作
Definition: Stock.h:27
static const string DAY
Definition: KQuery.h:58
SystemPart
系统关联部件(各自策略)枚举定义,用于修改相关部件参数
Definition: SystemPart.h:19
void load(Archive &ar, hku::Block &blk, unsigned int version)
Definition: Block_serialization.h:34
Definition: Block_serialization.h:18
持仓记录
Definition: PositionRecord.h:24
void name(const string &name)
设置账户名称
Definition: TradeManager.h:87
TradeCostPtr HKU_API TC_Zero()
创建零成本算法实例
Definition: ZeroTradeCost.cpp:35
const TradeRecordList & getTradeList() const
获取全部交易记录
Definition: TradeManager.h:167
price_t initCash() const
初始资金
Definition: TradeManager.h:90
TradeCostPtr costFunc() const
获取交易算法指针
Definition: TradeManager.h:111
shared_ptr< TradeManager > TradeManagerPtr
客户程序应使用此类型进行实际操作
Definition: TradeManager.h:635
#define HKU_API
Definition: DataType.h:12
vector< PositionRecord > PositionRecordList
Definition: PositionRecord.h:103
string name() const
账户名称
Definition: TradeManager.h:84
void save(Archive &ar, const hku::Block &blk, unsigned int version)
Definition: Block_serialization.h:20
HKU_API std::ostream & operator<<(std::ostream &os, const Block &blk)
Definition: Block.cpp:13
double price_t
Definition: DataType.h:53
成本记录
Definition: CostRecord.h:27
当前资产情况记录,由TradeManager::getFunds返回
Definition: FundsRecord.h:24
std::vector< Datetime > DatetimeList
日期列表
Definition: Datetime.h:177
hku_uint64 id() const
获取内部id,一般用于作为map的键值使用,该id实质为m_data的内存地址
Definition: Stock.h:254
void costFunc(const TradeCostPtr &func)
设置交易算法指针
Definition: TradeManager.h:114
Datetime getBrokerLastDatetime() const
从哪个时刻开始启动订单代理进行下单操作
Definition: TradeManager.h:67
size_t getShortStockNumber() const
当前空头持有的证券种类数量
Definition: TradeManager.h:152
string KType
查询K线类型:日线/周线等
Definition: KQuery.h:51
CostRecord getBorrowStockCost(const Datetime &datetime, const Stock &stock, price_t price, size_t num)
计算融劵借入成本
Definition: TradeManager.h:265
price_t currentCash() const
返回当前现金
Definition: TradeManager.h:120
#define PARAMETER_SUPPORT
Definition: Parameter.h:233
CostRecord getReturnCashCost(const Datetime &borrow_datetime, const Datetime &return_datetime, price_t cash)
计算归还融资成本
Definition: TradeManager.h:249
bool reinvest() const
红利/股息/送股再投资标志,即是否忽略权息信息
Definition: TradeManager.h:105
#define UTF8ToGB(s)
Definition: util.h:56
bool have(const Stock &stock) const
当前是否持有指定的证券
Definition: TradeManager.h:134
CostRecord getReturnStockCost(const Datetime &borrow_datetime, const Datetime &return_datetime, const Stock &stock, price_t price, size_t num)
计算融劵归还成本
Definition: TradeManager.h:280
shared_ptr< TradeManager > TMPtr
Definition: TradeManager.h:636
账户交易管理模块,管理帐户的交易记录及资金使用情况
Definition: TradeManager.h:42
Hikyuu核心命名空间,包含股票数据的管理、指标实现、交易系统框架等
Definition: Block.cpp:11
CostRecord getSellCost(const Datetime &datetime, const Stock &stock, price_t price, size_t num) const
计算卖出成本
Definition: TradeManager.h:225
CostRecord getBuyCost(const Datetime &datetime, const Stock &stock, price_t price, size_t num) const
计算买入成本
Definition: TradeManager.h:210
bool haveShort(const Stock &stock) const
当前空头仓位是否持有指定的证券
Definition: TradeManager.h:144
vector< BorrowRecord > BorrowRecordList
Definition: BorrowRecord.h:83