Обсуждение статьи "Как построить советник, работающий автоматически (Часть 15): Автоматизация (VII)"
Здравствуйте, Даниил, прежде всего, я хотел бы поздравить вас с успешным сотрудничеством с сообществом разработчиков и энтузиастов.
У меня есть вопрос по поводу исполнения советника в этой серии статей.
Я протестировал его на счетах Netting и Hedging, изменив OCO Order на Pending, согласно вашей документации. Но ордера не исполняются.
И в журнале ошибок тоже нет.
Что это может быть?
Примечание: я ничего не менял в коде, только логику покупки и продажи... Я протестировал его со своей логикой (моя стратегия) и он не дал ни одной записи, я подумал: я сделал что-то не так, kkkk.... затем я взял ваш код без изменений, скомпилировал его и произошло то же самое.
Он запускается вручную (когда вы устанавливаете количество партий), но не автоматически.
Привет, Дэниел, прежде всего я хотел бы поздравить вас с тем, что вы сотрудничаете с сообществом разработчиков и энтузиастов.
У меня есть вопрос по поводу запуска советника в этой последовательности статей.
Я протестировал его на счетах 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, даже для перечислений с большим количеством элементов.
- www.mql5.com
Дэниел, спасибо за вашу преданность преподаванию.
Не могли бы вы проверить работу советника этой части 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, а не количество максимальных элементов, которые будут возвращены.
Вы путаете понятия. 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 элементами.
В связи с этим, как мне создать цикл, который учитывает точное количество элементов в перечислении?
Неправильно отформатированный код отредактирован модератором.
Пожалуйста, используйте используйте кнопку CODE (Alt -S) при вводе кода.
- www.mql5.com
Новая статья Создание советника, работающего автоматически (часть 15): Автоматизация (VII) была опубликована:
Автор: Даниэль Хосе
Здравствуйте, я использую предоставленный вами советник на графике EURUSD 1M и в процессе работы столкнулся с тем, что функция ClosePosition не закрывает позицию успешно.
Я предполагаю, что это связано с тем, что тип счета Hedging и позиция должна быть закрыта путем установки действия TRADE_ACTION_CLOSE_BY вместо TRADE_ACTION_DEAL.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Опубликована статья Как построить советник, работающий автоматически (Часть 15): Автоматизация (VII):
Чтобы завершить этот цикл статей об автоматизации, мы дополним то, что рассмотрели в предыдущей статье. Это определенно показывает, как всё будет сочетаться друг с другом, заставляя советника работать как часы.
Я определил основные ошибки, проблемы и трудности, присущие работе программиста при создании автономного советника. Кроме того, я выделил ценные идеи и перспективные подходы к которым вы придете, наблюдая за рынком.
Я постарался упростить для вас задачу создания безопасной и надежной системы, которая является модульной, компактной и легкой. Эта система должна быть способна работать в сочетании с несколькими другими, поскольку универсальность имеет решающее значение для эффективности советника. Недостаточно иметь систему, которая торгует только одним активом, поскольку данный факт ограничивает возможности получения прибыли.
Последняя статья из этой серии, содержащая три практических примера, может представлять особый интерес для читателя. Однако, чтобы извлечь максимальную пользу из этой статьи, необходимо впитать знания из всей серии. Я пытался донести до вас, что не нужно быть вундеркиндом в области программирования или иметь несколько ученых степеней, достаточно просто хорошо понимать, как работает платформа MetaTrader 5 и язык MQL5.
Кроме того, я показал, как создать определенные условия для эффективной работы вашей системы, даже если в MQL5 или MetaTrader 5 нет индикатора, который вы хотели бы использовать. Это мы показали в примере номер 3, где показано, как создать внутренний индикатора HILO. Однако крайне важно, чтобы система была должным образом реализована и протестирована. Плохо выполненная система, как бы хорошо мы ее ни разработали, может привести скорее к убыткам, чем к прибыли.
Автор: Daniel Jose