Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 374

 
Vitalii Ananev:
Тогда вам просто надо по прошествии заданного времени брать значение iHigh(Symbol(),PERIOD_D1,0);  Это имеет смысл делать только для текущей еще не до конца сформированной дневной свечи. Но если брать значения прошлых дней то они в любой момент времени будут одинаковы.
В том то и беда, мне нужно посмотреть это дело ретроспективно....
 
-Aleks-:
В том то и беда, мне нужно посмотреть это дело ретроспективно....

Понятно. Вам нужно зафиксировать все внутридневные экстремумы цены. Тут я что то не могу так быстро на вскидку сообразить как  это сделать на исторических данных. 

Первое что приходит в голову: анализировать фракталы образовавшиеся на внутридневных временных интервалах.  

 

Не знаю как понятнее выразится, вообщем как задать имя массива в качестве переменной?

Например существует 2 массива Mass1 и Mass2, нужно сделать чтобы выполнялась одна и та же функция, но по условию с двумя разными массивами:

if(условие==true)

	Имя_массива=Mass1

else 

	Имя_массива=Mass2

ну и типа функция:

A=Имя_массива[123];
 
VANDER:

Не знаю как понятнее выразится, вообщем как задать имя массива в качестве переменной?

Например существует 2 массива Mass1 и Mass2, нужно сделать чтобы выполнялась одна и та же функция, но по условию с двумя разными массивами:

ну и типа функция:

А просто объявить два массива какие убеждения мешают?
 
VANDER:

Не знаю как понятнее выразится, вообщем как задать имя массива в качестве переменной?

Например существует 2 массива Mass1 и Mass2, нужно сделать чтобы выполнялась одна и та же функция, но по условию с двумя разными массивами:

ну и типа функция:

Никак. Потому, что массив - это пронумерованный набор переменных.

 
VANDER:

Не знаю как понятнее выразится, вообщем как задать имя массива в качестве переменной?

Например существует 2 массива Mass1 и Mass2, нужно сделать чтобы выполнялась одна и та же функция, но по условию с двумя разными массивами:

ну и типа функция:

Сделайте функцию, внутри которой производите операции над массивом. А по условию передавайте в функцию разные массивы:

//+------------------------------------------------------------------+
double massive_a[];
int a, massive_b[];
//+------------------------------------------------------------------+
void OnTick() {
   if(a==1) WorkWithMassive(massive_a);
   else WorkWithMassive(massive_b);
}
//+------------------------------------------------------------------+
void WorkWithMassive(double &massive[]) {
   // работаем с массивом а
   }
//+------------------------------------------------------------------+
void WorkWithMassive(int &massive[]) {
   // работаем с массивом b
   }
//+------------------------------------------------------------------+
 
Vitalie Postolache:
А просто объявить два массива какие убеждения мешают?
они оба объявлены, просто функция большая и одинаковая для всех массивов поэтому существует необходимость выбора
 
Artyom Trishkin:

Сделайте функцию, внутри которой производите операции над массивом. А по условию передавайте в функцию разные массивы:

спс, а внутри функции WorkWithMassive как к этому массиву обращаться?
 
VANDER:
спс, а внутри функции WorkWithMassive как к этому массиву обращаться?

Массив передаётся по ссылке и вы обращаетесь именно к тому массиву, который передаёте в функцию через входные параметры. Например (чисто гипотетически)

//+------------------------------------------------------------------+
void WorkWithMassive(double &massive[]) {
   int a=20;
   ArrayResize(massive,a);
   for(int i=a-1; i>=0; i--) {
      massive[i]=iOpen(Symbol(),Period(),a);
      }
   }
//+------------------------------------------------------------------+

Лучше конечно передавать в функции все нужные параметры:

//+------------------------------------------------------------------+
void WorkWithMassive(string symbol, int timeframe, double &massive[]) {
   int a=20;
   ArrayResize(massive,a);
   for(int i=a; i>=0; i--) {
      massive[i]=iOpen(symbol,timeframe,a);
      }
   }
//+------------------------------------------------------------------+

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

//+------------------------------------------------------------------+
void WorkWithMassive(string symbol, int timeframe, double &massive[]) {
   int a=20;
   ArrayResize(massive,a);
   for(int i=a; i>=0; i--) massive[i]=iOpen(symbol,timeframe,a);
   }
//+------------------------------------------------------------------+
int WorkWithMassive(int inp_value, int array_size, int &massive[]) {
   ArrayResize(massive,array_size);
   massive[array_size-1]=inp_value*2;
   return(massive[array_size-1]+massive[0]);
   }
//+------------------------------------------------------------------+
 
-Aleks-:
Верно.

1. Определяете время открытия дневной свечи;

2. Определяете количество баров num на нужном Вам ТФ (если хотите проверять экстремум дня каждые 15 минут - М15 баров);

3. Получаете данные high за num баров;

3. В цикле сравниваете все значения high баров с переменной dayHigh за нужную дневную свечу (изначально dayHigh = 0);

4. Если high > dayHigh - запоминаете новое значение в переменную dayHigh;

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