[存档]任何菜鸟问题,为了不使论坛变得杂乱无章。专业人士,不要与它擦肩而过。没有你,哪里都不能去 - 5. - 页 245

 
Vinin:

你试过错误处理吗?
不,这有什么好处?无论如何,你将不得不进行另一次查询
 
AndEv:
不,这有什么好处?无论如何,你都要再做一次查询。

你会知道为什么没有数据,也许重复查询是没有意义的。
 
AndEv:
不,这有什么好处?无论如何,你将不得不进行另一次查询
你需要其他货币和时间段的什么数据:标准或自定义指标、价格,还是其他什么?给我看看你不成功的那部分代码。
 

为了安全起见,我就问一下。关于MQL4规范的问题。如果根据MSDN文档,被调用的函数在其参数中有一个指针,在MQL4中,我可以使用引用方式传递参数,对吗?

至少在C++中是这样

int a;//переменная
int *ra = &a;//адрес(* ra) равен ссылке(& a) на а (переменную)
 
paladin80:
你需要其他货币和时间段的什么数据:标准或自定义指标、价格,还是其他什么?给我看看你不成功的那部分代码。
实际上,除了OHLC,你不需要其他任何东西。这不是关于代码的问题。在打开图表时,时间序列在虚拟内存中创建,所有传入的报价都存储在工作内存中,不写入 历史文件。历史文件只有在我们关闭MT4时才会被写入。当请求数据而不打开相应的图表时,不会创建时间序列,但下载的数据会直接写入历史文件中。为了得到这些数据,我们需要再次查询,只有在这种情况下,我们才能得到新的数据(从文件中)。我想尝试以某种方式模拟一个开放的图形的存在,以便从RAM而不是从文件中获取数据。
 
AndEv:
事实上,除了OHLC,你不需要其他任何东西。而且这与代码无关。当图表打开时,时间序列在虚拟内存中创建,所有传入的报价都存储在主内存中,不会被写入历史文件。历史文件只有在我们关闭MT4时才会被写入。当请求数据而不打开相应的图表时,不会创建时间序列,但下载的数据会直接写入历史文件中。为了得到这些数据,我们需要再次查询,只有在这种情况下,我们才能得到新的数据(从文件中)。我想尝试以某种方式模拟一个开放图表的存在,以便从RAM而不是从文件中获取数据。
说实话,我从来没有接触过这种过程。我想知道你需要知道这一点是为了什么类型的任务?
 
paladin80:
说实话,我从来没有深入研究过这种过程。我想知道你需要知道这一点是为了什么类型的任务?
三合一的任务--选择工具、计算权重和寻找进入点,同时交易三种货币。
 

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

在该工具的初始参数中,指定了 "empty "而不是应用程序的路径,在输出中,它返回(在日志中)其手柄和完整的路径。然后...

 
gyfto:


它似乎适合...以下是该指标的代码。

指标的初始参数指定为 "空",而不是应用程序的路径,在输出中,它返回(在日志中)其手柄和完整的路径。下一步...

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

为什么第一行使用字符串缓冲区,第二行使用整数数组?

在这两种情况下,是什么阻止了你使用初始化字符串?这将使代码减少十几行。

 

Zhunko:

在这两种情况下,是什么阻止了你使用一个初始化的字符串?


日志说,在字符串声明的情况下,函数'GetModuleFileNameA'从dll'kernel32.dll'调用的关键错误 c0000005在7C902128。我还是不明白为什么。表面上看--终端在打开后大约3-7秒就崩溃了,没有时间在日志中写任何东西,也就是说,终端不是自己关闭的。