[АРХИВ]Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 5. - страница 245

 
Vinin:

А ошибки пробовали обрабатывать
Нет. А что это даст? В любом случае придется делать еще один запрос
 
AndEv:
Нет. А что это даст? В любом случае придется делать еще один запрос

Будете знать - почему нет данных, и возможно повторять запрос бесмыленно
 
AndEv:
Нет. А что это даст? В любом случае придется делать еще один запрос
Какие данных с других валют и таймфреймов вам надо: стандартного или пользовательского индикатора, цены, что-то ещё? Покажите часть кода, где у вас не получается.
 

Перестрахуюсь, спрошу. Вопрос по спецификации MQL4. Если у меня по документации MSDN у вызываемой функции в параметрах имеется указатель, то в MQL4 я могу использовать в этом месте передачу параметра по ссылке, так?

Во всяком случае, в  С++

int a;//переменная
int *ra = &a;//адрес(*ra) равен ссылке(&a) на а (переменную)
 
paladin80:
Какие данных с других валют и таймфреймов вам надо: стандартного или пользовательского индикатора, цены, что-то ещё? Покажите часть кода, где у вас не получается.
Собственно, кроме OHLC больше ничего не нужно. И дело тут не в коде. При открытых графиках, таймсерии создаются в виртуальной памяти и все  поступающие котировки хранятся в оперативной памяти без записи в файлы истории. Запись в файлы истории происходит лишь тогда, когда мы закрываем МТ4. При запросе данных без открытия соответствующего графика, таймсерии не создаются, а происходит прямая запись подкачанных данных в файл истории. Для того, чтобы получить эти данные, необходимо еще раз сделать запрос и только в этом случае мы получим свежие данные (из файла). Хотелось попытаться каким-либо образом симитировать наличие открытого графика, для того, чтобы получать данные из оперативной памяти, а не из файла.
 
AndEv:
Собственно, кроме OHLC больше ничего не нужно. И дело тут не в коде. При открытых графиках, таймсерии создаются в виртуальной памяти и все  поступающие котировки хранятся в оперативной памяти без записи в файлы истории. Запись в файлы истории происходит лишь тогда, когда мы закрываем МТ4. При запросе данных без открытия соответствующего графика, таймсерии не создаются, а происходит прямая запись подкачанных данных в файл истории. Для того, чтобы получить эти данные, необходимо еще раз сделать запрос и только в этом случае мы получим свежие данные (из файла). Хотелось попытаться каким-либо образом симитировать наличие открытого графика, для того, чтобы получать данные из оперативной памяти, а не из файла.
Честно говоря никогда не вникал в такие процессы. Интересно, для какого типа задачи вам нужно знать такое?
 
paladin80:
Честно говоря никогда не вникал в такие процессы. Интересно, для какого типа задачи вам нужно знать такое?
Задача "три в одном" - выбор инструментов, вычисление весовых коэффициентов и нахождение точки входа для торговли тремя валютами одновременно.
 

gyfto: 

Так пойдёт?

#import "kernel32.dll"
int GetModuleHandleA (string lpModuleName);//возвращает хэндл процесса; если lpModuleName=NULL то - текущего
#import

string lpModuleName;// неинициализированная строка содержит только /0, т.е. NULL
int 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. Это выходной параметр - path
                        int nSize);//DWORD (целое, 4 знака). Расчётная длина буфера.
//на выходе DWORD (целое, 4 знака). Длина строки с path
#import
#property indicator_chart_window

extern string    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;// так обзовём выходной параметр с GetModuleFileNameA
int 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);
  }

 В начальных параметрах индюка указывается "пусто" вместо пути к приложению, на выходе возвращает (в журнал) его хэндл и полный путь. Идём дальше...

 
gyfto:


Походу, подойдёт... Вот код индикатора:

 В начальных параметрах индюка указывается "пусто" вместо пути к приложению, на выходе возвращает (в журнал) его хэндл и полный путь. Идём дальше...

hModule = GetModuleHandleA(lpModuleName);
sizeFileName = GetModuleFileNameA(hModule, lpFileName, nSize);

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

 Что мешает использовать инициализированную строку в обоих случаях? На десяток строк код сократит.

 

Zhunko:

 

 Что мешает использовать инициализированную строку в обоих случаях?


В журнале пишет function 'GetModuleFileNameA' call from dll 'kernel32.dll' critical error c0000005 at 7C902128 в случае объявления строкой. Так и не разобрался, почему. Внешне - терминал падает где-то через 3-7 секунд после своего открытия, в логи ничего не успевается написать, т.е. закрывается терминал не самостоятельно.
Причина обращения: