Ошибки, баги, вопросы - страница 1701

 
pako:
В тиках есть рыба?
Вот и хочу это выяснить.
 
fxsaber:
Вот и хочу это выяснить.

Есть смысл пробовать только на каком-нибудь lmax. И то сомнительно.

А объемы, сентимент, стакан пробовали? Как по мне вкуснее. Моя любимая торговля это по ленте и стакану, правда такого на форексе днем с огнем.

 
Комбинатор:

Есть смысл пробовать только на каком-нибудь lmax. И то сомнительно.

А объемы, сентимент, стакан пробовали? Как по мне вкуснее. Моя любимая торговля это по ленте и стакану, правда такого на форексе днем с огнем.

Хочу попробовать Биржу. Как-то мне все пока ясно, что нужно делать там. И не понятно, почему это не сделано даже в виде индикаторов.

Вот только баги тормозят. 

 
void OnStart()
  {
//---
   Print("-----------------------------   ");
   Print("DBL_MAX= ", DBL_MAX);
   Print("IntegerToString(int(DBL_MAX) )= ", IntegerToString(int(DBL_MAX) ) );
   Print("IntegerToString(uint(MathAbs(DBL_MAX) ) )= ", IntegerToString(uint(MathAbs(DBL_MAX) ) ) );
  }

Запускаю вот такой скриптик

и получаю

DBL_MAX= 1.797693134862316e+308

IntegerToString(int(DBL_MAX) )= -2147483648

IntegerToString(uint(MathAbs(DBL_MAX) ) )= 0 

------

Вопрос - а почему собственно при  переводе положительного double числа  в  int получаем отрицательное?

 
Print("-----------------------------   ");
   Print("DBL_MAX= ", DBL_MAX);
   Print("IntegerToString(int(DBL_MAX) )= ", IntegerToString(int(DBL_MAX) ) );
   Print("IntegerToString(uint(MathAbs(DBL_MAX) ) )= ", IntegerToString(uint(MathAbs(DBL_MAX) ) ) );
   Print("---");
   Print("int(DBL_MAX)= ", int(DBL_MAX) );
   Print("uint(DBL_MAX)= ", uint(DBL_MAX) );
Или так все равно тоже самое.
 
fxsaber:
Заявку оформил, хоть и задолбало это делать столь часто.
Ответили и сразу закрыли

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

Можно либо запретить этот "хак", либо оставить на совести того кто его использует.

Пока вы первый кому такая возможность мешает пользоваться терминалом, за несколько лет.

Это сколько же может индикаторов выполняться вот так в холостую, а мы о них ни слухом, ни духом?! Контроля нет совсем.

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

1) Только специально, осознанно можно написать индикатор с указанным поведением. Кто вас заставляет писать такой код и запускать такой индикатор? Или вы запускаете чужие программы не зная их кода?

2) Вредоносность такого индикатора не больше чем многих других с менее явными логическими ошибками.

3) При перезагрузке терминала индикатор выгружается и повторно не запускается. Если вы случайно запустили такой индикатор - перегрузите терминал. И не запускайте больше.

Мне нужно было иметь возможность удалить себя (индикатор) на тот случай, если запущена хоть одна копия, пусть и с другими входными параметрами. Для этого требовалось выяснить handle самого себя. К сожалению, на тот момент еще не знал, что это невозможно в MQL в 100% случаев. Поэтому решил пойти на не очень хитрый прием.

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

Именно из этих соображений был написан столь безобидный код, который вызвал такую неоднозначную, но, очевидно, негативную реакцию разработчиков. Видите ли, так делать нельзя. Что незаконного сделал-то? Ну прочел значение своего буфера через CopyBuffer. Это незаконно?!

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

Никто все равно не выскажется. Такую граблю хорошо бы в Справке отразить.

 
Если вы случайно запустили такой индикатор - перегрузите терминал. И не запускайте больше.
Это невозможно узнать. Никак!
 
Dmytro Zelenskyy:
Или так все равно тоже самое.

Тип int имеет размер 4 байта. Тип double имеет размер 8 байтов. Нельзя так делать - пытаться из 8 байтов получить 4 байта - в итоге может получится ерунда - особенно в данном случае, когда значение DBL_MAX лежит вне пределов значений int.

Если взять число double d=123456.1258 и попытаться из него получить int - тогда номер пройдёт, но всё равно, так делать нельзя.

 
Karputov Vladimir:

Тип int имеет размер 4 байта. Тип double имеет размер 8 байтов. Нельзя так делать - пытаться из 8 байтов получить 4 байта - в итоге может получится ерунда - особенно в данном случае, когда значение DBL_MAX лежит вне пределов значений int.

Если взять число double d=123456.1258 и попытаться из него получить int - тогда номер пройдёт, но всё равно, так делать нельзя.

Ок, а как корректно перевести double в int  с сохранением знака (число не важно, если уходит за пределы то ограничить пределом int)

 
Dmytro Zelenskyy:

Ок, а как корректно перевести double в int  с сохранением знака (число не важно, если уходит за пределы то ограничить пределом int)

int

Целый тип int имеет размер 4 байта (32 бита). Минимальное значение -2 147 483 648, максимальное значение 2 147 483 647. Исходя из этого, 

   int A=(int)2147483647.0;
   int B=(int)2147483646.2;
   int C=(int)2147483647.2;
   int D=(int)2147483648.0;
   Print("A: ",IntegerToString(A),", B: ",IntegerToString(B),", C: ",IntegerToString(C),", D: ",IntegerToString(D));

посмотрите что возвращается:

A: 2147483647, B: 2147483646, C: 2147483647, D: -2147483648

 

Думаю принцип понятен. 


Причина обращения: