Заставить работать CExpert <Expert\Expert.mqh> - страница 3

 

А, да, это я недосмотрел.  В базовом классе CExpertBase.

Но, все равно, похоже, что у вас просто неинициализируется эта перменная.

 

Все верно, в этой функции мы имеем:

double CExpertBase::Close(int ind) const
  {
//--- check pointer
   if(m_close==NULL)
      return(EMPTY_VALUE);
//--- return the result
   return(m_close.GetData(ind));
  }

Переменная m_close  у нас неинициализирована, равна NULL, и вам возвращается EMPTY_VALUE.

 
George Merts:

Все верно, в этой функции мы имеем:

double CExpertBase::Close(int ind) const
  {
//--- check pointer
   if(m_close==NULL)
      return(EMPTY_VALUE);
//--- return the result
   return(m_close.GetData(ind));
  }

Переменная m_close  у нас неинициализирована, равна NULL, и вам возвращается EMPTY_VALUE.

Эт понятно. Но вы в CExpertBase. Насколько помню, она инициализируется в СExpert.

Позднее еще гляну, сейчас убегаю. 

PS InitIndicators 

 

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

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

Возможно эти классы создавались для автоконструктора в редакторе. Но я, лично, не понимаю что он конструирует, т.к. никакии стандартные стратегии, стандартне индикаторы и вариации на их тему не использую. И не понимаю, как впихнуть свои индикаторы в этот индикаторный шаблон и что они там будут делать.))

Тем не менее, иметь ООП шаблон для стратегий оч. заманчиво. Однако, на данном этапе, изучение шаблона занимает больше времени, чем создание советника. На данном этапе у меня уже готовы класс таймсерий, класс индикаторов и уже работает класс стратегий с пока невнятной (отладочной) самой стратегией.

 

2016.08.16 22:00:04.959 eBat3.1 (EURUSD,M1)     Возможен Шорт Close=1.12764 Ind(4,0)=1.127666459359827
2016.08.16 22:00:04.959 eBat3.1 (EURUSD,M1)     TV=29.2
2016.08.16 22:00:04.959 eBat3.1 (EURUSD,M1)     Вне позиций Vol=0.0
2016.08.16 22:00:04.287 eBat3.1 (EURUSD,M1)     Возможен Шорт Close=1.12763 Ind(4,0)=1.127666458794369
2016.08.16 22:00:04.287 eBat3.1 (EURUSD,M1)     TV=29.2
2016.08.16 22:00:04.287 eBat3.1 (EURUSD,M1)     Вне позиций Vol=0.0
2016.08.16 22:00:03.406 eBat3.1 (EURUSD,M1)     Возможен Шорт Close=1.12763 Ind(4,0)=1.127666458794369
2016.08.16 22:00:03.406 eBat3.1 (EURUSD,M1)     TV=29.2
2016.08.16 22:00:03.406 eBat3.1 (EURUSD,M1)     Вне позиций Vol=0.0
2016.08.16 22:00:01.749 eBat3.1 (EURUSD,M1)     Возможен Шорт Close=1.12761 Ind(4,0)=1.127666457663451

Это, чтобы не быть голословным.))

ЗЫ Это с нуля. Посмотрел начало темы - 2016.08.14 21:02 - тогда еще вообще ничего не было. Ни строчки.)) Тогда еще хотел для упрощения СExpert использовать.

 

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

Структура CExpert достаточно логична и стройна, и вы совершенно правы - это именно шаблон взаимодействия между различными частями советника. Я бы не сказал, что он "лишен функциональности" - он как скелет в организме. Осьминог, вероятно, тоже думает, что скелет у позвоночных "лишен функциональности". Более того - он даже мешает, осьминог без проблем может пролезть в такую щель, через которую рыбы одинакового с ним размера никогда не пролезут. Но, тем не менее, в долговременном плане скелет дает больше преимуществ организму. Так и тут.

Для простейших советников CExpert - слишком замудренный и комплексный класс. Плюс, как я уже сказал, похоже,  проектировался с целью "утереть нос ребятям из Microsoft, писавшим библиотеку MS MFC, а не для того, чтобы облегчить жизнь советникописателям. Однако, в сложных по структуре советниках CExpert будет вполне себе оправдан. Кроме того, после того, как у вас будет написаны все классы основного шаблона вашего советника - CExpert будет очень даже полезен в дальнейшей поддержке кода. Вы просто меняете классы сигналов, манименеджмента, трейлинга, а все обслуживающие моменты (типа инициализации таймсерий) - уже будут сделаны.

Я сам считаю себя не последним дубом в ООП, и имею достаточно большой опыт написания сложных программ на С++, однако, со структурой шаблонов советника Стандартной библиотеки разбирался достаточно долго.

Так что ваше замечание, что "изучение шаблона занимает больше времени, чем написание советника" не совсем верно, и даже совсем неверно - изучение этого шаблона занимает ГОРАЗДО больше времени, чем написание советника.

 

День добрый! Возможно тема уже неактуальна, но я просто сейчас тоже разбираюсь с CExpert использовать ли или делать с нуля и решил отписаться:

По поводу EMPTY_VALUE в данных тайм серий я заметил, что после создания тайм-серий, размер буфера у них стоит по умолчанию 1024,

#define DEFAULT_BUFFER_SIZE 1024

и если нужны данные более старых баров то нужно вызывать BufferResize(), возможно на момент темы, по умолчанию был 0.

По крайней мере если судить что библиотека претерпела немало доработок и устранения багов, это вероятно.

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

А вот если пишешь свой класс от CExpert то такие нюансы приходится учитывать. Надеюсь возможностей после изучения получу больше чем если бы писал с нуля.

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