[ARCHIV]Alle Fragen von Anfängern, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht daran vorbei. Ohne dich kann ich nirgendwo hingehen - 5. - Seite 245

 
Vinin:

Haben Sie die Fehlerbehandlung ausprobiert?
Nein. Wozu sollte das gut sein? Sie müssten ohnehin eine weitere Abfrage machen
 
AndEv:
Nein. Wozu sollte das gut sein? Sie müssen ohnehin eine weitere Abfrage durchführen.

Dann wissen Sie, warum es keine Daten gibt, und vielleicht ist es sinnlos, die Abfrage zu wiederholen.
 
AndEv:
Nein. Wozu sollte das gut sein? Sie müssen trotzdem eine weitere Abfrage durchführen
Welche Daten von anderen Währungen und Zeitrahmen benötigen Sie: Standard- oder benutzerdefinierte Indikatoren, Preise oder etwas anderes? Zeigen Sie mir den Teil des Codes, in dem Sie keinen Erfolg haben.
 

Um sicher zu gehen, frage ich nach. Frage zur MQL4-Spezifikation. Wenn laut MSDN-Dokumentation die aufgerufene Funktion einen Zeiger in seinen Parametern hat, kann ich in MQL4 die Übergabe des Parameters per Referenz verwenden, richtig?

Zumindest in C++

int a;//переменная
int *ra = &a;//адрес(* ra) равен ссылке(& a) на а (переменную)
 
paladin80:
Welche Daten von anderen Währungen und Zeitrahmen benötigen Sie: Standard- oder benutzerdefinierte Indikatoren, Preise oder etwas anderes? Zeigen Sie mir den Teil des Codes, in dem Sie keinen Erfolg haben.
Eigentlich brauchen Sie außer OHLC nichts weiter. Es geht nicht um den Code. Bei geöffneten Charts werden Zeitreihen im virtuellen Speicher erstellt und alle eingehenden Kurse im Arbeitsspeicher gespeichert, ohnesie in History-Dateienzu schreiben. History-Dateien werden nur geschrieben, wenn wir MT4 schließen. Wenn Sie Daten anfordern, ohne das entsprechende Diagramm zu öffnen, werden die Zeitreihen nicht erstellt, sondern die heruntergeladenen Daten werden direkt in die Verlaufsdateien geschrieben. Um diese Daten zu erhalten, müssen wir eine weitere Anfrage stellen, und nur in diesem Fall werden wir neue Daten (aus der Datei) erhalten. Ich wollte versuchen, das Vorhandensein eines offenen Graphen zu simulieren, um die Daten aus dem RAM und nicht aus der Datei zu erhalten.
 
AndEv:
Eigentlich brauchen Sie nichts anderes als OHLC. Und es geht nicht um den Code. Wenn Diagramme geöffnet sind, werden Zeitreihen im virtuellen Speicher erstellt und alle eingehenden Kurse werden im Hauptspeicher gespeichert, ohne in Verlaufsdateien geschrieben zu werden. History-Dateien werden nur geschrieben, wenn wir MT4 schließen. Wenn Sie Daten anfordern, ohne das entsprechende Diagramm zu öffnen, werden die Zeitreihen nicht erstellt, sondern die heruntergeladenen Daten werden direkt in die Verlaufsdateien geschrieben. Um diese Daten zu erhalten, müssen wir erneut eine Abfrage durchführen, und nur in diesem Fall erhalten wir frische Daten (aus der Datei). Ich wollte versuchen, das Vorhandensein eines geöffneten Diagramms irgendwie zu simulieren, um die Daten aus dem RAM und nicht aus einer Datei zu erhalten.
Um ehrlich zu sein, habe ich mich nie mit solchen Prozessen beschäftigt. Ich frage mich, für welche Art von Aufgabe Sie das wissen müssen?
 
paladin80:
Um ehrlich zu sein, habe ich mich nie wirklich mit solchen Prozessen beschäftigt. Ich frage mich, für welche Art von Aufgabe Sie das wissen müssen?
Eine Drei-in-eins-Aufgabe - Auswahl der Instrumente, Berechnung der Gewichte und Ermittlung eines Einstiegspunkts für den gleichzeitigen Handel mit drei Währungen.
 

gyfto: 

Ist das in Ordnung?

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

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

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


Sieht aus, als würde es funktionieren... Hier ist der Code für den Indikator:

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

In den Anfangsparametern des Tools wird anstelle des Pfads zur Anwendung "empty" angegeben, in der Ausgabe gibt es (im Protokoll) sein Handle und den vollständigen Pfad zurück. Und dann...

 
gyfto:


Es scheint zu passen... Hier ist der Code des Indikators:

In den Anfangsparametern des Indikators wird anstelle des Pfads zur Anwendung "empty" angegeben, in der Ausgabe werden (im Protokoll) der Handle und der vollständige Pfad zurückgegeben. Nächste...

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

Warum wird in der ersten Zeile ein String-Puffer und in der zweiten ein Integer-Array verwendet?

Was hindert Sie daran, in beiden Fällen eine initialisierte Zeichenfolge zu verwenden? Das würde den Code um ein Dutzend Zeilen kürzen.

 

Zhunko:

Was hindert Sie daran, in beiden Fällen eine initialisierte Zeichenfolge zu verwenden?


Das Protokoll besagt, dass der Aufruf der Funktion 'GetModuleFileNameA' von der Dll 'kernel32.dll' einen kritischen Fehler c0000005 bei 7C902128 bei einer String-Deklaration aufweist. Ich verstehe immer noch nicht, warum. Oberflächlich betrachtet stürzt das Terminal etwa 3-7 Sekunden nach dem Öffnen ab, es bleibt keine Zeit, etwas in die Logs zu schreiben, d.h. das Terminal schließt sich nicht von selbst.