Требуется помощь в написании DLL

 

Уважаемые господа программисты!

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

Мне необходимо написать DLL (строго на Delphi), которая будет работать совместно с моим советником. За основу можно взять советник Moving Average из стандартной поставки МТ4. Вот фрагмент расчета условия открытия позиции из этого советника:

//---- get Moving Average 
   ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);

Именно этот простейший фрагмент мне нужно реализовать в виде DLL. Иными словами, DLL должна содержать одну функцию, которая рассчитывает значение SMA с заданным периодом, и возвращать это значение в советник при вызове этой функции. Входными параметрами должны являться:

  • Период SMA (N)
  • Массив (таймсерия), содержащий N последних цен закрытия.

Цель - чисто образовательная. Мне нужен академически правильный код DLL, который позволит понять следующие вещи:

  • Как правильно должен выглядеть проект DLL под MT4 на Delphi (имею опыт только в создании приложений)
  • Как следует передавать массивы ценовых данных из советника в DLL

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


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

На выходе хотелось бы получить следующее:

  • Фрагменты кода советника, где определяются библиотечные функции и происходит их вызов
  • DLL, осуществляющую отправку запроса на сервер, получение ответа и передачу его в советник
  • Рекомендации по реализации серверной части средствами PHP (если это возможно), приоритет - максимальное быстродействие

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


P.S. Чтобы снять возможные вопросы, скажу сразу - алгоритм торговой системы раскрыт не будет, во всех примерах будем реализовывать расчет SMA по ценам закрытия N часовых баров.


 
Patrol >>:

Мое мнение, не важно на чем делается DLL

прелесть увязки как раз в том, что не важно на чем написана DLL

но я вас понимаю - если знаете PASCAL - ( т е DELPHI ) то логично искать именно на базе PASCAL

---

риторический вопрос:

язык PASCAL конечно хорош

но почему разработчики выбрали именно СИ мт4 мт5 написанны на Си

---

второй риторический:

особенно мне "нравится" отсутствие в классическом PASCAL конструкции goto - причем - команда jmp есть в каждом микропроцессоре

все эти бредни с программированием без goto ... не убедительны пока в микропроцессорах есть команда jmp

вот если выпустят микропроцессор без jmp - тогда другой разговор

--

третий риторический:

PASCAL изначально был создан как язык для обучения студентов

Язык си изначально был создан для иных задач

Операционная система UXIX со всем ее клонами написана на си

Операционная система MS DOS была написана на си

Операционная система WINDOWS была написана на си

практически все драйвера написаны на си

Язык системного программирования = СИ

итак - умнейший человек планеты Билл Гейтц тоже выбирает Си

--

правда мне нравится в PASCAL контроль типов на уровне компиляции и другие которых к примеру нет в Си

хотя современны компиляторы Си уже решают часть проблем своих предков

--

код на Си - в иде asm получается чуть короче и как правило быстрее кода asm pascall

--

по существу вопроса не помогу - пишу на Си

 
Patrol >>:
  • DLL, осуществляющую отправку запроса на сервер, получение ответа и передачу его в советник

а зачем самописная DLL? пусть клиент сам и обращается на сервер средставим MQL и стандартной билиотеки винды...

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

использовать систем закрытого типа в этом случае не рекомендую. делайте всё только на базе стандартной виндовой библиотеки.

Фиг его знает, что вы засунете в DLL и будете отправлять на свой сервак.

Если у клиента возникнут подозрения на счёт взлома или кражи инфы вы же первый и пострадаете.

 
YuraZ >>:

Мое мнение, не важно на чем делается DLL

прелесть увязки как раз в том, что не важно на чем написана DLL

но я вас понимаю - если знаете PASCAL - ( т е DELPHI ) то логично искать именно на базе PASCAL

---

риторический вопрос:

язык PASCAL конечно хорош

но почему разработчики выбрали именно СИ мт4 мт5 написанны на Си

---

второй риторический:

особенно мне "нравится" отсутствие в классическом PASCAL конструкции goto - причем - команда jmp есть в каждом микропроцессоре

все эти бредни с программированием без goto ... не убедительны пока в микропроцессорах есть команда jmp

вот если выпустят микропроцессор без jmp - тогда другой разговор

--

третий риторический:

PASCAL изначально был создан как язык для обучения студентов

Язык си изначально был создан для иных задач

Операционная система UXIX со всем ее клонами написана на си

Операционная система MS DOS была написана на си

Операционная система WINDOWS была написана на си

практически все драйвера написаны на си

Язык системного программирования = СИ

итак - умнейший человек планеты Билл Гейтц тоже выбирает Си

--

правда мне нравится в PASCAL контроль типов на уровне компиляции и другие которых к примеру нет в Си

хотя современны компиляторы Си уже решают часть проблем своих предков

--

код на Си - в иде asm получается чуть короче и как правило быстрее кода asm pascall

--

по существу вопроса не помогу - пишу на Си



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

Ну скажем как Английский и Немецкий...

Все остальное дело вкуса. Что касаемо Pascal язык для студентов, то и C++ изучают студенты, так что С++ такой же язык для студентов.

А вообще эта тема из разряда что лучше Windows или Unix... Каждому свое.

 

YuraZ писал(а) >>

итак - умнейший человек планеты Билл Гейтц тоже выбирает Си


Ото ж оно чо, Михалыч! (с) "Наша Раша" :)

1.Про умнейшего - собственно, кто и чем мерил?

2.Вообще-то он не выбирал Си, это сделал несколько другой человек и далеко не с самого начала - у мелкософта существовал свой Паскаль-компилятор и первые версии "оконцев" как раз таки на Паскале были написаны. Собственно, некоторые "ноги", образно выражаясь, до сих пор торчат. :)

3.Вот уж чего не ожидал - дык это от вас холивара на тему Паскаль vs Си. Хорошо рабочая неделя начинается. :)))

 

library SYN;

uses
  SysUtils,
  windows,
  Classes;

{$R *.res}

function Time_Sleep(SL:Integer):Integer; stdcall ;
begin
Sleep(SL);
Result:=1;
end;

exports Time_Sleep;
begin
end.

Так выглядит элементарный DLL на Делфи.

Объявляем в MQL

#import "SYN.dll"
int Time_Sleep(int T);
#import

..................

Так к нему обращаются из MQL.

int R=Time_Sleep(T);

Желаю успехов.








 
YuraZ >>:

Мое мнение, не важно на чем делается DLL

прелесть увязки как раз в том, что не важно на чем написана DLL

но я вас понимаю - если знаете PASCAL - ( т е DELPHI ) то логично искать именно на базе PASCAL

---

риторический вопрос:

язык PASCAL конечно хорош

но почему разработчики выбрали именно СИ мт4 мт5 написанны на Си


(...)

YuraZ, после Вашего поста появилось желание изучить-таки Си, но всё-таки мне по духу ближе Pascal, я вон даже в MQL4 все переменные заранее объявляю ;)

Да и видимо в душе я вечный студент )))

 

Azzx писал(а) >>

3.Вот уж чего не ожидал - дык это от вас холивара на тему Паскаль vs Си. Хорошо рабочая неделя начинается. :)))

Да какой холивар? Абсолютно разные весовые категории. А вначале сам за паскаль был обеими руками... А сейчас... убогий язык.

Только вот сравнивать надо с С++, а не с С.

 
sergeev >>:

а зачем самописная DLL? пусть клиент сам и обращается на сервер средставим MQL и стандартной билиотеки винды...

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

использовать систем закрытого типа в этом случае не рекомендую. делайте всё только на базе стандартной виндовой библиотеки.

Фиг его знает, что вы засунете в DLL и будете отправлять на свой сервак.

Если у клиента возникнут подозрения на счёт взлома или кражи инфы вы же первый и пострадаете.

sergeev, как-то не подумал об этом, спасибо!

Моя беда в том, что я пока слабо представляю архитектуру клиент-серверного приложения применительно к торговому эксперту, в частности, ищу ответы на вопросы:

  • Какие системные библиотеки следует использовать для отправки запроса на сервер?
  • Нужно ли передавать при каждом запросе ценовые массивы или лучше как-то организовать их регулярное обновление на сервере?
  • Можно ли реализовать серверную часть средствами PHP и как это сделать?

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

Напомню, на выходе нужно получить простейший торговый советник, открывающий позиции на пересечении ценой SMA, но расчет этой SMA должен происходить на сервере.

 
zhuki >>:

library SYN;

uses
SysUtils,
windows,
Classes;

{$R *.res}

function Time_Sleep(SL:Integer):Integer; stdcall ;
begin
Sleep(SL);
Result:=1;
end;

exports Time_Sleep;
begin
end.

Так выглядит элементарный DLL на Делфи.

Объявляем в MQL

#import "SYN.dll"
int Time_Sleep(int T);
#import

..................

Так к нему обращаются из MQL.

int R=Time_Sleep(T);

Желаю успехов.

zhuki

Да, это оно! Спасибо, теперь есть по крайней мере отчего оттолкнуться.

Однако очень важный вопрос остался. В Вашем примере передается один параметр типа int. Мне же надо передать два - период SMA (int) и массив с ценами (array of double) для ее расчета.

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

Буду очень благодарен за указание направления, в котором следует копать ;)

 
Patrol >>:


  • Какие системные библиотеки следует использовать для отправки запроса на сервер?

wininet.dll

  • Нужно ли передавать при каждом запросе ценовые массивы или лучше как-то организовать их регулярное обновление на сервере?

нет. на сервер от клиента можно передавать только запрос-требование для вычисления чего-либо. Всё остальное делаетcя на MQL.

  • Можно ли реализовать серверную часть средствами PHP и как это сделать?

ну в принципе PHP и надо :) Всё зависит от того, что вам надо делать на сервере: контроль времени подписки клиента, просто передача/получение каких-то данных, или ещё что либо, ведение базы данных клиентов/запросов/сигналов. короче тема обширная. Объясните сначала что конкретно вы хотите от этого экспа и этой системы.

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