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

 
Alexey Viktorov:

А так

тоже работает, нерабочий второй вариант

 
   ObjectSetDouble (0,name,OBJPROP_ANGLE,direction*30.0);
direction у вас объявлена как int. Вот и получаете то что получаете. Последнее время довольно привередливо многие функции стали относиться к значениям. Лучше подстраховаться с приведением.
Сам недавно напоролся на таком. Вроде раньше проблем не было. А тут попросили подправить код и пока не привел к double не хотело работать как положено.
 
Konstantin Nikitin:
direction у вас объявлена как int. Вот и получаете то что получаете. Последнее время довольно привередливо многие функции стали относиться к значениям. Лучше подстраховаться с приведением.
Сам недавно напоролся на таком. Вроде раньше проблем не было. А тут попросили подправить код и пока не привел к double ни хотело работать как положено.

да, int. но это же умножение - в целых числах тоже 30*1=30. На 100% уверен, что несколько билдов тому назад работало отлично и во втором варианте, т.к. эти 30 подбором определял...

похоже ещё одна "особенность" MT5... Хорошо хоть блок декоративный, а если где-нибудь типа автолота или стоплоса - печалька может случиться - я частенько переворачиваю умножением на -1...

спасибо, возьму ещё один костыль на вооружение...

 
Igor Zakharov:

тоже работает, нерабочий второй вариант

Ааа. Я по невнимательности не тот код скопировал.

А Константин прав, зачем-же туда где ожидается double сувать int... И никакая это не особенность mql5, а просто некоторые попытки приучить к порядку.

 

Прошу помощи.

Индикатор вылетает по ошибке array out of the range.

в коде определил буферы

#property indicator_buffers 2

#property indicator_color1 Red

#property indicator_width1 1

#property indicator_plots  1 // количество графических построений

#property indicator_type1   DRAW_ARROW


Объявил глобальные переменные

double Buf1[];

double Buf2[];

В Init() задал свойства

    PlotIndexSetInteger(0,PLOT_ARROW,code); 

//--- установим пустое значение 

   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);

   SetIndexBuffer(0,Buf1,INDICATOR_DATA);

   PlotIndexSetString(0, PLOT_LABEL, "Break");



//----

   PlotIndexSetInteger(1,PLOT_ARROW,code);  

//--- установим пустое значение 

   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,0);

   SetIndexBuffer(1,Buf2,INDICATOR_CALCULATIONS);

   PlotIndexSetString(1, PLOT_LABEL, "Break");


В OnCalculate() в коде определяется условие - переменная up.

Если истина, то выполняется такой код

   

  i=nPoint1; BreakUp=false; BreakDn=false;
  
while(i>=0 && BreakUp==false && BreakDn==false)
  {              Print("i  ",i);                 tmp=iHigh(NULL,0,nPoint1)-Speed*(nPoint1-i);        tmp1=iHigh(NULL,0,nPoint1)-Speed*(nPoint1-i)-resultL;        if(NormalizeDouble(iLow(NULL,0,i),Digits())<NormalizeDouble(tmp1,Digits()) && NormalizeDouble(iHigh(NULL,0,i),Digits())>NormalizeDouble(tmp,Digits()))         {          size=ArraySize(Buf1);          Print("size ",size);                   BreakUp=true;          if(channelbreak) Buf1[i]=tmp;          Comm="\nПробой вверх на уровне " + DoubleToString(tmp,Digits());         }        else        if(NormalizeDouble(iLow(NULL,0,i),Digits())<NormalizeDouble(tmp1,Digits()))         {          size=ArraySize(Buf1);          Print("size ",size);                          BreakDn=true;          if(channelbreak) Buf1[i]=tmp1;          Comm="\nПробой вниз на уровне "+DoubleToString(tmp1,Digits());         }        else        if(NormalizeDouble(iHigh(NULL,0,i),Digits())>NormalizeDouble(tmp,Digits()))         {          size=ArraySize(Buf1);          Print("size ",size);                   BreakUp=true;          if(channelbreak) Buf1[i]=tmp;          Comm="\nПробой вверх на уровне "+DoubleToString(tmp,Digits());         }        else Comm="\nПробоя канала нет";        //i--;       }     } Ошибка происходит при входе в цикл while при присвоении значения переменной значению буфера. Проверка на размер массива буфера выдает ноль. Т.е. буфер не инициализируется. Всю голову сломал, не могу понять почему. В чем затык?
nPoint1 - это индекс бара (сдвиг от нулевого).
[Удален]  
Ilyas:

Уточните, пожалуйста, нормально ли, что во время откладки индикатора на открывшемся графике не видно значений этого индикатора? Т.е., например, открываем в отладчике MACD. Ставим точку останова в цикл записи значений в буферы. После записи значения ChartRedraw(). Ожидаю после записи значения увидеть это значение сразу на графике, но вижу только пустое окно.

Билд 2380 x64.

 
Alexey Viktorov:

никакая это не особенность mql5, а просто некоторые попытки приучить к порядку.

приучение к порядку - это когда компилятор выдаст предупреждение (или ошибку). преобразование целых в дробные возвращает 0 - это нонсенс, а не порядок. так 90% старых кодов поломаются.

и, заметьте, рабочий вариант всё равно был с int! т.е. дело не в преобразовании типов на этапе подстановки в функцию, а на этапе вычисления

ДОБАВЛЕНО: перешёл на MQ-demo, обновил рабочий терминал. Нет в нём этой проблемы.

 
Ошибка при компиляции
class A {  
public:
        static int i;
} a; //Error: unresolved static variable 'A::i'
int A::i = 0;
 
Igor Zakharov:

приучение к порядку - это когда компилятор выдаст предупреждение (или ошибку). преобразование целых в дробные возвращает 0 - это нонсенс, а не порядок. так 90% старых кодов поломаются.

и, заметьте, рабочий вариант всё равно был с int! т.е. дело не в преобразовании типов на этапе подстановки в функцию, а на этапе вычисления

ДОБАВЛЕНО: перешёл на MQ-demo, обновил рабочий терминал. Нет в нём этой проблемы.

А отсутствие подсветки возможных вариантов в этом случае не вызывает подозрений?

   ObjectSetDouble (0,name,OBJPROP_ANGLE,dir// тут должен появиться список вариантов переменных double
 
Ошибка при выполнении
class A {  
public:
         A() { i = ++ii; printf( "%d", i ); }
        ~A() {           printf( "%d", i ); }
        int i;
        static int ii;
};
int A::ii = 0;
A a[ 2 ];
void OnStart() {}

  • Результат в MQL: 1212
  •               а в С++: 1221