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

 
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
  struct ARGB
  {
    uchar blue;
    uchar green;
    uchar red;
    uchar alpha;
  };
  
  struct N
  {
    uint num;
  };
  
  N n={100288};
  ARGB c;
  c=n;         //так получаем предупреждение implicit struct cast       sample.mq5      22      4
  c=(ARGB)n;   //а так всё в порядке
}
Хотя размеры обеих структур одинаковые и их копирование друг в друга происходит без потерь,  предупреждение всё же получаем.
 
Fleder:
Хотя размеры обеих структур одинаковые и их копирование друг в друга происходит без потерь,  предупреждение всё же получаем.
Так это же отлично. Сделать явный каст не так уж и сложно. А разбираться где что присвоил когда баги полезут, не особо приятно
 
TheXpert:
Так это же отлично. Сделать явный каст не так уж и сложно. А разбираться где что присвоил когда баги полезут, не особо приятно
Похоже, девиз компилятора: "Лучше перебдеть, чем недобдеть!".
 

Копипаст из заявки в СД:

Возможность самостоятельной выгрузки таймсерии из ОЗУ обратно в кэш *.hc
Errors, MetaTrader 5 MQL, Открыта, Начата: 2014.04.12 06:04, #995430

Версия и битность терминала

910 32 bit

Описание проблемы

Здравствуйте, уважаемые разработчики!

 В языке MQL5 для получения данных таймсерии предназначен ряд системных функциий, таких как CopyRatesCopyTimeCopyOpen и т.д.

При вызове любой из этих функций  происходит загрузка затребованной таймсерии в ОЗУ в пределах параметра  "Max bars in chart" .

Однако, сочетание таких факторов как:

1. Достаточно глубокая доступная история по символу или полностью загруженная с сервера.

2. Параметр "Max bars in chart"  равен "Unlimited".

3. Затребованы данные самого маленького таймфрейма M1.

Происходит очень большое потребление оперативной памяти.

Проблему усугубляет ещё и тот факт, что в логике работающей программы MQL5 (например, если это мультивалютный эксперт или индикатор)

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

В результате потребление ОЗУ возрастает в разы.

 

Получение данных нужного таймфрейма из промежуточных данных

Служебные файлы в формате HCC исполняют роль источника данных для построения ценовых данных по запрошенным таймфреймам в формате HC. Данные в формате HC являются таймсериями, максимально подготовленными для быстрого доступа. Они создаются только по запросу графика или mql5-программы в объеме, не превышающем значения параметра "Max bars in charts", и сохраняются для дальнейшего использования в файлах с расширением hc.

Для экономии ресурсов данные по таймфрейму загружаются и хранятся в оперативной памяти только по необходимости, при длительном отсутствии обращений к данным происходит выгрузка их из оперативной памяти с сохранением в файл. Для каждого таймфрейма данные подготавливаются независимо от наличия уже готовых данных для других таймфреймов. Правила формирования и доступности данных одинаковы для всех таймфреймов. Т.е. не смотря на то, что единицей хранения данных в формате HCC является минутный бар, наличие данных в формате HCC не означает наличие и доступность в том же объеме данных таймфрейма М1 в формате HC.

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

 

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

 В результате все затребованные таймсерии "ютятся" в "оперативке" не понятно для чего.

Если "оперативка" ещё и не "резиновая" , а "ненасытный"  эксперт/индикатор требует всё больше и больше таймсерий, то терминалу ничего больше не остаётся,

кроме как начать экстренно "скидывать" лишние таймсерии обратно в файл(кэш). Так вот, при  этом экстренном сбросе терминал может сбросить таймсерию в

"битый кэш"  т.е. потеряет "добрую половину" данных. А при следующем обращении к этой таймсерии терминал загружает этот "битый кэш" под видом нормального.

 В результате на графике терминала нужная таймсерия отображается с огромной "дырой" в истории.

 

Ожидаемый результат

В языке MQL5 наблюдается склонность к экономии ресурсов среды выполнения. Примером может служить следующее:

1. функция ArrayFree

2. функция ResourceFree

3. оператор  delete

4.  параметр  "Max bars in charts"

 

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

по окончании тайминга, если, например не открыт ни один чарт с этой таймсерией?

 Например, функцию:

bool SeriesFlush(
   string           symbol_name,       // имя символа
   ENUM_TIMEFRAMES  timeframe,         // период
   );

 

Это позволило бы:

1. не опасаться за переполнение оперативной памяти.

2. не опасаться за появление "битых кэшей", от которых можно избавиться лишь при ручном удалении файлов *.hc при выключенном терминале.

3. не быть привязанным к разрядности операционной системы и размеру оперативной памяти.

4. при разработке программного продукта не применять "костыли", которые пытаются обойти недостатки, описанные выше. 

 

 
Fleder:

Копипаст из заявки в СД:

Возможность самостоятельной выгрузки таймсерии из ОЗУ обратно в кэш *.hc
А чё, идея замечательная.
 
Подскажете как получить данные индикатора у которого положительное смещение? интересуют данные на -1 баре?
 
dentraf:
Подскажете как получить данные индикатора у которого положительное смещение? интересуют данные на -1 баре?

Для этого нужно знать настройки смещения для интересуемой линии индикатора. Это пример из технического индикатора iAlligator 

//--- зададим смещение для каждой линии
   PlotIndexSetInteger(0,PLOT_SHIFT,jaw_shift);

Это именно смещение, а не расчет индикатора на будущем.

 

Копипаст из заявки в СД:

Некорректная работа системной функции IsStopped в индикаторах
Errors, MetaTrader 5 MQL, Открыта, Начата: 2014.04.12 07:59, #995480

Версия и битность терминала

910 32 bit

Описание проблемы

Здравствуйте, уважаемые разработчики!

Одной из рекомендаций по улучшению качества кода при проектировании циклов с большим количеством итераций

является встраивание проверки на факт принудительной остановки MQL5 программы  при помощи системной

функции bool IsStopped(); 

 

Однако, как показывает практика, эта проверка не работает в индикаторах (в скриптах и экспертах - работает)

Вот краткий код индикатора, отражающий суть проблемы:

#property indicator_plots 0
//=====================================================================
// Custom indicator initialization function
//=====================================================================
int OnInit()
{
  return(INIT_SUCCEEDED);
}
//=====================================================================
// 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[])
{
  long n=0;
  for(int i=0;i<1e+10 && !IsStopped();i++) {n++;}
  Print("OnCalculate End");
  return(rates_total);
}

Если попытаться удалить этот индикатор с чарта, то сам процесс "вычисления индикатора"  как таковой не останавливается,

хотя должен бы из-за проверки флага остановки программы

Об этом легко можно узнать, наблюдая за процессом terminal.exe в диспетчере задач. На четырёхъядерном процессоре

это около 25% загрузки ЦП.  Кроме того, загрузка терминала вообще не снижается со временем вплоть до выключения

терминала. И даже после выключения терминала процесс terminal.exe ещё висит в диспетчере. И, такое чувство,

что выгружается операционной системой как "зависший". 


Ожидаемый результат

Пожалуйста, исправьте данную проблему.

 
barabashkakvn:

Для этого нужно знать настройки смещения для интересуемой линии индикатора. Это пример из технического индикатора iAlligator 

Это именно смещение, а не расчет индикатора на будущем.

вот именно у меня расчет в будующее, а что бы отрисовать применяю смещение, как из эксперта считать значения -1 бара???

если кому понадобится можно вот так           CopyBuffer(Handle_original,0,-2,10,Data_Ind )

 
dentraf:
Вот именно у меня расчет в будущее, а что бы отрисовать применяю смещение, как из эксперта считать значения -1 бара???
Котировки  для бара "-1" не существует. Смещение - это: расчет для СУЩЕСТВУЮЩЕГО бара (например бара под номером 2), а затем это рассчитанное значение отрисовывается на баре 2 минус смещение. Т.е. если смещение равно 5, то значение рассчитанное на баре 2 отрисуется на баре "-3".
Причина обращения: