Нужны ли глобальные переменные терминала типа string?

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Mikhail Dovbakh
6928
Mikhail Dovbakh  
  • 30% (41)
  • 18% (25)
  • 18% (25)
  • 7% (9)
  • 12% (17)
  • 10% (14)
  • 5% (7)
Всего проголосовало: 104
_SERG_
81
_SERG_  
Mikhail Dovbakh:
  • Было бы супер! Вынужден выкручиваться без них.
  • К чему они? И так возможностей для грамотного профи достаточно.
  • Было бы не плохо, но этими возможностями будут пользоваться единицы, а у разработчиков других задач полно.
  • А что это? Я ими не пользуюсь, хотя и программирую на MQL.
  • Я просто смотрю очередной «опрос», хотя и программирую.
  • Я не программист и мне все равно.
  • Я не программирую на МQL, но я против, чтобы разработчики платформы отвлекались на всякую блажь.


Сортировку бы  string массивов сделали бы, и динамическое формирование имени массива не обязательно строкового, как и переменной, и хватило бы пока.

Georgiy Merts
9183
Georgiy Merts  
_SERG_:


Сортировку бы  string массивов сделали бы, и динамическое формирование имени массива не обязательно строкового, как и переменной, и хватило бы пока.

А разе сортировки строчных массивов нет ???

CArrayString::Sort() - прекрасно работает, только что проверил...

Yuriy Zaytsev
18682
Yuriy Zaytsev  
_SERG_:


Сортировку бы  string массивов сделали бы, и динамическое формирование имени массива не обязательно строкового, как и переменной, и хватило бы пока.

George Merts:

А разе сортировки строчных массивов нет ???

CArrayString::Sort() - прекрасно работает, только что проверил...

речь идет о глобальных переменных по F3
Georgiy Merts
9183
Georgiy Merts  
Yuriy Zaytsev:
речь идет о глобальных переменных по F3

Ну, нету сейчас глобальных переменных-строк.

Кому необходимо - пользуйтесь файлами. Кстати, INI-файлы для этого очень даже годятся. В Кодебазе были библиотеки для пользования INI-файлами, как с использованием стандартных функций Windows, так и с полностью самописными.

Yuriy Zaytsev
18682
Yuriy Zaytsev  
George Merts:

Ну, нету сейчас глобальных переменных-строк.

Кому необходимо - пользуйтесь файлами. Кстати, INI-файлы для этого очень даже годятся. В Кодебазе были библиотеки для пользования INI-файлами, как с использованием стандартных функций Windows, так и с полностью самописными.

да разумеется!

прекрасный механизм - есть один минус  - DLL запрещены в коммерческих продуктах

Georgiy Merts
9183
Georgiy Merts  
Yuriy Zaytsev:

да разумеется!

прекрасный механизм - есть один минус  - DLL запрещены в коммерческих продуктах

Значит, полностью самописный класс.

fxsaber
16797
fxsaber  
Каждая глобальная переменная - это 8 символов. Ничего сложного хранить строки там.
Stanislav Korotky
26248
Stanislav Korotky  
Имя переменной - строка. Там можно записывать пары ключ/значение. Конечно, такие переменные-строки придется упаковывать и распаковывать, но работать можно. Отдельный тип глобальных переменных - скорее всего не добавят.
fxsaber
16797
fxsaber  

Как вариант, таким образом можно записывать и считывать из глобальных переменных строки, простые структуры и даже массивы (например, обмениваться результатами CopyTicks)

// MQL4&5-code

#property strict

#include <TypeToBytes.mqh>

#define POSTFIX "___"

string GetName( const string Name, const int Num, const string PostFix = POSTFIX )
{
  return(Name + PostFix + (string)Num);
}

bool _GlobalVariableDel( const string Name )
{
  return(GlobalVariableDel(Name) && (GlobalVariablesDeleteAll(Name + POSTFIX) >= 0));
}

#define GLOBAL_VARIABLE_SET(A)                                                        \
template <typename T>                                                                 \
  datetime _GlobalVariableSet( const string Name, const T A )                         \
  {                                                                                   \
    _GlobalVariableDel(Name);                                                         \
                                                                                      \
    double Array[];                                                                   \
                                                                                      \
    const datetime Res = GlobalVariableSet(Name, _ArrayCopy(Array, _R(Value).Bytes)); \
    const int Size = ArraySize(Array);                                                \
                                                                                      \
    for (int i = 0; i < Size; i++)                                                    \
      GlobalVariableSet(GetName(Name, i), Array[i]);                                  \
                                                                                      \
    return(Res);                                                                      \
  }

GLOBAL_VARIABLE_SET(Value)
GLOBAL_VARIABLE_SET(&Value)
GLOBAL_VARIABLE_SET(&Value[])

#define GLOBAL_VARIABLE_GET(A)                                              \
  {                                                                         \
    double Array[];                                                         \
                                                                            \
    const int Amount = (int)Tmp;                                            \
    const int Size = ArrayResize(Array, Amount / sizeof(double) +           \
                                 ((Amount % sizeof(double) == 0) ? 0 : 1)); \
                                                                            \
    for (int i = 0; i < Size; i++)                                          \
      Array[i] = GlobalVariableGet(GetName(Name, i));                       \
                                                                            \
    uchar Bytes[];                                                          \
                                                                            \
    _ArrayCopy(Bytes, Array, 0, 0, Amount);                                 \
                                                                            \
    _W(A) = Bytes;                                                          \
  }

template <typename T>
const T _GlobalVariableGet( const string Name )
{
  T Res; // https://www.mql5.com/ru/forum/1111/page1869#comment_4854112

  double Tmp;

  if (GlobalVariableGet(Name, Tmp))
    GLOBAL_VARIABLE_GET(Res)

  return(Res);
}

template <typename T>
bool _GlobalVariableGet( const string Name, T &Value )
{
  double Tmp;
  const bool Res = GlobalVariableGet(Name, Tmp);

  if (Res)
    GLOBAL_VARIABLE_GET(Value)

  return(Res);
}

void OnStart()
{
  string Name = "Name";

// Записываем/считываем строки
  _GlobalVariableSet(Name, "Hello World!");
  Print(_GlobalVariableGet<string>(Name));

// Записываем/считываем простые структуры
  MqlTick Tick;
  SymbolInfoTick(_Symbol, Tick);

  _GlobalVariableSet(Name, Tick);
  Print(_GlobalVariableGet<MqlTick>(Name).time);

// Записываем/считываем массивы
  MqlTick Ticks[2];

  Ticks[0] = Tick;
  Ticks[1] = Tick;

  _GlobalVariableSet(Name, Ticks);

  MqlTick NewTicks[];

//  if (_GlobalVariableGet(Name, NewTicks)) // https://www.mql5.com/ru/forum/1111/page1868#comment_4853867
//    Print(NewTicks[1].time);

  _GlobalVariableDel(Name);
}

Возможно, стоит причесать в виде библиотеки.

Georgiy Merts
9183
Georgiy Merts  

fxsaber, хм... Век живи, век учись - можно темплейты вот прямо так использовать, без угловых скобок ?

Я всегда использовал только так:

Print(_GlobalVariableGet<MqlTick>(Name).time);

А, оказывается, можно и так:

_GlobalVariableSet(Name, "Hello World!");

Хороший код, кстати, о нашем недавнем разговоре - вот тут, вполне разумно использовать темплейты без проверки типов.  

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