Обсуждение статьи "Универсальный торговый эксперт: Событийная модель и прототип торговой стратегии (Часть 2)" - страница 4

 
Andrey Khatimlianskii:
Как минимум, проанализировать цену. Возможно, входить уже совсем не надо.
Да, есть такой механизм. И где ему быть встроенным, как не в класс торговых приказов? И как формализовать такой механизм, какое резкое движение считать критическим?
 
Гога:
Да, есть такой механизм. И где ему быть встроенным, как не в класс торговых приказов? И как формализовать такой механизм, какое резкое движение считать критическим?

Ну так в этом и вопрос! Поэтому и не встраивается это в движок.

Для одной стратегии просскольз на 20 пунктов роли не играет, и войти надо в любом случае, а для другой проскольз в 2 пипса ломает всю статистику, и входить хуже нельзя.

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

Ну, или настройку добавить. Точнее, настройки на все случаи жизни ) 

 
Это очень хорошая статья. Я узнал много нового. Хороший вклад, спасибо.
 
Alain Verleyen:

На билде 1241 код компилируется хорошо, поэтому я попытался запустить бэктест. Он не принимает никаких сделок.

Немного покопавшись, я обнаружил, что это связано с режимом заполнения. На используемом мной брокере/символе разрешен режим ORDER_FILLING_IOC. Ваш класс TradeCustom по умолчанию устанавливает режим заполнения ORDER_FILLING_FOK. И я застрял на месте, как можно изменить этот режим заполнения, чтобы советник Agent.mq5 мог вести торговлю? Я могу поискать, но это займет у меня много времени.

В этом и заключается проблема подобных инструментов, очень похожих на советник MQL5 wizard от Metaquotes, он практически непригоден для тех, кто не знает всех тонкостей работы с классами. Как только вы сталкиваетесь с проблемой, которая не была предусмотрена автором, исправить ее или изменить/дополнить становится настоящим мучением. Я не вижу никакой реальной разницы между вашим решением и решением от Metaquotes (wizard).

В любом случае, поздравляю с огромной работой. Это большая работа по программированию.

В папке MetaEditor5 include есть несколько классов. Если кто-то может дать нам глубокое объяснение классов папки Expert, это будет очень полезно, потому что они выглядят очень сложными. Людям нравится писать стандартные эксперты на основе формальных базовых классов и не всегда пересоздавать wheels..... В любом случае, эта статья очень помогает не пересоздавать колеса.
 
Amy Liu:
В папке MetaEditor5 include есть несколько классов. Если кто-то может дать нам глубокое объяснение классов папки Expert, это будет очень полезно, потому что они выглядят очень сложными. Людям нравится писать стандартные советники на основе формальных базовых классов и не всегда пересоздавать wheels..... В любом случае, эта статья очень помогает не создавать колеса заново.
Я согласен. Проблема возникает, когда во фреймворке есть ошибка. Прежде чем использовать фреймворк, мы должны либо принять решение о его глубоком изучении, либо убедиться, что он хорошо поддерживается автором.
 
Alain Verleyen:
Я согласен. Проблема возникает, когда во фреймворке есть ошибка. Прежде чем использовать фреймворк, нужно либо принять решение о его глубоком изучении, либо убедиться, что он хорошо поддерживается автором.
Именно поэтому я хочу изучить классы в MetaEditor5, они из "правительства" ;)
 
Amy Liu:
Вот почему я хочу изучить классы в MetaEditor5 - они из "правительства" ;)
И с ошибками, и не очень хорошо поддерживаются :-D
 
Спасибо. Очень хорошая статья.
 

Господин Василий,

очень хороший код... и полезный для меня...

в новостных сборках mt5 (1952), мы получили "сообщение" в компиляторе,


bool CBarDetector::IsNewBar(void)

  {

   datetime time[];

   if(CopyTime(m_symbol, m_timeframe, 0, 1, time) < 1)return false;

   if(time[0] == m_last_time)return false;

   return (m_last_time = time[0]);    //<=============HERE

  }

//+------------------------------------------------------------------+

///////////MESSAGE in THE METAEDITOR compiler///////////////
expression not boolean NewBarDetector.mqh 87 24


правильно должно быть так? Пожалуйста, подтвердите

//+------------------------------------------------------------------+
//| Возвращает true, если для данного символа и таймфрейма существует |
//| новый бар.|
//+------------------------------------------------------------------+
bool CBarDetector::IsNewBar(void)
  {
   datetime time[];
   if(CopyTime(m_symbol, m_timeframe, 0, 1, time) < 1)return (false);
   if(time[0] == m_last_time)return (false);
   return (m_last_time == time[0]);
  }
//+------------------------------------------------------------------+



 

Здравствуйте, Василий,

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

Что касается обработчиков событий New Tick и New Bar. Вы просматриваете список добавленных тиков, затем создаете структуру событий, передавая ее обработчикам событий Init и Support, например, событие нового тика ниже:

//+------------------------------------------------------------------+
//| Обнаруживает появление новых тиков мультиинструментов.|
//+------------------------------------------------------------------+
void CStrategy::NewTickDetect(void)
  {
   if(m_ticks_detectors.Total()==0)
      AddTickEvent(ExpertSymbol());
   for(int i=0; i<m_ticks_detectors.Total(); i++)
     {
      CTickDetector *tick=m_ticks_detectors.At(i);
      if(tick.IsNewTick())
        {
         m_event.period=PERIOD_CURRENT;
         m_event.type=MARKET_EVENT_TICK;
         m_event.symbol=tick.Symbol();
         CallSupport(m_event);
         CallInit(m_event);
        }
     }
  }

В одном из ваших примеров, например, клип скользящей средней ниже;

bool CMovingAverage::IsTrackEvents(const MarketEvent &event)
  {
//--- Мы обрабатываем только открытие нового бара на рабочем символе и таймфрейме
   if(event.type != MARKET_EVENT_BAR_OPEN)return false;
   if(event.period != Timeframe())return false;
   if(event.symbol != ExpertSymbol())return false;
   return true;
  }

Эта функция IsTrackEvents, похоже, сводит на нет назначение функции NewTickDetect, приведенной выше! Таким образом, пример со скользящей средней, приведенный выше, должен быть способен торговать на нескольких инструментах, основываясь на своей способности проверять несколько символов, как в NewTickDetect, но IsTrackEvents позволяет торговать только для таймфрейма стратегии и символа (символ здесь является ключевым). Не означает ли это, что цикл NewTickDetect на самом деле не нужен, поскольку стратегия может торговать только по своему символу? По сути, NewTickDetect должен только проверять, является ли полученный тик символом стратегии - без циклов. Что, по сути, похоже на наличие объекта стратегии для каждого интересующего символа, который CStragyList перебирает в цикле?

Я очень надеюсь, что я все правильно понимаю, и надеюсь, что вы сможете мне это объяснить.

Мне нравится ваша работа. Я многому научился из ваших статей, так что большое спасибо.

С уважением,

Шеп