Новая версия платформы MetaTrader 5 build 3550: улучшения и исправления - страница 15

 

b3571, какие баги сегодня ловил.


1. Обзор рынка обновляется где-то раз в секунду. Сразу сотня символов. Хотя FPS должен быть за сотню. При этом CopyTicks выдавал все тики, кроме последнего (Обзор рынка). И так на каждом тике.

2. Свежие тики не загружались.

3. Бары определенного символа не строятся, хотя котиры идут.


Все баги вылечивались перезагрузкой терминала. Что-то много за несколько часов работы!

 
Roman #:

Да есть rates_total, но именно в условии цикла Андрея оно не как не контролируется !
Вместо этого подаётся значение 
datetime, что вообще для меня нонсенс.

которое больше макс баров 1000000

Это код нормально же работает, когда в цикле контролируется rates_total

Роман, очень прискорбно, что вы не можете прочитать код в несколько строчек. Вам же всё объяснил наш коллега:

И для вас я изменил его, может так понятнее:

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[])
  {
   datetime arr_time=0, i_time=0;
//---
   for(int i=0; i_time<=0 && i<rates_total; i++) {
      arr_time=time[i];
      ResetLastError();
      i_time=iTime(_Symbol,PERIOD_CURRENT,rates_total-1-i);
      printf("i: %d   rates_total-%d: %d   time: %I64d   iTime: %I64d   Error: %d", i, i, rates_total-i, arr_time, i_time, GetLastError());
   }
//--- return value of prev_calculated for next call
   return(rates_total);
  }

Ну или так:

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[])
  {
   datetime arr_time=0, i_time=0;
//---
   for(int i=0; i<rates_total; i++) {
      arr_time=time[i];
      ResetLastError();
      i_time=iTime(_Symbol,PERIOD_CURRENT,rates_total-1-i);
      printf("i: %d   rates_total-%d: %d   time: %I64d   iTime: %I64d   Error: %d", i, i, rates_total-i, arr_time, i_time, GetLastError());
      if(i_time>0) break;
   }
//--- return value of prev_calculated for next call
   return(rates_total);
  }

Сути это не меняет.

Мне не нужно в этом индикаторе просчитывать ВСЮ историю. Здесь я ищу первое не нулевое значение iTime(...) с начала истории.

 
Andrey Kaunov #:

Роман, очень прискорбно, что вы не можете прочитать код в несколько строчек. Вам же всё объяснил наш коллега:


И для вас я изменил его, может так понятнее:

Ну или так:

Сути это не меняет.

Я реально не понимаю вашей задачи. Плюс голова болит ))

"найти момент, когда i_Time получит какое-нибудь значение"

Что значит какое-нибудь?
В моём показанном коде, значение будет получено на первой же итерации цикла.
И дальше по циклу продолжает получать.
 Пока не пройдёт по заданному lmit.

Затем в зависимости от операторов в цикле 

   //i>0  расчёт на каждом баре

   //i>=0 расчет на каждом тике

получает последнее текущее значение.


А этот ваш код отрабатывает без 

if(i_time>0) break;
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[])
{
   datetime arr_time=0, i_time=0;

   for(int i=0; i<rates_total; i++)
   {
      arr_time = time[i];
      
      ResetLastError();
      
      i_time = iTime(_Symbol,PERIOD_CURRENT,rates_total-1-i);
      printf("i: %d   rates_total-%d: %d   time: %I64d   iTime: %I64d   Error: %d", i, i, rates_total-i, arr_time, i_time, GetLastError());

   }

   return(rates_total);
}
2023.02.06 21:45:11.005 FORUM (EURUSD,M1)       i: 998226   rates_total-998226: 2048   time: 1675420080   iTime: 1675420080   Error: 0
2023.02.06 21:45:11.005 FORUM (EURUSD,M1)       i: 998227   rates_total-998227: 2047   time: 1675420140   iTime: 1675420140   Error: 0
2023.02.06 21:45:11.005 FORUM (EURUSD,M1)       i: 998228   rates_total-998228: 2046   time: 1675420200   iTime: 1675420200   Error: 0
2023.02.06 21:45:11.005 FORUM (EURUSD,M1)       i: 998229   rates_total-998229: 2045   time: 1675420260   iTime: 1675420260   Error: 0
2023.02.06 21:45:11.005 FORUM (EURUSD,M1)       i: 998230   rates_total-998230: 2044   time: 1675420320   iTime: 1675420320   Error: 0
2023.02.06 21:45:11.005 FORUM (EURUSD,M1)       i: 998231   rates_total-998231: 2043   time: 1675420380   iTime: 1675420380   Error: 0
2023.02.06 21:45:11.005 FORUM (EURUSD,M1)       i: 998232   rates_total-998232: 2042   time: 1675420440   iTime: 1675420440   Error: 0
2023.02.06 21:45:11.005 FORUM (EURUSD,M1)       i: 998233   rates_total-998233: 2041   time: 1675420500   iTime: 1675420500   Error: 0
2023.02.06 21:45:11.005 FORUM (EURUSD,M1)       i: 998234   rates_total-998234: 2040   time: 1675420560   iTime: 1675420560   Error: 0
2023.02.06 21:45:11.005 FORUM (EURUSD,M1)       i: 998235   rates_total-998235: 2039   time: 1675420620   iTime: 1675420620   Error: 0
2023.02.06 21:45:11.005 FORUM (EURUSD,M1)       i: 998236   rates_total-998236: 2038   time: 1675420680   iTime: 1675420680   Error: 0

Я реально не пойму задачи. Извините. Чем смог как говориться.

Новая версия платформы MetaTrader 5 build 3550: улучшения и исправления - Запустите мой код, и подождите появления нового бара
Новая версия платформы MetaTrader 5 build 3550: улучшения и исправления - Запустите мой код, и подождите появления нового бара
  • 2023.02.06
  • www.mql5.com
функция iBars возвращает то же значение что и rates total. и подождите появления нового бара Счет неттинг или хедж это все же пользователь должен решать а не быть на стороне сервера. В общим этим числом регулируем крайнее окно просчитываемых баров на старте
 
Roman #:

А этот ваш код отрабатывает без 

if(i_time>0) break;

Отрабатывает, но мне нужно его остановить как только найдётся не нулевое значение i_time. Вам же написал наш коллега.

Вам нужно почитать матчасть, честно. Вот тут в частности https://www.mql5.com/ru/docs/basis/operators/for

Там ничего не написано, что в выражении2 должны быть какие то переменные из выражения1, или вообще какие то конкретные переменные.

Документация по MQL5: Основы языка / Операторы / Оператор цикла for
Документация по MQL5: Основы языка / Операторы / Оператор цикла for
  • www.mql5.com
Оператор цикла for - Операторы - Основы языка - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Andrey Kaunov #:

Отрабатывает, но мне нужно его остановить как только найдётся не нулевое значение i_time

Вам нужно почитать матчасть, честно. Вот тут в частности https://www.mql5.com/ru/docs/basis/operators/for

Там ничего не написано, что в выражении2 должны быть какие то переменные из выражения1, или вообще какие то конкретные переменные.

Вы сперва говорите. что нужно найти какое-нибудь валидное значение.
Теперь говорите что нужно ещё остановить.

Ну так в моем коде на первой же итерации и остановите тем же оператором break.
Если решение не подходит, так и скажите.
Дело не в матчасти, а в корректно поставленной задаче изначально.

Поэтому изначально и предложил

datetime firtsDate = (datetime)SeriesInfoInteger(_Symbol,_Period,SERIES_FIRSTDATE);

которое вернёт первое валидное значение на данный момент

Самая первая дата по символу-периоду на данный момент


Если и это то-же не то. Увы я пас.

 
Roman #:

Вы сперва говорите. что нужно найти какое-нибудь валидное значение.
Теперь говорите что нужно ещё остановить.

Ну так моем коде на первой итерации и остановите тем же оператором break.
Дело не в матчасти, а в корректно поставленной задаче изначально.

Так найти и остановить. Зачем мне все бары отрабатывать.

Роман, я вообще не понимаю, что вы мне пытаетесь объяснить. Что я не правильно код написал? Мне не нужен индикатор с проверкой 

int limit = rates_total-prev_calculated;
  
   if(limit > 1) 
      limit = rates_total-1;

Мне нужно было найти первый бар с не нулевым значением с начала истории. А решил её минимальным количеством строк. Зачем мне обсчитывать текущий бар, и тем более все бары? Давайте завершим на этом нашу дискуссию. Прочитайте мой код, там несколько строчек, ничего сложного.

 
Andrey Kaunov #:

Мне нужно было найти первый бар с не нулевым значением с начала истории. 

О чём я и говорю, не корректно поставленная задача, рождает испорченный телефон!

Вот ваше решение без циклов, пример выше.

Удачи.

Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Информация об исторических данных по инструменту
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Информация об исторических данных по инструменту
  • www.mql5.com
Информация об исторических данных по инструменту - Торговые константы - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 

Вот человек... Вы упустили то, что ищу я этот бар не просто, а с определенной целью. Я всё изложил вот тут подробно. Ознакомьтесь на досуге. Всего вам наилучшего!

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Новая версия платформы MetaTrader 5 build 3550: улучшения и исправления

Andrey Kaunov, 2023.02.06 13:44

Так, как только появляется новый бар сверх количества  TERMINAL_MAXBARS, последний (самый старый) в истории удаляется,и функция не видит. И видит только TERMINAL_MAXBARS  в историю.

Причем раньше, после перезагрузке терминала, количество видимых индикатору баров сбрасывалось до TERMINAL_MAXBARS. Но сейчас остаётся таким же, как было при выключении терминала (по значению rates_total индикатора). А на графике при появлении каждого нового бара сверх значения  TERMINAL_MAXBARS, старый убирается с графика.


P.S. Это индикатор видит и считает бары, которых в окне графика уже нет. А в окне всё правильно отображается - 10000 баров. Но индикатор, даже после перезагрузки терминала, видит больше баров. 

Несостыковка из-за этого получается!

Рашид, вы поставьте индикаторы, что я прикрепил. Вот здесь поправил, чтобы дату бара показывал. Поставьте его, проверьте все. Это не есть правильно! Крайний бар там на скрине в 19:40 (первый бар на графике), но индикатор видит и удалившиеся бары.

Индикатор перестаёт видеть ушедшие в историю бары только после изменения настройки  TERMINAL_MAXBARS  и перезагрузки терминала. Причём, если просто увеличить TERMINAL_MAXBARS, а терминал не перезагружать, функция iTime(...) начинает видеть ушедшие в историю бары.


Вот здесь покороче:

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Новая версия платформы MetaTrader 5 build 3550: улучшения и исправления

Andrey Kaunov, 2023.02.06 18:15

Согласно документации, никаких ограничений по максимуму баров на графике в работе функции iTime и др. нет (в отличие от CopyTime(...)). Следовательно из индикатора данные из таймсерии бара можно взять как из массива time, так и из функции iTime. Причём и iBars возвращает количество баров, равное rates_total.

Здесь точно какая то ошибка или недоработка.

Требуется мне конвертировать индикатор из MQL4. И обращаясь к данным из функций iTime и др., получаю нулевые данные. А это неприемлемо. Бар вроде как есть, согласно функции iBars(...), а данные нулевые.


Новая версия платформы MetaTrader 5 build 3550: улучшения и исправления - В новом обновлении терминала не работает функция iTime
Новая версия платформы MetaTrader 5 build 3550: улучшения и исправления - В новом обновлении терминала не работает функция iTime
  • 2023.01.31
  • www.mql5.com
как только появляется новый бар сверх количества в истории удаляется. количество видимых индикатору баров сбрасывалось до MAXBARS. А на графике при появлении каждого нового бара сверх значения MAXBARS. Это индикатор видит и считает бары, которых в окне графика уже нет
 
Sergey Gridnev #:
Это не ошибка. Вы целое умножает на целое = результат тоже - целое.

вы че ребята? я делю целое на целое и должен получать дробное число.. почему 1 выдает?

раньше так не работало.

 
Alexandr Gavrilin #:

вы че ребята? я делю целое на целое и должен получать дробное число.. почему 1 выдает?


Гуглите что-нибудь типа "целочисленная арифметика в программировании".

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