Обсуждение статьи "Прототип торгового робота"

 

Опубликована статья Прототип торгового робота:

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

Автор: Алексей Сергеев

 

О наконец-то хорошая статья!

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

:-(

С уважением, Андрей.

 
LuckyFish:

О наконец-то хорошая статья!


Да, но данный шаблон не подходит для мультивалютных и(или) работающих по таймеру советников.
 

 ПОДДЕРЖИВАЮ!)

Да, но данный шаблон не подходит для мультивалютных и(или) работающих по таймеру советников.

 

спасибо !!!

а хлопцам разработчикам - месяца на 3 раньше такую статью слабо ?

 
а чем работа по таймеру отличается от работы по по тикам?
 
sergeev:
а чем работа по таймеру отличается от работы по по тикам?

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

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

PS

Таймер также интересно использовать для отслеживания состояния терминала. К примеру наличие коннекта...

 
Процедурно вышло, но для начала неплохо. Можно многое скрыть используя ООП. С минимально видимым интерфейсом в каждом новом советнике. Вынести стратегию в отдельный класс, к примеру. Настройки стратегии - свойства объекта CStrategy, инициировать в конструкторе эксперта. Мультивалютный - инициировать список объектов стратегий. Каждая стратегия на своем символе. Ну и мелочи всякие, вместо m_trade.ResultOrder() можно сразу использовать m_trade.ResultDeal() без лишних циклов по всем ордерам в дополнительной функции GetDealByOrder().
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Свойства объектов
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Свойства объектов
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы объектов / Свойства объектов - Документация по MQL5
 

Рекомендую уйти вот от такой конструкции

//------------------------------------------------------------------ CheckNewBar
bool CExpertAdvisor::CheckNewBar()          // функция проверки появления нового бара
  {
   MqlRates rt[2];
   if(CopyRates(m_smb,m_tf,0,2,rt)!=2)      // копируем бары
     { Print("CopyRates of ",m_smb," failed, no history"); return(false); }
   if(rt[1].tick_volume>1) return(false);   // проверяем объем 
   return(true);
  }

так как обработка предыдущего тика может занять достаточное количество времени чтобы пропустить приход первого тика нового бара

соответственно возможно пропустить открытие.

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

Если одинаковое - нового бара нет

Если отличается то в большую сторону то как минимум открыт новый (следующий) бар после чего сохраненное время нулевого бара инициализируем текущем временем нулевого бара.

Такая конструкция более надежная.

Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства позиций
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства позиций
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства позиций - Документация по MQL5
 
olyakish:

Рекомендую уйти вот от такой конструкции

так как обработка предыдущего тика может занять достаточное количество времени чтобы пропустить приход первого тика нового бара

соответственно возможно пропустить открытие.

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

Если одинаковое - нового бара нет

Если отличается то в большую сторону то как минимум открыт новый (следующий) бар после чего сохраненное время нулевого бара инициализируем текущем временем нулевого бара.

Такая конструкция более надежная.

Я у себя так делал:

bool CUniexp::checkNewBar(void)
{
   static datetime prevTime[1];
   datetime currentTime[0];
   CopyTime(_Symbol,_Period,0,1,currentTime);
   if (currentTime[0]==prevTime[0])
   {return (false);}
   else
   {
      prevTime[0] = currentTime[0];
      return (true);
   }
}


 
isNewBar
isNewBar
  • голосов: 7
  • 2010.05.07
  • Prival
  • www.mql5.com
Функция анализа появления нового бара на заданном таймфрейме.
Причина обращения: