Trading System API  3.0
Library for Simulating and Deploying Trading and Investment Strategies
TSAStreams.h
1 
2 /* ===================================================================
3 *
4 * T R A D I N G S Y S T E M A P I ™
5 * Copyright © 1999 - 2014 by Peter Ritter ( TradingSystemAPI.com )
6 * A L L R I G H T S R E S E R V E D
7 *
8 * Consult your license regarding permissions and restrictions.
9 * You may obtain a copy of the License at:
10 * http://www.TradingSystemAPI.com/licenses/LICENSE-TSAPI-3.0.html
11 *
12 * ====================================================================
13 */
14 
15 #ifndef TSA_RECORDSTREAMS__INCLUDED
16 #define TSA_RECORDSTREAMS__INCLUDED
17 
18 #include <vector>
19 
20 #include "TSASeriesTemplate.h"
21 #include "TSASeriesProxy.h"
22 #include "TSAComponent.h"
23 #include "TSADataDef.h"
24 
25 
26 namespace tsa {
27 
28  class in_stream;
29  class instrument;
30  class instrument_price_bar;
31  class record;
32 
33  namespace fast {
34  class database;
35  }
36 
41  /*
42  ** ====================================================
43  ** >>> class in_stream_adaptor <<<
44  ** ====================================================
45  */
46 
52  class dll_export in_stream_adaptor
53  : public component {
54  friend class strategy;
55  friend class instrument;
56  friend class in_stream;
57  private:
58  bool m_bOpenExists = false;
59  size_t m_nOpenIdx;
60  bool m_bHighExists = false;
61  size_t m_nHighIdx;
62  bool m_bLowExists = false;
63  size_t m_nLowIdx;
64  bool m_bCloseExists = false;
65  size_t m_nCloseIdx;
66  bool m_bVolumeExists = false;
67  size_t m_nVolumeIdx;
68  bool m_bOpenInterestExists = false;
69  size_t m_nOpenInterestIdx;
70  bool m_bBidExists = false;
71  size_t m_nBidIdx;
72  bool m_bAskExists = false;
73  size_t m_nAskIdx;
74  bool m_bBidSizeExists = false;
75  size_t m_nBidSizeIdx;
76  bool m_bAskSizeExists = false;
77  size_t m_nAskSizeIdx;
78  bool m_bLastExists = false;
79  size_t m_nLastIdx;
80  bool m_bPriceExists = false;
81  size_t m_nPriceIdx;
82  bool m_bValueExists = false;
83  size_t m_nValueIdx;
84  variant m_CurrentValue;
85  std::string m_stream_name;
86  bool m_bIsConnected = false;
87  bool m_bIsStrategyScheduler = false;
88  public:
89  //bool m_field_are_analyzed = false;
90  enum price_bar_fields_availability {
91  not_analyzed,
92  ohlc_fields_exist,
93  hlc_fields_exist,
94  close_field_exists,
95  last_field_exists
96  };
97  price_bar_fields_availability m_price_bar_field_availability = not_analyzed;
98  bool determine_price_bar_field_availability(void);
99  void update_price_bar(instrument_price_bar& price_bar);
100 
101  public:
105  in_stream_adaptor(void);
106 
110  ~in_stream_adaptor(void);
111 
116  void stream_name(const std::string& stream_name);
117 
122  const std::string& stream_name(void) const;
123 
128  void current_value(const variant& value);
129  public:
130 
135  void set_connected(bool is_connected_flag = true);
136 
141  bool is_connected(void) const;
142 
143  void InitFieldIndices(void);
144  public:
145 
150  size_t open_field_position(void) const;
151 
156  size_t high_field_position(void) const;
157 
162  size_t low_field_position(void) const;
163 
168  size_t close_field_position(void) const;
169  public:
170  //to be called instead of OnOpen()
171  void on_open__prepare_auto_series(void);
172  virtual bool isa__get_ohlc_fields_exist(void); //does not need to be overridden
173  //=====================================
176  //=====================================
177 
179  virtual void isa__set_forward_shift(size_t);
180 
182  virtual void isa__set_position(const date_time&) = 0;
183 
185  virtual bool isa__field_exists(const std::string&) = 0;
186 
188  virtual type_t isa__field_type(size_t) = 0;
189 
191  virtual size_t isa__field_index(const std::string&) = 0;
192 
194  virtual size_t isa__field_count() = 0;
195 
197  virtual const std::string& isa__field_name(size_t) = 0;
198 
204  virtual date_time isa__get_record_timestamp(void) = 0;
205 
207  virtual date_time isa__begin(void) = 0;
208 
210  virtual date_time isa__end(void) = 0;
211 
213  virtual size_t isa__size(void) = 0;
214 
216  virtual void isa__on_open(void) = 0;
217 
219  virtual variant isa__get_variant(size_t idx) = 0;
220 
222  virtual double isa__get_double(size_t idx) = 0;
223 
225  virtual void isa__update_value_at_position(size_t idx) = 0;
226 
227  public:
228 
237  virtual void isa__get_price_bar(const date_time& date_time, instrument_price_bar& priceBar) = 0;
238 
256  virtual bool isa__get_time_of_next_bar(date_time& nextDateTime,
257  const date_time& currentDateTime) = 0;
258 
264  virtual std::string isa__stream_name(void) const = 0;
265 
270  virtual bool isa__implements_scheduling(void) const = 0;
271 
272  //=================
274  //=================
275  public:
276 
281  bool get_is_strategy_scheduler(void) const {
282  return m_bIsStrategyScheduler;
283  };
284  void set_is_strategy_scheduler(bool _b) {
285  m_bIsStrategyScheduler = _b;
286  }
287  protected:
288  size_t m_nOpenIdx_PMS, m_nHighIdx_PMS, m_nLowIdx_PMS, m_nCloseIdx_PMS;
289  public:
291  virtual void cmp__finalize(void) override {
292  ;
293  }
294  virtual void cmp__evaluate_bar(const date_time&) override;
295  virtual void cmp__master_evaluate_bar(const date_time&) override;
296  private:
297  void raise_field_error(const std::string&) const;
298  public:
299  std::vector<series_core> m_auto_series;
300  public:
301  const series_core& open(void) const ;
302  const series_core& high(void) const;
303  const series_core& low(void) const;
304  const series_core& close(void) const;
305  const series_core& volume(void) const;
306  const series_core& bid(void) const;
307  const series_core& ask(void) const;
308  const series_core& bidsize(void) const;
309  const series_core& asksize(void) const;
310  const series_core& last(void) const;
311  const series_core& price(void) const;
312  const series_core& value(void) const;
313  const series_core& open_interest(void) const;
314  const series_core& at(size_t) const;
315  };
316 
318 
320 
325  /*
326  ** ====================================================
327  ** >>> class in_stream <<<
328  ** ====================================================
329  */
330 
336  class dll_export in_stream : public object {
337  tsa_declare_testable;
338  protected:
339  //bool m_is_init;
340  bool m_owns_pointer;
341  in_stream_adaptor* m_stream_adaptor_ptr = nullptr;
342  public:
344  in_stream(void);
345 
347  in_stream(const in_stream&);
348 
350  virtual ~in_stream(void);
351 
353  in_stream_adaptor* adaptor_ptr(void) const;
354 
356  in_stream_adaptor& adaptor(void) const;
357 
358  //IU
359  bool Connected(void) const;
360 
362  bool is_init(void) const;
363 
365  void verify_is_init(void) const;
366 
368  const std::string& source(void) const;
370  void as_random_walk(duration d = duration::days(1));
371 
373  void connect(const std::string& stream_name);
375  void connect(const std::string& stream_name, const std::string& data_store_name);
376 
384  void set_forward_shift(size_t shift_);
385 
392  void init_auto_series(void);
393  public:
395  bool field_exists(const std::string& field_name) const;
396 
398  size_t field_index(const std::string& field_name) const;
399 
401  size_t field_count(void) const;
402 
404  const std::string& field_name(size_t index) const;
405 
407  tsa::type_t field_type(const std::string& field_name)const;
408  public:
409 
416  date_time begin(void);
417 
424  date_time end(void);
425 
432  size_t size(void);
433 
434  public:
436  void connect(in_stream_adaptor& stream_adaptor);
437  public:
438  //IU
439  void connect(strategy*, fast::database&, const std::string& sourceName);
440  //IU
441  void set_default_stream_(void);
442  private:
443  // IU
444  void as_time_master(void);
445  public:
446 
452  const series_core& operator()(size_t index) const;
453 
459  const series_core& operator()(const std::string& field_name_) const;
460 
470  date_time timestamp(void) const;
471  public:
472  //======================
497  //======================
524  //
525  //auto_series close2;
526  };
528 
530 
535  };
536 
541  /*
542  ** ====================================================
543  ** >>> class out_stream_adaptor <<<
544  ** ====================================================
545  */
546 
553  class dll_export out_stream_adaptor : public component {
554  public:
555 
559  virtual ~out_stream_adaptor(void) {
560  ;
561  }
562  public:
563 
570  virtual void osa__append(const date_time& time_stamp,
571  std::vector<variant>& record) = 0;
572 
579  virtual void osa__prepare_stream(const std::string& stream_name,
580  const column_defs& field_list) = 0;// , rec_stream_open_flag open_flag) = 0;
581  public:
582 
587  virtual void cmp__finalize(void) override {
588  ;
589  }
590  };
592 
593 
598  /*
599  ** ====================================================
600  ** >>> class out_stream <<<
601  ** ====================================================
602  */
603 
611  class dll_export out_stream : public component, public object {
612  private:
613  out_stream_adaptor* m_out_stream_adaptor_ptr;
614  bool m_owns_adaptor_ptr;
615  std::string m_stream_name;
616  bool m_is_init;
617  private:
618  bool m_bFirstRecordCompletedAndSchemaReset;
619  bool m_bPrevValueWasFieldName;
620  size_t m_nInputPos;
621  size_t m_nValuePos;
622  size_t m_nCurrInputPos;
623  size_t m_nNumNamedFields;
624  size_t m_nNumValues;
625  std::string m_sMostRecentFieldName;
626  std::vector<type_t> m_Types;
627  std::vector<bool> m_IsValue;
628  std::vector<std::string> m_FieldName;
629  std::vector<variant> m_RecordSink_Values;
630  date_time m_RecordSink_Timestamp;
631  public:
633  out_stream(void);
634  private:
635  out_stream(const out_stream&) = delete;
636  public:
638  virtual ~out_stream(void);
639  private:
640  void operator= (out_stream_adaptor&); //disabled
641  public:
643  void connect(const std::string& table_name);// , rec_stream_open_flag flag = no_replace);
645  void connect(const std::string& table_name, const std::string& data_store_name);
646 
648  void attach(out_stream_adaptor& stream_adaptor);
649  public:
651  out_stream& operator<< (const char* char_string);
652 
654  out_stream& operator<< (const tsa::string& char_string);
655 
657  out_stream& operator<< (const std::string& char_string);
659  out_stream& operator<< (int num);
661  out_stream& operator<< (unsigned num);
663  out_stream& operator<< (int64_t num);
665  out_stream& operator<< (uint64_t num);
667  out_stream& operator<< (float num);
669  out_stream& operator<< (double num);
671  out_stream& operator<< (bool flag);
673  out_stream& operator<< (const date_time& date_time);
675  out_stream& operator<< (const date& dt);
677  out_stream& operator<< (const variant& var);//for NULL/undefined values.
678 
680  template<typename T>
681  out_stream& operator<< (const series<T>& ser) {
682  operator<<(ser[0]);
683  return *this;
684  }
685  public:
686  void ProcessFirstLineValue(const variant& var);
687  void ProcessValue(const variant&);
688  private:
689  void ResetCounters(void);
690  bool FirstRecordCompletedAndSchemaReset(void) const;
691  public:
692  virtual void cmp__post_evaluate_bar(const date_time&) override;
693  };
694 
696 
697 
698  /*
699  ** ====================================================
700  ** >>> class in_stream_adaptor_platform <<<
701  ** ====================================================
702  */
703 
704  // Internal
705  class dll_export in_stream_adaptor_platform
706  : public in_stream_adaptor, public tsa::object {
707  double prices[5];
708  std::string m_sFieldName;
709  public:
710  date_time m_CurrentTimestamp;
711  public:
712  in_stream_adaptor_platform(void);
713  virtual ~in_stream_adaptor_platform(void);
714  public:
715  void set_timestamp(const date_time&);
716  void set_prices(double _o, double _h, double _l, double _c, double _v);
717  void SetData(const date_time& _ts, double _o, double _h, double _l, double _c, double _v);
718  public:
719  virtual void isa__get_price_bar(const date_time& date_time,
720  instrument_price_bar& priceBar) override;
721  virtual bool isa__get_time_of_next_bar(date_time& nextDateTime,
722  const date_time& currentDateTime) override;
723  virtual std::string isa__stream_name(void) const override;
724  virtual bool isa__implements_scheduling(void) const override;
725  //virtual bool isa__ImplementsPriceMaster(void) const override;
726  public:
727  virtual void isa__set_position(const date_time&) override;
728  virtual bool isa__field_exists(const std::string&) override;
729  virtual type_t isa__field_type(size_t) override;
730  virtual const std::string& isa__field_name(size_t) override;
731  virtual size_t isa__field_index(const std::string&) override;
732  virtual size_t isa__field_count(void) override;
733  virtual date_time isa__get_record_timestamp(void) override;
734  virtual date_time isa__begin(void) override;
735  virtual date_time isa__end(void) override;
736  virtual size_t isa__size(void) override;
737  virtual void isa__on_open(void) override {
738  ;
739  }
740  public:
741  virtual variant isa__get_variant(size_t idx) override;
742  virtual double isa__get_double(size_t idx) override;
743  virtual void isa__update_value_at_position(size_t idx) override;
744  };
745 
746 
747 
748 
749 } // namespace tsa
750 #endif
Raise error if target already exists.
Definition: TSAStreams.h:534
Namespace for the &#39;Trading System API&#39; library.
Definition: original1.TSA3Core.cpp:20
series< double > high
Built in series object corresponding to stream field &#39;high&#39;.
Definition: TSAStreams.h:501
Class for managing native timeseries database files. Extremely high speed data access.
Definition: TSADatabase.h:118
series< double > bidsize
Built in series object corresponding to stream field &#39;bidsize&#39;.
Definition: TSAStreams.h:513
bool get_is_strategy_scheduler(void) const
Returns true.
Definition: TSAStreams.h:281
Defines the columnar structure of a table. Each column has a name, data type and field size...
Definition: TSADataDef.h:88
virtual void cmp__finalize(void) override
Definition: TSAStreams.h:291
virtual ~out_stream_adaptor(void)
Destructor.
Definition: TSAStreams.h:559
Parent class for &#39;in-stream adaptors&#39;. in_stream object rely on adaptors for access to underlying dat...
Definition: TSAStreams.h:52
Abstract base class for delegates of class out_stream.
Definition: TSAStreams.h:553
variant objects can represent values of different types.
Definition: TSAVariant.h:140
Represents a duration - the difference between two date_time values.
Definition: TSATime.h:945
Replace existing target if it already exists.
Definition: TSAStreams.h:533
_value_types_type
Data type enumeration used throughout the library. Intended to be used via type_t.
Definition: TSATypeDef.h:166
series< double > openint
Built in series object corresponding to stream field &#39;openint&#39;.
Definition: TSAStreams.h:523
series< double > close
Built in series object corresponding to stream field &#39;close&#39;.
Definition: TSAStreams.h:505
series< double > ask
Built in series object corresponding to stream field &#39;ask&#39;.
Definition: TSAStreams.h:511
Parent class for many library classes.
Definition: TSATypeDef.h:462
A date of the Gregorian calendar.
Definition: TSATime.h:119
series< double > low
Built in series object corresponding to stream field &#39;low&#39;.
Definition: TSAStreams.h:503
series< double > last
Built in series object corresponding to stream field &#39;last&#39;.
Definition: TSAStreams.h:517
series< double > open
Built in series object corresponding to stream field &#39;open&#39;.
Definition: TSAStreams.h:499
Class representing a database record.
Definition: TSADBRecord.h:52
series< double > volume
Built in series object corresponding to stream field &#39;volume&#39;.
Definition: TSAStreams.h:507
virtual void cmp__finalize(void) override
Override this member in any derived class. It will be invoked when the strategy is finalized...
Definition: TSAStreams.h:587
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 out_stream is used to write strategy output to various targets such as files, charts and series_base tables.
Definition: TSAStreams.h:611
Class strategy represents a trading or investment strategy.
Definition: TSAStrategy.h:108
series< double > bid
Built in series object corresponding to stream field &#39;bid&#39;.
Definition: TSAStreams.h:509
series< double > value
Built in series object corresponding to stream field &#39;value&#39;.
Definition: TSAStreams.h:521
Class representing a gregorian-date and time-of-day combination. The time component has microsecond r...
Definition: TSATime.h:428
series< double > asksize
Built in series object corresponding to stream field &#39;asksize&#39;.
Definition: TSAStreams.h:515
rec_stream_open_flag
flag for opening output streams
Definition: TSAStreams.h:532
Base class for components such as series_base adaptors.
Definition: TSAComponent.h:34
Class instrument represents a tradeable security such as a stock, option, futures contract...
Definition: TSAInstrument.h:64
series< double > price
Built in series object corresponding to stream field &#39;price&#39;.
Definition: TSAStreams.h:519