class DataFrame

С точки зрения пользователя класс предоставляет простую таблицу из N колонок по M строк данных в виде double. Для получения/записа данных в которую можно обращаться как table[ROW][COL]. А для запросов со стороны эксперта задавая функцию-getter. Получается эдакий мини-эксель через который ведётся всё общение с роботом.

DataFrame(EA *expert,int ncols,int nrows);

При создании объекта передаётся указатель на эксперт, макс. хранимое число колонок и строк. Типично непосредственным созданием объектов-фреймов заведует сам робот, и конструктор приведён к общему сведению.

Как и во всей библиотеке, поля являются публичными и доступными к изменениям. Запретов «на выстрел в ногу» библиотека не делает. Подразумевается что программист достаточно квалифицирован чтобы понимать что он делает изменяя отдельные поля объектов. Непосредственное изменение полей может потребоваться для «тонкого тюнинга» экземпляров, без порождения лишних классов. Если вы не уверены в результатах воздействия - просто не меняйте публично доступные поля, используйте методы.

  • EA *expert; указатель на эксперт-владелец фрейма данных. Требуется для возможности одновременной работы нескольких экспертов. Устанавливается в констукторе
  • DataSeries *series[]; динамический массив серий данных(указателей на серии), хранимых во фрейме. Как правило состав серий не меняется.
  • DataFrameGetter getter; указатель на функцию-getter задаваемую пользователем. Эта функция будет вызываться каждый раз когда требуются данные и они отсутсвуют в кеше DataExpert.

непосредственно (в разных версиях) могут быть дополнительные, ещё не документированные или временно-необходимые поля. Сверяётесь с исходным кодом, он доступен

DataFrame представляет собой таблицу, в ячейках которой находятся double - значения. То есть во многом повторяет интерфейс двухмерного массива, организованного по колонкам.

  • double Cell(int column,int row); - вернёт непосредственное значение, хранимое в колонке column и строке row. При необходимости будет инициированно вычисление.
  • double SetCell(int column,int row,double value); - установить/задать значение для ячейки данных
  • double View(int column,int row); - вернёт данные из кеша, но не инициирует вычисления.
  • DataSeries *Column(int column); - получить (указатель на) колонку данных

класс DataFrame повторяет интерфейс двухмерного массива, поэтому вы можете обращаться к колонкам данных как table[column], а к отдельным ячейкам как к table[column][row];

DataFrame кеширует последние полученные результаты для минимизации повтороных вызовов getter. Для того чтобы указать что данные больше не валидны, служит группа функций ForgetXXX() - сброс данных кеша.

  • ForgetCell(int column,int row) - сбросить(забыть) значение отдельной ячейки таблицы. При следующем обращении к данным будут инициированы вычисления.
  • ForgetRow(int row) - сбросить данные всех ячеек одной строки
  • ForgetAll() - сбросить кеши всей таблицы

С одной стороны сказать что DataFrame представляет собой комплексный индикатор с большим кол-вом буферов, с другой стороны он является электронной таблицей с автоматическим расчётом данных «по требованию», и наконец это де-факто двухмерный массив (матрица).

Поэтому кол-во функций будет довольно велико, но пополнятся и реализовываться они будут по мере востребованности (и оправданной необходимости быть внесёнными в интерфейс класса)

Пересечения данных

Частые задачи при графическом анализе и вообще работы с данными и графиками - поиск пересечений двух линий, двух наборов данных.

  • bool CrossedUp(int column1,int column2,int shift1=0,int shift2=shift1) проверить «пересечение вверх» набора из column1 c column2 взятых со смещениями shift1, shift2 .
  • bool CrossedDn(int column1,int column2,int shift1=0,int shift2=shift1) - аналогично проверить «пересечение вниз»
  • int FindCross(int column1,int column2,int shift1=0,int shift2=shift1) - найти (номер строки) пересечение двух наборов