[ARCHIVO]Cualquier pregunta de novato, para no saturar el foro. Profesionales, no lo dejéis pasar. No puedo ir a ningún sitio sin ti - 5. - página 245

 
Vinin:

¿Has probado a gestionar los errores?
No. ¿De qué serviría eso? De todos modos, tendrías que hacer otra consulta
 
AndEv:
No. ¿De qué serviría eso? De todos modos, tendrás que hacer otra consulta.

Sabrás por qué no hay datos, y tal vez sea inútil repetir la consulta.
 
AndEv:
No. ¿De qué serviría eso? De todas formas tendrás que hacer otra consulta
¿Qué datos de otras divisas y plazos necesita: indicador estándar o personalizado, precio, algo más? Muéstrame la parte del código en la que no tienes éxito.
 

Sólo para estar seguro, preguntaré. Pregunta sobre la especificación MQL4. Si según la documentación de MSDN la función llamada tiene un puntero en sus parámetros, en MQL4 puedo utilizar el paso del parámetro por referencia, ¿no?

Al menos en C++

int a;//переменная
int *ra = &a;//адрес(* ra) равен ссылке(& a) на а (переменную)
 
paladin80:
¿Qué datos de otras divisas y plazos necesita: indicador estándar o personalizado, precio, algo más? Muéstrame la parte del código en la que no tienes éxito.
En realidad, además de OHLC no necesitas nada más. No se trata del código. En los gráficos abiertos, las series de tiempo se crean en la memoria virtual y todas las cotizaciones entrantes se almacenan en la memoria de trabajo sinescribirlas en los archivos del historial. Los archivos del historial se escriben sólo cuando cerramos MT4. Cuando se solicitan datos sin abrir el gráfico correspondiente, no se crean las series temporales, sino que los datos descargados se escriben directamente en los archivos del historial. Para obtener estos datos, tenemos que consultar de nuevo y sólo en este caso obtendremos datos frescos (del archivo). Quería intentar simular de alguna manera la presencia de un gráfico abierto para obtener los datos de la RAM, no del archivo.
 
AndEv:
De hecho, no necesitas nada más que OHLC. Y no se trata del código. Cuando se abren los gráficos, las series de tiempo se crean en la memoria virtual y todas las cotizaciones entrantes se almacenan en la memoria principal sin que se escriban en los archivos del historial. Los archivos del historial se escriben sólo cuando cerramos MT4. Cuando se solicitan datos sin abrir el gráfico correspondiente, no se crean las series temporales, sino que los datos descargados se escriben directamente en los archivos del historial. Para recuperar estos datos, tenemos que consultar de nuevo y sólo en este caso obtendremos datos frescos (del archivo). Quería intentar simular de alguna manera la presencia de un gráfico abierto, para obtener los datos de la RAM en lugar de un archivo.
Para ser sincero, nunca me he metido en esos procesos. Me pregunto para qué tipo de tarea se necesita saber esto.
 
paladin80:
Para ser sincero, nunca he profundizado en estos procesos. Me pregunto para qué tipo de tarea se necesita saber esto.
Una tarea tres en uno: seleccionar los instrumentos, calcular las ponderaciones y encontrar un punto de entrada para negociar tres divisas simultáneamente.
 

gyfto: 

¿Esto está bien?

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

string lpModuleName;// неинициализированная строка содержит только /0, т.е. NULL
int hInstance;// передадим в CreateWindowExA

hInstance=GetModuleHandleA(lpModuleName);// аналогично GetModuleHandleA(NULL)


Parece que va a funcionar... Aquí está el código del indicador:

#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);
  }

En los parámetros iniciales de la herramienta, se especifica "empty" en lugar de la ruta de la aplicación, y en la salida devuelve (en el registro) su mango y la ruta completa. Y entonces...

 
gyfto:


Parece que encaja... Aquí está el código del indicador:

Los parámetros iniciales del indicador especifican "vacío" en lugar de la ruta de la aplicación, en la salida devuelve (en el registro) su mango y la ruta completa. Siguiente...

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

¿Por qué la primera línea utiliza un buffer de cadenas y la segunda una matriz de enteros?

¿Qué le impide utilizar una cadena inicializada en ambos casos? Reduciría el código en una docena de líneas.

 

Zhunko:

¿Qué le impide utilizar una cadena inicializada en ambos casos?


El registro dice que la función 'GetModuleFileNameA' llama desde la dll 'kernel32.dll' error crítico c0000005 en 7C902128 en caso de declaración de cadena. Todavía no entiendo por qué. A primera vista, el terminal se bloquea unos 3-7 segundos después de abrirse, sin tiempo para escribir nada en los registros, es decir, el terminal no se cierra por sí mismo.
Razón de la queja: