Синхронизация mql5 и c++ реализаций классов. - страница 2

 
G1G2G3 #:
 Кто проводил тест, как быстрее связывать mql программу с другой программой, через сокет на локальном адресе или через файл.

Тесты не проводил, сохраняю файлы на виртуальный диск в ОЗУ (у меня это Z:  на 2 Гг). А потом читаю сторонней программой. Работает быстро и диск не пилит.
Из MQL папки можно сделать ссылку на диск и все сразу туда будет улетать.

mklink /D C:\Users\__user__\AppData\Roaming\MetaQuotes\Terminal\Common\Files\RAM Z:

 

если вам нужно просто импортировать (использовать) в MQL класс из C++, обеспечив максимально схожий интерфейс, то путь примерно такой

// c++
class MyClass {
MyClass() { // конструктор
}
~MyClass() { // деструктор
}
int Method(int arg) { // некий метод
}
};
// оборачиваем класс в C ABI
#define API(x) declspec(__dllexport) x __stdcall
API(MyClass *) MyClass_create() { return new MyClass ; }
API(void) MyClass_destroy( MyClass *obj); { delete obj; }
API(int) MyClass_method( MyClass *obj,int args) { return obj->Method(arg); }

и в MQL

// mql
#define PTR ulong
#import MyClassLib.dll
PTR MyClass_create();
void MyClass_destroy(PTR);
int MyClass_method(PTR,int);
#import

class MyClass {
private: 
   PTR m_cppobj;
public:
   MyClass() { m_cppobj=MyClass_create(); }
   ~MyClass() { MyClass_destroy(m_cppobj); }
   int Method(int arg) { return MyClass_method(m_cppobj,arg); }
}

написано с руки, иллюстративно

надо ещё соблюсти размерности типов и обеспечить перехват исключений (они не должны пробрасываться в mql)

 
Maxim Kuznetsov #:

если вам нужно просто импортировать (использовать) в MQL класс из C++, обеспечив максимально схожий интерфейс, то путь примерно такой

Нет, задача совсем другая. Для отладки логики кода нужна возможность его (или его достаточно большого куска) запуска в интерпретаторе/компиляторе С++

Что-то типа такого:

#ifndef __MQL5__
#include <iostream>
#endif

struct Sab
{
  double a;
  double b;
  void set(double, double);
  void print();
};

void Sab::set(double x, double y)
{
  a=x; b=y;
}

void Sab::print()
{
  #ifdef __MQL5__
  Print(a," ",b);
  #else
  std::cout<<a<<" "<<b<<std::endl;
  #endif
}
Не помешали бы примеры с файлами, динамическими массивами структур и тд.
 
Aleksey Nikolayev #:

Нет, задача совсем другая. Для отладки логики кода нужна возможность его (или его достаточно большого куска) запуска в интерпретаторе/компиляторе С++

Что-то типа такого:

Не помешали бы примеры с файлами, динамическими массивами структур и тд.

Для отладки логики кода есть отладчик и тестер :-)

Полностью работоспособный mix невозможен - языки внешне похожи но не идентичны. Отдельное сильно ограниченное подмножество MQL ещё можно окостылить внешними дефайнами, шаблонами и скомпилять в C++. Но не произвольный файл/функцию/класс.

Идея с миксом тупиковая, обрастёте массой дефайнов,шаблонов, а то и доп.препроцессором, но придёте к тому что малейшее изменение кода ставит под вопрос эквивалентность полученных С++ <-> MQL и требует отладки и тестирования сразу в двух средах.
Код меньше и надёжнее не станет, но работы сильно прибавится

PS/ напомнило старое-старое, один сотрудник в гос.конторе хорошо знал Модулу но проекты пошли все как минимум на C..поэтому он породил массу дефайнов чтобы писать в более-менее привычном стиле :-) 

 
Maxim Kuznetsov #:

Для отладки логики кода есть отладчик и тестер :-)

Если логика немного сложнее пересечения МА-шек, то гибкость интерпретатора будет весьма нелишней. Можно нарисовать любой график или распечатать любые данные без перекомпиляции и перезапуска.

Maxim Kuznetsov #:

Полностью работоспособный mix невозможен - языки внешне похожи но не идентичны. Отдельное сильно ограниченное подмножество MQL ещё можно окостылить внешними дефайнами, шаблонами и скомпилять в C++. Но не произвольный файл/функцию/класс.

Ну, примерно очертил область совместимости - файлы и массивы-вектора. На сильно большее замахиваться, конечно, глупо.

Maxim Kuznetsov #:

Идея с миксом тупиковая

Как бы не оказалась ещё более тупиковой идея вечного присутствия Метаквот в России) Пионер должен быть всегда готов)

 
Aleksey Nikolayev #:

Если логика немного сложнее пересечения МА-шек, то гибкость интерпретатора будет весьма нелишней. Можно нарисовать любой график или распечатать любые данные без перекомпиляции и перезапуска.

Ну, примерно очертил область совместимости - файлы и массивы-вектора. На сильно большее замахиваться, конечно, глупо.

Как бы не оказалась ещё более тупиковой идея вечного присутствия Метаквот в России) Пионер должен быть всегда готов)

"Гибкость интерпретатора" :-)

Кого из двух MQL или C++ вы считаете интерпретируемым ?

 
Maxim Kuznetsov #:

"Гибкость интерпретатора" :-)

Кого из двух MQL или C++ вы считаете интерпретируемым ?

Второй, очевидно) Если бы считал таковым первый, то наверное не заводил бы ветку)

Cling, например, с которым весьма неплох церновский ROOT.

 
Aleksey Nikolayev #:

Второй, очевидно) Если бы считал таковым первый, то наверное не заводил бы ветку)

Cling, например, с которым весьма неплох церновский ROOT.

давненько не слышал про них обоих..оказывается живы ещё

у вас получится уже извращение в кубе (с 3-мя сторонами) : MQL,C++,Cling :-)

---

ну напишите вы просто рассчётную часть на С++ , сгенерив её с Cling и подцепите DLL-кой в MQL: более простой путь минимизирующий ошибки и объём работы

double[] в MQL это в точности double * в С++. Этого сокровенного знания достаточно 

 
Maxim Kuznetsov #:

давненько не слышал про них обоих..оказывается живы ещё

у вас получится уже извращение в кубе (с 3-мя сторонами) : MQL,C++,Cling :-)

---

ну напишите вы просто рассчётную часть на С++ , сгенерив её с Cling и подцепите DLL-кой в MQL: более простой путь минимизирующий ошибки и объём работы

double[] в MQL это в точности double * в С++. Этого сокровенного знания достаточно 

Возможно, в итоге приду к этому же выводу, но для начала попробую помучиться.
 
#define вам в помощ. При помощи них можно сделать полностью одинаковый код, который будет собираться и там и там.