[ARCHIVIO]Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Non posso andare da nessuna parte senza di te - 5. - pagina 245

 
Vinin:

Avete provato con la gestione degli errori?
No. A cosa servirebbe? Dovresti comunque fare un'altra ricerca
 
AndEv:
No. A cosa servirebbe? Dovrai comunque fare un'altra ricerca.

Saprai perché non ci sono dati, e forse è inutile ripetere la query.
 
AndEv:
No. A cosa servirebbe? Dovrai comunque fare un'altra ricerca
Di quali dati di altre valute e timeframes hai bisogno: indicatore standard o personalizzato, prezzo, qualcos'altro? Mostrami la parte del codice in cui non hai successo.
 

Per sicurezza, chiederò. Domanda sulla specifica MQL4. Se secondo la documentazione MSDN la funzione chiamata ha un puntatore nei suoi parametri, in MQL4 posso usare il passaggio del parametro per riferimento, giusto?

Almeno in C++

int a;//переменная
int *ra = &a;//адрес(* ra) равен ссылке(& a) на а (переменную)
 
paladin80:
Di quali dati di altre valute e timeframes hai bisogno: indicatore standard o personalizzato, prezzo, qualcos'altro? Mostrami la parte del codice in cui non hai successo.
In realtà, oltre a OHLC non avete bisogno di nient'altro. Non si tratta del codice. All'apertura dei grafici, le serie temporali sono create nella memoria virtuale e tutte le quotazioni in arrivo sono memorizzate nella memoria di lavoro senzascriverle nei file di cronologia. I file della cronologia vengono scritti solo quando si chiude MT4. Quando si richiedono dati senza aprire il grafico corrispondente, le serie temporali non vengono create, ma i dati scaricati vengono scritti direttamente nei file della cronologia. Per recuperare questi dati, abbiamo bisogno di interrogare di nuovo e solo in questo caso otterremo dati freschi (dal file). Volevo provare a simulare in qualche modo la presenza di un grafico aperto, per ottenere i dati dalla RAM e non da un file.
 
AndEv:
In effetti, non avete bisogno di nient'altro se non di OHLC. E non si tratta del codice. Quando i grafici sono aperti, le serie temporali sono create nella memoria virtuale e tutte le quotazioni in arrivo sono memorizzate nella memoria principale senza essere scritte nei file della cronologia. I file della cronologia vengono scritti solo quando si chiude MT4. Quando si richiedono dati senza aprire il grafico corrispondente, le serie temporali non vengono create, ma i dati scaricati vengono scritti direttamente nei file della cronologia. Per ottenere questi dati, abbiamo bisogno di interrogare di nuovo e solo in questo caso otterremo dati freschi (dal file). Volevo provare a simulare in qualche modo la presenza di un grafico aperto, per ottenere i dati dalla RAM piuttosto che da un file.
Per essere onesti, non mi sono mai addentrato in questi processi. Mi chiedo per quale tipo di compito è necessario sapere questo?
 
paladin80:
Ad essere onesti, non mi sono mai addentrato in questi processi. Mi chiedo per quale tipo di compito è necessario sapere questo?
Un compito tre in uno: selezionare gli strumenti, calcolare i pesi e trovare un punto di entrata per il trading di tre valute simultaneamente.
 

gyfto: 

Va bene così?

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

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

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


Sembra che funzionerà... Ecco il codice dell'indicatore:

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

Nei parametri iniziali dello strumento, viene specificato "empty" al posto del percorso dell'applicazione, nell'output restituisce (nel log) il suo handle e il percorso completo. E poi...

 
gyfto:


Sembra adattarsi... Ecco il codice dell'indicatore:

I parametri iniziali dell'indicatore specificano "empty" invece del percorso dell'applicazione, nell'output restituisce (nel log) il suo handle e il percorso completo. Il prossimo...

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

Perché la prima linea usa un buffer di stringhe e la seconda un array di interi?

Cosa vi impedisce di usare una stringa inizializzata in entrambi i casi? Ridurrebbe il codice di una dozzina di righe.

 

Zhunko:

Cosa vi impedisce di usare una stringa inizializzata in entrambi i casi?


Il log dice che la funzione 'GetModuleFileNameA' chiamata dalla dll 'kernel32.dll' ha un errore critico c0000005 a 7C902128 in caso di dichiarazione di stringa. Ancora non capisco perché. In superficie - il terminale si blocca circa 3-7 secondi dopo l'apertura, senza il tempo di scrivere nulla nei log, cioè il terminale non si chiude da solo.