Почему я не могу сохранить и получить ChartID () из функции GlobalVariableGet ()?

 

Я пробовал это:

void OnStart()
  {
   string name = "ChartID";
   GlobalVariableSet(name, double(ChartID()));
   Print("ChartID() : ", ChartID(), " , GlobalVariableGet(name) : ", DoubleToString(GlobalVariableGet(name)));
  }
//+------------------------------------------------------------------+

И вывод какой странный.

ChartID() : 128968168864101572 , GlobalVariableGet(name) : 128968168864101568.00000000

Я видел, что DBL_MAX больше LONG_MAX. Следовательно, мы можем хранить значение LONG в типе DOUBLE. Но то, что я вижу, не подтверждает мою теорию.

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

 

В глобальных переменных клиентского терминала можно хранить 8 байт любой информации

Используйте, например, такой юнион

union UDouble
  {
   double  dvalue;
   ulong   uvalue;
  };
...
UDouble d;
d.uvalue=ChartID();
GlobalVariableSet(name,d.dvalue);
...
d.dvalue=GlobalVariableGet(name);
Print(d.uvalue);

Этот приём обсуждался неоднократно. И даже в MT4

 
Вдогонку еще один момент. Глобальные переменные обычно используют для сохранения данных между запусками программ. К таким случаям относится перезагрузка терминала. После перезагрузки терминала идентификаторы чартов будут уже другими, не теми, которые записаны в глобальных переменных. Таким образом, для рассматриваемой ситуации сохранение данных в глобальных переменных является ошибочным подходом.
 
Ihor Herasko:
Вдогонку еще один момент. Глобальные переменные обычно используют для сохранения данных между запусками программ. К таким случаям относится перезагрузка терминала. После перезагрузки терминала идентификаторы чартов будут уже другими, не теми, которые записаны в глобальных переменных. Таким образом, для рассматриваемой ситуации сохранение данных в глобальных переменных является ошибочным подходом.

Разве??? Я не особо использую ChartID() но пытался это использовать в качестве магика и не замечал изменения.

ps сейчас специально проверил. Не меняется.
 
Slava :

В глобальных переменных клиентского терминала можно хранить 8 байт любой информации

Используйте, например, такой юнион

Этот приём обсуждался неоднократно. И даже в MT4

Спасибо за решение. Я попробую. Надеюсь, это сработает. Если глобальная переменная хранит 8 байт, то каков размер LONG? Я думаю, это тоже 8 байт.

 
jaffer wilson:

Если глобальная переменная хранит 8 байт, то каков размер LONG? Я думаю, это тоже 8 байт.

Да

 
jaffer wilson:

Спасибо за решение. Я попробую. Надеюсь, это сработает. Если глобальная переменная хранит 8 байт, то каков размер LONG? Я думаю, это тоже 8 байт.

Можно просто посмотреть

Тип

Размер в байтах

Минимальное значение

Максимальное значение

Аналог в языке С++

char

1

-128

127

char

uchar

1

0

255

unsigned char, BYTE

bool

1

0(false)

1(true)

bool

short

2

-32 768

32 767

short, wchar_t

ushort

2

0

65 535

unsigned short, WORD

int

4

- 2 147 483 648

2 147 483 647

int

uint

4

0

4 294 967 295

unsigned int, DWORD

color

4

-1

16 777 215

int, COLORREF

long

8

-9 223 372 036 854 775 808

9 223 372 036 854 775 807

__int64

ulong

8

0

18 446 744 073 709 551 615

unsigned __int64

datetime

8

0 (1970.01.01 0:00:00)

32 535 244 799 (3000.12.31 23:59:59)

__time64_t

Документация по MQL5: Основы языка / Типы данных / Целые типы / Типы char, short, int и long
Документация по MQL5: Основы языка / Типы данных / Целые типы / Типы char, short, int и long
  • www.mql5.com
Целый тип char занимает в памяти 1 байт (8 бит) и позволяет выразить в двоичной системе счисления 2^8 значений=256. Тип char может содержать как положительные, так и отрицательные значения. Диапазон изменения значений составляет от -128 до 127. uchar # Целый тип uchar также занимает в памяти 1 байт, как и тип char, но в отличие от него, uchar...
 
Ух ты, союз сработал. Спасибо @Slava , работает.
 

@ Слава Привет,

Подскажите, пожалуйста, почему это сработало с объединением, а не с приведением типов?

 
Alexey Viktorov:

Разве??? Я не особо использую ChartID() но пытался это использовать в качестве магика и не замечал изменения.

ps сейчас специально проверил. Не меняется.

Хм, действительно, не меняется. Но я точно помню, что, как только ввели его (ChartID()), то менялся. С тех пор уже не проверял. Видимо, терминал стал запоминать сгенерированные ID.

 
jaffer wilson:

Подскажите, пожалуйста, почему это сработало с объединением, а не с приведением типов?

double не может поместить в себя значение 18 446 744 073 709 551 615