Скачать MetaTrader 5

Переменные переменных

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Matvey Alekseev
636
Matvey Alekseev  

Всем привет!

Я давно работаю с php и там есть такое понятие 'Переменные переменных'...

Цитата: "Иногда бывает удобно иметь переменными имена переменных. То есть, имя переменной, которое может быть определено и изменено динамически."

Небольшой кусок кода для иллюстрации:

//php

$s_1=100;
$s_2=1;

${"s_1"}=5;

echo $s_1; //5

${"s_".$s_2}=50;

echo $s_1; //50

echo ${"s"."_"."1"}; //50

 Смысл такой, что к переменной с именем s_1 я могу спокойно обратиться через "строку" в фигурных скобках или любое выражение формирующее эту строку... Так вот есть ли такая штука у могучего MQL5 ?
 Поясню для чего, в индикаторе я принимаю 5 значений для линий, line_1, line_2...line_5, и вот мне на столько стало неудобно обрабатывать их в цикле, что цикл for  вобще теряет свой смысл, что и заставило меня напечатать сей пост. На все мои попытки MQL5 чётко сказал, массивы и объекты в инпут параметрах не принимаю... :/

А если линий будет 100, мне весь код перепечатывать???

220Volt
1175
220Volt  

Вам нужен массив объектов, размер которого варьирует в зависимости от количества input параметров, без модификации кода?

Matvey Alekseev
636
Matvey Alekseev  
220Volt:

Вам нужен массив объектов, размер которого варьирует в зависимости от количества input параметров, без модификации кода?

Не совсем... вот другой пример (mql5):

input int      line_value_1=1000;
input int      line_value_2=2500;
input int      line_value_3=5000;
input int      line_value_4=9000;
input int      line_value_5=3000;
input int      line_value_6=4500;
input int      line_value_7=7000;
input int      line_value_8=9500;

TLine *lines[];

int OnInit()
  {
//--- indicator buffers mapping

  ArrayResize(lines, 8);
  
  for(int i=0; i<8; i++)
  {
      lines[i]=new TLine();

      lines[i].lineValue= line_value_+i //Вот тут!!! ?

      SetIndexBuffer(i,lines[i].dLine,INDICATOR_DATA);
      
      PlotIndexSetDouble(i,PLOT_EMPTY_VALUE,0);
      PlotIndexSetString(i,PLOT_LABEL,lines[i].label);
      PlotIndexSetInteger(i,PLOT_LINE_COLOR,lines[i].lineColor);
  }
Конечно, это не критично, но приятно было бы иметь такую возможность... сейчас я руками загоняю все инпуты в массив, а потом с этим массивом уже работаю... короче масло масленное.
Andrew Petras
5021
Andrew Petras  

Не проще массив после инпутов добавить и присвоить им занести в него инпуты

int      line_value_a[5];
line_value_m[0]=line_value_1;
line_value_m[1]=line_value_2;
// и т.д.
220Volt
1175
220Volt  

Я бы вот так сделал:

#define SEPARATOR '_'    // Разделитель между элементами input строки

input string input_line;


class TLine
{
public:
   TLine(long val) {Alert(val);}
};

void OnStart()
{
   string res[];
   StringSplit(input_line, SEPARATOR, res);
   // Интерпретируем res ка хотим.
   
   TLine *lines[];
   ArrayResize(lines, ArraySize(res));
   for(int i = 0;  i < ArraySize(res);  i++)
      lines[i] = new TLine( StringToInteger(res[i]) );
}


220Volt
1175
220Volt  

Но нужно помнить,  что сепаратор это тоже число, поэтому можно попасть в нехорошую ситуацию. В принципе, если сепаратор это строка (набор символов), то вероятность мала,  но с таким сепаратором: "_" - не работает.

Если разработчики читают: функция StringSplit() не работае корректно со строками.

StringSplit(input_line, "_", res);   // Не работает

Может баг?

Не, не баг, функция принимает ushort, тогда можно написать свой анализатор.

220Volt
1175
220Volt  

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

Matvey Alekseev
636
Matvey Alekseev  
Silent:

Не проще массив после инпутов добавить и присвоить им занести в него инпуты

Согласитесь проще Не создавать промежуточных массивов, а напрямую использовать переменные, что и было представлено в первом посте... а так да, делаю именно так, но по-прежнему считаю это костылём.

220Volt:

Я бы вот так сделал:


Это было круто, спасибо! =) Можно так и строку JSON забубенить, а потом свой парсинг её в объекты =))) или вобще на регулярках, но это уже извращение какое то =) 
Andrey Khatimlianskii
57827
Andrey Khatimlianskii  
mat.twg:

Я давно работаю с php и там есть такое понятие 'Переменные переменных'...

В MQL можно изменить только имя Глобальной переменной терминала (см. функции, начинающиеся с GlobalVariable).

А для вашей задачи уже 2 варианта предложили, кроме них - разве что чтение из файла. 

Документация по MQL5: Глобальные переменные терминала / GlobalVariableName
Документация по MQL5: Глобальные переменные терминала / GlobalVariableName
  • www.mql5.com
Глобальные переменные терминала / GlobalVariableName - Документация по MQL5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий