[ARQUIVO]Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por ela. Não posso ir a lugar nenhum sem você - 5. - página 245

 
Vinin:

Você já tentou o tratamento de erros?
Não. De que serviria isso? Você teria que fazer outra pergunta de qualquer forma
 
AndEv:
Não. De que serviria isso? De qualquer forma, você terá que fazer outra consulta.

Você saberá porque não há dados, e talvez seja inútil repetir a consulta.
 
AndEv:
Não. De que serviria isso? Você terá que fazer outra consulta de qualquer forma
Que dados de outras moedas e prazos você precisa: indicador padrão ou personalizado, preço, algo mais? Mostre-me a parte do código em que você não tem sucesso.
 

Só por segurança, vou perguntar. Pergunta sobre a especificação MQL4. Se de acordo com a documentação MSDN a função chamada tem um ponteiro em seus parâmetros, na MQL4 eu posso usar a passagem do parâmetro por referência, certo?

Pelo menos em C++

int a;//переменная
int *ra = &a;//адрес(* ra) равен ссылке(& a) на а (переменную)
 
paladin80:
Que dados de outras moedas e prazos você precisa: indicador padrão ou personalizado, preço, algo mais? Mostre-me a parte do código em que você não tem sucesso.
Na verdade, além da OHLC, você não precisa de mais nada. Não se trata do código. Em gráficos abertos, são criadas séries de tempos na memória virtual e todas as cotações recebidas são armazenadas na memória de trabalho semserem gravadas em arquivos de histórico. Os arquivos de história são escritos somente quando fechamos o MT4. Ao solicitar dados sem abrir a tabela correspondente, as séries cronológicas não são criadas, mas os dados baixados são escritos diretamente nos arquivos de histórico. Para obter estes dados, precisamos consultar novamente e somente neste caso obteremos novos dados (do arquivo). Eu queria tentar simular de alguma forma a presença de um gráfico aberto, a fim de obter os dados da RAM e não do arquivo.
 
AndEv:
Na verdade, você não precisa de mais nada, exceto OHLC. E não se trata do código. Quando os gráficos são abertos, as séries de tempos são criadas na memória virtual e todas as cotações recebidas são armazenadas na memória principal sem serem gravadas nos arquivos de histórico. Os arquivos de história são escritos somente quando fechamos o MT4. Ao solicitar dados sem abrir a tabela correspondente, as séries cronológicas não são criadas, mas os dados baixados são escritos diretamente nos arquivos de histórico. A fim de recuperar estes dados, precisamos consultar novamente e somente neste caso obteremos dados novos (do arquivo). Eu queria tentar simular de alguma forma a presença de um gráfico aberto, a fim de obter os dados da RAM e não de um arquivo.
Para ser honesto, eu nunca entrei em tais processos. Para que tipo de tarefa você precisa saber disso?
 
paladin80:
Para ser honesto, eu nunca me aprofundei em tais processos. Para que tipo de tarefa você precisa saber disso?
Uma tarefa três em uma - selecionar instrumentos, calcular pesos e encontrar um ponto de entrada para negociar três moedas simultaneamente.
 

gyfto: 

Isto está bem assim?

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

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

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


Parece que vai funcionar... Aqui está o código para o 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);
  }

Nos parâmetros iniciais da ferramenta, "vazio" é especificado em vez do caminho da aplicação, e na saída retorna (no registro) sua alça e caminho cheio. E então...

 
gyfto:


Parece caber... Aqui está o código do indicador:

Os parâmetros iniciais do indicador especificam "vazio" ao invés do caminho para a aplicação, na saída ele retorna (no registro) sua alça e caminho cheio. A seguir...

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

Por que a primeira linha usa um buffer de cordas e a segunda usa uma matriz inteira?

O que o impede de usar uma corda inicializada em ambos os casos? Ele cortaria o código em uma dúzia de linhas.

 

Zhunko:

O que o impede de usar um cordel rubricado em ambos os casos?


O log diz a função 'GetModuleFileNameA' chamada da dll 'kernel32.dll' erro crítico c0000005 a 7C902128 no caso de declaração de string. Eu ainda não entendo por que. Na superfície - o terminal trava cerca de 3-7 segundos após a abertura, não há tempo para escrever nada nos logs, ou seja, o terminal fecha não por si só.