Всё ещё актуально.
Перепробовал, вроде бы, все способы вывода параметров из DLL на freepascal, но почти все приводят к ошибке терминала:
Способы, которые к ошибке не приводят, данные не передают.
Код проекта для Lazarus и скрипт для проверки прилагаю. Подойдёт любой способ передачи массива, даже самый дурацкий (кроме "через файл" и т.п. медленные способы).
Всё ещё актуально.
Перепробовал, вроде бы, все способы вывода параметров из DLL на freepascal, но почти все приводят к ошибке терминала:
Способы, которые к ошибке не приводят, данные не передают.
Код проекта для Lazarus и скрипт для проверки прилагаю. Подойдёт любой способ передачи массива, даже самый дурацкий (кроме "через файл" и т.п. медленные способы).
Ответ на самом деле простой, если только вы знаете как передавать указател из MQ4,
А в длл-ке должна быть запись такого вида:
type TDoubleArray = array of Double;
PDoubleArray = ^TDoubleArray;
function SMA100(close: PDoubleArray; size: integer): double; stdcall; export; var i: integer; begin Result := 0; for i := 0 to size - 1 do Result := Result + close^[i]; Result := Result / size; close^[0] := -1; end;И все, должно работать!
Как я обрадовался... ведь я примерно то же самое пробовал, но немного по-другому, думал - ну вот оно! Но вот облом, терминал всё равно критическую ошибку показал =(
Или... а что Вы имеете в виду под передачей указателя в MQ4?
Насколько я понял, при использовании double& как раз указатель передается. Или нет? Нужно как-то по-другому?
Как я обрадовался... ведь я примерно то же самое пробовал, но немного по-другому, думал - ну вот оно! Но вот облом, терминал всё равно критическую ошибку показал =(
Или... а что Вы имеете в виду под передачей указателя в MQ4?
Насколько я понял, при использовании double& как раз указатель передается. Или нет? Нужно как-то по-другому?
Описанный мной подход верен на 99%, на практике сам использую работу обмена данных только через указатели.
Скорей всего проблема непосредственно в самом фри-паскале. Помниться я тоже хотел переписать один проект на фри-паскале и как раз это была длл-ка. Уж не помню из-за чего, но от этой затеи пришлось отказаться.
Советую вам обратиться на официальный форум по фри-паскалю, может вам дадут дельный совет там.
Успехов.
Думаю, никак не связано. Имеется в виду вызов вообще не из терминала, а вообще из другой программы.
Это способ проверки того, что именно не работает, - dll на freepascal (в моей реализации :) ) или связка с ней из MT.
Пока времени не было проверить. Как проверю - отпишу сюда.
У меня этот пример, который выше, в zip-е - отлично работает, ни каких ошибок.
Ver: MT4 - 223, FPC - 2.2.4
кроме того, поменял в паскалевском файле строчку {$mode objfpc}{$H+} на {$mode delphi}{$H+}
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Ранее мной была написана DLL на Delphi 7, пример функции:
соответственно использование в MQL4:
Это работало - sma рассчитывался, содержимое массива менялось.
Сейчас нужно перейти на Lazarus (free pascal), но в нём своя интерпретация параметров const, из-за чего нельзя с ними работать на запись, компилятор ругается на указанную строку.
Прошу совета по данному вопросу.
P.S. Здесь привел тестовый пример функции, в которой мало смысла. В действительности функции сложнее, вынос которых в DLL полностью оправдан.