Функция, возвращающая 2 результата? - страница 4

 

gordon: It doesn't imply anything, but specifically in both C and C++ arrays are passed by reference as well (technically a pointer to the array's first element is passed, that pointer is passed by value).

Спасибо. Мне тоже нужно подтянуть свои знания по указателям.

Матутин: Очень интересно! К сожалению, EA нужны параметры, и иногда очень много, поэтому мы не можем избежать их и должны заботиться о них по всем причинам, упомянутым в https://www.mql4.com/go?http://www.c2.com/cgi/wiki?GlobalVariablesAreBad.

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

gordon : Это обсуждение касается переменных, определенных в глобальной области видимости (объявленных вне специальных функций start(), init(), deinit()), а не GV... Не смешивайте эти два понятия.

Я всегда говорю global-scope variables & GlobalVariables, чтобы избежать путаницы. MT4 и MT5 могут работать лучше, если использовать для них разную терминологию.

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


Ну, потому что я написал функцию, которая работает именно так. У нее есть несколько скользящих средних в массиве от 1 до 7, если любая из них пересекается сигнальной линией, она берет индекс массива*1000 + направление (0 для вверх, 1 для вниз)*100. Это возвращает уникальный ID номер для каждого ордера, который содержит три информации.

Например, сигнал открытия ордера с номером 3100 создается, когда третья МА пересеклась вниз, сигнал с номером 2000 создается, если вторая МА пересеклась вверх.

Это означает, что моя функция пересечения линий может послать это число в мою функцию открытия ордеров, поскольку теперь оно содержит 3 информации. Во-первых, это само магическое число, во-вторых, ordertype = signal%1000/100 результат - единица или ноль - решает, должен ли это быть ордер на продажу или покупку.

затем магическое число содержит информацию о том, какая линия MA была пересечена для генерации ордера. int MA=magicnumber/1000 результат - значение от 1 до 7, которое соответствует исходному индексу массива скользящих средних.

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

далее в программе, если я хочу выполнить операцию, основанную на типе ордера, я делаю type=(magicnumber%1000)/100; если результат равен 1, это был ордер на продажу, если ноль, это был ордер на покупку, если я хочу знать, какая линия MA создала этот ордер, я делаю int MA=magicnumber/1000, очевидно, что интергер отбрасывает любую плавающую точку и дает мне исходный индекс MA с 1 по 7.

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

 
SDC:

Ну, потому что [...].

Это замечательно, но опять же - почему бы просто не сделать это прямым, универсальным, ясным и общепринятым способом. Зачем идти на все эти трудности? Разве вы не думаете, что это проще:

int  a,b;
void MyFunc( int& a, int& b )
   {
   //... function result should be 'passed' to a and b
 

Я не знаю, наверное, это тоже сработало бы, просто в то время это казалось хорошей идеей, в основном потому, что я работал над советником для управления несколькими различными торговыми стратегиями одновременно, поэтому я разработал систему управления ордерами по магическим номерам в зависимости от того, к каким торговым критериям они относятся, например, вы можете закрыть все ордера на продажу, открытые пересечением скользящей средней за 55 периодов, независимо от всех других ордеров, потому что 55 MA - это индекс 3, магические номера этих ордеров будут основаны на 3000, затем я понял, что могу пойти дальше и включить тип ордера тоже, так что ордера на продажу на линии MA имеют магический номер 3100 3101 3102 и т.д. Это означает, что вы можете идентифицировать все ордера, открытые по этому торговому критерию, или все ордера на покупку, открытые по этому торговому критерию, или все ордера на продажу, открытые по любому торговому критерию и т.д. все по специальному магическому номеру.

Причина обращения: