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);
}
и любуемся данными
Правда на них теперь нельзя бросить индикатор для обработки, но код настолько прост, что его несложно добавлять в индикаторы, реализующие нужные прцедуры. Пожалуй в таком виде этим пользоваться можно.
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
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. Понимаю, что предлагать такое разработчикам опасно :), но штатная возможность просмотра графика произвольных данных наверное была бы полезна многим пользователям.