Бета-тестирование MetaTrader 5 началось! - страница 95

 

С нововведением под названием SSL разобрался, предупреждать нужно о необходимости делать резервную копию сертификата (ладно хоть демка, а мог быть реал)...


PS

Теперь уважаемые разработчики объясните пожалуйста как DLL подцепить при помощи заголовочного файла (в принципе конечно не важно ex5 иии DLL, главное чтоб работало)....

Вот на такую конструкцию:


//#import "FileName.ex5"
//----------------------------------------------------------------------------//
CopyrightCreate(string Copyright);
..................
..................
//----------------------------------------------------------------------------//
#import


Компилятор выдает следующее:

unexpected end of program
no executable file produced


А это сообщение об ошибке основного проекта (советник):

code generate error


PS

Даже если удается скомпилировать код советника он отказывается присоединяться к графику... :(

Может я что нетак делаю, есть у кого работающий пример подключения DLL или библиотек?

 
Для примера написал DLL вот с такой функцией (Borland Delphi7):
//Function WeekdayToStr
Function WeekdayToStr(Value:Integer):PChar; export; stdcall;
Begin
................
................
End;

И подключаю ее вот таким образом:

#import "DLLDemo.dll"
//----------------------------------------------------------------------------//
string WeekdayToStr(int Value);
//----------------------------------------------------------------------------//
#import

В результате компилятор выдает различные ошибки (в зависимости от компоновки заголовочного файла) .

В самом лучшем варианте советник получает вместо результата квадраты...


PS

В MT4 код работает без особых проблем

 

void OnTrade()
{

ResetLastError();
if(O_P()==false) {Comment("Не удалось освободить поток OnTrade = ", _LastError); PlaySound("alert.wav");}


if(Ttik==T_Tik) return;
T_Tik = Ttik;

ResetLastError();
if(HistoryDealSelect(Ttik, 1000)==false) Print("Ошибка получения тикета из списка сделок OnTrade = ", _LastError);

double Prof=0;

ResetLastError();
if(HistoryDealGetString(Ttik, DEAL_SYMBOL) != _Symbol) return;
//----
if(HistoryDealGetInteger(Ttik, DEAL_ENTRY) == DEAL_ENTRY_IN)
{
if(HistoryDealGetInteger(Ttik, DEAL_TIME, T_Deal)==false) Print("Не удалось выбрать время последней сделки = ", T_Deal);
}
//----
if(HistoryDealGetInteger(Ttik, DEAL_ENTRY) == DEAL_ENTRY_OUT)
{
ResetLastError();
if(HistoryDealGetDouble(Ttik, DEAL_PROFIT, Prof) ); else Print("Ошибка выбора прибыли OnTrade = ", _LastError);
Prof_D += Prof; if(Prof_D > Prof_Max) {Prof_Max = Prof_D; Prof_Min = Prof_Max - Prof_Instr;}
}
//-------

Prof_D = NormalizeDouble(Prof_D,2);
Prof_Min = NormalizeDouble(Prof_Min,2);

Comment("Прыбыль по истории сделок = OnTrade ", Prof_D, " Минимальная = ", Prof_Min);
Print("Время последней сделки = OnTrade ", T_Deal, " Тикет = ", Ttik);

Прошу объяснить следующее. Если удалить(закомментировать) выделенный код, то зафиксированная прибыль по символу будет больше, чем должна быть(контроль по окну сделок). А получается это, потомучто по торговой операции OrderSend() в функции OnTrade() генерируется сразу несколько идентичных(с одним тикетом) событий. Это так и должно быть?

 
Interesting >>:
Для примера написал DLL вот с такой функцией (Borland Delphi7):

И подключаю ее вот таким образом:

В результате компилятор выдает различные ошибки (в зависимости от компоновки заголовочного файла) .

В самом лучшем варианте советник получает вместо результата квадраты...


PS

В MT4 код работает без особых проблем

Такой код работает.

library test;

uses
  windows,
  messages;

function PrintInt(int : integer):integer; export; stdcall;
begin
result:=int*2;
end;
exports PrintInt;

begin
end.

Вызов

#import "test.dll"
int PrintInt(int Value);
void OnStart()
  {
   Print(IntegerToString(PrintInt(5)));
  }

Выполняется корректно, но вовремя компиляции выдает предупреждение, "#import closed implicitly" как сделать что бы компиляция прошла без варнингов?

Файлы:
testdll.mq5  1 kb
 
Interesting писал(а) >>
Для примера написал DLL вот с такой функцией (Borland Delphi7):

И подключаю ее вот таким образом:

В результате компилятор выдает различные ошибки (в зависимости от компоновки заголовочного файла) .

В самом лучшем варианте советник получает вместо результата квадраты...

PS

В MT4 код работает без особых проблем

Вы учитываете юникодность строк?

 

Repetition!

Как все же в 5 получить :

1) Стоимость минимального изменение цены

2) Минимальное изменение цены

запросы

SymbolInfoDouble(Symbol(),SYMBOL_TRADE_TICK_VALUE); 
SymbolInfoDouble(Symbol(),SYMBOL_TRADE_TICK_SIZE); 
выдают по нулю!
 
stringo >>:

Вы учитываете юникодность строк?

Для выполнения определенных действий и операций (в том числе для внешнего анализа данных) в MT4 я использовал собственную DLL (скомпилированную в Delphi7).

Там она прекрасно работала, причем без особых проблем.


Для совместимости с MQL (Си) прописывалась дополнительная команда stdcall;

Насколько я помню она говорит о том, что синтаксис в DLL принадлежит к стандарту Си (а не Паскаля).


Единственным изменением в заголовочном файле была смена PChar на string (что насколько я помню допускается).


Хочется посмотреть работающий пример вызова функций возвращающих по крайней мере следующие типы значений: int, string, bool и long.

Если в примере будет приведен код самой DLL, то думаю не будет большой разницы в какой среде она разрабатывалась.


PS

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

В качестве среды разработки такой DLL предлагаю использовать Borland C++ Builder, поскольку он наилучшим образом должен проилюстрировать пример.

 
betmen >>:

Такой код работает.

Вызов

Выполняется корректно, но вовремя компиляции выдает предупреждение, "#import closed implicitly" как сделать что бы компиляция прошла без варнингов?

Возможно приведенная функция и работает как положено, но число это не самое сложное что может потребоваться передать/получить.

Об обмене с Dll структурированными переменными (хотя бы в очень урезаном виде) я уже и не мечтаю. А хотелось бы иметь и такую возможность.


PS

Но проблемы с подключением DLL это еще не вся проблема заголовочных файлов, хотелось бы еще с объявлением функций обычных библиотек разобраться.

Так чтобы ошибки компилирования не вылезали по поводу и без повода.


С использованием одной функции в разных модулях тоже не очень понятно, компилятор с гордостью сообщает что он обнаружил две копии одной функции в разных модулях.


Как я понимаю библиотеки должны храниться в каталоге MQL5\Libraries и использоваться скриптами, индикаторами и советниками по мере необходимости.

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


На практике же компилятор постоянно сообщает о куче различных ошибок, примерами коих служат:

unexpected end of program
no executable file produced

code generate error

 
Interesting >>:

В качестве среды разработки такой DLL предлагаю использовать Borland C++ Builder, поскольку он наилучшим образом должен проилюстрировать пример.

Есть опасения, что это будет зря. Лучше MSVC, именно той версии, которая компилила терминал. В принципе, для dll, можно использовать и дельфи, и билдер и фрипаскаль и прочее. Но, попробуйте в билдере откомпилить пример длл из мт4 и запустить его. Если не трудно, покажите что получилось в результате.

 
ITeXPert >>:

Известно хоть примерно, когда включат Тестер стратегий в MT5?

Присоединяюсь к вопросу, необходимость уже давно назрела.

Так же интересует вопрос по поводу окончательности принятого решения оставить функцию рисования буферов в индикаторах.

Причина обращения: