Trading System API  3.0
Library for Simulating and Deploying Trading and Investment Strategies
TSAInstrument.h
1 /* ===================================================================
2 *
3 * T R A D I N G S Y S T E M A P I ™
4 * Copyright © 1999 - 2014 by Peter Ritter ( TradingSystemAPI.com )
5 * A L L R I G H T S R E S E R V E D
6 *
7 * Consult your license regarding permissions and restrictions.
8 * You may obtain a copy of the License at:
9 * http://www.TradingSystemAPI.com/licenses/LICENSE-TSAPI-3.0.html
10 *
11 * ====================================================================
12 */
13 
14 #ifndef TSA_INSTRUMENT__INCLUDED
15 #define TSA_INSTRUMENT__INCLUDED
16 
17 #include <ostream>
18 
19 #include "TSASupport.h"
20 #include "TSAMetrics.h"
21 #include "TSAMetrics2.h"
22 #include "TSATime.h"
23 #include "TSAOrderManager.h"
24 #include "TSAIntraday.h"
25 #include "TSAPriceBar.h"
26 #include "TSAStrategyPtr.h"
27 #include "TSALogs.h"
28 #include "TSAOrder.h"
29 
30 namespace tsa {
31  class strategy_delegate;
32  namespace os {
33  class path;
34  }
35 
39  /*
40  ** ====================================================
41  ** >>> class instrument <<<
42  ** ====================================================
43  */
44 
64  class dll_export instrument :
65  public object,
66  public metrics_source {
67  tsa_declare_testable;
68  friend class tsa::strategy;
69  friend class tsa::strategy_delegate;
70  private:
71  std::string m_sSymbol;
72  std::string m_msg_symbol;
73  std::string m_secType;
74  std::string m_platform;
75  std::string m_feed;
76  std::string m_interval;
77  std::string m_expiry;
78  std::string m_expiry_yyyymm;
79  double m_strike;
80  std::string m_right;
81  std::string m_multiplier;
82  std::string m_exchange;
83  std::string m_contract_expiry;
84  std::string m_primaryExchange; // actual (i.e. non-aggregate) exchange that the instrument trades on.
85  std::string m_currency;
86  bool m_includeExpired;
87  std::string m_secIdType; // CUSIP;SEDOL;ISIN;RIC
88  std::string m_secId;
89  size_t m_id;
90  public:
91  std::string m_data_stream_name;
92  std::string m_data_store_name;
93  in_stream m_in_stream;
94  in_stream_adaptor* m_in_stream_adaptor_ptr;
95  public:
96  bool m_is_initialized;
97  bool m_is_finalized;
98  bar_log* m_bar_log_ptr;
99  strategy* m_strategy_ptr;
100  order_manager m_order_mgr;
101  strategy_delegate* m_strat_base_ptr;
102  private:
103  bool m_is_stand_alone;
104  strategy_state_type m_strategy_state;
105  size_t m_nNumObj;
106  bool m_allow_zero_and_sub_zero_prices;
107  size_t m_bar_count;
108  instrument_price_bar m_curr_price_bar;
109  instrument_price_bar m_prev_bar_price_bar;
110  date_time m_last_price_bar_update_timestamp;
111  date_time m_bar_timestamp;
112  date_time m_prev_bar_timestamp;
113  bool m_is_scheduled_by_series;
114  bool m_is_time_master;
115  bool m_bar_duration_is_intraday;
116  bool m_undefined_values_allowed;
117  bool m_bMasterOHLCnotAvailable;
118  double m_tick_size;
119  double m_tick_value;
120  bool m_auto_round;
121  bool m_has_bid_ask;
122  bool m_use_bid_ask_for_sim_market_orders;
123  public:
124  //
125  void use_bid_ask_for_sim_market_orders(bool flag);
126  //
127  bool use_bid_ask_for_sim_market_orders(void)const;
128  private:
129  mutable enum class chart_mkt_order_price_type{
130  open, close, last, not_init
131  }m_chart_mkt_order_price_type = chart_mkt_order_price_type::not_init;
132  double m_chart_mkt_order_price;
133  public:
134  double chart_mkt_order_price(void)const;
135  public:
145  void set_next_bar(const date_time&, double o, double h, double l, double c, double v);
146  public:
147  struct daily_equity {
148  date day;
149  double strategy_equity;
150  daily_equity(const date& _d, double _eq) : day(_d), strategy_equity(_eq) {}
151  };
152  std::vector<daily_equity> m_daily_equity;
153  public:
154  std::vector<component*> m_components;
155  private:
156  void InitMembers(const std::string& _name);
157  std::list<order*> m_pre_submit_orders;
158  void pre_submit_order(order*);
159  void un_pre_submit_order(order*);
160  public:
161  void include_expired(bool _ie) { m_includeExpired = _ie; }
162  bool include_expiry(void) const { return m_includeExpired; }
163  private:
164  void register_with_strategy();
165  public:
166  bool m_verbose_eval;
167  std::ostream* m_verbose_stream_ptr;
168  public:
169  void set_ohlc(double, double, double, double);
170  const order_manager* order_manager_ptr(void)const;
171  strategy* strategy_ptr(void) const;
172  public:
174  const std::vector<trade_info>& closed_trades(void)const;
175 
183  const std::vector<trade_leg>& current_trade_legs(void)const;
184  private:
185  void set_strategy(strategy*);
186  void initialize(void);
187  bool fetch_ohlc_data(void);
188  void finalize(void);
189  size_t bar_count(void) const;
190  void notify_increment_bar(void);
191  bool EvaluateInterval(void);
192  void EvaluateOrderQueueBacktesting(void);
193  private:
194  void Do_PRE_OPEN(void);
195  void Do_OPEN(void);
196  void Do_BAR(void);
197  void Do_CLOSE(void);
198  void Do_POST_CLOSE(void);
199  void Do_POST_EVAL(void);
200  void evaluate_order_queue_BAR(void);
201  void evaluate_order_queue_POST_CLOSE(void);
202  public:
203  bool is_finalized(void) const;
204  public: //for metrics_source interface
205  virtual const date_time& metrics_source__begin_timestamp(void) const override;
206  virtual const date_time& metrics_source__end_timestamp(void) const override;
207  virtual bool is_contract(void) const override { return true; }
208  virtual std::string metric_source_name(void) const override { return name(); }
209  private:
210  void verify_eval_not_started(void) const;
211  void verify_is_finalized(void) const;
212  void verify_reporting_enabled(void) const;
213  strategy_state_type get_strategy_state(void) const;
214  bool EvaluationHasStarted(void) const;
215  public:
216  const date_time& prev_interval_timestamp(void) const;
217  const date_time& interval_timestamp(void) const;
218  void set_strategy_time(const date_time&);
219  void interval_timestamp(const date_time&);
220  void is_strategy_scheduler(bool _b);
221  public:
222  const date_time& bar_timestamp(void) const;
223  public:
224  //===================================
227  //===================================
228 
230  instrument(void);
231 
233  ~instrument(void);
234 
235  //=================
237  //=================
238  public:
239  //===================================
242  //===================================
243 
245  size_t id(void) const;
246 
253  bool is_platform_driven(void) const;
254 
261  bool is_live(void)const;
262 
263  //
264  bool exception_on_backfill_orders(void)const;
265 
277  void name(const std::string& name);
278 
283  const std::string& name(void) const;
284 
285  //=================
287  //=================
288 
289  // internal
290  instrument& symbol_ex(const std::string&);
291 
292  public:
293  //===================================
296  //===================================
297 
314  void as_random_walk(duration bar_duration = duration::days(1));
315 
324  void connect(const std::string& stream_name, const std::string& database_name = "default");
325 
330  std::string stream_name(void) const;
331 
332  //IU
333  std::string data_base_name(void) const;
334 
338  void connect(in_stream_adaptor& adaptor);
339 
348  date_time begin();
349 
358  date_time end();
359 
366  const series_core& operator()(size_t field_pos) const;
367 
374  const series_core& operator()(const std::string& field_name) const;
375 
380  size_t field_count(void) const;
381 
392  date_time record_timestamp(void) const;
393 
400  bool field_exists(const std::string& field_name) const;
401 
409  size_t field_index(const std::string& field_name) const;
410 
416  tsa::type_t field_type(const std::string& field_name) const;
417 
418  //=================
420  //=================
421 
422  void verify_registered_with_strategy(void) const;
423  public:
424  //==============================
427  //==============================
428 
455  //=================
457  //=================
458 
459  public:
460  //================================
463  //================================
464 
478  void negative_prices_ok(bool neg_prices_ok);
479 
484  bool negative_prices_ok(void) const;
485 
491  double big_point(void) const;
492 
509  void tick(double min_tick, double tick_value, bool auto_round = true);
510 
515  double tick_size(void) const;
516 
523  double tick_value(void)const;
524 
534  double ticks(int64_t multiplier) const;
535 
561  void limit_fill_proviso(double proviso);
562 
567  double limit_fill_proviso(void) const;
568 
578  void slippage(double slip);
579 
584  double slippage(void) const;
585 
592  void commission(double comm);
593 
599  double commission(void) const;
600 
608  void cost_allocation(cost_alloc_type t);
609 
615  bool costs_allocated_per_unit(void) const;
616 
617  //=================
619  //=================
620 
621  void SetInternalTradeLogDisabled(void); // deprecated
622  bool GetInternalTradeLogDisabled(void) const;
623  void SetAllocateSlippageAndCommissionPerUnit(bool _bFlag); //obsolete
624  //void ResetBigPointValue(double _dBigPointValue);
625  public:
626  //===================================
629  //===================================
630 
632  std::string platform(void)const;
633 
640  instrument& platform(const std::string& platform_name);
641 
643  std::string broker(void)const;
644 
650  instrument& broker(const std::string& broker_name);
651 
656  std::string feed(void)const;
657 
663  std::string interval(void)const;
664 
675  instrument& define(const std::string& symbol, const std::string& exchange, const std::string& platform);
676 
681  instrument& symbol(const std::string& symb);
682 
686  const std::string& symbol(void) const;
687 
694  instrument& expiry(const std::string& expiry);
695 
700  const std::string& expiry(void) const;
701 
706  const std::string& expiry_yyyymm(void) const;
707 
712  std::string instrument::type(void)const;
713 
720  instrument& exchange(const std::string& exch);
721 
726  const std::string& exchange(void) const;
727 
733  instrument& currency(const std::string& ccy);
734 
739  const std::string& currency(void)const;
740 
741  //=================
743  //=================
744 
745  public:
746  //=====================================
759  //====================================
760  private:
761  order::time_in_force m_default_time_in_force = order::time_in_force::gtc;
762  public:
767  void default_time_in_force(order::time_in_force default_tif);
768  public: //market orders
769 
776  order_ref buy(quantity_t quantity);
777 
778  // internal use
779  order_ref buy(quantity_t quantity, double fixed_fill_price);
780 
787  order_ref buy_order(quantity_t quantity);
788 
795  order_ref sell(quantity_t quantity);
796 
797  // internal use
798  order_ref sell(quantity_t quantity, double fixed_fill_price);
799 
806  order_ref sell_order(quantity_t quantity);
807 
808  public: //stop orders
809 
817  order_ref buy_stop(quantity_t quantity, double stop_price);
818 
826  order_ref buy_stop_order(quantity_t quantity, double stop_price);
827 
835  order_ref sell_stop(quantity_t quantity, double stop_price);
836 
844  order_ref sell_stop_order(quantity_t quantity, double stop_price);
845 
846  public: //stop limit orders
847 
856  order_ref buy_stop_limit(quantity_t quantity, double stop_price, double price_limit);
857 
866  order_ref buy_stop_limit_order(quantity_t quantity, double stop_price, double price_limit);
867 
876  order_ref sell_stop_limit(quantity_t quantity, double stop_price, double price_limit);
877 
886  order_ref sell_stop_limit_order(quantity_t quantity, double stop_price, double limit_price);
887 
888  public: //limit orders
889 
897  order_ref buy_limit(quantity_t quantity, double limit_price);
898 
906  order_ref buy_limit_order(quantity_t quantity, double limit_price);
907 
915  order_ref sell_limit(quantity_t quantity, double limit_price);
916 
924  order_ref sell_limit_order(quantity_t quantity, double limit_price);
925 
926  //=================
928  //=================
929  public:
930 
931  //===================================
934  //===================================
935 
939  void cancel_all_orders(void);
940 
945  void cancel_order(identifier_t id);
946 
952  bool order_exists(identifier_t id) const;
953 
960  void get_orders(std::vector<order_ref>& v, bool active_only = true) const;
961 
966  bool has_active_orders(void)const;
967 
974  void get_active_orders(std::vector<order_ref>& v, order::type _ot, order::action) const;
975 
981  order_ref get_order(identifier_t id) const;
982 
989  order* get_order_ptr(identifier_t id) const;
990 
995  size_t order_count(void) const;
996 
1002  size_t order_count_inclusive() const;
1003 
1004  //=================
1006  //=================
1007 
1008  public:// internal use
1009  void submit_order(order*);
1010  void init_order_properties(order*);
1011  void reset_expiry(identifier_t order_id, order::time_in_force tif);
1012  void reset_expiry(identifier_t order_id, const date_time& date_time);
1013  void reset_tag(identifier_t order_id, const std::string& tag);
1014  void reset_price(identifier_t order_id, double price, double aux_price = (-1.0));
1015  void reset_quantity(identifier_t order_id, quantity_t quantity);
1016  public:
1022  const std::vector<transaction>& get_bar_transactions(void) const;
1023 
1024  public:
1025  //===================================
1028  //===================================
1029 
1034  double net_profit(void) const;
1035 
1043  POSITION::state position_state() const;
1044 
1049  bool is_long(void) const;
1050 
1055  bool is_short(void) const;
1056 
1061  bool is_flat(void) const;
1062 
1067  quantity_t position_size(void) const;
1068 
1073  position_t position(void) const;
1074  //=================
1076  //=================
1077  public:
1078  //===========================
1081  //===========================
1082 
1089  size_t trade_leg_count(void) const;
1090 
1095  double trade_PL(void) const;
1096 
1102  size_t trade_bar_count(void) const;
1103 
1109  double trade_first_leg_entry_price(void) const;
1110 
1115  const date_time& trade_first_leg_entry_timestamp(void) const;
1116 
1123  quantity_t trade_max_position(void) const;
1124 
1131  double trade_most_favorable_price(void) const;
1132 
1133  // internal
1134  double trade_point_change_since_entry(void) const;
1135 
1136  //=================
1138  //=================
1139  public:
1140  //=============================
1143  //=============================
1144 
1145  // internal
1146  const transaction& get_most_recent_transaction(void) const;
1147 
1152  int64_t transact_count(void);
1153 
1160  int64_t transact_count(order::type order_type);
1161 
1166  int64_t unit_count(void);
1167 
1168  //=================
1170  //=================
1171 
1172  // internal
1173  int64_t filled_order_count(void);
1174  public:
1180  double current_drawdown(void) const;
1181  public:
1182  bool GetLastTradeIsOpen(trade_grouping t) const;
1183  bool GetLastTradeWasOpen(void) const;
1184  double GetMaxAccountBalance(double _start_balance) const;
1185  double GetMinAccountBalance(double _start_balance) const;
1186  double _GetCumulativePL_DDN_Log(void) const;
1187  public:
1195  void allow_null_values(bool flag);
1196 
1201  bool allow_null_values(void) const;
1202  public:
1203  const equity_metrics& get_equity_metrics(void) const;
1204  const order_manager& get_order_manager(void) const;
1205  public:
1206  order_log m_order_log;
1207  bar_log m_BarLog;
1208  trade_log m_trade_log;
1209  drawdown_log m_drawdown_log;
1210  transaction_log m_transact_log;
1211  int m_report_fp_precision;
1212  log_type_t m_enabled_logs;
1213  private:
1214  mutable std::vector<order_ref> m_tmp_orders;
1215  public:
1216  std::string transaction_info_string(void) const;
1217  std::string order_info_string(void) const;
1218  public:
1219  //================================
1222  //================================
1223 
1230  const metrics& get_metrics(void) const;
1231 
1239  virtual variant get_metric(perf_metric_type metric_type, trade_grouping grouping = all_trades) const;
1240 
1248  virtual variant metric(const std::string& metric_name, trade_grouping grouping = all_trades) const;
1249 
1250  //=================
1252  //=================
1253  //
1254  // internal use
1255  virtual void daily_cash_flow(mem_table& mt) const;
1256  void save_bar_report(const os::path& dir);
1257  public: //IU
1258  log_type_t GetLogType(void) const;
1259  fast::database* GetLogDBPtr(void) const;
1260  bool log_db_was_set(void) const;
1261  void write_reports(const os::path&);
1262  void log(log_type_t _eLogTypes, bool _bOverwrite);
1263  void print_order_report(std::ostream&, bool vertical, bool with_borders);
1264  void print_bar_report(std::ostream&, bool vertical, bool with_borders);
1265  void print_transaction_report(std::ostream&, bool vertical, bool with_borders);
1266  void print_trade_report(std::ostream&, bool vertical, bool with_borders);
1267  void print_drawdown_report(std::ostream&, bool vertical, bool with_borders);
1268  public: //IU
1269  void report_float_precision(size_t _precision);
1270  void save_transaction_report(const os::path& dir);
1271  void save_order_report(const os::path& dir);
1272  void save_trade_report(const os::path& dir);
1273  void save_drawdown_report(const os::path& dir);
1274  void save_performance_report(const os::path& path);
1275  protected:
1276  metrics m_metrics;
1277  metrics2 m_metrics2;
1278  int64_t transact_count_market(void);
1279  int64_t transact_count_stop(void);
1280  int64_t transact_count_limit(void);
1281  void populate_metrics_object(metrics2&);
1282  protected:
1283  double transact_price(double defaultPrice = 0.0);
1284  date_time transact_timestamp(void);
1285  quantity_t transact_size(void);
1286  int64_t transact_order_num(void);
1287  bool transact_had_slippage(void);
1288  std::string transact_order_type(void);
1289  std::string TransactExecInterval(void);
1290  bool transact_is_long(void);
1291  bool transact_is_short(void);
1292  std::string transact_order_message(void);
1293  };
1294 
1296 }
1297 #endif
type
Order type.
Definition: TSAOrder.h:101
series< double > open
Built in series object corresponding to record field &#39;open&#39;.
Definition: TSAInstrument.h:430
Utility class to manipulate file system paths. This class is intended to fulfil the requirements of t...
Definition: TSAOS.h:36
Class order is the library&#39;s internal order representation. Users are not intended to interact with t...
Definition: TSAOrder.h:49
Namespace for the &#39;Trading System API&#39; library.
Definition: original1.TSA3Core.cpp:20
The value of the current drawdown.
Class for managing native timeseries database files. Extremely high speed data access.
Definition: TSADatabase.h:118
Base class for classes that can produce metrics.
Definition: TSAMetrics.h:44
perf_metric_type
Values that represent performance metric types.
Definition: TSATypeDef.h:216
series< double > price
Built in series object corresponding to record field &#39;price&#39;.
Definition: TSAInstrument.h:450
strategy_state_type
Values that represent strategy state ts.
Definition: TSATypeDef.h:84
structure defining all the metric names. For example, you can pass metric::trade_count as metric_name...
Definition: TSATypeDef.h:297
series< double > last
Built in series object corresponding to record field &#39;last&#39;.
Definition: TSAInstrument.h:448
Strategy performance metrics.
Definition: TSAMetrics.h:367
int64_t quantity_t
Definition: TSATypeDef.h:444
series< double > volume
Built in series object corresponding to record field &#39;volume&#39;.
Definition: TSAInstrument.h:438
Parent class for &#39;in-stream adaptors&#39;. in_stream object rely on adaptors for access to underlying dat...
Definition: TSAStreams.h:52
log_type_t
Log type enumeration. Multiple log types can be combined by using operator|.
Definition: TSATypeDef.h:424
variant objects can represent values of different types.
Definition: TSAVariant.h:140
Represents a reference to an internally managed order object. Working with class order directly is no...
Definition: TSAOrder.h:422
Represents a duration - the difference between two date_time values.
Definition: TSATime.h:945
cost_alloc_type
Transaction cost allocation enumeration.
Definition: TSATypeDef.h:418
series< double > close
Built in series object corresponding to record field &#39;close&#39;.
Definition: TSAInstrument.h:436
_value_types_type
Data type enumeration used throughout the library. Intended to be used via type_t.
Definition: TSATypeDef.h:166
series< double > low
Built in series object corresponding to record field &#39;low&#39;.
Definition: TSAInstrument.h:434
Parent class for many library classes.
Definition: TSATypeDef.h:462
Represents a transaction that occurred on an exchange or as part of a simulation when an order is fil...
Definition: TSATransaction.h:40
series< double > asksize
Built in series object corresponding to record field &#39;asksize&#39;.
Definition: TSAInstrument.h:446
A date of the Gregorian calendar.
Definition: TSATime.h:119
series< double > high
Built in series object corresponding to record field &#39;high&#39;.
Definition: TSAInstrument.h:432
series< double > value
Built in series object corresponding to record field &#39;value&#39;.
Definition: TSAInstrument.h:452
trade_grouping
Trade aggregation types used by reporting functionality.
Definition: TSATypeDef.h:208
series< double > ask
Built in series object corresponding to record field &#39;ask&#39;.
Definition: TSAInstrument.h:442
action
Order action.
Definition: TSAOrder.h:94
The strategy &#39;net profit&#39; (after slippage + commission).
time_in_force
Time-in-force (TIF). By default all orders are placed as good-till-cancel (GTC) orders. See instrument::default_time_in_force(order::time_in_force).
Definition: TSAOrder.h:133
All trades.
Definition: TSATypeDef.h:211
series< double > bid
Built in series object corresponding to record field &#39;bid&#39;.
Definition: TSAInstrument.h:440
static duration days(uint64_t)
Returns a duration equivalent to a given number of days.
Definition: TSATime.cpp:1402
Record stream class. Represents a standardised interface to all data sources. Instances rely on deleg...
Definition: TSAStreams.h:336
Class strategy represents a trading or investment strategy.
Definition: TSAStrategy.h:108
series< double > bidsize
Built in series object corresponding to record field &#39;bidsize&#39;.
Definition: TSAInstrument.h:444
series< double > openint
Built in series object corresponding to record field &#39;openint&#39;.
Definition: TSAInstrument.h:454
Class representing a gregorian-date and time-of-day combination. The time component has microsecond r...
Definition: TSATime.h:428
int64_t identifier_t
type for ID&#39;s
Definition: TSATypeDef.h:117
int64_t position_t
Definition: TSATypeDef.h:447
Class instrument represents a tradeable security such as a stock, option, futures contract...
Definition: TSAInstrument.h:64
Class mem_table represents a memory based table. mem_table objects can be used in strategies both for...
Definition: TSAMemTable.h:48