Как преобразовать текстовую переменную в имя переменной double

 

Добрый день!

Прошу подсказать, как преобразовать текстовую переменную в имя переменной double.

Язык MQL4.

Есть текстовая переменная 

string Low5M1 = "Low"+nomer+"_M1";

print ( Low5M1);

Результат выводит Low4_M1. 

Есть такая переменная типа double Low4_M1, которая принимает различные значения:

double Low4_M1=iLow(Symb,PERIOD_M1,4); 

Если написать  print ( Low4_M1 );

то выводит 0.


Изначальная задача:

получить значение минимума из n-го количества свечей.

Функция iLowest выдает только номер свечи, а нужен ее минимум.



Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
  • www.mql5.com
Вещественные типы (double, float) - Типы данных - Основы языка - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
EPABHOMC2:

Прошу подсказать, как преобразовать текстовую переменную в имя переменной double.

Язык MQL4.

Так не получится - имя переменной задается при ее объявлении.
Его не сгенерировать и не получить расчетным путем как например можно это сделать в Python.

 
Документация по MQL5: Преобразование данных / DoubleToString
Документация по MQL5: Преобразование данных / DoubleToString
  • www.mql5.com
DoubleToString - Преобразование данных - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Alexander Sevastyanov #:

Так не получится - имя переменной задается при ее объявлении.
Его не сгенерировать и не получить расчетным путем как например можно это сделать в Python.

double Low4_M1=iLow(Symb,PERIOD_M1,4); 

string Low5M1 = "Low"+nomer+"_M1";

print ( Low5M1);

Получаем нужный результат Low4_M1. Должен же быть способ, как использовать в вычислениях?

Например,

if ( Low4_M1>0)

 

Не то.
Топикстартера интересует объявление / создание переменной типа double с именем, которое будет получено ПРОГРАММНО.

EPABHOMC2 #:

Получаем нужный результат Low4_M1. Должен же быть способ, как использовать в вычислениях?

Возможно, но мы его пока не знаем. (((
Бывают недокументированные фичи.

EPABHOMC2:

Изначальная задача:

получить значение минимума из n-го количества свечей.

Такая задача имеет решение:

int    count=10;   // количество баров для просчет вглубь
int    x1=1;       // с какого бара начинать просчет
int    index_lowest = iLowest(NULL, PERIOD_CURRENT, MODE_LOW, count, x1); // индекс бара с минимальным Low
double low = iLow(NULL,PERIOD_CURRENT,index_lowest);                      // значение Low этого бара
 
EPABHOMC2:

получить значение минимума из n-го количества свечей.

Функция iLowest выдает только номер свечи, а нужен ее минимум.

Стоп! А что мешает Вам после того, как Вы нашли номер свечи, сделать вот такой запрос: Low[номер свечи]?

 
Vitaly Murlenko #:

Стоп! А что мешает Вам после того, как Вы нашли номер свечи, сделать вот такой запрос: Low[номер свечи]?

Имя переменной Low4_M1

Low[nomer]_M1 дает ошибку, как еще можно соединить?

Решение получается только так:

iLow(Symb,PERIOD_M1,nomer)


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

 
EPABHOMC2 #:

Имя переменной Low4_M1

Low[nomer]_M1 дает ошибку, как еще можно соединить?

Решение получается только так:

iLow(Symb,PERIOD_M1,nomer)


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

Зачем нужно именно имя переменной? В переменной находится некое текстовое содержимое. В этом содержимом есть номер свечи. Вот его и нужно достать из текста. Делается это либо при помощи StringSplit(), либо каким-то своим методом обхода по символам строки. Получив номер свечи, остается подставить его в функцию iLow().

Если же у Вас N-ое количество переменных вида Low4_M1, то налицо неправильный подход, т. к. для каждой свечи не заводят свою переменную, для этого существуют массивы.

 
EPABHOMC2 #:

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

Это потому, что Вы отклонились от цели. Смотрите, Вот Ваш пост:

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

 

Задача автоматической генерации имени переменной и использование впоследствии такой переменной с данными типа double вполне решаемая. Только не с переменной doublе, а с переменной глобального уровня терминала. Это те переменные, список которых вызывается нажатием кнопки F3 в терминале (Сервис -> Глобальные переменные).Они могут принимать значения чисел с плавающей точкой.

Для переменной такого типа можно вполне сгенерировать строку, которая будет содержать нужное имя. Далее, при объявлении (инициализации) этой переменной её имя указывается как строковый параметр. Так что задача Ваша вполне решаема, только для поиска очередного экстремума это не решение - это пляски с бубном. Короче, это не лучший способ прийти к цели (в конкретно Вашем случае).

 
Ihor Herasko #:

Зачем нужно именно имя переменной? В переменной находится некое текстовое содержимое. В этом содержимом есть номер свечи. Вот его и нужно достать из текста. Делается это либо при помощи StringSplit(), либо каким-то своим методом обхода по символам строки. Получив номер свечи, остается подставить его в функцию iLow().

Если же у Вас N-ое количество переменных вида Low4_M1, то налицо неправильный подход, т. к. для каждой свечи не заводят свою переменную, для этого существуют массивы.

Сейчас реализуется так:

double lowest5M1=iLowest(Symb,1,MODE_LOW,5,0);

string nomer=DoubleToStr(lowest5M1, 0);

string Low5M1 = "Low"+nomer+"_M1";


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

Переделывать всю структуру очень трудоемко, поэтому ищется возможность оптимизировать в таком формате.