Скачать MetaTrader 5

Как получить массив данных с другого таймфрейма?

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Forex Trader
114297
Forex Trader  
Есть к примеру нестандартный индикатор, который нарисовал на графике D1 или H4 линию. Как получить доступ из H1 или M30 к массиву данных этого индикатора на старшем таймфрейме? И просто любой массив данных (не обязательно величин индикатора) можно получить с другого таймфрейма?
Forex Trader
114297
Forex Trader  
iCustom, iClose, iOpen и иже с ними ;)
Forex Trader
114297
Forex Trader  
Стоить ли пробовать с функциями Win32Api маппирования файлов или бесполезно?
#import "kernel32.dll"
int CreateFileMappingA(
  int hFile,              // handle to file to map
  int lpFileMappingAttributes, // optional security attributes
  int flProtect,           // protection for mapping object
  int dwMaximumSizeHigh,   // high-order 32 bits of object size
  int dwMaximumSizeLow,    // low-order 32 bits of object size
  string lpName             // name of file-mapping object
);
  
int OpenFileMappingA(
  int dwDesiredAccess,  // access mode
  int bInheritHandle,    // inherit flag
  string lpName          // pointer to name of file-mapping object
);

int MapViewOfFileA(
  int hFileMappingObject,  // file-mapping object to map into 
                              // address space
  int dwDesiredAccess,      // access mode
  int dwFileOffsetHigh,     // high-order 32 bits of file offset
  int dwFileOffsetLow,      // low-order 32 bits of file offset
  int dwNumberOfBytesToMap  // number of bytes to map
);

int UnmapViewOfFileA(
  int lpBaseAddress   // address where mapped view begins
);

#import

#define PAGE_READONLY          0x02     
#define PAGE_READWRITE         0x04

#define FILE_MAP_WRITE      0x0002
#define FILE_MAP_READ       0x0004


Использование:

int MemShare(int NumberOfBytes, string memName)
{
   int m_hfm = CreateFileMappingA( -1, 0, PAGE_READWRITE, 0, NumberOfBytes, memName);
   return (MapViewOfFileA(m_hfm, FILE_MAP_WRITE, 0, 0, 0));
}


В языках программирования Си, Дельфи и т.д. функция MemShare возвратила бы указатель, через этот указатель можно было бы работать с массивом. В одном месте заполнил массив. В другом через OpenFileMappingA открыл этот массив для доступа. В MQL4 указателей нет. Появляется вопрос, как подставить объявленный объект массива под MemShare, OpenFileMappingA, возможно ли это?

Forex Trader
114297
Forex Trader  
А может и этой функции было бы достаточно void *malloc( size_t size ) , из какой ДЛЛ только она?
Forex Trader
114297
Forex Trader  
Маппирование работает:
#import "kernel32.dll"
int CreateFileA(
  string lpFileName,          // pointer to name of the file
  int dwDesiredAccess,       // access (read-write) mode
  int dwShareMode,           // share mode
  int lpSecurityAttributes,
                               // pointer to security attributes
  int dwCreationDisposition,  // how to create
  int dwFlagsAndAttributes,  // file attributes
  int hTemplateFile         // handle to file with attributes to 
                               // copy
);

int CreateFileMappingA(
  int hFile,              // handle to file to map
  int lpFileMappingAttributes, // optional security attributes
  int flProtect,           // protection for mapping object
  int dwMaximumSizeHigh,   // high-order 32 bits of object size
  int dwMaximumSizeLow,    // low-order 32 bits of object size
  string lpName             // name of file-mapping object
);
  
int OpenFileMappingA(
  int dwDesiredAccess,  // access mode
  int bInheritHandle,    // inherit flag
  string lpName          // pointer to name of file-mapping object
);

int MapViewOfFile(
  int hFileMappingObject,  // file-mapping object to map into 
                              // address space
  int dwDesiredAccess,      // access mode
  int dwFileOffsetHigh,     // high-order 32 bits of file offset
  int dwFileOffsetLow,      // low-order 32 bits of file offset
  int dwNumberOfBytesToMap  // number of bytes to map
);

int UnmapViewOfFile(
  int lpBaseAddress   // address where mapped view begins
);

#import

#define GENERIC_READ       0x80000000
#define GENERIC_WRITE      0x40000000

#define FILE_SHARE_READ    0x1  
#define FILE_SHARE_WRITE   0x2  

#define CREATE_NEW          1
#define CREATE_ALWAYS       2
#define OPEN_EXISTING       3
#define OPEN_ALWAYS         4

#define PAGE_READONLY      0x2     
#define PAGE_READWRITE     0x4

#define FILE_MAP_WRITE      0x2
#define FILE_MAP_READ       0x4


и

int MemShare(int nBytes, string fName)
{
   int m_hf = CreateFileA(fName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, CREATE_ALWAYS, 0, 0);
   int m_hfm = CreateFileMappingA( m_hf, 0, PAGE_READWRITE, 0, nBytes, 0);
   int m_mv = MapViewOfFile(m_hfm, FILE_MAP_WRITE, 0, 0, 0);
   Comment("fName = ",fName,", m_hf = ",m_hf,", m_hfm = ",m_hfm, ", m_mv = ",m_mv);
   return(m_mv);
}


Создался файл на 10000 байт в корневой директории диска и был замаппирован, об этом показал коммент.
Только вот как этот кусок памяти под массив подвести, вопрос вопросов?

Forex Trader
114297
Forex Trader  
Что ещё сделать удалось:
#import "msvcrt.dll"
int memcpy( int dest,  double src[], int count );
#import


и

int h_mem = 0;
double d_mem[];
...

   if (h_mem == 0)
   {
      ArrayResize(d_mem, 250);
      ArrayInitialize(d_mem, 1.1111);
      h_mem = MemShare(elems, memName);
      memcpy(h_mem, d_mem, 2000);
   }


Копирование в память и файл действительно происходит, но сильно ругается:
"There has been a critical error
Time : 2006.08.17 18:33
Program : Client Terminal
Version : 4.00 (build: 195, 30 Jun 2006)
Owner : FIBO Group, Ltd. (FIBO Group)
OS : Windows 2000 Server 5.0 Service Pack 4 (Build 2195)
Processors : 1, type 586, level 15
Memory : 507348/53536 kb
Exception : C0000005
Address : CB295E9E
Access Type : read
Access Addr : CB295E9E

Registers : EAX=00000000 CS=001b EIP=CB295E9E EFLGS=00010246
: EBX=000007D0 SS=0023 ESP=001289E4 EBP=00128A1C
: ECX=01A82678 DS=0023 ESI=01A827C0 FS=0038
: EDX=0000002F ES=0023 EDI=011AEE1C GS=0000

Stack Trace : 0045055A 00000000 00000000 00000000
: 00000000 00000000 00000000 00000000
: 00000000 00000000 00000000 00000000
: 00000000 00000000 00000000 00000000
Modules :
1 : 00400000 00292000 E:\programs\MT4\FG\terminal.exe
2 : 60000000 00045000 D:\WINNT\system32\MSCTF.dll
3 : 6B2C0000 00005000 D:\WINNT\system32\MSIMG32.dll
4 : 6C370000 000FB000 D:\WINNT\system32\MFC42.DLL
5 : 70A70000 00066000 D:\WINNT\system32\SHLWAPI.dll
6 : 71710000 00084000 D:\WINNT\system32\COMCTL32.dll
7 : 75020000 00008000 D:\WINNT\system32\WS2HELP.DLL
8 : 75030000 00014000 D:\WINNT\system32\WS2_32.dll
9 : 75E60000 0001A000 D:\WINNT\system32\IMM32.DLL
10 : 76B30000 0003E000 D:\WINNT\system32\comdlg32.dll
11 : 770C0000 00023000 D:\WINNT\system32\CSCDLL.DLL
12 : 77570000 00030000 D:\WINNT\system32\WINMM.dll
13 : 77840000 0003E000 D:\WINNT\system32\cscui.dll
14 : 779B0000 0009B000 D:\WINNT\system32\OLEAUT32.dll
15 : 77D30000 0006F000 D:\WINNT\system32\RPCRT4.dll
16 : 77E10000 00069000 D:\WINNT\system32\USER32.DLL
17 : 77F40000 0003C000 D:\WINNT\system32\GDI32.dll
18 : 77F80000 0007C000 D:\WINNT\system32\ntdll.dll
19 : 78000000 00045000 D:\WINNT\system32\MSVCRT.DLL
20 : 7C2D0000 00065000 D:\WINNT\system32\ADVAPI32.DLL
21 : 7C570000 000B4000 D:\WINNT\system32\KERNEL32.dll
22 : 7C950000 0008F000 D:\WINNT\system32\CLBCATQ.DLL
23 : 7CE20000 000EF000 D:\WINNT\system32\ole32.dll
24 : 7CF30000 00246000 D:\WINNT\system32\SHELL32.dll

Call stack :
004503C0:019A [0045055A] ?InitFunctionInt@CExpertInterior"

Forex Trader
114297
Forex Trader  
Если справиться с ошибкой, то можно делать так:
Индикатор рисуется на графике.
mem объявляется глобальной переменной
int mem = malloc(num * 8)
данные индикатора копируются по адресу mem через memcpy
На другом таймфрейме с адреса mem скопировать обратно в массив
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий