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

 
Aleksei Stepanenko #:

Виталий, как оценивать пропуск баров? 48 баров в сутки? Иногда работа прекращается в 23 часа, иногда начинается в 2. Если на рубль посмотреть, то там ночью торгов нет.

Если строго 24 часа 5 дней в неделю, тогда перебором каждого бара по порядку с проверкой последовательности через время бара при помощи структуры MqlDateTime. Но тогда будут сигналы о пропущенных барах, которых и не должно существовать.

Вот к примеру:

Пропущен 1 бар в среду, начинается по этому символу с 00:30, то есть потерян в 00:00

Тайм М30, получилось в сутках 47, вместо 48. Именно это и нужно выявить


 
Vitaly Muzichenko #:

Вот к примеру:

Пропущен 1 бар в среду, начинается по этому символу с 00:30, то есть потерян в 00:00

Тайм М30, получилось в сутках 47, вместо 48. Именно это и нужно выявить


Я не знаю как правильно, но я бы в таком направлении думал

      datetime tt=Time[Bars-1];
      //--- 
      if(Time[i]==tt){tt+=PeriodSeconds(PERIOD_CURRENT);}
      else
      {Print(TimeToString(tt,TIME_DATE|TIME_MINUTES));tt+=PeriodSeconds(PERIOD_CURRENT);}
 
Vitaly Muzichenko #:

Вот к примеру:

Пропущен 1 бар в среду, начинается по этому символу с 00:30, то есть потерян в 00:00

Тайм М30, получилось в сутках 47, вместо 48. Именно это и нужно выявить


int  Bars( 
   string           symbol_name,     // имя символа 
   ENUM_TIMEFRAMES  timeframe,       // период 
   datetime         start_time,      // с какой даты 
   datetime         stop_time        // по какую дату 
   );
Если 47
 

Vitaly Muzichenko #:

Именно это и нужно выявить

Понял, вопрос в ложных звоночках, которых будет много.

//дата последней свечи
 curr_time=iTime(symbol,frame,0);
//ограничение на торговлю вне начала бара
if(last_time==curr_time) return;

if((iBarShift(eSymbol,eFrame,last_time)-iBarShift(eSymbol,eFrame,curr_time))>PeriodSeconds(eFrame)) printf("а-я-яй");
last_time=curr_time;
 
Alexey Viktorov #:
Если 47

Это можно, можно и CopyOpen()

Не могу решить, как это организовать в цикле по всей истории

 

ещё проще:

for(int i=TotalBars-1; .....
   {
   if((iBarShift(eSymbol,eFrame,last_time)-i)>PeriodSeconds(eFrame)) printf("а-я-яй");
   last_time=iTime(symbol,frame,i);
 
Vitaly Muzichenko #:

Это можно, можно и CopyOpen()

Не могу решить, как это организовать в цикле по всей истории

Время открытия нулевого дневного бара минус 1 секунду до открытия первого дневного бара. Затем от открытия первого дневного бара минус 1 секунду до открытия второго дневного бара и так далее.
 
Vitaly Muzichenko #:

Это можно, можно и CopyOpen()

Не могу решить, как это организовать в цикле по всей истории

начерно (к примеру для M30) - если время между открытиями (по модулю % 24 часа) соседних баров больше чем M30 - значит между ними пропущены бары. 

int nbars = ( ( iTime(_Symbol,PERIOD_M30,N) - iTime(_Symbol,PERIOD_M30,N+1) ) ) / PeriodSeconds(PERIOD_M30) ) % 48; // сколько баров должно быть между ссоедними отметками

if (nbars>1) PrintFormat("Пропущено баров: %d",nbars-1);

 

ВСЕМ спасибо, принцип понятен, задачу смог формализовать.

---

Теперь вопрос: Что делаю не так, на всех символах одинаковое значение?

#property strict

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   Print( DoubleToString(SymbolInfoDouble(_Symbol,SYMBOL_POINT),8) );
  }
//+------------------------------------------------------------------+
0       14:39:38.965    sc GBPCHF,M30: 0.00001000
0       14:46:44.478    sc NZDCHF,M30: 0.00001000
0       14:44:54.709    sc EURUSD,M30: 0.00001000

---

P.S. Терминал МТ4, проверил на двух разных терминалах в разных ДЦ

P.SS. Проверил в мт5, результат тот-же

2021.11.20 15:05:34.881 sc (EURCHF,M30)  0.00001000
2021.11.20 15:05:39.203 sc (AUDUSD,M30)  0.00001000
2021.11.20 15:05:51.985 sc (EURAUD,M30)  0.00001000

---

Наверное, что-то делаю не так!

Нужно получить "Стоимость пункта"

 
Vitaly Muzichenko #:

ВСЕМ спасибо, принцип понятен, задачу смог формализовать.

---

Теперь вопрос: Что делаю не так, на всех символах одинаковое значение?

Виталий, тут надо или в баг, разработчикам, или

Причина обращения: