импорт из DLL - страница 3

 
GSB:
alexjou:
Вот нашел у себя в архиве написанный во времена оны индикатор полностью на MQL. Выкладываю исходник и свежетранслированный. Подробнее о DCT-преобразовании
Александр
Спасибо что откликнулись на мою просьбу.
Вообще суть просьбы была в другом.
Я сам не программист, но на работе мне написали DLL, вписав Ваши коды в пример из поставки МТ - sample_DLL. Я попробовал написать индикатор и у меня получается, что DLL доступна программе, а вот функция не вызывается GetDiffrDCTS(), о чем пишется в лог файл.
Я никогда еще не писал индикаторы с использованием DLL, и поэтому попросил Вас привести пример данного индикатора на mql именно с использованием DLL. Потом уже было место к размышлению и самостоятельному творчеству.

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

Поэтому вопросов, если не сложно будет ответить, два.
Все же, если есть пример индикаторов с использованием DLL, то скиньте для обучения, можно фрагменты кодов на С++ от того что используется. (gsb51@mail.ru)

И все же, перерисовывается ли DCT во времени или это моя ошибка при написании индикатора.

С уважением
Сергей
Сергей, никакой Вашей ошибки здесь нет. Индикатор интегральный, он пересчитывается на всем множестве заданных баров каждый раз при вызове. Перерисовывается целиком исключительно для упрощения записи кода. Он и не предназначен для торговли он-лайн, а только для анализа, т.к. дает очень гладкие кривые без запаздывания. По поводу С - в файле *.срр в директивах препроцессора должна быть строчка #define MT4_EXPFUNC __declspec(dllexport), тем самым будут экспортироваться функции с идентификатором MT4_EXPFUNC (либо любым другим на Ваше усмотрение, главное, чтобы он везде был один и тот же). Вот начало файла проекта:
// DCTSmoothing.cpp : Defines the entry point for the DLL application. // #include "stdafx.h" #include "DCTSmoothing.h" #include "math.h" #include "stdio.h" #include "stdlib.h" #include <iostream> using namespace std; // #define MT4_EXPFUNC __declspec(dllexport) // BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; } // // ---- FLOAT POINT CONSTANTS ---- #define PI 3.1415926535 // pi #define EPS 0.000000001 // 1e-09 // // ---- FIXED POINT CONSTANTS ---- #define NN_MAX 750 // #define NN_MIN 10 // // double x[NN_MAX]; // чтобы не возиться с динамическим выделением памяти double y[NN_MAX]; // -- // -- // ... // ... дальше функции DCT преобразования //*************************************************************************// ///////////////////////////////////////////////////////////////////////////// //+-----------------------------------------------------------------------+// //|Ïðÿìîå äèñêðåòíîå êîñèíóñ-ïðåîáðàçîâàíèå (DCT) x[] --> y[] |// //+-----------------------------------------------------------------------+// ///////////////////////////////////////////////////////////////////////////// /* Âõîäíûå ãëîáàëüíûå ïåðåìåííûå: double x[] // âõîäíîé ìàññèâ Âõîäíûå ëîêàëüíûå ïåðåìåííûå: int n_bars // ïîëíîå ÷èñëî áàðîâ äëÿ DCT-ïðåîáðàçîâàíèÿ Âûõîäíûå ëîêàëüíûå ïåðåìåííûå: íåò Âûõîäíûå ãëîáàëüíûå ïåðåìåííûå: double y[] // ìàññèâ ãàðìîíèê */ void DCT(int n_bars, double x [], double y []) { int k; // ñ÷åò÷èê ñòðîê ìàòðèöû êîýôôèöèåíòîâ int n; // ñ÷åò÷èê ñòîëáöîâ ìàòðèöû êîýôôèöèåíòîâ double sum; // íàêîïèòåëü double PIN2 = PI / (n_bars * 2.0); double wgt_zero = 1.0 / sqrt(n_bars); // âåñ ïðè 0-ì êîýôôèöèåíòå double wgt_nzero = sqrt(2.0) * wgt_zero; // âåñ ïðè âñåõ îñòàëüíûõ //---- // dct-ïðåîáðàçîâàíèå for (k = 0; k < n_bars; k++) { // öèêë ïî k sum = 0.0; // îáíóëÿåì íàêîïèòåëü for (n = 0; n < n_bars; n++) { sum += x[n] * cos(PIN2 * (2.0 * n + 1.0) * k); } // öèêë ïî n if (k != 0) { y[k] = wgt_nzero * sum; } else { y[k] = wgt_zero * sum; } } // öèêë ïî k //---- return; } // //*************************************************************************// ///////////////////////////////////////////////////////////////////////////// //+-----------------------------------------------------------------------+// //| Îáðàòíîå äèñêðåòíîå êîñèíóñ-ïðåîáðàçîâàíèå (IDCT) y[] --> x[] |// //+-----------------------------------------------------------------------+// ///////////////////////////////////////////////////////////////////////////// /* Âõîäíûå ãëîáàëüíûå ïåðåìåííûå: double y[] // ìàññèâ ãàðìîíèê Âõîäíûå ëîêàëüíûå ïåðåìåííûå: int n_bars // ïîëíîå ÷èñëî áàðîâ äëÿ DCT-ïðåîáðàçîâàíèÿ Âûõîäíûå ëîêàëüíûå ïåðåìåííûå: íåò Âûõîäíûå ãëîáàëüíûå ïåðåìåííûå: double x[] // âûõîäíîé ìàññèâ */ void IDCT(int n_bars, double x [], double y []) { int k; // ñ÷åò÷èê ñòðîê ìàòðèöû êîýôôèöèåíòîâ int n; // ñ÷åò÷èê ñòîëáöîâ ìàòðèöû êîýôôèöèåíòîâ double sum; // íàêîïèòåëü double PIN2 = PI / (n_bars * 2.0); double wgt_zero = 1.0 / sqrt(n_bars); // âåñ ïðè 0-ì êîýôôèöèåíòå double wgt_nzero = sqrt(2.0) * wgt_zero; // âåñ ïðè âñåõ îñòàëüíûõ //---- // idct-ïðåîáðàçîâàíèå for (n = 0; n < n_bars; n++) { // öèêë ïî n sum = 0.0; // îáíóëÿåì íàêîïèòåëü for (k = 0; k < n_bars; k++) { // öèêë ïî k if (k != 0) { sum += wgt_nzero * y[k] * cos(PIN2 * (2.0 * n + 1.0) * k); } else { sum += wgt_zero * y[k] * cos(PIN2 * (2.0 * n + 1.0) * k); } } // öèêë ïî k x[n] = sum; } // öèêë ïî n //---- return; } // //*************************************************************************// ///////////////////////////////////////////////////////////////////////////// //+-----------------------------------------------------------------------+// //| Âû÷èñëåíèå ëåâîé ÷àñòè óðàâíåíèÿ y[] --> y[] (äèôôðàêöèîííîå ÿäðî) |// //+-----------------------------------------------------------------------+// ///////////////////////////////////////////////////////////////////////////// /* Âõîäíûå ãëîáàëüíûå ïåðåìåííûå: double y[] // ìàññèâ ãàðìîíèê Âõîäíûå ëîêàëüíûå ïåðåìåííûå: int n_bars // ïîëíîå ÷èñëî áàðîâ äëÿ ðàñ÷åòà double eye // ðàçìåð "îêíà" double alfa // ïàðàìåòð ðåãóëÿðèçàöèè Âûõîäíûå ëîêàëüíûå ïåðåìåííûå: íåò Âûõîäíûå ãëîáàëüíûå ïåðåìåííûå: double y[] // ìàññèâ çíà÷åíèé ëåâîé ÷àñòè óðàâíåíèÿ */ void GetDiffrLeftSide(int n_bars, double eye, double alfa, double y []) { double kern; // double omega; // double domega; // double omega2; // 1 + omega^2 double delta = 2.0 * PI / (n_bars - 1); int i; //---- for (i = 0; i < n_bars; i++) { omega = i * delta; domega = omega * eye; omega2 = 1.0 + omega * omega; // 1. + omega^2 kern = (sin(domega) + EPS) / (domega + EPS); // sin(arg)/arg y[i] = (kern * y[i]) / (kern * kern + alfa * omega2); } //---- return; } // //*************************************************************************// ///////////////////////////////////////////////////////////////////////////// //+-----------------------------------------------------------------------+// //| Ëèíåéíîå ñãëàæèâàíèå ìàññèâà x[] ïî 5 òî÷êàì; ðåçóëüòàò - y[] |// //+-----------------------------------------------------------------------+// ///////////////////////////////////////////////////////////////////////////// /* Âõîäíûå ãëîáàëüíûå ïåðåìåííûå: double x[] // âõîäíîé ìàññèâ - àðãóìåíò; Âõîäíûå ëîêàëüíûå ïåðåìåííûå: int n_beg // íîìåð íà÷àëüíîãî áàðà int n_end // íîìåð êîíå÷íîãî áàðà Âûõîäíûå ëîêàëüíûå ïåðåìåííûå: íåò Âûõîäíûå ãëîáàëüíûå ïåðåìåííûå: double y[] // âûõîäíîé ìàññèâ - îòâåò; */ void GetSmooth5(int n_beg, int n_end, double x [], double y []) { int i; //---- y[n_beg] = (3.0 * x[n_beg] + 2.0 * x[n_beg+1] + x[n_beg+2] - x[n_beg+4]) / 5.0; y[n_beg+1] = (4.0 * x[n_beg] + 3.0 * x[n_beg+1] + 2.0 * x[n_beg+2] + x[n_beg+3]) / 10.0; for (i = n_beg + 2; i < n_end - 2; i++) { y[i] = (x[i-2] + x[i-1] + x[i] + x[i+1] + x[i+2]) / 5.0; } y[n_end-2] = (x[n_end-4] + 2.0 * x[n_end-3] + 3.0 * x[n_end-2] + 4.0 * x[n_end-1]) / 10.0; y[n_end-1] = (3.0 * x[n_end-1] + 2.0 * x[n_end-2] + x[n_end-3] - x[n_end-5]) / 5.0; //---- return; } // //*************************************************************************// //#########################################################################// //# ÝÊÑÏÎÐÒÈÐÓÅÌÛÅ ÏÎ MT4_EXPFUNC ÔÓÍÊÖÈÈ #// //#########################################################################// //*************************************************************************// // //*************************************************************************// ///////////////////////////////////////////////////////////////////////////// //+-----------------------------------------------------------------------+// //| Ñãëàæèâàíèå ìåòîäîì DCT-ïðåîáðàçîâàíèÿ (áåç çàïàçäûâàíèÿ) |// //+-----------------------------------------------------------------------+// ///////////////////////////////////////////////////////////////////////////// /* Âõîäíûå ãëîáàëüíûå ïåðåìåííûå: double x[] // íåñãëàæåííûé ìàññèâ çíà÷åíèé àðãóìåíòà (öåíà); Âõîäíûå ëîêàëüíûå ïåðåìåííûå: int n_bars // ïîëíîå ÷èñëî áàðîâ äëÿ ïðåîáðàçîâàíèÿ int dct_on // ìåòîä ñãëàæèâàíèÿ: 1 - DCT, 0 - èíòåðïîëÿöèîííîå (5 òî÷åê) double eye // ðàçìåð "îêíà" double alfa // ïàðàìåòð ðåãóëÿðèçàöèè Âûõîäíûå ëîêàëüíûå ïåðåìåííûå: int nn_tot // ÷èñëî ñãëàæåííûõ áàðîâ Âûõîäíûå ãëîáàëüíûå ïåðåìåííûå: double x[] // îòâåò - ñãëàæåííûé ìàññèâ çíà÷åíèé àðãóìåíòà; */ MT4_EXPFUNC int __stdcall GetSmoothing (int nn_tot, int dct_on, double eye, double alfa, double x []) { int err_code = 0; // êîä îøèáêè int i; // ñ÷åò÷èê // // ########################### Error Definitions ########################### // *** Îøèáêà: åñëè ïðåâûøåíî ìàêñèìàëüíîå ÷èñëî áàðîâ, âûõîä *** if (nn_tot > NN_MAX) { err_code = -1; return(err_code); } // *** Îøèáêà: äëÿ ïðåîáðàçîâàíèÿ çàäàíî ñëèøêîì ìàëî áàðîâ, âûõîä *** if (nn_tot < NN_MIN) { err_code = -2; return(err_code); } // *** Îøèáêà: ïàðàìåòð alfa = 0 ïðè eye <> 0, âûõîä *** if ((alfa == 0.0) && (eye != 0.0)) { err_code = -3; return(err_code); } // *** Îøèáêà: ïàðàìåòð eye_size < 0, âûõîä *** if (eye < 0.0) { err_code = -4; return(err_code); } // *** Îøèáêà: ïàðàìåòð eye_alfa < 0, âûõîä *** if (alfa < 0.0) { err_code = -5; return(err_code); } // ######################################################################### // //---- // if (dct_on <= 0) { dct_on = 0; } if (dct_on >= 1) { dct_on = 1; } if (dct_on == 1) { DCT (nn_tot, x, y); // x[] --> y[] GetDiffrLeftSide (nn_tot, eye, alfa, y); // y[] --> y[] IDCT (nn_tot, x, y); // y[] --> x[] GetSmooth5 (0, nn_tot, x, y); // x[] --> y[] for (i = 0; i < nn_tot; i++) { x[i] = y[i]; } // y[] --> x[] } else { GetSmooth5 (0, nn_tot, x, y); // x[] --> y[] for (i = 0; i < nn_tot; i++) { x[i] = y[i]; } // y[] --> x[] } // //---- err_code = nn_tot; return(err_code); } //

(русский текст в комментариях см. тот форум)
Кроме того, к проекту должен быть присоединен файл DCTSmoothing.def - обычный текстовый файл, содержащий следующий текст:
LIBRARY <имя_проекта>
EXPORTS <список_имен_экспортируемых_функций>
т.е. в нашем случае:
LIBRARY DCTSmoothing EXPORTS GetSmoothing

Дальше все вместе компилируется в DCTSmoothing.dll. Посмотрите еще пример ExpertSample.dll и руководство по Вашему С-компилятору. Разбирайтесь. Удачи!
 
Александр спасибо огромное, теперь есть над чем поработать и поучиться работать с DLL.
Еще пару вопросов. Для чего вставлять в заголовок #include "DCTSmoothing.h".
И что за параметр int dct_on поскольку в предыдущей редакции его не было, а коментарий в данной версии не читается.
С уважением
Сергей
 
GSB:
Александр спасибо огромное, теперь есть над чем поработать и поучиться работать с DLL.
Еще пару вопросов. Для чего вставлять в заголовок #include "DCTSmoothing.h".
И что за параметр int dct_on поскольку в предыдущей редакции его не было, а коментарий в данной версии не читается.
С уважением
Сергей
Забыл упомянуть - как и разработчики МТ, я пользуюсь Microsoft Visual C++ 6.0. Файл DCTSmoothing.h - это файл заголовка препроцессора, требуемый Стандартом С. Его создаст и включит в проект сам Мастер создания проектов С++ (Project Wizard) при выборе типа проекта "Dynamic Link Library" с названием проекта DCTSmoothing. В настройках при создании проекта на вопрос Мастера "Which type of DLL should be created?" надо из списка выбрать опцию "DLL that exports some symbols". После этого ничего в сгенерированном мастером файле заголовка не меняйте, равно как и в сгенерированном файле *.срр. Просто добавьте в файл *.срр вышеприведенный код. Все необходимые для препроцессора объявления уже в нем сделаны, хоть это и не совсем по правилам. Просто MSVC допускает значительную свободу выбора в этом, а также и во многих других вопросах. Но здесь же заключается и абсолютное большинство трудностей у начинающих при недостатке опыта. Поэтому сначала советую посмотреть какую-нибудь литературу именно по языку С, а затем уже переходить к С++, внимательнейше изучив руководство по Вашему компилятору. Особо хотел бы подчеркнуть, что потребуется упорный самостоятельный труд, поскольку С++ - не самое простое из средств разработки, хотя, скорее всего, и самое мощное, исключая разве что только Ассемблер. К счастью, литературы и по С, и по С++ - море, в том числе и изданной у Вас в Питере издательством "БХВ-Петербург".
По поводу параметра dct_on - вот комментарии на русском языке (после очередного эксперимента очередной раз в компиляторе С++ слетела кириллица, сейчас восстанавливаю):
/* Входные глобальные переменные: double x[] // несглаженный массив значений аргумента (цена); Входные локальные переменные: int n_bars // полное число баров для преобразования int dct_on // метод сглаживания: 1 - DCT, 0 - интерполяционное (5 точек) double eye // размер "окна" double alfa // параметр регуляризации Выходные локальные переменные: int nn_tot // число сглаженных баров Выходные глобальные переменные: double x[] // ответ - сглаженный массив значений аргумента; */

Код функции интерполяционного сглаживания по 5 точкам GetSmooth5() приводил выше, а раньше и на том (основном?) форуме. Значение dct_on = 1 на самом деле означает "и DCT-сглаживание, и интерполяционное", dct_on = 0 - "только интерполяционное". Словом, дерзайте, пробуйте, изучайте, и все у Вас получится!
 
RickD:
Все уже давно проверено лично.
Про тип стринг - их внутренний тип данных они конечно не очень написали, чем некоторых товарищей запутали. Есть ведь много типов стринг, которые не их внутренний тип данных.

если ни чего за последние 10 лет не изменилось, то есть 2 типа стрингов.

1) zero-terminated. состоит из строки и добавленного в конце символа 00h

2) "паскалевский", ( не знаю как правильно назвать.) состоит из байта длины самым первым символом, затем идёт сама строка.

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

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

сомневаюсь, что кому-то надо менять эту систему, переписывая компиляторы....

 

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


За последние годы кое-что все-таки изменилось. Юникод, это отдельная песня. UCS16, 32, кодировка UTF-8 (16, 32) - число байт на символ не постоянно, а, грубо говоря, зависит от языка.
 

Не получается импортировать DLL. (((

В MS Visual C++ написал DLL:

//MyDll.h

#define MY_EXPORT extern "C" __declspec ( dllexport )
MY_EXPORT int CALLBACK Return1();

//MyDll.cpp

MY_EXPORT int CALLBACK Return1() { return 1; }

//MyDll.def

LIBRARY "MyDll"

EXPORTS Return1 @1

После компиляции получил MyDll.dll и MyDll.lib

Также написал микро прогу на C++ использующую DLL. В настройках проекта указал MyDll.lib. Она нормально работает с DLL.

Далее попробовал импорт DLL из MT4, положив в директорию experts\libraries файл MyDll.dll. В документации ничего про *.lib я не нашел поэтому его не клал.
//ImportDll.mqh (в директории experts\include)
#import "MyDll.dll"

int Return1();

//ImportDll.mq4 (в директории experts\indicators)
#include <ImportDll.mqh>
int init()

{

Print("Return1="+Return1());

return (0);
}

При запуске ImportDll.ex4 пришет: dll calls are not allowed; 'MyDll.dll' - 'Return1'
ПОМОГИТЕ .... я уже мосх сломал ((((((((((((((((((((((((( Мой ICQ: 573794562, e-mail: AKalashnikov84@mail.ru.

 

Nado razreshit import DLL (kak pokazano na risunke vnizu):


[X] Allow DLL import


 

импорт DLL разрешен... не помогает (((

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