- [SOLVED] Индикаторы неправильно инстанцируются при вызове/создании из индикатора другого рабочего таймфрейма.
- Данные из индикаторов mql5
- Как проверить, во сколько будет время линии, если она нарисована на старшем таймфрейме?
#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, возможно ли это?
#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 байт в корневой директории диска и был замаппирован, об этом показал коммент.
Только вот как этот кусок памяти под массив подвести, вопрос вопросов?
#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"
Индикатор рисуется на графике.
mem объявляется глобальной переменной
int mem = malloc(num * 8)
данные индикатора копируются по адресу mem через memcpy
На другом таймфрейме с адреса mem скопировать обратно в массив
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования