Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 166

 
-Aleks-:

 

Показать на моей функции, как это сделать можете? Я правда с трудом понимаю.


Нужно определиться какие переменные из функции вам нужны (для основной программы) и их передавать/забирать. Если нужны Все, тогда объявить эти переменные в самом начале программы и они будут видны всем функциям сразу.
 
-Aleks-:

 

Да не думайте "зачем", лучше подумать "как".

Я же сказал, что это не относится к этой функции...

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

Ну, к примеру, хочу за раз получить количество всех лотов и количество всех ордеров с разбивкой по типу ордера.

#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
double n_Lot_BUY;
double n_Lot_SELL;
int n_Order_BUY;
int n_Order_SELL;

int OnInit()
  {
   return(INIT_SUCCEEDED);
  }
void OnDeinit(const int reason)
  {
  }
void OnTick()
  {
   F();
   Print("Лотов BUY:",n_Lot_BUY,"   Лотов SELL:",n_Lot_SELL,"   Позиций BUY:",n_Order_BUY,"   Позиций SELL:",n_Order_SELL);
  }
//+------------------------------------------------------------------+
void F()
  {
   n_Lot_BUY=0;
   n_Lot_SELL=0;
   n_Order_BUY=0;
   n_Order_SELL=0;
   for(int pos=OrdersTotal()-1;pos>=0;pos--)
     {
      if(!OrderSelect(pos,SELECT_BY_POS,MODE_TRADES)){break;}
      if(OrderType()==0)
        {
         n_Order_BUY++;
         n_Lot_BUY=n_Lot_BUY+OrderLots();
        }
      if(OrderType()==1)
        {
         n_Order_SELL++;
         n_Lot_SELL=n_Lot_SELL+OrderLots();
        }
     }
  }
//+------------------------------------------------------------------+
 
Nikolay Gaylis:

 

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

однотипные можно объединить в структуру и объявить массив, как выше уже подсказали)

//структура из переменных
struct OrdStruct
   {
   double tp;
   double sl;
   double open;
   double close;
   double lot;
   datetime time_open; 
   datetime time_close;
   };

//массив структур
OrdStruct ORDERS[];


//обращение к переменным
ORDERS[i].sl=OrderStopLoss();
ORDERS[i].tp=OrderTakeProfit();
ORDERS[i].lot=OrderLots();

//или
ORDERS[i]=ORDERS[i+1];

ZeroMemory(ORDERS[i]);
 
Taras Slobodyanik:

однотипные можно объединить в структуру и объявить массив, как выше уже подсказали)

 Это уже сложно понять... к примеру, не могу понять i - чему равно и, разве не надо задать размер массиву ORDERS[i]=?

 
-Aleks-:

 Это уже сложно понять... к примеру, не могу понять i - чему равно и, разве не надо задать размер массиву ORDERS[i]=?


это для примера, конечно i нужно указывать и задавать размер массива в зависимости от количества ордеров...

то есть переменные как бы одни и теже tp / sl / lot ... но меняется индекс массива i 

 
-Aleks-:

Больно видеть Ваши мучения... Вы на техническом форуме, используйте логику, пожалуйста.

1. Опишите задачу;

2. Опишите какие переменные используете;

3. Опишите что хотите получить на выходе;

Учитесь излагать мысли техническим языком на техническом форуме. Иначе гадать тут можно долго.

 
Taras Slobodyanik:


это для примера, конечно i нужно указывать и задавать размер массива в зависимости от количества ордеров...

то есть переменные как бы одни и теже tp / sl / lot ... но меняется индекс массива i 

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

 
Alexey Kozitsyn:

Больно видеть Ваши мучения... Вы на техническом форуме, используйте логику, пожалуйста.

1. Опишите задачу;

2. Опишите какие переменные используете;

3. Опишите что хотите получить на выходе;

Учитесь излагать мысли техническим языком на техническом форуме. Иначе гадать тут можно долго.

 

Напишите, пожалуйста, где нет логики в моих словах?

Мучения в познании - удовольствие в решении.

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

 
-Aleks-:

 

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

Прочти ВНИМАТЕЛЬНО здесь и всё поймёшь. Здесь описывается тот первый вариант который был предложен, передача параметров по ссылке.

Проще говоря при вызове функции переменную можно передать по параметру

double FirstMethod(int i,int j)

или по ссылке если перед именем переменной стоит знак &

double SecondMethod(int &i,int &j)

во втором варианте переменные переданные в функцию по ссылке будут изменены вместе с переменными имеющими даже другие имена. В частном случае это переменные i и j

Всё остальное достаточно понятно из текста справки.

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