[ARCHIVE]Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Je ne peux aller nulle part sans toi - 5. - page 245

 
AndEv:
Non. Quel bien cela ferait-il ? Vous devrez faire une autre requête de toute façon.

Vous saurez pourquoi il n'y a pas de données, et peut-être qu'il est inutile de répéter la requête.
 
AndEv:
Non. Quel bien cela ferait-il ? Vous devrez de toute façon faire une autre requête
De quelles données provenant d'autres devises et d'autres horizons temporels avez-vous besoin : indicateur standard ou personnalisé, prix, autre chose ? Montre-moi la partie du code où tu ne réussis pas.
 

Juste pour être sûr, je vais demander. Question sur la spécification MQL4. Si, selon la documentation MSDN, la fonction appelée a un pointeur dans ses paramètres, dans MQL4 je peux utiliser le passage du paramètre par référence, n'est-ce pas ?

Au moins en C++

int a;//переменная
int *ra = &a;//адрес(* ra) равен ссылке(& a) на а (переменную)
 
paladin80:
De quelles données provenant d'autres devises et d'autres horizons temporels avez-vous besoin : indicateur standard ou personnalisé, prix, autre chose ? Montre-moi la partie du code où tu ne réussis pas.
En fait, à part OHLC, vous n'avez besoin de rien d'autre. Il ne s'agit pas du code. Lors des graphiques ouverts, les séries temporelles sont créées dans la mémoire virtuelle et toutes les cotations entrantes sont stockées dans la mémoire de travail sansles écrire dans les fichiers d'historique. Les fichiers d'historique ne sont écrits que lorsque nous fermons MT4. Lorsque vous demandez des données sans ouvrir le graphique correspondant, les séries chronologiques ne sont pas créées, mais les données téléchargées sont directement écrites dans les fichiers d'historique. Pour récupérer ces données, il faut refaire une requête et seulement dans ce cas, nous obtiendrons des données fraîches (du fichier). Je voulais essayer de simuler d'une certaine manière la présence d'un graphique ouvert, afin d'obtenir les données de la RAM et non d'un fichier.
 
AndEv:
En fait, vous n'avez besoin de rien d'autre que de l'OHLC. Et ce n'est pas à propos du code. Lorsque les graphiques sont ouverts, les séries chronologiques sont créées dans la mémoire virtuelle et toutes les cotations entrantes sont stockées dans la mémoire principale sans être écrites dans les fichiers historiques. Les fichiers d'historique ne sont écrits que lorsque nous fermons MT4. Lorsque vous demandez des données sans ouvrir le graphique correspondant, les séries chronologiques ne sont pas créées, mais les données téléchargées sont directement écrites dans les fichiers d'historique. Pour récupérer ces données, il faut refaire une requête et seulement dans ce cas, nous obtiendrons des données fraîches (du fichier). Je voulais essayer de simuler d'une certaine manière la présence d'un graphique ouvert, afin d'obtenir les données de la RAM plutôt que d'un fichier.
Pour être honnête, je ne suis jamais entré dans de tels processus. Je me demande pour quel type de tâche vous avez besoin de savoir cela ?
 
paladin80:
Pour être honnête, je ne me suis jamais vraiment penché sur ces processus. Je me demande pour quel type de tâche vous avez besoin de savoir cela ?
Une tâche trois en un - sélectionner les instruments, calculer les pondérations et trouver un point d'entrée pour négocier trois devises simultanément.
 

gyfto: 

Est-ce que ça va ?

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

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

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


On dirait que ça va marcher... Voici le code de l'indicateur :

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

Dans les paramètres initiaux de l'outil, "empty" est spécifié à la place du chemin de l'application, et dans la sortie, il renvoie (dans le journal) son handle et le chemin complet. Et puis...

 
gyfto:


Ça semble correspondre... Voici le code de l'indicateur :

Les paramètres initiaux de l'indicateur spécifient "empty" au lieu du chemin de l'application, dans la sortie il retourne (dans le journal) son handle et le chemin complet. Suivant...

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

Pourquoi la première ligne utilise-t-elle un tampon de chaîne de caractères, et la seconde un tableau d'entiers ?

Qu'est-ce qui vous empêche d'utiliser une chaîne initialisée dans les deux cas ? Cela réduirait le code d'une douzaine de lignes.

 

Zhunko:

Qu'est-ce qui vous empêche d'utiliser une chaîne initialisée dans les deux cas ?


Le journal indique que l'appel à la fonction 'GetModuleFileNameA' de la dll 'kernel32.dll' présente une erreur critique c0000005 à 7C902128 en cas de déclaration de chaîne. Je ne comprends toujours pas pourquoi. En apparence, le terminal se bloque environ 3 à 7 secondes après son ouverture, sans avoir le temps d'écrire quoi que ce soit dans les journaux, c'est-à-dire que le terminal ne se ferme pas tout seul.
 


Bonjour à tous, j'aimerais poser cette question : il existe une paire comme eur/usd/ mais peut-on faire la paire opposée ? usd/usd/ ? J'aimerais en avoir un.

Raison: