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

 

У вас оффлайн-график?

 
  Подскажите, как получить донные индикатора с таймфрейма, отличного от того, на котором висит сова?
 
Galim_V:
  Подскажите, как получить донные индикатора с таймфрейма, отличного от того, на котором висит сова?

1. Вы зачем птичку повесили? Не жалко?

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

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

 
Artyom Trishkin:

У вас оффлайн-график?

Нет.

 
PolarSeaman:

Нет.

Для чего тогда постоянный рефреш без надобности?

Вам нужно время? Время можете получить либо последнего тика: TimeCurrent(), либо последнее локальное время: TimeLocal()

Если будете получать время последнего тика в выходные, то таймер тут не поможет - время будет последнего тика пятницы, ну или последнего тика последнего рабочего дня. А TimeLocal() не даст вам время сервера - нужно пересчитывать со смещением.

Впрочем, я не знаю что именно вы хотите получить в итоге.

 
Artyom Trishkin:

1. Вы зачем птичку повесили? Не жалко?

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

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

2018.07.04 22:17:38.398 2016.11.10 13:00:00  Arap01 EURUSD,H1: Округляем 44.53781512605145 45.0  Это данные стохастика в "нормальном" режиме. т.е так:

2=iStochastic(NULL,0,K,D,slowing,Average_method,price_field,MODE_MAIN,2);

здесь я прошу М5 2=iStochastic(NULL,5,K,D,slowing,Average_method,price_field,MODE_MAIN,2); 

получаю 2018.07.04 22:23:05.680 2016.11.10 13:00:00  Arap01 EURUSD,H1: Округляем 0.0 0.0



 
Artyom Trishkin:

Впрочем, я не знаю что именно вы хотите получить в итоге.

Алерт, хочу, за две секунды до закрытия бара. Выходные не буду работать.

 
PolarSeaman:

Так мне без тика нужен алерт за две секунды до закрытия бара.

Это не сделать просто, нужно запускать более точный таймер (хотя бы 500 мс) и предварительно делать синхронизацию локального времени и серверного.
Вот я вам уже рассказывал:

в момент прихода тика считаем разницу TimeCurrent()-TimeLocal()
(это делается один раз для синхронизации времени локального и серверного)

- это смещение относительно брокера, если это смещение в дальнейшем изменится, значит нужно пересчитывать время заново;
- при старте советника, (или появлении бара Д1) пересчитываем все нужные времена заново, в локальное время, учитывая смещение;
- ждём то что "насчитали" в таймере, попутно проверяя рассинхронизацию, пропадание связи с брокером, перевод локальных стрелок.

при этом можно ловить +/- 1 секунду
 
Taras Slobodyanik:

Это не сделать просто, нужно запускать более точный таймер (хотя бы 500 мс) и предварительно делать синхронизацию локального времени и серверного.
Вот я вам уже рассказывал:

при этом можно ловить +/- 1 секунду

Спасибо. Как сделать чтобы время было в секундах, до закрытия бара М5. Сейчас отображает Н1.

#property strict
#property indicator_chart_window
//--- input parameters
#define MILLISEC_TIMER_INTERVAL         500 
int            timeOffset;
datetime       ServerLocalOffset;
datetime       prevTime,myTime,localtime;
bool           newBar = false;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   EventSetMillisecondTimer(MILLISEC_TIMER_INTERVAL);
   
  datetime srvtime,tmpOffset;
   RefreshRates();
   srvtime = TimeCurrent();
   // Modified
   localtime = TimeLocal()+TimeGMTOffset();
   if(TimeHour(srvtime)>TimeHour(localtime)){
      // Server Time is still ahead of us
      int newOffset = TimeHour(srvtime)-TimeHour(localtime);
      ServerLocalOffset = (newOffset*60*60);
   }else if(TimeHour(srvtime)<TimeHour(localtime)){
      // Server Time is Behind us
      int newOffset = TimeHour(localtime)-TimeHour(srvtime);
      ServerLocalOffset = (newOffset*60*60);
   }else{
      // No modification required
      ServerLocalOffset = srvtime;
   }
   localtime = TimeLocal()-ServerLocalOffset;
   
   tmpOffset = TimeSeconds(srvtime) - TimeSeconds(localtime);
   if(tmpOffset < 30 && tmpOffset >= 0){
      timeOffset = TimeSeconds(srvtime) - TimeSeconds(localtime);
   }
   return(INIT_SUCCEEDED);
  }
  
void OnDeinit(const int reason)
  {
   EventKillTimer();
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
datetime sec;
   datetime localtime;
   localtime = TimeLocal()+(TimeGMTOffset()+(60*60));
 sec=Time[0]-localtime-timeOffset;
 if(sec<=2){Alert("время откр. бара ",Time[0]);}
      Comment(TimeToStr(sec,TIME_SECONDS ));
  }
//+------------------------------------------------------------------+
 
Так и не сообразил, как посчитать секунды до закрытия бара на текущем периоде. Помогите.