Опять "Ожидание обновления"

 
Каюсь, решил использовать МТ нецелевым образом. А именно: просмотреть данные, полученные в результате работы скрипта прямо в МТ. Для этого записал эти данные в формате hst с помощью функции
bool SaveDataAsHst(double& Data[], int N, string FileName) {
//  Print("Пробую записать как hst");
   int    version=400;
   string c_copyright;
   string c_symbol=FileName;
//   string c_symbol=Symbol();
   int    i_period=Period();
   int    i_digits=Digits;
   int    i_unused[13];
   int    i; 
//----  
  int handle=FileOpenHistory(c_symbol+".hst", FILE_BIN|FILE_WRITE);
  if(handle < 0) {
    Print(" .hst файл открыть не удалось, последняя ошибка ", GetLastError());
    return(false);
  }
// Пишем заголовок hst файла
  c_copyright="(C)opyright 2003, MetaQuotes Software Corp.";
  FileWriteInteger(handle, version, LONG_VALUE);
  FileWriteString(handle, c_copyright, 64);
  FileWriteString(handle, c_symbol, 12);
  FileWriteInteger(handle, i_period, LONG_VALUE);
  FileWriteInteger(handle, i_digits, LONG_VALUE);
  FileWriteInteger(handle, 0, LONG_VALUE);       //timesign
  FileWriteInteger(handle, 0, LONG_VALUE);       //last_sync
  FileWriteArray(handle, i_unused, 0, 13);
/*
  double Max = Data[0];
  double Min = Data[0];
  for (i=1;i<N;i++) {
    if (Data[i]>Max) Max=Data[i];
    if (Data[i]<Min) Min=Data[i];
  }
  double Range = Max-Min;
*/
// Начинаем заполнять
  for (i=0;i<N;i++) {
    double NData = Data[i];
//    double NData = 1+(Data[i] - Min)/Range;
//    Print(Time[i],"  ",Data[i]);
    FileWriteInteger(handle, Time[N-i], LONG_VALUE);  //  Time
    FileWriteDouble(handle, NData, DOUBLE_VALUE);  //  Open
    FileWriteDouble(handle, NData, DOUBLE_VALUE);  //  Low
    FileWriteDouble(handle, NData, DOUBLE_VALUE);  //  High
    FileWriteDouble(handle, NData, DOUBLE_VALUE);  //  Close
    FileWriteDouble(handle, 1.0, DOUBLE_VALUE);  //  Volume
  }
//----
  FileClose(handle);
  return(true);
}


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

P.S. Понимаю, что предлагать такое разработчикам опасно :), но штатная возможность просмотра графика произвольных данных наверное была бы полезна многим пользователям.

 
P.P.S. Чтобы лучше представить открывающиеся перспективы, можно представить себе пользовательские индикаторы, обрабатывающие эти данные. Конечно для того, чтобы отказаться от программ типа матлаба пользователям придётся здорово попотеть над кодированием алгоритмов :), но простую обработку дешевле делать прямо в МТ.
 
Самый простой вариант, нет такого символа, как ты передаешь в качестве имени файла. Это я к тому, что может и не в функции дело.
 
Я в Вашем коде не смог отыскать команду обновления графика
PostMessageA(hwnd, WM_COMMAND, 33324, 0);


Можете глянуть как строить автономные графики например вот здесь:
"MQL4: Графики без "дыр""

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

Может быть. По крайней мере когда я замаскировал его под EURUSD1, номер прошёл. Но что-то мне кажется, что раньше я это тоже пробовал и номер не проходил. Вопрос с обновлением на форуме уже всплывал, такое ощущение что иногда какой-то трудновоспроизводимый заскок случается.


Я в Вашем коде не смог отыскать команду обновления графика
PostMessageA(hwnd, WM_COMMAND, 33324, 0);


Можете глянуть как строить автономные графики например вот здесь:
"MQL4: Графики без "дыр""


Это немного не то, задача функции гораздо скромнее - записать формально правильный файл hst. Cмотреться этот файл должен другими средствами.
 
Для пущей наглядности прелести идеи аппроксимировал данные полиномом с помощью индюка ang_PR (Din)-v1.mq4 :)
 
Чтобы закончить тему. На самом деле всё гораздо проще. Не знаю, почему меня на hst замкнуло. Элементарный код:
//+------------------------------------------------------------------+
//|                                                     ShowData.mq4 |
//|                                                           Candid |
//|                                                   likh@yandex.ru |
//+------------------------------------------------------------------+
#property copyright "Candid"
#property link      "likh@yandex.ru"

#property indicator_separate_window
#property show_inputs
#property indicator_buffers 1
#property indicator_color1 Blue

extern string    FileName = "Data.txt";

int pos;
int handle;
double Data[];

int init() {
  IndicatorShortName(FileName);
  SetIndexStyle(0,DRAW_LINE);
  SetIndexBuffer(0,Data);

  handle = FileOpen(FileName,FILE_CSV|FILE_READ,';');
  return(0);
}

int deinit() {
  FileClose(handle);
  return(0);
}

int start() {
  pos = 0;
  while (FileIsEnding(handle) == false) {
    Data[pos] = FileReadNumber(handle);
    pos++; 
  }
  Data[pos] = EMPTY_VALUE;  
  return(0);
}


и любуемся данными



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





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