Управление большим количеством советников - страница 3

 
Edgar Akhmadeev:
Согласен с автором. Я что, один помню, сколько раз за последние годы высказывались желания иметь версию терминала без GUI, для работы экспертов на VPS. У MQ же есть такая платформа.
Кроме того, много раз высказывались желания иметь мультитерминал, последнее время заглохли. Но это уже другая история.

Спасибо, хоть кто-то меня понял ;)

 
Georgiy Merts:

Каждая система сама ведет свою позицию. Что там сложного ? Там громоздко, много кода. Но сложного - ничего.

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

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

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

Ну и дополнительно, при возникновении ряда событий (например, при изменении баланса, событии на чарте, еще каком-то) - весь список ТС оповещается, соответствующими функциями.

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

При приходе тика по какому из символов?

 
Dmi3:

При приходе тика по какому из символов?

Любого тика.

Вот моя функция OnTick():

void OnTick()
{  
   EEAWorkRetcode irResult = etMainExpert.MyOnTick();
}

Все. В ней больше ничего нет.

Функция MyOnTick() разворачивается в следующую:

EEAWorkRetcode CExpert::MyOnTick()
{
   datetime dtCurMoment = _TimeCurrent();

   // Учтем очередной тик
   m_dpDataProvider.ConsiderTick(dtCurMoment);
   
   // Проверим изменение баланса, и вызовем соответствующую функцию у фабрик, если баланс изменился
   _CheckBalance();

   EEAWorkRetcode wrResult = WR_UNKNOWN;

   // Проверим, возможно, еще не все фабрики инициализированы.
   if(m_fpaEAFactories.IsAllFactoriesInited() == false)
      {
      wrResult = m_fpaEAFactories.InitOnTicks(GetPointer(m_dpDataProvider),GetPointer(m_cprlRequestQueue),dtCurMoment-m_dpDataProvider.GetWorkMoments().m_dtFirstTickMoment);
      
      if(m_fpaEAFactories.IsAllFactoriesInited())
          m_dpDataProvider.SetInitedMoment(dtCurMoment);
      
      _ConsiderOnTickResult(wrResult);
      
      return(wrResult);
      };
   
   // Теперь проверяем необходимость тика, и если надо - рефрешим данные, и обрабатываем его.   
   wrResult = _RefreshData(RFRQ_SYMBOLS,false); // Сперва рефрешим только символы
         
   if(wrResult != WR_SUCCEEDED && wrResult != WR_DATA_PROVIDER_REFRESH_ERRORS)
      {
      _ConsiderOnTickResult(wrResult);
         
      return(wrResult);
      };
   
   CEAPartsFactoryT* pepfFactory = NULL;
   bool bDataHasRefreshed = false;
   bool bTerminalHasRefreshed = false;

   // Перебираем все фабрики.
   for(uint uiI=0; uiI<m_fpaEAFactories.Total(); ++uiI)
      {
      pepfFactory = m_fpaEAFactories.GetFactory(uiI);
      ASSERT_MYPOINTER(pepfFactory);

      // Проверим, надо ли обрабатывать тик в текущей фабрике ? 
      if(pepfFactory.ProceedTick(dtCurMoment) != true)
         continue;
      
      // Тик обрабатывать надо. 
      
      // Обновим данные 
      if(bDataHasRefreshed == false && pepfFactory.NeedAccTsIndRefresh())
         {
         wrResult = _RefreshData(ACC_TS_IND_REFRESH_MASK,false); // Проводим рефреш данных без терминала
         
         if(wrResult != WR_SUCCEEDED && wrResult != WR_DATA_PROVIDER_REFRESH_ERRORS)
            {
            _ConsiderOnTickResult(wrResult);
            
            return(wrResult);
            };
         
         bDataHasRefreshed = true;   
         };        

      if(bTerminalHasRefreshed == false && pepfFactory.NeedTerminalRefresh())
         {
         wrResult = _RefreshData(RFRQ_TERMINAL,false); // Проводим рефреш данных терминала (который очень медленно рефрешится)

         if(wrResult != WR_SUCCEEDED  && wrResult != WR_DATA_PROVIDER_REFRESH_ERRORS)
            {
            _ConsiderOnTickResult(wrResult);
            
            return(wrResult);
            };

         bTerminalHasRefreshed = true;
         };

      // Обновим внутренние данные фабрики      
      wrResult = pepfFactory.OnRefresh(dtCurMoment);

      if(wrResult != WR_SUCCEEDED)
         {
         _ConsiderOnTickResult(wrResult);
         
         return(wrResult);
         };
         
      // Обработаем тик, запросив у очередной фабрики реквесты на торговые действия
      wrResult = pepfFactory.MyOnTick(dtCurMoment);

      if(wrResult != WR_SUCCEEDED)
         {
         _ConsiderOnTickResult(wrResult);
         
         return(wrResult);
         };
      };   // Цикл по всем фабрикам
   
   // В этой точке m_cprlRequestQueue заполнен реквестами, и требуется их выполнение.   
   wrResult = _ProceedTradeRequests(dtCurMoment);
   
   _ConsiderOnTickResult(wrResult);

   return(wrResult);      
};

"Фабрика эксперта" - это, по сути сама ТС. Это такой класс, который создает все объекты, необходимые для работы ТС.

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

После того, как все фабрики создали свои реквесты - эти реквесты последовательно выполняются.

 
Georgiy Merts:

Любого тика.

Вот моя функция OnTick():

Все. В ней больше ничего нет.

Функция MyOnTick() разворачивается в следующую:

"Фабрика эксперта" - это, по сути сама ТС. Это такой класс, который создает все объекты, необходимые для работы ТС.

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

После того, как все фабрики создали свои реквесты - эти реквесты последовательно выполняются.

Уровень кодинга на два порядка выше моего.

Я не буду строить такую систему в любом случае,так как, как минимум:

1. Для многих моих советников тиковые события избыточны, т.е. этот алгоритм слишком "быстрый".

2. Для многих моих советников такая организация "очередей" заявок и опроса всех советников по очереди критически! "медленная".


Я хочу простую табличку. Скрипт или как он называется в терминологии MQL, которая будет связывать мои советники с терминалом без того интерфейса, который понапридумали разработчики в MQ.

 
Dmi3:

Уровень кодинга на два порядка выше моего.

Я не буду строить такую систему в любом случае,так как, как минимум:

1. Для многих моих советников тиковые события избыточны, т.е. этот алгоритм слишком "быстрый".

2. Для многих моих советников такая организация "очередей" заявок и опроса всех советников по очереди критически! "медленная".


Я хочу простую табличку. Скрипт или как он называется в терминологии MQL, которая будет связывать мои советники с терминалом без того интерфейса, который понапридумали разработчики в MQ.

1. Не боги горшки обжигают. Дорогу осилит идущий. Сейчас не нужно - ну и фиг с ним. Понадобится - тогда что-то подобное придумаешь.

2. Мои системы работают минимум на пятнадцатиминутках, большинство работает на часовках, значительная часть - на четырехчасовках. Это решение принимается на этапе оптимизации, и оптимальный таймфрейм "забивается" в текст самой ТС. После этого, хотя, класс эксперта вызывает обработку каждого тика в фабрике, сама фабрика глядит, обработан ли текущий бар, и если он уже обработан - сразу возвращает управление. Там есть функция ProceedTick(), как раз это запрос к фабрике - надо ли обрабатывать, если возвращается false, обработки не происходит, переходим к следующей фабрике.  Таким образом, в одном списке могут быть как ТС, работающие на тиках, так и ТС, работающие на дневках.

3. Что значит "критически медленная" ? Думаешь, если у тебя эти эксперты работают на разных графиках, они будут работать быстрее ? Приказы в любом случае выполняются последовательно. В любом случае все работающие эксперты должны проанализировать график цен, показания индикаторов, и, если надо - отдать торговые приказы на исполнение.


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

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

На мой взгляд, единственная возможность поставить десятки и больше ТС - это именно объединение их в рамках одного исполнимого файла.

 
Georgiy Merts:

1. Не боги горшки обжигают. Дорогу осилит идущий. Сейчас не нужно - ну и фиг с ним. Понадобится - тогда что-то подобное придумаешь.

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

3. Что значит "критически медленная" ? Думаешь, если у тебя эти эксперты работают на разных графиках, они будут работать быстрее ? Приказы в любом случае выполняются последовательно. В любом случае все работающие эксперты должны проанализировать график цен, показания индикаторов, и, если надо - отдать торговые приказы на исполнение.


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

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

На мой взгляд, единственная возможность поставить десятки и больше ТС - это именно объединение их в рамках одного исполнимого файла.

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

2. Если вы на советниках, которые установлены на часовые графики оперируете только моментом открытия свечи, советую пересмотреть подход.

 
Dmi3:

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

2. Если вы на советниках, которые установлены на часовые графики оперируете только моментом открытия свечи, советую пересмотреть подход.

1. А какая разница ? Пришел тик - вызвана функция OnTick(), она сразу вызывается у всех имеющихся фабрик, те, кому это требуется - сразу выставляют свои торговые приказы, которые сразу же исполняются. Задержка на это очень небольшая. У меня больше задержка на вычисление индикаторов. Так что - в данном случае, узкого места нет. Как раз, на мой взгляд, если стоит два отдельных советника - они имеют большую задержку, чем если в рамках одного советника работают два класса ТС.

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

 
Georgiy Merts:

1. А какая разница ? Пришел тик - вызвана функция OnTick(), она сразу вызывается у всех имеющихся фабрик, те, кому это требуется - сразу выставляют свои торговые приказы, которые сразу же исполняются. Задержка на это очень небольшая. У меня больше задержка на вычисление индикаторов. Так что - в данном случае, узкого места нет. Как раз, на мой взгляд, если стоит два отдельных советника - они имеют большую задержку, чем если в рамках одного советника работают два класса ТС.

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

Как показывает практика, слово "сразу" может иметь достаточно существенные различия. В моем текущем "сразу" я максимально близко к возможностям самого терминала. Если увижу, что возможности терминала меня ограничивают, перейду на прямое подключение.

 
Dmi3:

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

Но вам нужен именно менеджер советников, а его MQ абсолютно точно не будут делать.


Какой нужен функционал?

Советник Инструмент ТаймФрейм Статус
 EA1  EURUSD  H1  Working
 EA2  GBPUSD  M5  Paused
 +Добавить+       

Что-то такое?

Это можно написать сейчас на MQL. Графики открывать/закрывать с помощью кнопок в таблице. Считайте их обычными контейнерами для советников.

 
Andrey Khatimlianskii:

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

Но вам нужен именно менеджер советников, а его MQ абсолютно точно не будут делать.


Какой нужен функционал?

Советник Инструмент ТаймФрейм Статус
 EA1  EURUSD  H1  Working
 EA2  GBPUSD  M5  Paused
 +Добавить+       

Что-то такое?

Это можно написать сейчас на MQL. Графики открывать/закрывать с помощью кнопок в таблице. Считайте их обычными контейнерами для советников.

Андрей, не подскажешь? Есть ли в mql5 стандартная функция по добавлению эксперта на график?
Функция удаления есть, ExpertRemove, а вот добавления что то не видел.
Вообще не хватает таких функций для всех типов программ, индикаторы, скрипты, скрипты_Py, сервисы, эксперты.

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