Вопросы по Мастеру MQL5 и стандартной библиотеке торговых классов - страница 11

 
Reshetov:

Три вопроса:

  1. Как заставить сигнальный модуль работать только по ценам открытия, а не на каждом тике?
  2. Как получить значения голосования сигнального модуля в модуле сопровождения позиций? Необходимо тралить по уже вычисленному сигналу, а не сочинять другой сигнальный модуль для сопровождения.
  3. Как получить значения голосования сигнального модуля в модуле управления капиталом и риском? Необходимо открывать объемы в зависимости от уже вычисленных торговых сигналов, а не сочинять другой сигнальный модуль для вычисления объемов.

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

Вы сами отвечаете на все свои вопросы: "... собрать советник с помощью мастера, а потом ... вручную ...". Других вариантов пока нет. Мастер, скорее всего, в ближайшее время развиваться не будет. Классы Стандартной Библиотеки не догма, а попытка предоставить набор типовых (на мой взгляд) решений. Наследуйтесь (для возможности использования в Мастере), перегружайте методы, дописывайте свои. И будет Вам "щастье"...
 
uncleVic:
Вы сами отвечаете на все свои вопросы: "... собрать советник с помощью мастера, а потом ... вручную ...". Других вариантов пока нет. Мастер, скорее всего, в ближайшее время развиваться не будет.

Жаль, что такое хорошее начинание и заброшено в дальний угол.

Если бы довести его до ума, то очень многое можно было бы сделать, т.е. не разбрасываться по мелочам, а программистам создавать готовые модули, из которых чайники и друге пользователи могли, не лазая по кодам, собирать различные готовые советники. А так получается та же самая бодяга, что и на алгоритмическом mql4, т.е. бери алгоритм, лезь в код и вручную прикручивай. Принцип OOП опять нарушается. Например, если захотел заменить один модуль на другой, то придется опять лезть в код и заново все вручную все менять. Не мастер получается, а ерунда, т.к. одно только ползание по кодам, с целью хотя бы разобраться, где и что нужно модифицировать, убьет уйму времени.

Хорошее было начинание. Жаль. Вчера только создал сигнальный модуль, а как с его помощью заставить всего советника работать, чтобы не соваться каждый раз в коды, теперь ума не приложу. Хотел статью написать, как им пользоваться, по типу вставил, добавил управление позициями, управление капиталом и риском и все работает. Ан нет, работать не будет. Т.к. если пользователь и соберет советника с помощью мастера, то ничего не заработает. Ему нужно еще целую портянку инструкций написать, куда лезть в код и что менять. Не говоря о том, что мне еще самому нужно со всем этим разобраться прежде, чем инструкцию писать.

Так что пользователям ничего теперь не остается, как учить mql5, OpenCL и проч. чтобы заниматься автотрейдингом. А иначе им удачи не видать.

Ладно, раз этот проект заброшен, то буду думать теперь в другом направлении.

 
Reshetov:

Жаль, что такое хорошее начинание и заброшено в дальний угол.

Будем надеяться не заброшен, а отложен. У самого много интересных мыслей по развитию Мастера. Но...
 
uncleVic:
Будем надеяться не заброшен, а отложен. У самого много интересных мыслей по развитию Мастера. Но...

Надежда умирает последней (с) Народная поговорка

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

А вот как считывать показания сигнального модуля в модулях сопровождения позиций и управления капиталом и риском, без ковыряния кодов, допетрить пока не удается. Полазил по исходникам, поразбирался. Свои результаты сигнальный модуль выдает через метод direction(), т.е. каким-то образом достаточно лишь обратиться к экземпляру класса этого самого модуля в модулях сопровождении позиций и управлении капиталом и риском и вызвать этот самый метод, чтобы считать его показания. Как это можно сделать, не меняя кодов, пока не ясно.

 
Reshetov:

Надежда умирает последней (с) Народная поговорка

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

А вот как считывать показания сигнального модуля в модулях сопровождения позиций и управления капиталом и риском, без ковыряния кодов, допетрить пока не удается. Полазил по исходникам, поразбирался. Свои результаты сигнальный модуль выдает через метод direction(), т.е. каким-то образом достаточно лишь обратиться к экземпляру класса этого самого модуля в модулях сопровождении позиций и управлении капиталом и риском и вызвать этот самый метод, чтобы считать его показания. Как это можно сделать, не меняя кодов, пока не ясно.

Не меняя кодов наверное ничего не получится.

 
uncleVic:

Не меняя кодов наверное ничего не получится.

Еще не все потеряно. Ведь можно будет создать унаследованные классы от СExpert, СExpertMoney и СExpertTrailing, а в них добавить необходимые методы доступа к экземпляру класса сигнального модуля. Но тут тоже трабла имеет место, т.к. мастер прописывает в создаваемом советнике #include <Expert\Expert.mqh>, а не его потомка.

Надо еще подумать.

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

 
Reshetov:

Еще не все потеряно. Ведь можно будет создать унаследованные классы от СExpert, СExpertMoney и СExpertTrailing, а в них добавить необходимые методы доступа к экземпляру класса сигнального модуля. Но тут тоже трабла имеет место, т.к. мастер прописывает в создаваемом советнике #include <Expert\Expert.mqh>, а не его потомка.

Надо еще подумать.

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



Всё так и задумывалось. Мастер создаёт "рыбу" советника. Дальше:

  • заменить инклюд - не проблема;
  • основной сигнал специально создаётся снаружи (для удобства подмены);
  • добавить немного инпутов и вызовов методов настройки?
 
uncleVic:

Всё так и задумывалось. Мастер создаёт "рыбу" советника. Дальше:

  • заменить инклюд - не проблема;
  • основной сигнал специально создаётся снаружи (для удобства подмены);
  • добавить немного инпутов и вызовов методов настройки?


В том и безобразие, что изначально не были продуманы такие вещи, как:

  1. Доступ к  методам классов модулей, включенных в торговую систему, закрыт даже на чтение, что напрочь исключает возможности согласования их работы.
  2. Сигнальные модули могут запросто конфликтовать с модулями сопровождения позиций, т.к. сигналы у них разные, а следовательно несовместимость не исключена.
  3. Разные сигналы в модулях, а следовательно у всех у них отдельные настройки, из-за чего получается не немного, а много входных настроек у советника. Чем больше разных настроек, тем выше вероятность подгонки под историю.
  4. После работы мастера иногда приходится лазить по исходникам, дабы устранить проблемы. Для конечного пользователя, не знающего программирования, такое вообще не подходит, т.к. ему нужен plug-and-play. Для программиста такие недоразумения тоже создают проблемы, т.к. разобраться с своем собственном коде гораздо проще, нежели в коде сваленном в кучу мастером. Дополнительная сложность в том, что классы унаследованы, т.е. причину недоразумений редко можно обнаружить на уровне потомков, а приходится искать углубляясь в родительские классы.

Хотели как лучше. Получилось как всегда (с) Черномырдин

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

 
Reshetov:

В том и безобразие, что изначально не были продуманы такие вещи, как:

  1. Доступ к  методам классов модулей, включенных в торговую систему, закрыт даже на чтение, что напрочь исключает возможности согласования их работы.
  2. Сигнальные модули могут запросто конфликтовать с модулями сопровождения позиций, т.к. сигналы у них разные, а следовательно несовместимость не исключена.
  3. Разные сигналы в модулях, а следовательно у всех у них отдельные настройки, из-за чего получается не немного, а много входных настроек у советника. Чем больше разных настроек, тем выше вероятность подгонки под историю.
  4. После работы мастера иногда приходится лазить по исходникам, дабы устранить проблемы. Для конечного пользователя, не знающего программирования, такое вообще не подходит, т.к. ему нужен plug-and-play. Для программиста такие недоразумения тоже создают проблемы, т.к. разобраться с своем собственном коде гораздо проще, нежели в коде сваленном в кучу мастером. Дополнительная сложность в том, что классы унаследованы, т.е. причину недоразумений редко можно обнаружить на уровне потомков, а приходится искать углубляясь в родительские классы.

Хотели как лучше. Получилось как всегда (с) Черномырдин

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

Давайте конкретные предложения. Будем рассматривать.
 
uncleVic:
Давайте конкретные предложения. Будем рассматривать.

Пока только одно единственное, которое позволяет устранить вышеуказанные недостатки:

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

Т.е. в модулях сопровождения позициями и управления капиталом и риском добавить еще один метод, например с идентификатором double getMainSingnal(), который обращается к экземпляру класса модуля сигналов и возвращает в качестве результата, результат метода Direction() сигнального модуля. Поскольку такой обмен информацией происходит в режиме "только чтение", то безопасность никоим образом не будет нарушена.

Для этого нужно

  1. Выделить в классах CExpertMoney и CExpertTrailing поля для хранения экземпляра класса CExpertSignal, т.е. основного  модуля сигналов. 
  2. Этот самый экземпляр класса CExpertSignal, т.е. сигнальный модуль необходимо передать модулям сопровождения позиций и управления капиталом и риском во время инициализации экземпляров классов этих самых модулей и сохранить его в полях указанных в п.1. Естественно, что перед этим необходимо также проверить (убедиться), что экземпляр класса сигнального модуля уже существует, т.е. был создан.
  3. Создать в классах CExpertMoney и CExpertTrailing дополнительные методы с идентификатором double getMainSingnal(), которые обращаются к экземпляру класса модуля сигналов, хранимого в соответствующих полях данных классов и возвращает в качестве результата, результат метода Direction()  модуля сигналов.

P.S. Поле в котором хранится ссылка на экземпляр класса модуля сигналов есть в классе CExpert

CExpertSignal    *m_signal;                   // trading signals object
Т.е. необходимо создать аналогичные поля для классов  CExpertMoney и CExpertTrailing и передать им во время инициализации тоже самое значение из вышеуказанного поля в том же самом классе CExpert
Причина обращения: