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

 
Привет! Заранее извиняюсь, возможно вопрос не корректный: можно ли написать пользовательскую функцию которая одновременно будет возвращать две характеристики закрытого в убыток ордера (int cmd и double volume)? Или надо писать две функции?
 
Maksim Neimerik:
Привет! Заранее извиняюсь, возможно вопрос не корректный: можно ли написать пользовательскую функцию которая одновременно будет возвращать две характеристики закрытого в убыток ордера (int cmd и double volume)? Или надо писать две функции?

Достаточно ввести в функцию 2 переменные по ссылке и ничего возвращать не надо.

Передача параметров - Функции - Основы языка - Справочник MQL4
Передача параметров - Функции - Основы языка - Справочник MQL4
  • docs.mql4.com
Передача параметров - Функции - Основы языка - Справочник MQL4
 

Будет проще :

1. Декларировать нужные переменные на глобальном уровне

2. А саму функцию декларировать как void, а внутри вычислить сколько угодно из переменных.

 
Ivan Ivanov:

Будет проще :

1. Декларировать нужные переменные на глобальном уровне

2. А саму функцию декларировать как void, а внутри вычислить сколько угодно из переменных.

Да, для меня это точно проще!) Спасибо! Про переменные по ссылке я уже читал и пробовал разобраться но я ВООБЩЕ не понимаю как ОНО работает(((((((
 
Maksim Neimerik:
Привет! Заранее извиняюсь, возможно вопрос не корректный: можно ли написать пользовательскую функцию которая одновременно будет возвращать две характеристики закрытого в убыток ордера (int cmd и double volume)? Или надо писать две функции?

Есть целых два варианта:

struct S2P{
   int p1;
   int p2;
};

void OnStart(){

   // вариант 1
   S2P x=fun();
   Alert("1: ",x.p1," ",x.p2);

   // вариант 2
   int x1,x2;
   fun2(x1,x2);
   Alert("2: ",x1," ",x2);
   
}

S2P fun(){
   S2P tmp;
   tmp.p1=1;
   tmp.p2=2;
   return tmp;
}

void fun2(int & p1,int & p2){
   p1=1;
   p2=2;

Лучше второй вариант - по ссылке. 

Глобальные переменные - тоже вариант, но очень неудобный.

 

глобальный массив решит проблему возврата хоть всех данных по ордеру сразу https://www.mql5.com/ru/articles/1390

// Terminal.mq4
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж
int Terminal()
   {
//============================================== Предопределения ==
   ArrayCopy(Mas_Ord_Old, Mas_Ord_Tek);
// Сохраняем предыдущую историю
   int Kol=0;                         // Обнуление счётчика ордеров
   ArrayInitialize(Mas_Ord_Tek,0);    // Обнуление массива
//=============================================== Анализ ордеров ==
   for (int i=0; i<OrdersTotal(); i++)// По всем ордерам терминала
     {
      if((OrderSelect(i, SELECT_BY_POS)==true) && 
          (OrderSymbol()==Symbol()))
                                //Если есть следующ и наша вал.пара
       {                                                                     
        Kol++;                  // Считаем общее количество ордеров
//-------------------------- Формирование нового массива ордеров --
        Mas_Ord_Tek[Kol][1] = NormalizeDouble(OrderOpenPrice(),
                                              Digits); 
// Курс открытия ордеров
        Mas_Ord_Tek[Kol][2] = NormalizeDouble(OrderStopLoss(),
                                              Digits); 
// Курс SL 
        Mas_Ord_Tek[Kol][3] = NormalizeDouble(OrderTakeProfit(),
                                              Digits); 
// Курс ТР 
        Mas_Ord_Tek[Kol][4] = OrderTicket();     // Номер ордера
        Mas_Ord_Tek[Kol][5] = OrderLots();       // Количество лотов
        Mas_Ord_Tek[Kol][6] = OrderType();       // Тип ордера
        Mas_Ord_Tek[Kol][7] = OrderMagicNumber();// Магическое число 
//------------------------------------------------------------------
       }
     }
   Mas_Ord_Tek[0][0] = Kol; // Сохраняем в нулевую ячеечку
//==================================================================
   return();
   }
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж


Учёт ордеров в большой программе
Учёт ордеров в большой программе
  • 2006.06.01
  • Сергей Ковалев
  • www.mql5.com
Рассматриваются общие принципы построения учёта ордеров в сложной программе.
 
Dmitry Fedoseev:   Есть целых два варианта:

Структурой можно так:

struct sp      // Структура сразу задает тип возвращаемого функцией значения
{
  int sum, pro;
} SumPro(int x, int y)
{
  sp z;
  z.sum=x+y;
  z.pro=x*y;
  return z;
}


void OnStart()
{                     //    результат сразу из возвращаемого значения
  Alert("Сумма=", SumPro(2,3).sum, " Произведение=", SumPro(2,3).pro);
}
 
STARIJ:

Структурой можно так:


Можно. Но не нужно. Отсутствует возможность объявления переменной для получена результатов работы функции. Вызывать же функцию для получения каждого поля - это не рационально.

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