Передать структуру в эскперт

 

Есть индикатор. Он заполняет вот такую структуру:

struct StateInfo
   {
   datetime timeStart; // state time start
   datetime timeEnd; // state time end
   enTrendStates State;
   enTrendStructs Structure;
   int BarsCount;    //bars in trend
   double StateHigh; // State low
   double StateLow; // State low
   double stateBreak;// Break point of trend
   };
StateInfo States[];

Надо этот массив  перенести в советник. Как? -  Буфферы индикатора поддерживают только double

Я в начале хотел сразу класс сделать (чтобы там методы типа "GetTrendPoints() etc) . Но тут уж такой затык что объекты и указатели в эсперт передавать тоже нельзя. Так что уже хоят бы данные как нибудь перекачать

 
Max B:

Есть индикатор. Он заполняет вот такую структуру:

Надо этот массив  перенести в советник. Как? -  Буфферы индикатора поддерживают только double

Я в начале хотел сразу класс сделать (чтобы там методы типа "GetTrendPoints() etc) . Но тут уж такой затык что объекты и указатели в эсперт передавать тоже нельзя. Так что уже хоят бы данные как нибудь перекачать

штатный способ передачи данных от советника - заполнение индикторных массивов(буферов).

(сразу кривое, но рабочее решение: Да они double но с акуратностью можно считать что просто скаляр 64 бита. Можно распарсить вашу структуру на кусочки по 64 бита и положить туда. На стороне советника собрать обратно.)

Каким образом эта структура соотносится с буферами индикатора ? что конкретно он отображает, что получается в окне данных по Ctrl+D. Лучше правильно и логично вести буферы

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

--

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

 
Maxim Kuznetsov #:

штатный способ передачи данных от советника - заполнение индикторных массивов(буферов).

(сразу кривое, но рабочее решение: Да они double но с акуратностью можно считать что просто скаляр 64 бита. Можно распарсить вашу структуру на кусочки по 64 бита и положить туда. На стороне советника собрать обратно.)

Каким образом эта структура соотносится с буферами индикатора ? что конкретно он отображает, что получается в окне данных по Ctrl+D. Лучше правильно и логично вести буферы

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

--

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

А как конкретно это сделать? Я что-то смутно думаю будет использовать оператор union , но тут надо чтобы эти куски вместе аккуратно ложились и в правильном порядку ( чтот смутно припоминаю про обратный порядок байтов в слове) В общем логика для меня туманна - я не делал такого.

Почему как индикатор? - ну так сложилось.  Сейчас это уже очень навороченный идикатор с кучей кода и комплексной логикой, и кстати, одних буфферов там 80. Визуализация индикатора необходима для собственно отладки и осмысления логики. Переделывать как класс - может быть когда нибудь потом. Но при этом не хочу ещё больше усложнять то что и так сложно добавив ещё и ООП. Эта структура один из элементов (но важный)

Эксперт тоже не самй простой - использует несколько таймфреймов

Через буффер перегнать бы идеально - уже эскперт работает с нескольими буфферами (но понятно double)


p.s. Сделал в лоб по тупому. Не элегантно но надо же работает!

bool structToDouble(StateInfo &state,int i, double &arr[])
   {
   
   arr[i]=(double)state.timeStart;
   arr[i+1]=(double)state.timeEnd;
   arr[i+2]=(double)state.BarsCount;
   arr[i+3]=(double)state.StateHigh;
   arr[i+4]=(double)state.StateLow;
   arr[i+5]=(double)state.StateBreak;
   return true;
   }
 
Max B #:

А как конкретно это сделать? Я что-то смутно думаю будет использовать оператор union , но тут надо чтобы эти куски вместе аккуратно ложились и в правильном порядку ( чтот смутно припоминаю про обратный порядок байтов в слове) В общем логика для меня туманна - я не делал такого.

Почему как индикатор? - ну так сложилось.  Сейчас это уже очень навороченный идикатор с кучей кода и комплексной логикой, и кстати, одних буфферов там 80. Визуализация индикатора необходима для собственно отладки и осмысления логики. Переделывать как класс - может быть когда нибудь потом. Но при этом не хочу ещё больше усложнять то что и так сложно добавив ещё и ООП. Эта структура один из элементов (но важный)

Эксперт тоже не самй простой - использует несколько таймфреймов

Через буффер перегнать бы идеально - уже эскперт работает с нескольими буфферами (но понятно double)


p.s. Сделал в лоб по тупому. Не элегантно но надо же работает!

union X{
   StateInfo a;
   double b[sizeof(StateInfo)/sizeof(double)+(sizeof(StateInfo)%sizeof(double)==0?0:1)];
};

Вот так красивее. Соответственно, сколько массив double получился, столько буферов и используем, их из union заполняем, в роботе читаем буфера в этот же union и имеем готовую структуру. Если префиксом en обозначен enum, то 7 буферов дополнительно на эту структуру надо.

 
Конечно через юнион.
Но лично я бы использовал ресурс, а не буфер. Т.к. буфер равен размеру количества баров в окне. Этого размера может не хватить или, наоборот, будет слишком большой, расходуя зря память.

У fxsaber есть рабочая быстрая  библа. 
Здесь, здесь это обсуждали.

Причина обращения: