Ошибки, баги, вопросы - страница 2347

 
TheXpert:

Сделать макрос-обертку вокруг импорта которая формирует класс по имени либы (class##libname)

Это для меня сложновато, пошел гуглить.

 
Kuzmich:

Всем, привет.

Вызываю из эксперта функцию  IndicatorParameters, но получаю ошибку 4014. Почему это может быть - подскажите? Build 1960.

ну если у Вас 3 инклудника, тогда мой код который выше опубликовал должен работать, но нужно для каждого класса прописать макроподстановки, вот мой пример, вроде работает, но еще проверять буду:

class Myclass
  {
public:
                     Myclass(){};
                    ~Myclass(){};
   void              OnInit()  {Print(__FUNCSIG__," выполнен");};
   void              OnDeinit(int Reason){Print(__FUNCSIG__," выполнен");}
   void              OnTick()  {Print(__FUNCSIG__," выполнен");};
   void              OnTimer() {Print(__FUNCSIG__," выполнен");};
  } m_class;
//+------------------------------------------------------------------+
#define MyClassOnInit m_class.OnInit();
void OnInit( void ){ MyClassOnInit; EventSetMillisecondTimer(300); ::MyClassOnInit_(); }
#define OnInit MyClassOnInit_
//+------------------------------------------------------------------+
#define MyClassOnDeinit(Reason) m_class.OnDeinit(Reason);
void OnDeinit( const int Reason ){ MyClassOnDeinit(Reason); ::MyClassOnDeinit_(Reason); }
#define OnDeinit MyClassOnDeinit_
//+------------------------------------------------------------------+
#define MyClassOnTimer m_class.OnTimer();
void OnTimer( void ){ MyClassOnTimer; ::MyClassOnTimer_(); }
#define OnTimer MyClassOnTimer_
//+------------------------------------------------------------------+
#define MyClassOnTick m_class.OnTick();
void OnTick( void ){ MyClassOnTick; ::MyClassOnTick_(); }
#define OnTick MyClassOnTick_
//+------------------------------------------------------------------+

и в коде эксперта просто подключаю одним #include <fileMyclass.mqh>

в Вашем примере все три файла нужно закрыть (в самом низу кода) моими макроподстановками (и подменить имена m_class2 , m_class3...)

Andrey Khatimlianskii:

Для однотипного класса решение уже подсказали: унаследуйте его от CObject, и макроподстановку добавьте в класс-менеджер, который будет хранить все добавленные экземпляры в CArrayObj, перебирать его и вызывать нужную OnXXX-функцию.

А вот для разных библиотек у меня тоже не получилось это реализовать. Чтобы одной строкой подключать несколько библиотек с такими макро-подстановками, и чтобы при вызове OnTick вызывался OnTick всех библиотек.

пример нужен, не умею и не работал "макроподстановкой в класс менеджере"

 
Andrey Khatimlianskii:

Чтобы в результате выполнения получить все 3 принта: "Init 1", "Init 2" и "Init EA"

Делать менеджер. Пример исходника выше показал. Макросы все же для другого.

 
Andrey Khatimlianskii:

Это для меня сложновато, пошел гуглить.

вобщем красиво не получится, но сократить запись вроде как можно примерно до такой:

// for libsample
#import "libsample.ex5"
IMPORT_EA_INTERFACE // здесь список импортируемых функций. они по идее одинаковые, поэтому можно в отдельный дефайн
#import
DECLARE_AND_REGISTER(libsample) // здесь генерация класса-обертки для libsample который обернет импортированные функции и зарегистрируется в менеджере
 

Вот прямой вызов и пример реализации без менеджера.

#define IMPORT_EA_INTERFACE \
void f1(); \
void f2(); \

#define DECLARE_AND_REGISTER(x) \
class ImportFrom_##x \
{ \
public: \
   static void f1() { x::f1();} \
   static void f2() { x::f2();} \
}; \

#import "libsample.ex5"
IMPORT_EA_INTERFACE
#import
DECLARE_AND_REGISTER(libsample)

#import "libsamplesecond.ex5"
IMPORT_EA_INTERFACE
#import
DECLARE_AND_REGISTER(libsamplesecond)

void OnStart()
{
   ImportFrom_libsample::f1();
   ImportFrom_libsample::f2();

   ImportFrom_libsamplesecond::f1();
   ImportFrom_libsamplesecond::f2();
}

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

 
TheXpert:

Вот прямой вызов и пример реализации без менеджера.

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

Мысль понял, спасибо.

Не 100% прозрачно, но лучше, чем есть на данный момент.

 
Как логическое развитие такого подхода

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Библиотеки: Report

fxsaber, 2018.12.14 23:51

Когда ставишь на чарт советник, сразу открывается отчет бэктеста до текущих свежих данных. Это позволяет сразу увидеть (взгляд на графики многое определяет за секунду), что и как советник с заданными входными параметрами "наторговал". И в случае какой-то случайной ошибки во входных параметрах, быстро определить это.


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


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

 
fxsaber:

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

Ничего удобнее не встречал:


 
Andrey Khatimlianskii:

Ничего удобнее не встречал:

Попробую реализовать такую визуализацию, Спасибо!

 
fxsaber:

Попробую реализовать такую визуализацию, Спасибо!

Мне кажется, что лучше это сделать на канвасе(а еще лучше на iCanvas) и с помощью сглаженых линий, а именно LineWu.