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

star603

Новичок форума
А почему бы не массив структур?
Пример для 5 МА
Код:
struct moving
{
string symbol; // имя символа
int timeframe; // таймфрейм;
int ma_period; // период
int ma_shift; // сдвиг средней
int ma_method; // метод усреднения
int applied_price; // тип цены
int shift; // сдвиг
};
moving MA[5];

//Нужно заполнить массив структур параметрами всех МА

...

double ma[5];//Массив с результатами

string text="";

for(int i=0; i<5; i++)

{

ma=iMA{MA[i].symbol,MA[i].timeframe,MA[i].ma_period,MA[i].ma_shift,MA[i].ma_method,MA[i].applied_price,1};

text=text+ma+"\n";

}

Comment(text);
выжает ощибки много
 

Ugar

Гуру форума
Можешь подробнее обяснить почему структура ради структуры?
Потому что она там не нужна вообще. Параметры МА сначала вносятся в структуру, потом в функцию iMA. Параметры можно сразу подставлять в функцию iMA(). Обычно все так и делают. Это в MQL5 без использования структур сложно обойтись. В MQL4 структуры нужны для удобства программирования. Без них можно обойтись вполне. А в данном коде структура применена для лишней писанины. То есть для неудобства.
 

ZNV

Активный участник
Опять по тому же вопросу. Не получается реализовать.. :(
Умные люди, напишите строчку кода, что бы в тестере работало... 😭

В индикаторе - удалить объект после получения ТейкПрофита.
Можно в течении нескольких минут по прошествии.

ps:
OnTrade не работает в mql4, только 5.
проверять время закрытия ордера внутри OnTick не получается (в тестере)
проверять если изменилось количество OrdersHistoryTotals - не получилось. в тестере не видит результатов...
 

star603

Новичок форума
Потому что она там не нужна вообще. Параметры МА сначала вносятся в структуру, потом в функцию iMA. Параметры можно сразу подставлять в функцию iMA(). Обычно все так и делают. Это в MQL5 без использования структур сложно обойтись. В MQL4 структуры нужны для удобства программирования. Без них можно обойтись вполне. А в данном коде структура применена для лишней писанины. То есть для неудобства.
Пользовательские функции помогают улучшать быстродействие кода и удобства програмирования?
 

star603

Новичок форума
еще есть возможность через многомерные массивы. MA[7][3] 7 скольязщих по 3 значения в каждом.
 

Ugar

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

Ugar

Гуру форума
еще есть возможность через многомерные массивы. MA[7][3] 7 скольязщих по 3 значения в каждом.
В массивах можно хранить что угодно, в том числе и значения МА. Но сначала их надо получить функцией iMA. А уж куда записать в переменную или ячейку массива, это уже как будет удобнее.
 

star603

Новичок форума
Код:
/*поэтапное воплощение моей идеи
void OnTick()
  {
////////////////////////////////////////////////////////////////////////////
  ma();
  Comment(ma());
/*как только передаю в комент саму функцию я получаю  значение МА, когда передаю
значение функции k в рузльтате получаю число 9. Не пойму почему так. Хотя знаю
правильный вариант в комент надо писать ma()*/
////////////////////////////////////////////////////////////////////////////
  }
//**************************************************************
double ma()//Пользовательская функция
{
 double k = iMA(Symbol(),PERIOD_CURRENT,18,0,MODE_EMA,PRICE_CLOSE,1);
 return(k);
};

Мой вопрос в коментария в коде.
 

star603

Новичок форума
Код:
/*поэтапное воплощение моей идеи
void OnTick()
  {
////////////////////////////////////////////////////////////////////////////
  ma();
  Comment(ma());
/*как только передаю в комент саму функцию я получаю  значение МА, когда передаю
значение функции k в рузльтате получаю число 9. Не пойму почему так. Хотя знаю
правильный вариант в комент надо писать ma()*/
////////////////////////////////////////////////////////////////////////////
  }
//**************************************************************
double ma()//Пользовательская функция
{
 double k = iMA(Symbol(),PERIOD_CURRENT,18,0,MODE_EMA,PRICE_CLOSE,1);
 return(k);
};

Мой вопрос в коментария в коде.
Дальше буду думать как записать в одномерный масив этого индикатора 10 значений. Писать коды мне не надо я сам буду делать только указывайте на ошибки мне. Спасибо.
 

vladradon

Программист
Вынеси определение переменной k как глобальную и все будет работать:
C#:
double k = 0;
void OnTick()
  {
////////////////////////////////////////////////////////////////////////////
 ma();
  Comment(k);
/*как только передаю в комент саму функцию я получаю  значение МА, когда передаю
значение функции k в рузльтате получаю число 9. Не пойму почему так. Хотя знаю
правильный вариант в комент надо писать ma()*/
////////////////////////////////////////////////////////////////////////////
  }
//**************************************************************
void ma()//Пользовательская функция
{
 k = iMA(Symbol(),PERIOD_CURRENT,18,0,MODE_EMA,PRICE_CLOSE,1);
};
 

Ugar

Гуру форума
Вынеси определение переменной k как глобальную и все будет работать:
C#:
double k = 0;
void OnTick()
  {
////////////////////////////////////////////////////////////////////////////
 ma();
  Comment(k);
/*как только передаю в комент саму функцию я получаю  значение МА, когда передаю
значение функции k в рузльтате получаю число 9. Не пойму почему так. Хотя знаю
правильный вариант в комент надо писать ma()*/
////////////////////////////////////////////////////////////////////////////
  }
//**************************************************************
void ma()//Пользовательская функция
{
 k = iMA(Symbol(),PERIOD_CURRENT,18,0,MODE_EMA,PRICE_CLOSE,1);
};
Так и появляются программисты у которых все переменные на глобальном уровне.
 

Ugar

Гуру форума
Код:
/*поэтапное воплощение моей идеи
void OnTick()
  {
////////////////////////////////////////////////////////////////////////////
  ma();
  Comment(ma());
/*как только передаю в комент саму функцию я получаю  значение МА, когда передаю
значение функции k в рузльтате получаю число 9. Не пойму почему так. Хотя знаю
правильный вариант в комент надо писать ma()*/
////////////////////////////////////////////////////////////////////////////
  }
//**************************************************************
double ma()//Пользовательская функция
{
 double k = iMA(Symbol(),PERIOD_CURRENT,18,0,MODE_EMA,PRICE_CLOSE,1);
 return(k);
};

Мой вопрос в коментария в коде.
Лучше локальную переменную завести.
Ну а если вместо переменной МА будет ячейка массива, то в разные ячейки можно писать разные значения.
Код:
void OnTick()
  {
////////////////////////////////////////////////////////////////////////////
  double MA=ma();
  Comment(MA);
////////////////////////////////////////////////////////////////////////////
  }
//**************************************************************
double ma()//Пользовательская функция
{
 double k = iMA(Symbol(),PERIOD_CURRENT,18,0,MODE_EMA,PRICE_CLOSE,1);
 return(k);
}
И после закрывающей фигурной скобки функции MA() точка с запятой не нужна.
 

star603

Новичок форума
Лучше локальную переменную завести.
Ну а если вместо переменной МА будет ячейка массива, то в разные ячейки можно писать разные значения.
Код:
void OnTick()
  {
////////////////////////////////////////////////////////////////////////////
  double MA=ma();
  Comment(MA);
////////////////////////////////////////////////////////////////////////////
  }
//**************************************************************
double ma()//Пользовательская функция
{
 double k = iMA(Symbol(),PERIOD_CURRENT,18,0,MODE_EMA,PRICE_CLOSE,1);
 return(k);
}
И после закрывающей фигурной скобки функции MA() точка с запятой не нужна.
я невижу где ячейка памяти тут( Еще цикл надо добавить без этого никак.
 
Последнее редактирование:

star603

Новичок форума
Код:
#property copyright "Copyright 2021, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
double MA[10];


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

Получилось с одномерным массивом. На очереди с двумерным придумать как.
 

AlexeyVik

Программист mql4 mql5
Получилось с одномерным массивом. На очереди с двумерным придумать как.
Вот так лучше
Код:
#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);
}
 
Верх