Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 85

 

По ходу дела возникли еще пару вопросов:

1. есть строка: 

datetime ProvTimeX1=ObjectGetInteger(0,"Y="+IntegerToString(y,0,' '),OBJPROP_TIME);

компилятор на нее ругается, пишет "possible loss of data due to type conversion". Что здесь не так?

2. Как в mql5 заносятся в массивы и распределяются данные, в каком направлении? 

 
WindSW:

По ходу дела возникли еще пару вопросов:

1. есть строка: 

datetime ProvTimeX1=ObjectGetInteger(0,"Y="+IntegerToString(y,0,' '),OBJPROP_TIME);

компилятор на нее ругается, пишет "possible loss of data due to type conversion". Что здесь не так?

Ну и правильно ругается, Вы ведь пытаетесь записать в переменную  datetime значение long, возвращаемое ObjectGetInteger. Делайте приведение типов.

datetime ProvTimeX1=(datetime)ObjectGetInteger(0,"Y="+IntegerToString(y,0,' '),OBJPROP_TIME);
 2. Как в mql5 заносятся в массивы и распределяются данные, в каком направлении? 

Направление всегда одно - от начала (индекс равен нулю) к концу, НО если не указана индексация с помощью функции ArraySetAsSeries. Если вопрос по индексации.

 

Добрый день, не могу поделить числа, результат 0.0

Почему? 

   double res =  8000/16000 * 100;
   Print(res);
 
ryzhak.vladimir:

Добрый день, не могу поделить числа, результат 0.0

Почему? 



   double res=((double)8000/16000)*100;
   Print(res);
Документация >>> Приведение типов
 

Тупизм конечно, что приходится что-то дописывать менять, какой-то калькулятор без точек все нормально считает и не надо ему указывать, какой это тип данных, ну да ладно, второй способ это в конеце целого числа дописывать ".0"

тоесть правильное выражение еще вот такое будет

double res =8000.0/16000.0*100;
Print(res);
Кстати, в каком-то языке програмирования видел обозначение переменной такое, что терминал сам выбирает ее тип, возможно это касалось только цифровых данных, но всеравно удобно, это случаем не тут реализовано, пытался найти в документации - не нашел?
 
спасибо всем)
 

В 4 версии: datetime TimeX2=Time[0]+18000;  - увеличивало значение времени на 5 свечей вперед

Сейчас в 5 при написании:

datetime Topen[];
ArraySetAsSeries(Topen,true);
CopyTime(_Symbol,_Period,0,3,Topen);
datetime TimeX2=Topen[0]+18000;

при отладке выдает ошибку переполнения массива и указывает на строку  datetime TimeX2=Topen[0]+18000;

Пожалуйста, подскажите как в 5 получить такой же результат как был в 4?

Дополнение: Все правильно написано, просто я ошибся - в OnInit массив был пустой.

 
WindSW:

В 4 версии: datetime TimeX2=Time[0]+18000;  - увеличивало значение времени на 5 свечей вперед

Сейчас в 5 при написании:

при отладке выдает ошибку переполнения массива и указывает на строку  datetime TimeX2=Topen[0]+18000;

Пожалуйста, подскажите как в 5 получить такой же результат как был в 4?

 

 

datetime b=TimeTradeServer()+60*min; //min - кол-во минут от текущего времени
 

Столкнулся с проблемой отрисовки уровней.

void OnInit()
  {
   ObjectCreate(0,oPP,OBJ_TREND,0,0,0,0,0);
   ObjectSetInteger(0,oPP,OBJPROP_COLOR,clrDeepSkyBlue);
   ObjectSetInteger(0,oPP,OBJPROP_STYLE,STYLE_SOLID);
   ObjectSetInteger(0,oPP,OBJPROP_WIDTH,2);
   ObjectSetInteger(0,oPP,OBJPROP_RAY,false);
   ObjectCreate(0,oRes1,OBJ_TREND,0,0,0,0,0);
   ObjectSetInteger(0,oRes1,OBJPROP_COLOR,clrDeepSkyBlue);
   ObjectSetInteger(0,oRes1,OBJPROP_STYLE,STYLE_DASH);
   ObjectSetInteger(0,oRes1,OBJPROP_WIDTH,1);
   ObjectSetInteger(0,oRes1,OBJPROP_RAY,false);
   ObjectCreate(0,oSup1,OBJ_TREND,0,0,0,0,0);
   ObjectSetInteger(0,oSup1,OBJPROP_COLOR,clrDeepSkyBlue);
   ObjectSetInteger(0,oSup1,OBJPROP_STYLE,STYLE_DASH);
   ObjectSetInteger(0,oSup1,OBJPROP_WIDTH,1);
   ObjectSetInteger(0,oSup1,OBJPROP_RAY,false);
   PPlevel();
  }
//+------------------------------------------------+
//| Пивот поинт                                    |
//+------------------------------------------------+
void PPlevel()
   {
    double iH=iHigh(Symbol(),PERIOD_D1,1);
    double iL=iLow(Symbol(),PERIOD_D1,1);
    double iC=iClose(Symbol(),PERIOD_D1,1);
    double iO=iOpen(Symbol(),PERIOD_D1,1);
    int New_candle=0;
    New_candle=NBar(); // функция появления новой свечи
    if(New_candle==1)
      {
       double range=NormalizeDouble(iH-iL,_Digits);
       double PP=NormalizeDouble((iH+iL+iC)/3,_Digits);
       double R1=NormalizeDouble((2*PP)-iL,_Digits);
       double S1=NormalizeDouble((2*PP)-iH,_Digits);
       TimeStart=iTime(Symbol(),PERIOD_D1,0)-7200;
       TimeFinish=Topen[0]+64000;
       ObjectSetInteger(0,oPP,OBJPROP_TIME,TimeStart);                 // отрисовка PP
       ObjectSetDouble(0,oPP,OBJPROP_PRICE,PP);
       ObjectSetInteger(0,oPP,OBJPROP_TIME,1,TimeFinish);
       ObjectSetDouble(0,oPP,OBJPROP_PRICE,1,PP);
       ObjectSetInteger(0,oRes1,OBJPROP_TIME,TimeStart);               // отрисовка сопротивления
       ObjectSetDouble(0,oRes1,OBJPROP_PRICE,R1);
       ObjectSetInteger(0,oRes1,OBJPROP_TIME,1,TimeFinish);
       ObjectSetDouble(0,oRes1,OBJPROP_PRICE,1,R1);
       ObjectSetInteger(0,oSup1,OBJPROP_TIME,TimeStart);               // отрисовка поддержки
       ObjectSetDouble(0,oSup1,OBJPROP_PRICE,S1);
       ObjectSetInteger(0,oSup1,OBJPROP_TIME,1,TimeFinish);
       ObjectSetDouble(0,oSup1,OBJPROP_PRICE,1,S1);
      }
   }
Проверяю через Print(), выдает нормальные результаты расчетов "Пример: (GBPUSD,H1) 0.0152 i 1.5911 i 1.59682 i 2013.01.20 22:00:00 i 2013.01.22 09:46:40", однако не рисует эти уровни. Проверяю в терминале через "Список объектов", их там нет. Пожалуйста, подскажите в чем проблема? Где косячу?
 
WindSW:

Столкнулся с проблемой отрисовки уровней.

Проверяю через Print(), выдает нормальные результаты расчетов "Пример: (GBPUSD,H1) 0.0152 i 1.5911 i 1.59682 i 2013.01.20 22:00:00 i 2013.01.22 09:46:40", однако не рисует эти уровни. Проверяю в терминале через "Список объектов", их там нет. Пожалуйста, подскажите в чем проблема? Где косячу? 
Выведите через print результаты ObjectCreate, может там ошибка.
Причина обращения: