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

 
Interesting:

Надежней? Почему получать хэндлы при инициализации это не надежно? Почему проверять наличие необходимых данных это не надежно? И тем более, почему наличие проверок это не надежно?

Для новичков может не так просто, но со временем все станет понятным...

 

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

 

Почему загружает?

 

 

 
simpleton:

"Обычные числа" - это константные выражения, которые тоже имеют тип. В данном случае - тип int.

Выражение, состоящее из умножения двух подвыражений, каждое типа int, - тоже имеет тип int. Вот тут-то и происходит переполнение.

И только потом, при инициализации переменной типа long происходит неявное приведение от типа выражения int к типу long.

Здесь всё чисто. Кстати, в данном случае необязательно каждый из операндов приводить к типу long. Достаточно привести один, а второй будет приведён неявно.

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

Вопрос в другом. Где в каком тaлмуде сказано, что :

 "Обычные числа" - это константные выражения, которые тоже имеют тип. В данном случае - тип int.

 Например если X сделать равным 10000000000 , то он становится типом long  ?  А почему не ulong или datetime  или даже string.?

А какой тип у числа 255   uchar или short ?

 
gumgum:

Почему загружает?

 

 

Возможно потому, что GBPJPY  кроспара и в коде где-нить присутствуют расчеты маржи. IMHO
 
simpleton:

Похоже, перепутан лог и код. Приведённый код работает "чисто". А, чтобы получить такой лог, пришлось переменные A и B сделать типа int или uint, а переменную X - типа uint:

А вот - работа оригинального кода:

Build 314 (20 Aug 2010). 

 Я же приводил другой код 

long A = AccountInfoInteger(ACCOUNT_LOGIN);  // 661701
long B = A;
long C = 661701;

Print(" A=",A,"  B=",B,"  C=",C);

long X =(long)10000;

long L1 = A*X;
long L2 = B*X;
long L3 = C*X;

Print(" L1=",L1,"   L2=",L2,"   L3=",L3);

 особое внимание на первую строчку, на вашем счете, может быть другое число. Посмотрите его и проставьте в long C =

Еще раз проверил результат

2010.08.25 20:23:12     Servis (EURUSD,H1)       L1=2322042704   L2=2322042704   L3=6617010000
2010.08.25 20:23:12     Servis (EURUSD,H1)       A=661701  B=661701  C=661701

Build 314 (20 Aug 2010).

 
Скажите пожалуйста, почему функция SymbolInfoDouble(_Symbol,SYMBOL_POINT) по паре USDCHF выдает размер поинта пятизначный после запятой 0.00001, когда по этой паре принята величина поинта 0.0001?
Документация по MQL5: Получение рыночной информации / SymbolInfoDouble
Документация по MQL5: Получение рыночной информации / SymbolInfoDouble
  • www.mql5.com
Получение рыночной информации / SymbolInfoDouble - Документация по MQL5
 
rut_:
Скажите пожалуйста, почему функция SymbolInfoDouble(_Symbol,SYMBOL_POINT) по паре USDCHF выдает размер поинта пятизначный после запятой 0.00001, когда по этой паре принята величина поинта 0.0001?

 с чего вы взяли что на этом инструменте 4 знака, в терминале явно видно что котировки там идут 5-ти значные
 
sergey1294:
 с чего вы взяли что на этом инструменте 4 знака, в терминале явно видно что котировки там идут 5-ти значные

Данная функция может возвращать разные значения пункта даже на счетах с пяти знаками, все зависит от настроек, которые примет брокер.

Вот например в одном  ДЦ есть такой коммент

1 pips (пункт) равен:

для валютных пар с 5 знаками после запятой - минимальному изменению 4-го знака после запятой (0,0001);
для валютных пар с 3 знаками после запятой - минимальному изменению 2-го знака после запятой (0,01).

 а у другого 1 pips равен как есть  в пятом разряде.

 
SHOOTER777:

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

Вопрос в другом. Где в каком тaлмуде сказано, что :

 "Обычные числа" - это константные выражения, которые тоже имеют тип. В данном случае - тип int.

 Например если X сделать равным 10000000000 , то он становится типом long  ?  А почему не ulong или datetime  или даже string.?

А какой тип у числа 255   uchar или short ?

 

Констаната 10000000000 - да, уже типа long.

Как бы это сказать? В нормальных языках есть суффиксы-модификаторы, позволяющие задать тип константы без использования явного приведения к типу. Для MQL5 я такое нашёл только для float. Поэтому задать константы типа uchar, ushort, uint, ulong, char, short и long (если значение константы укладывается в тип int) без явного приведения типа невозможно.

У константы 255 тип - int. Кое-что можно найти в описаниях типов, например, символьные константы объявлены имеющими тип ushort. Там же рассказано о константах типа datetime, типа color, типа bool, типа double и типа string.

Можно попробовать распечатать размер типа константы, коль скоро введена операция sizeof (только для чего она введена - объяснил бы кто из разработчиков):

void OnStart()
{
  Print("sizeof true                = ", sizeof true);
  Print("sizeof 'a'                 = ", sizeof 'a');
  Print("sizeof 255                 = ", sizeof 255);
  Print("sizeof 200000000           = ", sizeof 20000000);
  Print("sizeof 10000000000         = ", sizeof 10000000000);
  Print("sizeof C'128,128,128'      = ", sizeof C'128,128,128');
  Print("sizeof D'2004.01.01 00:00' = ", sizeof D'2004.01.01 00:00');
  Print("sizeof 1.0f                = ", sizeof 1.0f);
  Print("sizeof 1.0                 = ", sizeof 1.0);
  Print("sizeof \"Xa!\"               = ", sizeof "Xa!");
  Print("sizeof \"Xa-xa-xa!!!\"       = ", sizeof "Xa-xa-xa!!!");
}

/* Вывод в лог (хронология - сверху вниз):
GF      0       1 (EURUSD,M15)  02:03:23        sizeof true                = 1
IS      0       1 (EURUSD,M15)  02:03:23        sizeof 'a'                 = 2
LF      0       1 (EURUSD,M15)  02:03:23        sizeof 255                 = 4
JI      0       1 (EURUSD,M15)  02:03:23        sizeof 200000000           = 4
EQ      0       1 (EURUSD,M15)  02:03:23        sizeof 10000000000         = 8
DG      0       1 (EURUSD,M15)  02:03:23        sizeof C'128,128,128'      = 4
JN      0       1 (EURUSD,M15)  02:03:23        sizeof D'2004.01.01 00:00' = 8
GE      0       1 (EURUSD,M15)  02:03:23        sizeof 1.0f                = 4
GR      0       1 (EURUSD,M15)  02:03:23        sizeof 1.0                 = 8
QJ      0       1 (EURUSD,M15)  02:03:23        sizeof "Xa!"               = 12
ER      0       1 (EURUSD,M15)  02:03:23        sizeof "Xa-xa-xa!!!"       = 12
*/

В общем-то, из суффиксов только f для double-констант работает, модифицируя их до float, что видно по размеру типа такой константы.

Вот, единственное, хоть сколько-нибудь осмысленное применение операции sizeof нашёл. :)

 
SHOOTER777:

 Я же приводил другой код 

 особое внимание на первую строчку, на вашем счете, может быть другое число. Посмотрите его и проставьте в long C =

Еще раз проверил результат

Build 314 (20 Aug 2010).

 

Нет, у меня нет такого эффекта, который наблюдается у Вас. Осталось только битности версий MT5 сверить. У меня 64-битная версия, а у Вас?

Кстати, тот модифицированный код, который прогонял я, у Вас даёт те же результаты, что и у меня?

Если да, то тогда происходящее очень похоже на тот bug, что связан с "происхождением" значения, - то есть код может вести себя по-разному (как правильно, так и неправильно) в зависимости от того, откуда изначально взялось значение, на основе которого выполняются дальнейшие вычисления.