NeuroShellDT и Метатрейдер

 
Пытаюсь соеденить NST и Метатрейдер через dataxapi.dll столкнулся с такой проблемой:

функции из dataxapi.dll
CreateMMF(filenum1, maxbars);
и
CloseMMF(filenum1);
работают нормально (возвращают 1) это говорит о том, что виртуальный файл создаётся и удаляется соответственно.
Начинаю исследовать дальше функцию
GetFlagMMF(filenum1, flag1); - метатрейдер вываливается в crash

На Си пример использования этой функции такой:
//get and display the 'new data' flag #1 
    ret=GetFlagMMF(filenum1, &flag1); 
    printf("New data flag 1 = %d\n", flag1);


Описание функции:

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.

вот код советника:

//+------------------------------------------------------------------+
//|                                                     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 flag);
#import
//--------------------------------------------------------------------
   int ret, filenum1=1, maxbars;
   int flag1;
//+------------------------------------------------------------------+
//| 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()
  {
//----
         //get and display the 'new data' flag #1
         //ret=GetFlagMMF(filenum1, &flag1); - пример использования функции
         ret=GetFlagMMF(filenum1, flag1);
         Comment("flag1 =   ", flag1, "  ret ", ret);
   
//----
   return(0);
  }
//+------------------------------------------------------------------+



нам нужно получить значение переменной flag1.
Как можно на MQL4 это сделать?

 
Так как в 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-го элемента.

Можно ли так делать ?

Вот и обходной маневр удался...


Вот и изящьное решение.... :)
Проверил сейчас, стандартный пример от NeuroShela, написанный на Си, перевел на MQL4 - все работает !!!
 
Вот..., сейчас проверил несколько свои пограмм...
Если применить такой "манёвр"..., код программ сильно упрощается...
Исключаются многие лишние DLL-ки... :)