Использование пользовательской функции

 

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

К примеру в тестере будет перебор меток от 1 до 100 к примеру, а заголовки функций будут следующими: func1, func2, func3....func99, func100.

Каким образом лучше осуществлять доступ в тестере к заголовкам фукций?

То есть взять func + цифры от 1 до 100, чтобы вызвать одну из 100 функций.

P.S. if не предлагайте, так как 100 условных операторов для каждой функции будет перебор.

 
forexman77:

Каким образом лучше осуществлять доступ в тестере к заголовкам фукций?

самый простой вариант сделайте одну ф-цию переключатель и в качестве параметра передавайте ей № ф-ции, в теле этой ф-ции пропишите switch - case № ф-ции

работы на 5 минут - копипастить в редакторе только

ЗЫ: если более сложный вариант, то нужно обернуть каждую ф-цию через #define ... но это только fxsaber умеет

 
Igor Makanu:

самый простой вариант сделайте одну ф-цию переключатель и в качестве параметра передавайте ей № ф-ции, в теле этой ф-ции пропишите switch - case № ф-ции

работы на 5 минут - копипастить в редакторе только

ЗЫ: если более сложный вариант, то нужно обернуть каждую ф-цию через #define ... но это только fxsaber умеет

Тогда возникает вопрос: дело в том, что в самой функции будет несколько условных операторов, на сколько знаю switch не обрабатывает такие конструкции. Или это не так?

 
forexman77:

Тогда возникает вопрос: дело в том, что в самой функции будет несколько условных операторов, на сколько знаю switch не обрабатывает такие конструкции. Или это не так?

switch работает только с константой типа int - и все, сейчас даже компилятор не пропустит другое

ну вопрос был как быстро модифицировать код для тестера и вызывать много разных ф-ции (подозреваю на разных проходах)

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

 
Массив указателей на функции.
 
Igor Makanu:

switch работает только с константой типа int - и все, сейчас даже компилятор не пропустит другое

ну вопрос был как быстро модифицировать код для тестера и вызывать много разных ф-ции (подозреваю на разных проходах)

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

В принципе подумал как сделать, как Вы написали:

завернуть все в switch, передавать в него константу, что будет выбираться тестером и записывать значение в статическую или глобальную переменную и записать все значения в массив.

 

редиска - нехороший человек
обращаться к 
функциям - вызов функции
перебор меток 
от 1 до 100 - итерация  
заголовки функций - имена функций
осуществлять доступ к заголовкам фукций - вызов функций по их имени



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

 
fxsaber:
Массив указателей на функции.

если не затруднит, то можно пример  - интересно  части самообучения, заранее благодарен!

 
fxsaber:
Массив указателей на функции.
Sergey Dzyublik:

редиска - нехороший человек
обращаться к 
функциям - вызов функции
перебор меток 
от 1 до 100 - итерация  
заголовки функций - имена функций
осуществлять доступ к заголовкам фукций - вызов функций по их имени



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

На правильном ли пути читая эту страницу? https://www.mql5.com/ru/docs/basis/types/object_pointers

Документация по MQL5: Основы языка / Типы данных / Указатели объектов
Документация по MQL5: Основы языка / Типы данных / Указатели объектов
  • www.mql5.com
//| Script program start function                                    | //|  Объекты всегда передаются по ссылке                             | //| Передача массива объектов                                        | //| Передача массива указателей на объект                            |
 
input int NumFunc = 0;
input double Input = 0;

typedef double (*FUNC)( const double );

double Func0( const double d ) { return(d + 0); }
double Func1( const double d ) { return(d + 1); }

FUNC Func[2];

void OnInit()
{
  Func[0] = Func0;
  Func[1] = Func1;
}

void OnTick()
{
  static int const i = NumFunc % ArraySize(Func);
  
  Print(Func[i](Input));
  
  ExpertRemove();
}
Документация по MQL5: Основы языка / Типы данных / Пользовательские типы
Документация по MQL5: Основы языка / Типы данных / Пользовательские типы
  • www.mql5.com
//|                                                Panel_Buttons.mq5 | //|                        Copyright 2017, MetaQuotes Software Corp. | //|                                             https://www.mql5.com | //| defines                                                          |  INDENT_LEFT                         (11)      ...
 
fxsaber:

Спасибо!

Просто вот находил еще https://www.mql5.com/ru/docs/basis/types/object_pointers и немного был в замешательстве, какой вариант выбрать.

Документация по MQL5: Основы языка / Типы данных / Указатели объектов
Документация по MQL5: Основы языка / Типы данных / Указатели объектов
  • www.mql5.com
//| Script program start function                                    | //|  Объекты всегда передаются по ссылке                             | //| Передача массива объектов                                        | //| Передача массива указателей на объект                            |