Так как в MQL4 нет адресной арифметики, то в чистом виде операции вида GetFlagMMF(filenum1, &flag1); не пройдут. Надо попробовать какой-то обходной путь. Завтра подумаем с учетом внутренней организации переменных и наверное дадим совет.
Как вариант - напишите свою DLL-прослойку с передачей параметров по значению (ByVal), которая в свою очередь обращается к dataxapi.dll с передачей параметров по ссылке (ByRef) и обратно возвращает результат
Как вариант - напишите свою DLL-прослойку с передачей параметров по значению (ByVal), которая в свою очередь обращается к dataxapi.dll с передачей параметров по ссылке (ByRef) и обратно возвращает результат
Не хотелось бы огород из DDL-ок городить. Должно быть изящное решение на MQL4 :)
Должно быть изящное решение на MQL4
MQL4 заточен в первую очередь для облегчения _основных_ задач трейдеров при написании торговых систем. Безусловно если копнуть глубже - видно массу ограничений (и таймфреймы только такие какие заданы, и тиковая история не хранится, и масса ограничений по вводу-выводу, работой с памятью и т.п. и т.д.). По всей видимости сюда же следует отнести отсутствие адресной арифметики.Так что DLL-прослойка имхо наиболее "изящный" огород :) Имхо
Должно быть изящное решение на MQL4
MQL4 заточен в первую очередь для облегчения _основных_ задач трейдеров при написании торговых систем. Безусловно если копнуть глубже - видно массу ограничений (и таймфреймы только такие какие заданы, и тиковая история не хранится, и масса ограничений по вводу-выводу, работой с памятью и т.п. и т.д.). По всей видимости сюда же следует отнести отсутствие адресной арифметики.Так что DLL-прослойка имхо наиболее "изящный" огород :) Имхо
Возможно Вы правы, если не получится решить в MQL4-e сделаю так, как Вы рекомендуете...
Должно быть изящное решение на MQL4
MQL4 заточен в первую очередь для облегчения _основных_ задач трейдеров при написании торговых систем. Безусловно если копнуть глубже - видно массу ограничений (и таймфреймы только такие какие заданы, и тиковая история не хранится, и масса ограничений по вводу-выводу, работой с памятью и т.п. и т.д.). По всей видимости сюда же следует отнести отсутствие адресной арифметики.Так что DLL-прослойка имхо наиболее "изящный" огород :) Имхо
Возможно Вы правы, если не получится решить в MQL4-e сделаю так, как Вы рекомендуете...
вот, кажись нашёл решение, конечно нужно еще проверить как оно на самом деле работает, но покрайней мере, ret = 1 !!! - это говорит о том, что функция отработала правильно...
суть решения в том, что я перенаправил вывод flag1 не в переменную, а в массив состоящий из 1-го элемента.
Можно ли так делать ?
//+------------------------------------------------------------------+ //| DT-SMART.mq4 | //+------------------------------------------------------------------+ #import "dataxapi.dll" // Function prototypes // CreateMMF(ULONG filenum, ULONG numbars); int CreateMMF(int filenum1, int numbars); // CloseMMF(ULONG filenum); int CloseMMF(int filenum1); // GetFlagMMF(ULONG filenum, ULONG *flag); int GetFlagMMF(int filenum1, int& flag1[]); #import //-------------------------------------------------------------------- int ret, filenum1=1, maxbars; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- maxbars=10; //create virtual memory file #1 ret=CreateMMF(filenum1, maxbars); //display result Print("CreateMMF(filenum1, maxbars) = ", ret); //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- ret=CloseMMF(filenum1); Print("CloseMMF(filenum1) = ", ret); //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { int flag1[1]; //---- //get and display the 'new data' flag #1 //ret=GetFlagMMF(filenum1, &flag1); ret=GetFlagMMF(filenum1, flag1); Comment("flag1 = ", flag1[0], " ret ", ret); //---- return(0); } //+------------------------------------------------------------------+
вот, кажись нашёл решение, конечно нужно еще проверить как оно на самом деле работает, но покрайней мере, ret = 1 !!! - это говорит о том, что функция отработала правильно...
суть решения в том, что я перенаправил вывод flag1 не в переменную, а в массив состоящий из 1-го элемента.
Можно ли так делать ?
суть решения в том, что я перенаправил вывод flag1 не в переменную, а в массив состоящий из 1-го элемента.
Можно ли так делать ?
Да.
суть решения в том, что я перенаправил вывод flag1 не в переменную, а в массив состоящий из 1-го элемента.
Можно ли так делать ?
Можно ли так делать ?
Вот и обходной маневр удался...
суть решения в том, что я перенаправил вывод flag1 не в переменную, а в массив состоящий из 1-го элемента.
Можно ли так делать ?
Можно ли так делать ?
Вот и обходной маневр удался...
Вот и изящьное решение.... :)
Проверил сейчас, стандартный пример от NeuroShela, написанный на Си, перевел на MQL4 - все работает !!!
Вот..., сейчас проверил несколько свои пограмм...
Если применить такой "манёвр"..., код программ сильно упрощается...
Исключаются многие лишние DLL-ки... :)
Если применить такой "манёвр"..., код программ сильно упрощается...
Исключаются многие лишние DLL-ки... :)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
функции из dataxapi.dll
CreateMMF(filenum1, maxbars);
и
CloseMMF(filenum1);
работают нормально (возвращают 1) это говорит о том, что виртуальный файл создаётся и удаляется соответственно.
Начинаю исследовать дальше функцию
GetFlagMMF(filenum1, flag1); - метатрейдер вываливается в crash
На Си пример использования этой функции такой:
Описание функции:
Extracted from the Data Exchange API Help File
C language prototype:
DLLIMPORT GetFlagMMF(ULONG filenum, ULONG *flag);
------------------------------------------------------------------------------------------------------------
When giving C language prototypes we are using the following macro definitions for shortness:
#define ULONG unsigned long
#define DLLIMPORT _declspec(dllimport) ULONG _stdcall
-------------------------------------------------------------------------------------------------------------
Accesses existing virtual memory file identified as filenum and retrieves the “new data has arrived” flag. This flag is raised whenever the PutData indicator is successfully refreshed on the NST chart.
The flag may have two values:
flag=1. This means that the new data has arrived from NST, so the data is ready to be read by the GetDataMMFServer function.
flag=0. This can actually signify two different things: (1) there is no data in the file at all, or (2) there is some old data in the file, but this data has already been successfully read by the GetDataMMFServer function, which resets the flag to zero.
The GetFlagMMF should be called in the user’s app timer event function to see if there is new data sent by the Trader.
Returns 1 if call is successful, and 0 if there was an error.
вот код советника:
нам нужно получить значение переменной flag1.
Как можно на MQL4 это сделать?