Учёба. Классы. Нужна помощь. - страница 29

 
Vitaly Murlenko #:

Сам разберусь.

Я удалю последний пост и вы тоже,
 

что за люди, никогда не имейте с ними никаких тут дел

когда идет речь о каких-то важных вещах, он пошел и пропал)

 
Alexey Oreshkin #:

Самый простой пример с простой функцией - IsNewBar.
По этой функции определяем что пришла новая свечка. У этой функции один нюанс - повторный вызов всегда возвращаем фальш. А вызвать повторно иногда надо. Это может быть и мультивалютный советник и надо на разных периодах проверить свечки и т.д. Если вместо этой функции использовать класс, то для каждой ситуации можно создать свой экземпляр класса и всё, очень удобно.

Спасибо. Уже раpобрался, уже не актуально. Но что касается функции нового бара, не вижу нужды делать класс - проще объявить глобальную переменную для нужного таймфрейма нужного торгового инструмента и использовать iBars(). Как правило, инструмент и таймфрейм заранее известны. В крайнем случае выбор инструмента, как и выбор таймфреймов можно вынести в пользовательский переменные.

Но за участие всё равно спасибо.

 
Vitaly Murlenko #:

Спасибо. Уже раpобрался, уже не актуально. Но что касается функции нового бара, не вижу нужды делать класс - проще объявить глобальную переменную для нужного таймфрейма нужного торгового инструмента и использовать iBars(). Как правило, инструмент и таймфрейм заранее известны. В крайнем случае выбор инструмента, как и выбор таймфреймов можно вынести в пользовательский переменные.

Но за участие всё равно спасибо.

В одной из статей рассказывал про реализацию такой функции в мультивалютном советнике, где набор символов и таймфреймов может быть любым и неизвестным на момент компиляции:

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

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

Сделаем общедоступную функцию IsNewBar(symbol, timeframe), которая должна уметь сообщить о наступлении на текущем тике нового бара по символу symbol и таймфрейму timeframe. При этом желательно, чтобы кроме вызова этой функции никаких дополнительных переменных и действий в код торговой логики стратегий добавлять не понадобилось. Также, если на текущем тике наступил новый бар, и функция вызывается несколько раз (например, из разных экземпляров торговых стратегий), то она должна на каждом вызове возвращать истину, а не только на первом.

Тогда нам понадобится хранить информацию о временах наступления последнего бара для каждого символа и таймфрейма. Но под "каждым" мы подразумеваем не все, которые доступны в терминале, а только реально требуемые для работы конкретных экземпляров торговых стратегий. Чтобы определить круг этих необходимых символов и таймфреймов, мы расширим список действий, выполняемый функцией IsNewBar(symbol, timeframe). Пусть она сначала проверяет, существует ли в каком-то виде запомненное время для текущего бара на данном символе и таймфрейме. Если не существует, то она будет выполнять действия по созданию такого места хранения времени. Если существует, то будет возвращать результат проверки наступления нового бара.

И использование классов здесь очень помогло.

 
Vitaly Murlenko #:

Спасибо. Уже раpобрался, уже не актуально. Но что касается функции нового бара, не вижу нужды делать класс - проще объявить глобальную переменную для нужного таймфрейма нужного торгового инструмента и использовать iBars(). Как правило, инструмент и таймфрейм заранее известны. В крайнем случае выбор инструмента, как и выбор таймфреймов можно вынести в пользовательский переменные.

Но за участие всё равно спасибо.

У меня в общем эксперте может быть сколько угодно "элементарных экспертов", каждый из которых работает на одном символе, и на одном таймфрейме(или на тиках). 

В классе эксперта запоминается время последнего обработанного тика, и при приходе нового тика - определяется, в каком баре основного таймфрейма находится прошлый обработанный тик, и пришедший. Если это один и тот же бар - то пришедший тик не обрабатывается. Если это разные бары - запоминается новое время обработанного тика, и тик обрабатывается, с анализом и выдачей новых торговых приказов. 

Создавая несколько объектов "элементарных экспертов" - я автоматически получаю обработку по нужным символам, таймфреймам(или тикам). Как раз, на мой взгляд, никаких глобальных переменных здесь быть не должно, как раз для того, чтобы каждый "элементарный эксперт" работал бы независимо. ООП-подход тут очень даже к месту. 

 
Georgiy Merts #:

...

В классе эксперта запоминается время последнего обработанного тика...

Как у Вас реализовано запоминание времени внутри класса? Статическая переменная? 

 
Vitaly Murlenko #:

Как у Вас реализовано запоминание времени внутри класса? Статическая переменная? 

/********************************************************************\
|   Класс Новый бар                                                  |
\********************************************************************/
class CNewBar : public CObject
 {
private:
  string             m_symbol;
  ENUM_TIMEFRAMES    m_timeframe;
  datetime           m_time;       // время последнего обращения
public:

Никаких особых ухищрений не надо.

 
Alexey Viktorov #:

Никаких особых ухищрений не надо.

class CNewBar
  {
protected:
   datetime          oldTime;
public:
   bool              NewBar(string symbol,ENUM_TIMEFRAMES timeframe)
     {
      //--- создаем переменную newtime(тип время), присваиваем в нее из функции SeriesInfoInteger дату открытия последнего бара
      datetime newTime=datetime(SeriesInfoInteger(symbol,timeframe,SERIES_LASTBAR_DATE));
      if(newTime!=oldTime && newTime) // проверка на появление нового бара (новое время не равно старому и в newtime есть значение(true))
        {
         oldTime=newTime; //обновим время прошлого бара
         return(true); // вернем функции NewBar true, появился новый бар
         if(MQLInfoInteger(MQL_DEBUG))
            Print("Новый бар",newTime,"старый бар",oldTime); // в режиме отладки, будет выводится сообщение о значениях времен баров
        }
      //--- иначе,
      return(false); // нового бара еще нет
     };
   //---- конструктор класса
                     CNewBar() {oldTime=NULL;}; // вызывается автоматический при создании Объекта проинициализируем m_prevtime в -1
  };
 

не стоит его использовать, если точно не знаете для чего

он вам точно не нужен если вы новичок

 
lynxntech #:

А если советник установлен на EURUSD а мне надо получить новый бар на GBPUSD тогда как? Писать новый класс?