Ошибки, баги, вопросы - страница 2722

 
Stanislav Korotky:

Есть две программы, работающие одновременно с одним и тем же файлом. Та, что записывает, использует флаги FILE_READ|FILE_WRITE|FILE_BIN|FILE_SHARE_READ. Та, что читает - FILE_READ|FILE_BIN|FILE_SHARE_WRITE|FILE_SHARE_READ. Несмотря на то, что первая программа периодически сохраняет файл с помощью FileFlush, вторая видит длину файла только на момент открытия. Пробовал делать FileSeek взад-вперед - не помогает.

Вопрос: как сделать, чтобы программа, читающая файл, подхватывала дозаписываемые данные?

Эти две программы в одном терминале или в двух разных?

 

Методы объекта из массива объектов, переданного по ссылке не отрабатывают.

Пример:

//+------------------------------------------------------------------+
//| Пример: добавленный метод для расширения файла ..\Include\String\String.mqh
//|--
//| Получает из указанной строки подстроки по заданному разделителю 
//| и возвращает количество полученных объектов-подстрок
//|         НЕ РАБОТАЕТ !!!!!!!!!!
//+------------------------------------------------------------------+
int CString::Split(const string separator,      // разделитель
                   CString      &result[] )     // массив строковых объектов
  {
   string tmp_result[];               

   if(StringLen(separator)==0) return(0);

   ushort u_sep=StringGetCharacter(separator,0); 
   
   int count=StringSplit(m_string,u_sep,tmp_result);

   // временно для проверки
   result[0].Assign("Buy"); // НЕ РАБОТАЕТ !!!!!!
   Alert("ressult[0] = ",result[0].Str()); // <--- уже не отрабатывает
   // конец временно
   
   /*
   for(int i=0;i<count;i++)
     {
      result[i].Assign(tmp_result[i]); // НЕ РАБОТАЕТ !!!!!
     };
   */
   
   return(count);
  }
//+------------------------------------------------------------------+
 
Slava:

Эти две программы в одном терминале или в двух разных?

В одном терминале. Пишет данные эксперт, читает индикатор. Висели на разных чартах, но очевидно, что могут быть и на одном (если это важно). Билд 2380.

 

VS2019

#include <iostream>

int x;

struct A 
{
    const int a;
    A() :a(x) {}
};
int main()
{
    std::cout << "x = ";
    std::cin >> x;
    const A a;
    std::cout << "a.a = " << a.a;
}

x = 12345

a.a = 12345

хм, все работает как в MQL5

ОК, забираю свои слова обратно, в Шарпе это не скомпилируется

 
Vict:

Ну вам же ещё и конструктор всунули. Сами решайте, конечно, но структуры - сишные сущности, модель там другая - пассивные сущности с внешней логикой (фцнкции).

Совсем необязательно. Почему именно сишные?  Как насчёт C# ? - к нему как-раз таки ближе по смыслу.  Все разговоры о пассивности структур - это всё архаические представления, имхо.  Считаю, что, как минимум, конструктор обязан быть у каждого типа. Неинициализированные поля - это зло, от которого нужно уходить.  

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

struct A
{
  const int a;
  A(int init_value) : a(init_value) { }

  static bool CreateArray(A &array[], int count, int init_value)
  {
    //...
  }
};

И там уже одним из предложенных ранее способов заполнять элементы массива.

 

столкнулся со следующей незадачей. Индикатор рисует свечи

Он накинут на график. Также работает советник, читающий буфера этого индикатора

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

Т.е. уже несколько тиков назад (до пары минут точно) он просчитал и обновил буфера, и советник данные из них читает

(и сов и индюк пишут это в лог). Но на графике видим старую картину. Вот например, скрин сделан в тот момент, когда образовался красный столбик вниз, пробивший лоу предыдущего. Но на графике видим только предыдущий красный, и недорисованный зеленый, (он уже по факту больше на два бокса).


а вот какая фактически картинка, она дорисовалась позже. Видим пробитие лоу, оно и инициировало запись скриншота. По логам все чётко.



Кто подскажет в чём дело и как ускорить обновление графика? Функцию ChartRedraw вызываю из советника, но всё равно пару минут задержка возникает.

Две минуты как-то многовато, даже не представлю причины. Расчёты не настолько космические чтобы так тормозить.

 
Aleksey Mavrin:

Кто подскажет в чём дело и как ускорить обновление графика? Функцию ChartRedraw вызываю из советника, но всё равно пару минут задержка возникает.

ChartRedraw нужна только для прорисовки (обновления) графических обьектов, для нормального индикатора который рисует индикаторными буферами ChartRedraw не нужна

имхо, ищите проблему в индикаторе, возможно не корректный расчет буферов на каждом тике, есть "авторы" у которых считается вся история каждый тик

ЗЫ: не могу утверждать, но возможно ChartRedraw обновляет весь чарт с синхронизацией истории, если так, то Вы вообще каждый раз заново перезапускаете индикатор с полным расчетом всей истории

UPD: попробуйте ограничить истрию на чарте меньшим количеством баров 10 000 достаточно, в МТ4 был случай, когда тяжелый индикатор "сожрал" всю память и потом искал почему ЕА не правильно работал (то работал то нет). Хотя в МТ5 маловероятно, что память всю использовали....ну всяко бывает

 
Igor Makanu:

ChartRedraw нужна только для прорисовки (обновления) графических обьектов, для нормального индикатора который рисует индикаторными буферами ChartRedraw не нужна

имхо, ищите проблему в индикаторе, возможно не корректный расчет буферов на каждом тике, есть "авторы" у которых считается вся история каждый тик

ЗЫ: не могу утверждать, но возможно ChartRedraw обновляет весь чарт с синхронизацией истории, если так, то Вы вообще каждый раз заново перезапускаете индикатор с полным расчетом всей истории

UPD: попробуйте ограничить истрию на чарте меньшим количеством баров 10 000 достаточно, в МТ4 был случай, когда тяжелый индикатор "сожрал" всю память и потом искал почему ЕА не правильно работал (то работал то нет). Хотя в МТ5 маловероятно, что память всю использовали....ну всяко бывает

Тоже сразу полез оптимизировать расчёт и поставил на тест дошлифованую версию индюка. До этого считал каждый тик 1000 баров, теперь жду открытия нового бара.

Если из-за этого, всё равно стоит сильно удивится. 1к баров не очень сильных расчётов тормозят прорисовку графика на 2 минуты? ..

 
Aleksey Mavrin:

Если из-за этого, всё равно стоит сильно удивится. 1к баров не очень сильных расчётов тормозят прорисовку графика на 2 минуты? ..

не может такого быть, по моему терминал выгрузит такой индикатор с сообщением мол "слишком долгий расчет в индикаторе ххх removed" 

скорость работы МТ (4/5) очень большая, можно конечно по нескольку раз одни и те же данные считать, но имхо, это еще постараться нужно

думаю, что автор индикатора просто с экономным расчетом индикаторных буферов  не знаком, да и забывает последние бары обсчитывать правильно...срочно в КБ, на изучение как индикаторы пишутся ;)

 
Slava :

Эти две программы в одном терминале или в двух разных?

Здесь размещен код для воспроизведения проблемы. https://www.mql5.com/en/forum/332849

Чтобы воспроизвести его, вам нужно запустить код как минимум 2 раза.

File-Sharing ... my next "Sometimes-Bug" in MT5?
File-Sharing ... my next "Sometimes-Bug" in MT5?
  • 2020.02.16
  • www.mql5.com
FILE_SHARE_READ and FILE_SHARE_WRITE do not work proper. MQL creates buffers with different contents for the same file. Please watch the example...