Ugar
Гуру форума
Получилось структура ради структуры.1. Для вставки кода используй кнопку
Посмотреть вложение 470188
2. Что ты там лопатил? Структура без изменений и массива структур тоже нет.
Получилось структура ради структуры.1. Для вставки кода используй кнопку
Посмотреть вложение 470188
2. Что ты там лопатил? Структура без изменений и массива структур тоже нет.
выжает ощибки многоА почему бы не массив структур?
Пример для 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);
Можешь подробнее обяснить почему структура ради структуры?Получилось структура ради структуры.
Потому что она там не нужна вообще. Параметры МА сначала вносятся в структуру, потом в функцию iMA. Параметры можно сразу подставлять в функцию iMA(). Обычно все так и делают. Это в MQL5 без использования структур сложно обойтись. В MQL4 структуры нужны для удобства программирования. Без них можно обойтись вполне. А в данном коде структура применена для лишней писанины. То есть для неудобства.Можешь подробнее обяснить почему структура ради структуры?
Там неправильные скобки, в следующем посте это поправил. Но не проверял на работоспособность. Это просто пример решения, а не образец кода для использования.выжает ощибки много
Опять по тому же вопросу. Не получается реализовать..
Пользовательские функции помогают улучшать быстродействие кода и удобства програмирования?Потому что она там не нужна вообще. Параметры МА сначала вносятся в структуру, потом в функцию iMA. Параметры можно сразу подставлять в функцию iMA(). Обычно все так и делают. Это в MQL5 без использования структур сложно обойтись. В MQL4 структуры нужны для удобства программирования. Без них можно обойтись вполне. А в данном коде структура применена для лишней писанины. То есть для неудобства.
Именно для удобства программирования пользовательских функции и нужны.Пользовательские функции помогают улучшать быстродействие кода и удобства програмирования?
В массивах можно хранить что угодно, в том числе и значения МА. Но сначала их надо получить функцией iMA. А уж куда записать в переменную или ячейку массива, это уже как будет удобнее.еще есть возможность через многомерные массивы. MA[7][3] 7 скольязщих по 3 значения в каждом.
/*поэтапное воплощение моей идеи
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 значений. Писать коды мне не надо я сам буду делать только указывайте на ошибки мне. Спасибо.Код:/*поэтапное воплощение моей идеи 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); };
Мой вопрос в коментария в коде.
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);
};
Так и появляются программисты у которых все переменные на глобальном уровне.Вынеси определение переменной 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); };
Лучше локальную переменную завести.Код:/*поэтапное воплощение моей идеи 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);
}
2 локальных переменных лучше 1-й глобальной? В любом случае я хотел пояснить в чем его ошибка, т.к. он только учится.Лучше локальную переменную завести.
я невижу где ячейка памяти тут( Еще цикл надо добавить без этого никак.Лучше локальную переменную завести.
Ну а если вместо переменной МА будет ячейка массива, то в разные ячейки можно писать разные значения.
И после закрывающей фигурной скобки функции MA() точка с запятой не нужна.Код:void OnTick() { //////////////////////////////////////////////////////////////////////////// double MA=ma(); Comment(MA); //////////////////////////////////////////////////////////////////////////// } //************************************************************** double ma()//Пользовательская функция { double k = iMA(Symbol(),PERIOD_CURRENT,18,0,MODE_EMA,PRICE_CLOSE,1); return(k); }
return(k);
#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]);
};
Вот так лучшеПолучилось с одномерным массивом. На очереди с двумерным придумать как.
#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);
}