Ваши вопросы по языку MQL4

star603

Новичок форума
Вот так лучше
Код:
Expand Collapse Copy
#property strict

void OnTick()
  {
   double MA[10];
////////////////////////////////////////////////////////////////////////////
 mk(MA);
 Comment("MA[1]=",MA[1],"\n",
         "MA[2]=",MA[2]);
////////////////////////////////////////////////////////////////////////////
  }
 
void mk(double & ma[])//Пользовательская функция
{
 for(int i = 0; i < ArrayRange(ma, 0);i++)
  ma[i] = iMA(NULL,PERIOD_CURRENT,18,0,MODE_EMA,PRICE_CLOSE,i);
}
Если не сложно можешь расписать плюсы и минусы твоего и моего способа?
 

star603

Новичок форума
Код:
Expand Collapse Copy
double & ma[]
и
Код:
Expand Collapse Copy
 mk(MA);

Можете обьяснить эти записи?
 

AlexeyVik

Программист mql4 mql5
Код:
Expand Collapse Copy
double & ma[]
и
Код:
Expand Collapse Copy
 mk(MA);

Можете обьяснить эти записи?
mk{MA); это вызов функции с передачей в неё переменной. В частном случае массива.
Знак & в такой записи означает, что переменная передаётся в функцию по ссылке. То-есть при изменении в массиве ма[] произойдёт изменение в массиве МА[] который объявлен локально в функции OnTick()
Плюсов не много, но самый главный плюс возможность вернуть из функции несколько значений. И второе, это иметь несколько одноимённых переменных или массивов в разных функциях и они между собой не будут конфликтовать. А минусов вообще нет, или я о них не знаю.
Вот такой пример
C++:
Expand Collapse Copy
void OnStart()
{
 int a, b;
 double c, d;
 a = fu(b, c, d);
 Print("a = ", a, " b = "b, " c = ", c, " d = ", d)
}
int fu(int &e, double &f, double &g)
{
 e = 77;
 f = 2.75;
 g = 33.9;
 return(7);
}
Проверь что будет распечатано.
 

star603

Новичок форума
mk{MA); это вызов функции с передачей в неё переменной. В частном случае массива.
Знак & в такой записи означает, что переменная передаётся в функцию по ссылке. То-есть при изменении в массиве ма[] произойдёт изменение в массиве МА[] который объявлен локально в функции OnTick()
Плюсов не много, но самый главный плюс возможность вернуть из функции несколько значений. И второе, это иметь несколько одноимённых переменных или массивов в разных функциях и они между собой не будут конфликтовать. А минусов вообще нет, или я о них не знаю.
Вот такой пример
C++:
Expand Collapse Copy
void OnStart()
{
 int a, b;
 double c, d;
 a = fu(b, c, d);
 Print("a = ", a, " b = "b, " c = ", c, " d = ", d)
}
int fu(int &e, double &f, double &g)
{
 e = 77;
 f = 2.75;
 g = 33.9;
 return(7);
}
Проверь что будет распечатано.
А насчет моей версии записи какие + и -? Если я не ошибаюсь при моем способе я же могу в коментариях получить несколько значений, то есть получается я возвращаю массив данных MA[10]. Это тоже должно быть не сомненным плюсом?
 
Последнее редактирование:

star603

Новичок форума
Код:
Expand Collapse Copy
double MA[2][10]

double ma()//Пользовательская функция
{
 for(int i = 0; i < ArrayRange(MA, 0);i++)
  for(int j = 0; j < ArrayRange(MA, 1);j++)
    MA[i][j] = iMA(NULL,PERIOD_CURRENT,18*i,0,MODE_EMA,PRICE_CLOSE,j);
  return(MA[i][j]);
};

Сова прекращает работать критической ошибкой:

2022.03.27 22:22:59.862 2004.01.01 00:00:00 Umr EURUSD,Daily: array out of range in 'Umr.mq4' (201,12)
 

vladradon

Программист
Сова прекращает работать критической ошибкой
Действие индексных переменных i и j прекращается на
MA [j] = iMA(NULL,PERIOD_CURRENT,18*i,0,MODE_EMA,PRICE_CLOSE,j);
и в return они уже не действуют и вообще в возврате значений нет смысла - просто в массиве будут записаны значения машки и уже в любом другом месте из этого массива можно вытащить нужные данные.
 

star603

Новичок форума
Действие индексных переменных i и j прекращается на
MA [j] = iMA(NULL,PERIOD_CURRENT,18*i,0,MODE_EMA,PRICE_CLOSE,j);
и в return они уже не действуют и вообще в возврате значений нет смысла - просто в массиве будут записаны значения машки и уже в любом другом месте из этого массива можно вытащить нужные данные.
Моим способом не получилсь. Получилось способом Алексея.
Код:
Expand Collapse Copy
double MA[2][10];

mk(MA);
Comment(MA[2,1]);

void mk( double &mn[2][10])
{
 for(int i = 0; i < ArrayRange(mn, 0);i++)
  for(int j = 0; j < ArrayRange(mn, 1);j++)
    mn[i][j] = iMA(NULL,PERIOD_CURRENT,18*i,0,MODE_EMA,PRICE_CLOSE,j);
};
 

star603

Новичок форума
C#:
Expand Collapse Copy
double MA[2][10];

void OnTick()
{
mk();
Comment(MA[2,1]);
}

void mk()
{
 for(int i = 0; i < ArrayRange(mn, 0);i++)
  for(int j = 0; j < ArrayRange(mn, 1);j++)
    MA[i][j] = iMA(NULL,PERIOD_CURRENT,18*i,0,MODE_EMA,PRICE_CLOSE,j);
};
не замечаю разницы. Чем ваша запись имеет преимущества? заранее спасибо.
 

vladradon

Программист
Чем ваша запись имеет преимущества?
Тут сложно судить о преимуществах. Зависит от поставленной задачи. Не нужно передавать данные в функцию в виде массива и массив можно так же использовать в разных других функциях.
 

AlexeyVik

Программист mql4 mql5
А насчет моей версии записи какие + и -? Если я не ошибаюсь при моем способе я же могу в коментариях получить несколько значений, то есть получается я возвращаю массив данных MA[10]. Это тоже должно быть не сомненным плюсом?
В таких примитивных примерах говорить о + и - довольно сложно. Но самый большой минус в использовании переменных глобального уровня в том, что в самых неожиданных местах программы могут быть изменены значения и в результате поймали неуловимую ошибку.
 

star603

Новичок форума
Тут сложно судить о преимуществах. Зависит от поставленной задачи. Не нужно передавать данные в функцию в виде массива и массив можно так же использовать в разных других функциях.
В каких случаях лучше использовать ссылку & а в каких нет?Когда понять когда нужно делать это: "Не нужно передавать данные в функцию в виде массива и массив можно так же использовать в разных других функциях." а в когда нет?
 

vladradon

Программист
В каких случаях лучше использовать ссылку &
Здесь есть 2 варианта использования ссылки:
1. Мы имеем какое-то значение и его нужно передать в функцию во входное значение функции, чтобы это значение в самой функции можно было использовать и результирующее значение, после расчетов в функции, передать обратно во входное значение (заменив его).
2. То же, что в предыдущем варианте, но в варианте const - тогда мы передаем в функцию значение, но на выходе передаваемое значение не изменится - мы просто передаем в функцию значение для внутренних расчетов этой функции.
В первом варианте есть смысл, если нам нужно 2 разных переменных (массива) из разных функций синхронизировать.
Второй вариант имеет смысл, если используется функция, в которую нужно передать какую-то информацию из исходного массива для каких-то расчетов. Функция после расчетов каким-то своим способом возвращает значения (записывает в глобальный массив к примеру).
В любом случае ссылка имеет смысл, если нужен обмен информацией между функциями либо для синхронизаци, либо для передачи массива данных.
 
Последнее редактирование:

star603

Новичок форума
Здесь есть 2 варианта использования ссылки:
1. Мы имеем какое-то значение и его нужно передать в функцию в входное значение функции, чтобы это значение в самой функции можно было использовать и результирующее значение после расчетов в функции передать обратно во входное значение (заменив его).
2. То же, что в предыдущем варианте, но в варианте const - тогда мы передаем в функцию значение, но на выходе передаваемое значение не изменится - мы просто передаем в функцию значение для внутренних расчетов этой функции.
В первом варианте есть смысл, если нам нужно 2 разных переменных (массива) из разных функций синхронизировать.
Второй вариант имеет смысл, если используется функция, в которую нужно передать какую-то информацию из исходного массива для каких-то расчетов. Функция после расчетов каким-то своим способом возвращает значения (записывает в глобальный массив к примеру).
В любом случае ссылка имеет смысл, если нужен обмен информацией между функциями.
Есть в наличии какие нибудь примеры этого?
 

star603

Новичок форума
Здесь есть 2 варианта использования ссылки:
1. Мы имеем какое-то значение и его нужно передать в функцию в входное значение функции, чтобы это значение в самой функции можно было использовать и результирующее значение после расчетов в функции передать обратно во входное значение (заменив его).
2. То же, что в предыдущем варианте, но в варианте const - тогда мы передаем в функцию значение, но на выходе передаваемое значение не изменится - мы просто передаем в функцию значение для внутренних расчетов этой функции.
В первом варианте есть смысл, если нам нужно 2 разных переменных (массива) из разных функций синхронизировать.
Второй вариант имеет смысл, если используется функция, в которую нужно передать какую-то информацию из исходного массива для каких-то расчетов. Функция после расчетов каким-то своим способом возвращает значения (записывает в глобальный массив к примеру).
В любом случае ссылка имеет смысл, если нужен обмен информацией между функциями либо для синхронизаци, либо для передачи массива данных.
У меня теперь два варианта воплощения ссылкой и без твоя и от Алексея.
 

star603

Новичок форума
В таких примитивных примерах говорить о + и - довольно сложно. Но самый большой минус в использовании переменных глобального уровня в том, что в самых неожиданных местах программы могут быть изменены значения и в результате поймали неуловимую ошибку.
у меня в планах навернуть сложный советник и 27 стратегий простых, трелинг стопа, разной варианта торговли.) Там можно будет выбирать либо 1ну стратегию или все сразу.
 
Последнее редактирование:

star603

Новичок форума
Код:
Expand Collapse Copy
int SV[3];
void OnTick()
  {
////////////////////////////////////////////////////////////////////////////
nk(SV);Comment(SV[2]);
////////////////////////////////////////////////////////////////////////////
  }
void nk (int &mb[3])//Массив данных для 3х первых свечей
  {
   for(int i = 0; i < ArrayRange(mb, 0);i++)
     mb[i]=(NormalizeDouble(Open[i]-Close[i],Digits))/Digits;
  };
  //Хочу записать целочисленное значения высоты свечи.

Выдает непонятную ошибку:
possible loss of data due to type conversion Umr.mq4 207 11
 

Ugar

Гуру форума
Код:
Expand Collapse Copy
int SV[3];
void OnTick()
  {
////////////////////////////////////////////////////////////////////////////
nk(SV);Comment(SV[2]);
////////////////////////////////////////////////////////////////////////////
  }
void nk (int &mb[3])//Массив данных для 3х первых свечей
  {
   for(int i = 0; i < ArrayRange(mb, 0);i++)
     mb[i]=(NormalizeDouble(Open[i]-Close[i],Digits))/Digits;
  };
  //Хочу записать целочисленное значения высоты свечи.

Выдает непонятную ошибку:
possible loss of data due to type conversion Umr.mq4 207 11
NormalizeDouble возвращает double, а SV int типа.
Зачем делить на Digits?
Наверное лучше переписать строку так:
Код:
Expand Collapse Copy
mb[i]=(int)MathRound((High[i]-Low[i])/Point);//Высота свечи



//или так:

mb[i]=(int)MathRound(MathAbs(Open[i]-Close[i])/Point);//Размер тела свечи
 

star603

Новичок форума
Код:
Expand Collapse Copy
Зачем делить на Digits?

Потому что при разности получается размер тела тела 0,0568, а деление нужно чтобы получить целое число.

Код:
Expand Collapse Copy
mb[i]=(int)MathRound(MathAbs(Open[i]-Close[i])/Point);//Размер тела свечи

Это строчка впринципе понятна только не пойму что значит (int) запись?
 

vladradon

Программист
Раз Андрей не отвечает (пока его нет на связи) попробую, пояснить:
(int)(...) преобразует значение в скобках (если для функции или не для формулы, можно без скобок) в целочисленное значение (отсекает все после запятой без нормализации).
Так можно большинство переменных из одного типа преобразовывать в другой. Но сама переменная при этом тип не меняет - мы получаем только преобразованное значение в нужном нам типе.
 
Верх