Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 580

 
Здравствуйте! Помогите разобраться с проблемой. Мне нужно из одного советника получать данные по разным символам/ТФ. В справке написано: "Механизм обращения к серверу за данными не зависит от того, каким образом был инициирован запрос — пользователем при навигации по графику или программным способом на языке MQL4." Однако на практике, если в реальном времени, например, следить за количеством баров по символу/ТФ отличному от символа, на котором запущен советник, получается следующее.. По новому символу подгружается небольшое число баров при первом обращении (примерно в районе 1000 для М1) и это число не меняется. Пробовал разные функции доступа к таймсериям, пробовал задавать смещение баров и времени глубже в истории, чем она загружена в данный момент, пробовал двигать график ChartNavigate(_ID, CHART_BEGIN) - новые данные не грузятся, число баров не меняется. Однако, если из того же советника программно открыть окно (открывал ранее для функции ChartNavigate()) и двигать график влево стрелочкой/кнопка Home/PgUp - это приводит к увеличению массивов таймсерий, увеличивается число баров в реальном времени, т.е. данные подгружаются. Что нужно сделать, чтобы подгрузить историю программно, не нажимая физические клавиши на клавиатуре? Спасибо)
 
Ihor Herasko:

Так и сделайте. Код почти правильный. Там только одного слова не хватает:

Благодарю! 
 
Alexandr Mordashov:
Здравствуйте! Помогите разобраться с проблемой. Мне нужно из одного советника получать данные по разным символам/ТФ. В справке написано: "Механизм обращения к серверу за данными не зависит от того, каким образом был инициирован запрос — пользователем при навигации по графику или программным способом на языке MQL4." Однако на практике, если в реальном времени, например, следить за количеством баров по символу/ТФ отличному от символа, на котором запущен советник, получается следующее.. По новому символу подгружается небольшое число баров при первом обращении (примерно в районе 1000 для М1) и это число не меняется. Пробовал разные функции доступа к таймсериям, пробовал задавать смещение баров и времени глубже в истории, чем она загружена в данный момент, пробовал двигать график ChartNavigate(_ID, CHART_BEGIN) - новые данные не грузятся, число баров не меняется. Однако, если из того же советника программно открыть окно (открывал ранее для функции ChartNavigate()) и двигать график влево стрелочкой/кнопка Home/PgUp - это приводит к увеличению массивов таймсерий, увеличивается число баров в реальном времени, т.е. данные подгружаются. Что нужно сделать, чтобы подгрузить историю программно, не нажимая физические клавиши на клавиатуре? Спасибо)

Надо более четко формулировать вопрос. Если задача не поставлена, то она не может быть решена.

 
Galim_V:
  Подскажите, как получить донные индикатора с таймфрейма, отличного от того, на котором висит сова?
double iRev()
{
 static int wtf;
 static int tf;  
 int xtf =Period();       // таймфрейм текущего графика 
 
                          //PERIOD_CURRENT;
 if(xtf != PERIOD_CURRENT)
 {
 Print("xtf  ",xtf);
   switch(xtf)
   {
    case 1: tf = PERIOD_H1;
    break;
    case 5: tf = PERIOD_H4; wtf = PERIOD_H1;
    break;
    case 15: tf = PERIOD_D1;
    break;
   }
     
 }
Print("tf == ",tf,"wtf ==",wtf);
 double  iRa =  NormalizeDouble(iCustom(NULL,tf,"iRevers",InpSARStep,InpSARMaximum,0),Digits);
 double  wRa =  NormalizeDouble(iCustom(NULL,wtf,"iRevers",InpSARStep,InpSARMaximum,0),Digits);
   if(iRa != 0) ObjectCreate("Ra",OBJ_HLINE,0,Time[0],iRa,0,0);
     
     ObjectSet("Ra",OBJPROP_TIME1,Time[0]);
     ObjectSet("Ra",OBJPROP_PRICE1,iRa);
   
   if(wRa != 0) ObjectCreate("weRa",OBJ_HLINE,0,Time[0],wRa,0,0); 
     ObjectSet("weRa",OBJPROP_TIME1,Time[0]);
     ObjectSet("weRa",OBJPROP_PRICE1,wRa); 
    
     
  Print("iRa   ",iRa,wRa);
 return(iRa);
}  
Работает, но не всегда правильно. Обьекты прикрутил для визуальной оценки. Подскажите или где посмотреть.
 
Galim_V:
Работает, но не всегда правильно. Обьекты прикрутил для визуальной оценки. Подскажите или где посмотреть.

А для чего тут DRAW_LINE

 double  iRa =  NormalizeDouble(iCustom(NULL,tf,"iRevers",InpSARStep,InpSARMaximum,DRAW_LINE,0),Digits);
 double  wRa =  NormalizeDouble(iCustom(NULL,wtf,"iRevers",InpSARStep,InpSARMaximum,DRAW_LINE,0),Digits);
 
Alexey Viktorov:

А для чего тут DRAW_LINE

  Подправил код. Но некорректно работало, даже не из-за ошибок в коде. Делаю тесты в терминале не своего брокера и не всегда слежу за связью с сервером. А в данном случае это критично. Спасибо.
 

Здравствуйте. Как узнать цену закрытия М30, если советник на графике Н1?

Close_M30= iClose(Symbol(),PERIOD_M30,1);
 
bij:

Здравствуйте. Как узнать цену закрытия М30, если советник на графике Н1?

Нравится, когда люди задают вопрос и сами же на него отвечают ))

По большому счету все верно. Только есть один нюанс: перед использованием данных, полученных с другого ТФ, нужно убедиться, что эти данные вообще существуют.

Поэтому полный корректный код будет выглядеть так:

ResetLastError();
Close_M30= iClose(Symbol(),PERIOD_M30,1);
if (GetLastError() != ERR_NO_ERROR)
{
  // Значение Close_M30 использовать нельзя
}
 
Ihor Herasko:

Нравится, когда люди задают вопрос и сами же на него отвечают ))

По большому счету все верно. Только есть один нюанс: перед использованием данных, полученных с другого ТФ, нужно убедиться, что эти данные вообще существуют.

Поэтому полный корректный код будет выглядеть так:

Спасибо, действие только после закрытия Н1, но условие выполнено за 30 мину до закрытия Н1.

 ResetLastError();
   niz_=NormalizeDouble(iCustom(NULL,PERIOD_M30,"mand v.1",2,1),Digits);
   Close_M30=iClose(Symbol(),PERIOD_M30,1);
   if(GetLastError() != ERR_NO_ERROR)return;
   if(Close_M30>niz_)//условие
     {
      //действие
     }
 
bij:

Спасибо, действие только после закрытия Н1, но условие выполнено за 30 мину до закрытия Н1.

Если нужно взять свечу М30, которая закрылась вместе с последней закрытой свечей Н1, то это может быть свеча с индексом не только 1, но и 2. Другое дело, что тогда непонятно, почему берется цена закрытия М30, если это та же самая цена закрытия для предыдущей свечи Н1. То есть в этом случае нет смысла опрашивать цену закрытия другого ТФ, т. к. она совпадает с ценой закрытия текущего ТФ.