Обсуждение статьи "Как за 10 минут написать DLL библиотеку для MQL5 и обмениваться данными?" - страница 8

 

To Prival .

Если Вы сформулируете достаточно интересную задачу с применением МатКада (для начала не очень сложную), то уверен, что найдутся спецы, которые захотят присоединиться к решению данной задачи. 

 
Prival:

2010.05.06 02:28:14   Setka_Final_1 (EURUSD,M5)            Ошибка создания SetVLine  VLine_838524   4202  t1= 2010

Если объект не найден. Программа должна была его создать. Но объект есть if(…) почему же тогда выдается 4202.

Ошибка осталась от предыдущего вызова функции. Используйте ResetLastError()
 

Можете ли вы показать мне импорт структуры в библиотеку C++?

Мне нужно добавить этот код в MQL5DLLSample.cpp:
------------------------
struct MqlTick

{
INT64 Time;
double Bid;
double Ask;
double Last;
UINT64 Volume;
};

_DLLAPI MqlTick __stdcall MyTick(MqlTick &my)
{
my.Bid = 1;
return(my);
}
------------------------

Затем я добавляю этот код в MQL5DLL Test.mq5 (раздел импорта)

MqlTick MyTick(MqlTick &tick);

и вызываю его в OnTick()

MqlTick tick;
SymbolInfoTick("GBPUSD", tick);
MyTick(tick);
Print("Мой тик: ",tick.bid);
------------------------

Компиляция библиотеки c++ и советника проходит без ошибок.

После вызова функции MyTick(tick) в терминале получаю ошибку: MQL5DLL_Test (EURUSD,M1) Access violation write to 0x00000008

 

Здравствуйте и спасибо за эту полезную статью.

Я пытался создать небольшую dll для обмена данными между mql5 и mysql.

Я выполнил несколько шагов и столкнулся с некоторыми ошибками.

Длл написана на c++.

Первая была скомпилирована с помощью minGW.

Ex5 не смог открыть ее, потому что она не была 64-битной скомпилированной dll.

Поэтому я скомпилировал ее с помощью minGW 64 бит.

Моя первая dll (которая была очень простой) работает.

Она делает некоторые добавления и т.д..

Когда я пытаюсь использовать библиотеку mysql, я могу скомпилировать и собрать свою dll без каких-либо проблем.

Но когда я пытаюсь открыть ex5, вызывая ее, я получаю следующую ошибку:

Cannot open C:\user......\DLLNAME.dll (193)

У вас есть идеи, как это исправить?

Большое спасибо

 

Привет всем,

отличная статья!


Но я хотел спросить, может ли кто-нибудь помочь мне сделать то, что описано в этой статье, как бы задом наперед: получить данные (тики или бары) в программу C++ из metatrader?

 


День добрый! К слову о передачи строк в функции из DLL

Имею след. код:

#include <WinUser32.mqh>

#import "mt4excel.dll"

bool  ExcelOpen();//Открывает Excel и создает чистую страницу  

bool  ExcelSetTextCell(int X,int Y,char Value[]);//Записать текст в ячейку

/*

 others cut

*/ 

#import

 void OnTick()

  {

  MqlRates rates []; 

  int copied=CopyRates("EURUSD",PERIOD_M1,0,1,rates);

   ExcelSetTextCell(1,1,"Tool");

        ExcelSetTextCell(2,1,"EURUSD");        

        ExcelSetValueCell(2,2,rates[0].close);

  }

 Как и говорилось, в Excel отображается только первая буква из передаваемых туда с помощью ExcelSetTextCell. После прочтения этой нитки, я понял в чем причина, но не совсем пойму как добиться того, что нужно. Дело в том, что DLL писал не я, это библиотека функций для работы с Excel через MT4. По понятым причинам MT5 кидает туда указатель на строку, где лежит лишь первый символ. Вопрос в том, как можно заставить MT5 передать туда то, что нужно, если у меня нет возможность править исходный код DLL? Ведь насколько я догоняю, нужно в самой DLL в коде каждой функции дописать нечтно вроде

_DLLAPI void __stdcall demo(char *stream, char *buf){ buf=stream;} 

Буду признателен за коментарии разработчиков MT5 

Спасибо! 

 

ns_k, не забывайте, что строки в MQL5 - юникодные.

Возможны 2 решения.

1. Переделать (доделать) dll для приёма юникодных строк

2. Самому конвертировать строку в массив

 
stringo:

ns_k, не забывайте, что строки в MQL5 - юникодные.

Возможны 2 решения.

1. Переделать (доделать) dll для приёма юникодных строк

2. Самому конвертировать строку в массив

Второе решение мне подходит. Скажите, я видимо тогда должен и объявление фукнции изменить? Т.е. вместо

 

bool  ExcelSetTextCell(int X,int Y, string Value);//Записать текст в ячейку

я должен написать объявление где третим параметром будет массив? Если да, как это сделать не пойму. Спасибо! 

 

updated: разобрался все же, чуть подумать надо было. Спасибо за помощь!! 

 

Объявление функции DLL

bool ExcelSetTextCell(int X,int Y, uchar& Value[]);
Вызов функции DLL
//--- объявляем массив символов
uchar value[];
//--- преобразуем юникод строку в однобайтный массив
StringToCharArray("EURUSD", value);
//--- передаем полученные данные массива по ссылке
ExcelSetTextCell(2,1,value);
 
avoitenko:

Обьявление функции DLL

Вызов функции DLL

Точно! Я именно так и сделал. Спасибо!