AndEv: Нет. А что это даст? В любом случае придется делать еще один запрос
Какие данных с других валют и таймфреймов вам надо: стандартного или пользовательского индикатора, цены, что-то ещё? Покажите часть кода, где у вас не получается.
Перестрахуюсь, спрошу. Вопрос по спецификации MQL4. Если у меня по документации MSDN у вызываемой функции в параметрах имеется указатель, то в MQL4 я могу использовать в этом месте передачу параметра по ссылке, так?
Во всяком случае, в С++
int a;//переменнаяint *ra = &a;//адрес(*ra) равен ссылке(&a) на а (переменную)
paladin80: Какие данных с других валют и таймфреймов вам надо: стандартного или пользовательского индикатора, цены, что-то ещё? Покажите часть кода, где у вас не получается.
Собственно, кроме OHLC больше ничего не нужно. И дело тут не в коде. При открытых графиках, таймсерии создаются в виртуальной памяти и все поступающие котировки хранятся в оперативной памяти без записи в файлы истории. Запись в файлы истории происходит лишь тогда, когда мы закрываем МТ4. При запросе данных без открытия соответствующего графика, таймсерии не создаются, а происходит прямая запись подкачанных данных в файл истории. Для того, чтобы получить эти данные, необходимо еще раз сделать запрос и только в этом случае мы получим свежие данные (из файла). Хотелось попытаться каким-либо образом симитировать наличие открытого графика, для того, чтобы получать данные из оперативной памяти, а не из файла.
AndEv: Собственно, кроме OHLC больше ничего не нужно. И дело тут не в коде. При открытых графиках, таймсерии создаются в виртуальной памяти и все поступающие котировки хранятся в оперативной памяти без записи в файлы истории. Запись в файлы истории происходит лишь тогда, когда мы закрываем МТ4. При запросе данных без открытия соответствующего графика, таймсерии не создаются, а происходит прямая запись подкачанных данных в файл истории. Для того, чтобы получить эти данные, необходимо еще раз сделать запрос и только в этом случае мы получим свежие данные (из файла). Хотелось попытаться каким-либо образом симитировать наличие открытого графика, для того, чтобы получать данные из оперативной памяти, а не из файла.
Честно говоря никогда не вникал в такие процессы. Интересно, для какого типа задачи вам нужно знать такое?
#import "kernel32.dll"int GetModuleHandleA (string lpModuleName);//возвращает хэндл процесса; если lpModuleName=NULL то - текущего#importstring lpModuleName;// неинициализированная строка содержит только /0, т.е. NULLint hInstance;// передадим в CreateWindowExA
hInstance=GetModuleHandleA(lpModuleName);// аналогично GetModuleHandleA(NULL)
Походу, подойдёт... Вот код индикатора:
#import "kernel32.dll"//в комментариях типы данных в С++ :int GetModuleHandleA (string lpModuleName);//LPCSTR, т.е. LP (указатель) на строку (STR) с завершающим /0, которая является константой (C). Имя модуля, возм. с path//на выходе HMODULE (целое без знака, 4 байта). Дескриптор приложения (процесса)int GetModuleFileNameA(int hModule,//HMODULE (целое без знака, 4 байта). Он же.int& lpFileName[],//LPSTR, т.е. LP (указатель) на строку (STR) с завершающим /0. Это выходной параметр - pathint nSize);//DWORD (целое, 4 знака). Расчётная длина буфера.//на выходе DWORD (целое, 4 знака). Длина строки с path#import#property indicator_chart_windowexternstring lpModuleName;//Path. Сейчас там '/0', то есть GetModuleHandleA возвращает дескриптор текущего управляющего процесса. Path задавать не через '/', a '\'. string path="";//инициализация пустой строкойint lpFileName[64];//через string задать не получается. Почему не разобрался. 64 это 0х100/4 байта (длина int)=0х40=64.int hModule;//для выхода функции GetModuleHandleA, т.е. дескриптора процессаint nSize=255;//не 256, потому что последний 256-й символ по идее будет 0х00 = '/0' (максимальная длина строки)int sizeFileName;// так обзовём выходной параметр с GetModuleFileNameAint i;//счётчик циклаint start()
{
hModule = GetModuleHandleA(lpModuleName);
sizeFileName = GetModuleFileNameA(hModule, lpFileName, nSize);
for (i=0; i<sizeFileName; i++){//конвертация int[] в string
path=path//конкатенация с проходом от 0 до sizeFileName-1, на каждом проходе обрабатываем по одному каждый байт:
+ CharToStr(lpFileName[i] & 255)//битовое and, обнуление старших разрядов. Н-р, 0xkkllmmnn&0x000000FF(т.е.255)=0x000000nn, т.к. x&0=0, x&1=x (0xFF=0b11111111)
+ CharToStr(lpFileName[i] >> 8 & 255)//сдвиг вправо на 1 байт (8 бит), потом обнуление старших разрядов. На выходе, как и в предыдущей строке, 1 (один) байт
+ CharToStr(lpFileName[i] >> 16 & 255)//сдвиг вправо на 2 байта (16 бит), чтобы получить третий в int байт, и обнуление старших разрядов.
+ CharToStr(lpFileName[i] >> 24 & 255)// аналогично: на 3 байта (24 бит), четвёртый байт. Параллельно везде конвертация в string.
;
}
Print("hmodule = ", hModule, ", sizeFileName = ", sizeFileName, ", path = ", path);//в журнал.
path="";//обнуляем строку на выходе, чтобы не было дальнейшей конкатенации по циклу
return(0);
}
В начальных параметрах индюка указывается "пусто" вместо пути к приложению, на выходе возвращает (в журнал) его хэндл и полный путь. Идём дальше...
Что мешает использовать инициализированную строку в обоих случаях?
В журнале пишет function 'GetModuleFileNameA' call from dll 'kernel32.dll' critical error c0000005 at 7C902128 в случае объявления строкой. Так и не разобрался, почему. Внешне - терминал падает где-то через 3-7 секунд после своего открытия, в логи ничего не успевается написать, т.е. закрывается терминал не самостоятельно.
А ошибки пробовали обрабатывать
Нет. А что это даст? В любом случае придется делать еще один запрос
Будете знать - почему нет данных, и возможно повторять запрос бесмыленно
Нет. А что это даст? В любом случае придется делать еще один запрос
Перестрахуюсь, спрошу. Вопрос по спецификации MQL4. Если у меня по документации MSDN у вызываемой функции в параметрах имеется указатель, то в MQL4 я могу использовать в этом месте передачу параметра по ссылке, так?
Во всяком случае, в С++
Какие данных с других валют и таймфреймов вам надо: стандартного или пользовательского индикатора, цены, что-то ещё? Покажите часть кода, где у вас не получается.
Собственно, кроме OHLC больше ничего не нужно. И дело тут не в коде. При открытых графиках, таймсерии создаются в виртуальной памяти и все поступающие котировки хранятся в оперативной памяти без записи в файлы истории. Запись в файлы истории происходит лишь тогда, когда мы закрываем МТ4. При запросе данных без открытия соответствующего графика, таймсерии не создаются, а происходит прямая запись подкачанных данных в файл истории. Для того, чтобы получить эти данные, необходимо еще раз сделать запрос и только в этом случае мы получим свежие данные (из файла). Хотелось попытаться каким-либо образом симитировать наличие открытого графика, для того, чтобы получать данные из оперативной памяти, а не из файла.
Честно говоря никогда не вникал в такие процессы. Интересно, для какого типа задачи вам нужно знать такое?
gyfto:
Так пойдёт?
Походу, подойдёт... Вот код индикатора:
В начальных параметрах индюка указывается "пусто" вместо пути к приложению, на выходе возвращает (в журнал) его хэндл и полный путь. Идём дальше...
Походу, подойдёт... Вот код индикатора:
В начальных параметрах индюка указывается "пусто" вместо пути к приложению, на выходе возвращает (в журнал) его хэндл и полный путь. Идём дальше...
Почему в первой строке используется строковый буфер, а во второй целочисленный массив?
Что мешает использовать инициализированную строку в обоих случаях? На десяток строк код сократит.
Zhunko:
Что мешает использовать инициализированную строку в обоих случаях?
В журнале пишет function 'GetModuleFileNameA' call from dll 'kernel32.dll' critical error c0000005 at 7C902128 в случае объявления строкой. Так и не разобрался, почему. Внешне - терминал падает где-то через 3-7 секунд после своего открытия, в логи ничего не успевается написать, т.е. закрывается терминал не самостоятельно.