Обсуждение статьи "Как построить советник, работающий автоматически (Часть 15): Автоматизация (VII)"

 

Опубликована статья Как построить советник, работающий автоматически (Часть 15): Автоматизация (VII):

Чтобы завершить этот цикл статей об автоматизации, мы дополним то, что рассмотрели в предыдущей статье. Это определенно показывает, как всё будет сочетаться друг с другом, заставляя советника работать как часы.

Я определил основные ошибки, проблемы и трудности, присущие работе программиста при создании автономного советника. Кроме того, я выделил ценные идеи и перспективные подходы к которым вы придете, наблюдая за рынком.

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

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

Кроме того, я показал, как создать определенные условия для эффективной работы вашей системы, даже если в MQL5 или MetaTrader 5 нет индикатора, который вы хотели бы использовать. Это мы показали в примере номер 3, где показано, как создать внутренний индикатора HILO. Однако крайне важно, чтобы система была должным образом реализована и протестирована. Плохо выполненная система, как бы хорошо мы ее ни разработали, может привести скорее к убыткам, чем к прибыли.

Автор: Daniel Jose

 

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

У меня есть вопрос по поводу исполнения советника в этой серии статей.

Я протестировал его на счетах Netting и Hedging, изменив OCO Order на Pending, согласно вашей документации. Но ордера не исполняются.

И в журнале ошибок тоже нет.

Что это может быть?

Примечание: я ничего не менял в коде, только логику покупки и продажи... Я протестировал его со своей логикой (моя стратегия) и он не дал ни одной записи, я подумал: я сделал что-то не так, kkkk.... затем я взял ваш код без изменений, скомпилировал его и произошло то же самое.

Он запускается вручную (когда вы устанавливаете количество партий), но не автоматически.

 
César Augusto #:

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

У меня есть вопрос по поводу запуска советника в этой последовательности статей.

Я протестировал его на счетах Netting и Hedging, изменив OCO Order на Pending, согласно вашей документации. Но ордера не исполняются.

Также он не выдает никаких ошибок в журнале.

Что это может быть?

Примечание: я ничего не менял в коде, только логику покупки и продажи... Я протестировал его с моей логикой (моя стратегия) и он не дал никаких записей, я подумал: я сделал что-то не так, kkkk.... затем я взял ваш код без каких-либо изменений, скомпилировал его и происходит то же самое.

Он запускается вручную (когда вы устанавливаете количество партий), но не автоматически.

Автоматические входы происходят только тогда, когда заданные вами входные параметры позволяют ордеру быть запущенным. Другими словами, если в вашей логике указано, что индикатор, каким бы он ни был, должен иметь определенное значение, автоматический вход или выход произойдет только при достижении этого значения. В противном случае этого никогда не произойдет. Вы, наверное, заметили, что в последовательности есть 3 примера настроек. Попробуйте изучить каждый из них, чтобы понять, как работает логика триггера. Без понимания этой логики срабатывания вы не сможете заставить автоматический механизм работать. Это как мышеловка, если вы настроите ее на поимку слона, она не сработает, когда к ней прикоснется мышь 😂 ... В общем, изучайте механизмы в примерах и удачи... 😁👍

 

Даниэль, спасибо за вашу преданность делу обучения.

Проверьте, пожалуйста, работу эксперта этой части 15 - версии v3 - который использует C_Automaton_v3.mqh?

Определение списка eSelectMedia понятно. Однако, как мне кажется, есть проблема с его использованием, когда речь идет о манипуляциях с элементами массивов m_Op в цикле FOR, а именно с "sizeof(eSelectMedia)".

Согласно документации(https://www.mql5.com/en/docs/basis/types/integer/enumeration), sizeof всегда возвращает 4, даже для перечислений с большим количеством элементов.

Documentation on MQL5: Language Basics / Data Types / Integer Types / Enumerations
Documentation on MQL5: Language Basics / Data Types / Integer Types / Enumerations
  • www.mql5.com
Enumerations - Integer Types - Data Types - Language Basics - MQL5 Reference - Reference on algorithmic/automated trading language for MetaTrader 5
 
FernandoN23 #:

Дэниел, спасибо за вашу преданность преподаванию.

Не могли бы вы проверить работу советника этой части 15 - версии v3 - который использует C_Automaton_v3.mqh?

Определение списка eSelectMedia понятно. Однако, на мой взгляд, при его использовании возникает некоторая проблема, связанная с манипуляцией элементами массивов m_Op в цикле FOR, в частности с "sizeof(eSelectMedia)".

Согласно документации(https://www.mql5.com/en/docs/basis/types/integer/enumeration), sizeof всегда возвращает 4, даже для перечислений с большим количеством элементов.

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

 
Daniel Jose #:

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

Дэниел, спасибо за быстрый ответ.

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

Спасибо за подсказки.

скрипт test.mq5

//+------------------------------------------------------------------+
void OnStart()
  {
      enum eSelectMedia {MEDIA_FAST, MEDIA_SLOW};
      enum eSelectMeses {JANEIRO, FEVEREIRO, MARCO, ABRIL, MAIO, JUNHO, JULHO, AGOSTO, SETEMBRO, OUTUBRO, NOVEMBRO, DEZEMBRO};
   
      struct st01
         {
               double  Buff[];
               int     Handle;
         }m_Op[sizeof(eSelectMedia) + 1];
                   
      Print("Tamanho do eSelectMedia = ", sizeof(eSelectMedia));
      Print("Tamanho do eSelectMeses = ", sizeof(eSelectMeses));
      Print("Tamanho do m_Op = ", ArraySize(m_Op));
      
      Print("========= Mostrar enum eSelectMedia =========");
      for (int i = sizeof(eSelectMedia); i >= 0; i--)
        {
            Print("eSelectMedia - idx = ", i);
        }
   
      Print("========= Mostrar enum eSelectMeses =========");
      for (int i = sizeof(eSelectMeses); i >= 0; i--)
        {
            Print("eSelectMeses - idx = ", i);
        }
   
      Print("========= Mostrar enum m_Op =========");
      for (int i = ArraySize(m_Op); i >= 0; i--)
        {
            Print("m_Op - idx = ", i);
        }     
  }
// End OnStart() 
//+------------------------------------------------------------------+


Результат:

2023.06.07 09:09:10.415    teste (EURUSD,M1)    Tamanho do eSelectMedia = 4
2023.06.07 09:09:10.415    teste (EURUSD,M1)    Tamanho do eSelectMeses = 4
2023.06.07 09:09:10.415    teste (EURUSD,M1)    Tamanho do m_Op = 5
2023.06.07 09:09:10.415    teste (EURUSD,M1)    ========= Mostrar enum eSelectMedia =========
2023.06.07 09:09:10.415    teste (EURUSD,M1)    eSelectMedia - idx = 4
2023.06.07 09:09:10.415    teste (EURUSD,M1)    eSelectMedia - idx = 3
2023.06.07 09:09:10.415    teste (EURUSD,M1)    eSelectMedia - idx = 2
2023.06.07 09:09:10.415    teste (EURUSD,M1)    eSelectMedia - idx = 1
2023.06.07 09:09:10.415    teste (EURUSD,M1)    eSelectMedia - idx = 0
2023.06.07 09:09:10.415    teste (EURUSD,M1)    ========= Mostrar enum eSelectMeses =========
2023.06.07 09:09:10.415    teste (EURUSD,M1)    eSelectMeses - idx = 4
2023.06.07 09:09:10.415    teste (EURUSD,M1)    eSelectMeses - idx = 3
2023.06.07 09:09:10.415    teste (EURUSD,M1)    eSelectMeses - idx = 2
2023.06.07 09:09:10.415    teste (EURUSD,M1)    eSelectMeses - idx = 1
2023.06.07 09:09:10.415    teste (EURUSD,M1)    eSelectMeses - idx = 0
2023.06.07 09:09:10.415    teste (EURUSD,M1)    ========= Mostrar enum m_Op =========
2023.06.07 09:09:10.415    teste (EURUSD,M1)    m_Op - idx = 5
2023.06.07 09:09:10.415    teste (EURUSD,M1)    m_Op - idx = 4
2023.06.07 09:09:10.415    teste (EURUSD,M1)    m_Op - idx = 3
2023.06.07 09:09:10.415    teste (EURUSD,M1)    m_Op - idx = 2
2023.06.07 09:09:10.415    teste (EURUSD,M1)    m_Op - idx = 1
2023.06.07 09:09:10.415    teste (EURUSD,M1)    m_Op - idx = 0


Перечисление eSelectMedia содержит 2 элемента.
Перечисление eSelectMonths содержит 12 элементов.
Возврат sizeof() равен 4, для любого из них, согласно документации.

m_Op имеет ArraySize() = 5, поскольку он был определен на основе sizeof(eSelectMedia) + 1, согласно файлу C_Automaton_v3.mqh.

Когда я использовал sizeof(enum) в цикле FOR, количество элементов в соответствующем перечислении не учитывалось. Взаимодействие учитывало 4, что является возвратом sizeof(enum), как для перечисления с 2 элементами, так и для перечисления с 12 элементами.

В связи с этим, как мне создать цикл, который учитывает точное количество элементов в перечислении?

Неправильно отформатированный код отредактирован модератором.

 
@FernandoN23 #: скрипт test.mq5

Пожалуйста, используйте используйте кнопку CODE (Alt -S) при вводе кода.

Кнопка кода в редакторе

Nota de usuário - MQL5.community
Nota de usuário - MQL5.community
  • www.mql5.com
Você acabou de registrar e, provavelmente, você tem perguntas como: "Como faço para inserir uma imagem na minha mensagem?", "Como faço para formatar meu código fonte MQL5?", "Onde são mantidas minhas mensagens pessoais?". Você pode ter muitas outras perguntas. Neste artigo, nós preparamos algumas dicas práticas que ajudarão você a se acostumar com o MQL5.community e tirar o máximo proveito de seus recursos disponíveis.
 
Добрый день, господин Дэниел, пожалуйста, не могли бы вы поделиться
EA_v1.mq5, EA_v2.mq5 и EA_v3.mq5 файл для меня. Или мне интересно, где я могу увидеть прикрепленный файл.
 

Здравствуйте, я использую предоставленный вами советник на графике EURUSD 1M и в процессе работы столкнулся с тем, что функция ClosePosition не закрывает позицию успешно.

Я предполагаю, что это связано с тем, что тип счета Hedging и позиция должна быть закрыта путем установки действия TRADE_ACTION_CLOSE_BY вместо TRADE_ACTION_DEAL.

 
Дорогой Дэниел. Поздравляю Вас со статьями. Помогите, пожалуйста, с вопросом: когда я заменяю блок кода метода "inline virtual void Triggers(void) final" на отправку отложенного ордера по максимуму или минимуму бара, на котором сработал сигнал скользящей средней, советник покупает уже 2 объема контракта, хотя настроен на покупку 1 объема. Если я возвращаюсь к исходному коду, он снова работает идеально. Если вы можете мне помочь, спасибо!!!