[ARCHIVE] 포럼을 어지럽히 지 않도록 초보자 질문. 프로, 놓치지 마세요. 너 없이는 아무데도 - 5. - 페이지 245

[Eliminado]  
Vinin :

그리고 그들은 오류를 처리하려고 노력했습니다.
아니요. 그리고 그것은 무엇을 줄 것입니까? 어쨌든 다른 요청을 해야 합니다.
 
AndEv :
아니요. 그리고 그것은 무엇을 줄 것입니까? 어쨌든 다른 요청을 해야 합니다.

왜 데이터가 없는지 알게 될 것이고, 무심코 요청을 반복하는 것이 가능합니다.
 
AndEv :
아니요. 그리고 그것은 무엇을 줄 것입니까? 어쨌든 다른 요청을 해야 합니다.
다른 통화 및 기간의 어떤 데이터가 필요합니까? 표준 또는 사용자 지정 지표 , 가격, 기타 정보는 무엇입니까? 코드에서 실패한 부분을 표시하십시오.
 

물어보기가 두렵다. MQL4 사양에 대한 질문입니다. MSDN 문서에 따르면 호출된 함수의 매개변수에 포인터가 있는 경우 MQL4에서는 여기 에서 매개변수를 참조로 전달하는 데 사용할 수 있습니다. 그렇죠?

어쨌든 C++에서

 int a; //переменная
int *ra = &a; //адрес( * ra) равен ссылке( & a) на а (переменную)
[Eliminado]  
paladin80 :
표준 또는 맞춤형 지표, 가격 등 다른 통화 및 기간의 어떤 데이터가 필요합니까? 코드에서 실패한 부분을 보여주세요.
사실 OHLC 외에 다른 것은 필요하지 않습니다. 그리고 그것은 코드에 관한 것이 아닙니다. 차트가 열리면 시계열이 가상 메모리에 생성되고 들어오는 모든 따옴표는 기록 파일에 기록 되지 않고 RAM에 저장됩니다. 히스토리 파일에 쓰기는 MT4를 닫을 때만 발생합니다. 해당 차트를 열지 않고 데이터를 요청할 경우 시계열이 생성되지 않지만 다운로드한 데이터는 히스토리 파일에 직접 기록됩니다. 이 데이터를 얻으려면 다시 요청해야 하며 이 경우에만 파일에서 새로운 데이터를 얻습니다. 파일이 아닌 RAM에서 데이터를 수신하기 위해 열린 차트의 존재를 시뮬레이션하기 위해 어떤 식으로든 시도하고 싶었습니다.
 
AndEv :
사실 OHLC 외에는 아무것도 필요하지 않습니다. 그리고 그것은 코드에 관한 것이 아닙니다. 차트가 열리면 시계열이 가상 메모리에 생성되고 들어오는 모든 따옴표는 기록 파일에 기록되지 않고 RAM에 저장됩니다. 히스토리 파일에 쓰기는 MT4를 닫을 때만 발생합니다. 해당 차트를 열지 않고 데이터를 요청할 경우 시계열이 생성되지 않지만 다운로드한 데이터는 히스토리 파일에 직접 기록됩니다. 이 데이터를 얻으려면 다시 요청해야 하며 이 경우에만 파일에서 새로운 데이터를 얻습니다. 파일이 아닌 RAM에서 데이터를 수신하기 위해 열린 차트의 존재를 시뮬레이션하기 위해 어떤 식으로든 시도하고 싶었습니다.
솔직히 말해서, 나는 그런 과정을 깊이 파고든 적이 없습니다. 어떤 유형의 작업을 위해 이것을 알아야 하는지 궁금합니다.
[Eliminado]  
paladin80 :
솔직히 말해서, 나는 그런 과정을 탐구한 적이 없습니다. 어떤 유형의 작업을 위해 이것을 알아야 하는지 궁금합니다.
"3가지 중 하나" 작업은 상품 선택, 가중치 계수 계산 및 세 가지 통화를 동시에 거래하기 위한 진입점 찾기입니다.
 

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

첫 번째 줄에는 문자열 버퍼 가 사용되고 두 번째 줄에는 정수 배열이 사용되는 이유는 무엇입니까?

두 경우 모두 초기화된 문자열을 사용하지 못하는 이유는 무엇입니까? 코드는 10줄로 줄어듭니다.

 

Zhunko :

두 경우 모두 초기화된 문자열을 사용하지 못하는 이유는 무엇입니까?


로그는 문자열로 선언된 경우 7C902128에서 dll 'kernel32.dll' 치명적 오류 c0000005에서 함수 'GetModuleFileNameA' 호출을 씁니다. 이유를 알아내지 못했습니다. 외부적으로 - 터미널이 열린 후 3-7초 안에 어딘가에서 충돌이 발생하고 로그에 아무 것도 쓸 시간이 없습니다. 터미널이 저절로 닫히지 않습니다.