Dimka-novitsek 0 Share Posted December 10, 2013 (edited) Опишите пожалуста, как создавать DLL для MetaTrader 4 с помощю Microsoft Visual C++ 2010 Express, как с ее же помощю быстрее тестить, отлаживать роботов, написанных в MetaTrader 4, дополнительные всякие финты и возможности. Отладка программ написанных в MetaTrader 4 в визуал студии, или их написание прямо в Visual C++ 2010 для испрльзования в MetaTrader 4. Edited December 10, 2013 by AntFX пункт 9 правил форума Link to post Share on other sites
kazakov.v 189 Share Posted December 11, 2013 В стандартной поставке МТ4 есть пример .dll и вызвающей .mq4. Собственно, только разобраться с передачей разных типов данных тудой-сюдой. С отладкой - облом: отладку MQ запретили (ну, т.е. целиком МТ4 не отладить, если только одну dll-ку) Никому верить нельзя. Мне - можно. Link to post Share on other sites
Dimka-novitsek 0 Author Share Posted December 11, 2013 Необходимо выбрать "MFC AppWizard (dll)" и вбить имя проекта в поле "Project Name" У меня в студии этого нет. У меня как-то не так это организовано, написано по русски, и соотнести я не могу. Попробую вставить скрин.Вотт! Link to post Share on other sites
Dimka-novitsek 0 Author Share Posted December 11, 2013 Фу, это я в другой форум отправлял. Link to post Share on other sites
kazakov.v 189 Share Posted December 12, 2013 Ну вот выбираешь консольное приложение Win32, дальше в визарде выберешь dll, и mfc если надо (я, например mfc не использую; на кой она в консольном то приложении?) Никому верить нельзя. Мне - можно. Link to post Share on other sites
Dimka-novitsek 0 Author Share Posted December 12, 2013 Спасибо!!!! Для начала понял. Link to post Share on other sites
Dimka-novitsek 0 Author Share Posted December 12, 2013 Я что-то создал. Скрин приложу. как в проект добавить что-л действующее ( для обучения )? Или куда его добавить? как организоват взаимодествие с торговой платформой? Пока глобальная задача использовать Microsoft Visual C++ 2010 Express для оптимизации кода mql4, ускорения тестирования советников. Возможность продолжать тестирование с заданной точки, сохранение его ризультатов при внезапном отключении тока. Link to post Share on other sites
kazakov.v 189 Share Posted December 13, 2013 В соседнем разделе есть начальные сведения https://alpariforum.com/showpost.php?p=2051746&postcount=32 На mql4.com (mql5.com) можно поискать - были там неплохие статьи. Но вообще, сейчас уже выпустили вариант МТ4 с новым редактором и компилятором в стиле МТ5. Может есть смысл сразу в ту сторону смотреть - там будет компилироваться уже в машинный код, т.е. быстродействие должно быть на уровне. Да и отладчик свой должен работать. Никому верить нельзя. Мне - можно. Link to post Share on other sites
Dimka-novitsek 0 Author Share Posted December 13, 2013 Спасибо!!!!! Link to post Share on other sites
Dimka-novitsek 0 Author Share Posted December 13, 2013 Не получается сделать сходу по ссылке- то есть, по-шагово не получается, визуал студия у меня не идентична, опять таки. Пытаюсь в целом разобратья в вопросе, в том числе и пытаясь сделать что-то у себя. Link to post Share on other sites
kazakov.v 189 Share Posted December 13, 2013 (edited) У меня сейчас VS 2012, но вот вроде нашел проект из 2010, попробуй. Там стандартный пример из МТ4 впихнут. Edited December 13, 2013 by kazakov.v 1 Никому верить нельзя. Мне - можно. Link to post Share on other sites
Dimka-novitsek 0 Author Share Posted December 13, 2013 Спасибо!!!! Смотрю. Link to post Share on other sites
Dimka-novitsek 0 Author Share Posted December 14, 2013 (edited) Спасибо!!! ddl воспринимается визуал студией отлично. как повысить репутацию на форуме? Не вижу кнопки. Вот файл .cpp проекта, порассматривам его и сходив пару раз в гугл и яндекс, я не обнаружил чего-то вовсе мозголомного, в целом понятно. Вроде даже просто. //+------------------------------------------------------------------+ //| Sample DLL for MQL4 | //| Copyright 2001-2012, MetaQuotes Software Corp. | //| [url]http://www.metaquotes.net[/url] | //+------------------------------------------------------------------+ #define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers #include <windows.h> #include <stdlib.h> #include <stdio.h> //--- #define MT4_EXPFUNC __declspec(dllexport) //это что? //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ #pragma pack(push,1) struct RateInfo // Структура, переменные { unsigned int ctm; double open; double low; double high; double close; double vol; }; #pragma pack(pop) //--- struct MqlStr { int len; char *string // Указатель на стринг, я плохо помню. }; static int CompareMqlStr(const void *left,const void *right); //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ 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); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ MT4_EXPFUNC int __stdcall GetIntValue(const int ipar) // __stdcall кладет аргументы в стек справа налево { // MT4_EXPFUNC говорит что функция будет видима из метатрайдера, я не совсем понял. printf("GetIntValue takes %d\n",ipar); return(ipar); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ MT4_EXPFUNC double __stdcall GetDoubleValue(const double dpar) { printf("GetDoubleValue takes %.8lf\n",dpar); return(dpar); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ MT4_EXPFUNC char* __stdcall GetStringValue(char *spar) { printf("GetDoubleValue takes \"%s\"\n",spar); return(spar); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ MT4_EXPFUNC double __stdcall GetArrayItemValue(const double *arr,const int arraysize,const int nitem) { //--- if(arr==NULL) { printf("GetArrayItemValue: NULL array\n"); return(0.0); } if(arraysize<=0) { printf("GetArrayItemValue: wrong arraysize (%d)\n", arraysize); return(0.0); } if(nitem<0 || nitem>=arraysize) { printf("GetArrayItemValue: wrong item number (%d)\n", nitem); return(0.0); } //--- return(arr[nitem]); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ MT4_EXPFUNC BOOL __stdcall SetArrayItemValue(double *arr,const int arraysize,const int nitem,const double value) { //--- if(arr==NULL) { printf("GetArrayItemValue: NULL array\n"); return(FALSE); } if(arraysize<=0) { printf("GetArrayItemValue: wrong arraysize (%d)\n", arraysize); return(FALSE); } if(nitem<0 || nitem>=arraysize) { printf("GetArrayItemValue: wrong item number (%d)\n", nitem); return(FALSE); } //--- arr[nitem]=value; return(TRUE); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ MT4_EXPFUNC double __stdcall GetRatesItemValue(const RateInfo* rates,const int rates_total,const int shift,const int nrate) { //--- if(rates==NULL) { printf("GetRatesItemValue: NULL array\n"); return(0.0); } //--- if(rates_total<0) { printf("GetRatesItemValue: wrong rates_total number (%d)\n", rates_total); return(0.0); } //--- if(shift<0 || shift>=rates_total) { printf("GetRatesItemValue: wrong shift number (%d)\n", shift); return(0.0); } //--- if(nrate<0 || nrate>5) { printf("GetRatesItemValue: wrong rate index (%d)\n", nrate); return(0.0); } //--- int nitem=rates_total-1-shift; switch(nrate) { case 0: return double(rates[nitem].ctm); case 1: return rates[nitem].open; case 2: return rates[nitem].low; case 3: return rates[nitem].high; case 4: return rates[nitem].close; case 5: return rates[nitem].vol; } //--- return(0.0); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ MT4_EXPFUNC int __stdcall SortStringArray(MqlStr *arr,const int arraysize) { //--- if(arr==NULL) { printf("SortStringArray: NULL array\n"); return(-1); } if(arraysize<=0) { printf("SortStringArray: wrong arraysize (%d)\n", arraysize); return(-1); } //--- qsort(arr,arraysize,sizeof(MqlStr),CompareMqlStr); //--- return(arraysize); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ MT4_EXPFUNC int __stdcall ProcessStringArray(MqlStr *arr,const int arraysize) { int len1,len2; //--- if(arr==NULL) { printf("ProcessStringArray: NULL array\n"); return(-1); } if(arraysize<=0) { printf("ProcessStringArray: wrong arraysize (%d)\n", arraysize); return(-1); } //--- for(int i=0; i<arraysize-1; i++) { if(arr[i].string==NULL) len1=0; else len1=strlen(arr[i].string); if(arr[i+1].string==NULL) len2=0; else len2=strlen(arr[i+1].string); //--- uninitialized string if(arr[i+1].string==NULL) continue; //--- destination string is uninitialized and cannot be allocated within dll if(arr[i].string==NULL) continue; //--- memory piece is less than needed and cannot be reallocated within dll if(arr[i].len<len1+len2) continue; //--- final processing strcat(arr[i].string,arr[i+1].string); } //--- return(arraysize); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int CompareMqlStr(const void *left,const void *right) { MqlStr *leftstr=(MqlStr *)left; MqlStr *rightstr=(MqlStr *)right; //--- if(leftstr->string==NULL) return(-1); //-> вот этот знак я не знаю if(rightstr->string==NULL) return(1); //--- return(strcmp(leftstr->string,rightstr->string)); } //+------------------------------------------------------------------+ А как же это работает?? Я не совсем понял, как обращаться в эту ddl - из кода советника? Как? Во-первых, вроде так #include <GetIntValue> Нет как то не так.. 2. При вызове dll ведь не обязательно держать включенную студию, так? как же она выполняется? Edited December 14, 2013 by AntFX цитирование кода с тегом CODE Link to post Share on other sites
Dimka-novitsek 0 Author Share Posted December 14, 2013 Простейший робот' date=' я как мог что-то в него внес. //+------------------------------------------------------------------+//| Длильный.mq4 | //| Copyright 2013, MetaQuotes Software Corp. | //| http://www.metaquotes.net | //+------------------------------------------------------------------+ #property copyright "Copyright 2013, MetaQuotes Software Corp." #property link "http://www.metaquotes.net" #import "MyFirstDLL.dll" void Funktsja(string say); #import //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { //---- Funktsja ("Myi poedem, myi pomchimsya na olenyah");Print ( " Принт " ); //---- return(0); } //+------------------------------------------------------------------+ 2013.12.14 21:17:26 2006.11.02 00:00 Длильный EURUSD,H1: expert stopped 2013.12.14 21:17:26 2006.11.02 00:00 Длильный EURUSD,H1: cannot load library 'MyFirstDLL.dll' (error 126) 2013.12.14 21:17:25 Длильный test started Вот, что я дописал в файл капепе MT4_EXPFUNC void __stdcall Funktsja(char* say){ MessageBox(NULL,say,"Funktsja",NULL); } Link to post Share on other sites
Dimka-novitsek 0 Author Share Posted December 14, 2013 Да, я разумеется престроил проект с помощью клавиши эф-семь. Вот, щас дописал еще в ExpertSample.def Funktsja. Link to post Share on other sites
AntFX 6,474 Share Posted December 14, 2013 (edited) Исходный код в сообщениях заключайте, пожалуйста, в теги [ CODE ] и [ /CODE ] (без пробелов), а не QUOTE. Ещё есть тег PHP, с цветовой разметкой. Это делает сообщения с большими вставками кода значительно более читаемыми. как повысить репутацию на форуме? Не вижу кнопки. Инструкция Edited December 14, 2013 by AntFX 1 Link to post Share on other sites
Dimka-novitsek 0 Author Share Posted December 14, 2013 Да, в папке торговой платформы теперь наряду с нормальной папкой проэкта DLLSample - VS2010 есть старая папка DLLSample которую моя студия не перестраивает. Думаю, это не играет роли? Link to post Share on other sites
Dimka-novitsek 0 Author Share Posted December 14, 2013 Спасибо! Понял. Link to post Share on other sites
Dimka-novitsek 0 Author Share Posted December 15, 2013 Да, я частично протупил. #import "MyFirstDLL.dll" было скопировано просто бездумно. В общем, можно по частям? 1. Препроцессор заменяет строку #include <имя_файла> содержимым файла WinUser32.mqh- это из примера. И я вот думаю, по логике, что же мне вписать? Это не файл с расширением .cpp нет это должен быть скомпилированный файл но все же нет не .ex4 так как в проэкте визуал студии его нету и быть не может видимо скорее это файл .exe . А файл с расширением .dll это что??? Это в общем другое имя файла .exe? Стал изучать проект, что бы через свойства папки вписать себе ее правильно и имя, и расширение. И вот, смотрите , я вовсе потерялся, в проекте масса расщирений а такие расширения можно найти тольков папке дебаг моя папка и я короче вовсе растерялся, там обалдеть много всего. Ух ё, архиватор, прри попытке разбить папку на архив частями, творит невразумительное- создает одну (!!) папку __rar_03.750, она растет 5 минут по обьему, и просто исчезает из компа!!!!!! Link to post Share on other sites
Dimka-novitsek 0 Author Share Posted December 16, 2013 Создаю проект с помощью визуал студии. Проэкт Link to post Share on other sites
Dimka-novitsek 0 Author Share Posted December 16, 2013 Дальше, я из этого проекта копирую DLLproect.dll и помещаю ее в папку libraries метатрайдера. Код робота //+------------------------------------------------------------------+ //| NowiyDLL .mq4 | //| Copyright 2013, MetaQuotes Software Corp. | //| http://www.metaquotes.net | //+------------------------------------------------------------------+ #property copyright "Copyright 2013, MetaQuotes Software Corp." #property link "http://www.metaquotes.net" #import "DLLproect.dll" int fnCalculateSpeed(int &res1,double &res2); #import //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- int speed=0; int res_int=0; double res_double=0.0; speed=fnCalculateSpeed(res_int,res_double); Print("Time ",speed," msec, int: ",res_int," double: ",res_double); //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { //---- //---- return(0); } //+------------------------------------------------------------------+ Все компилируется. Но результата нету, точнее 2013.12.16 16:23:57 NowiyDLL USDCHF,M5: cannot call function 'fnCalculateSpeed' from dll 'DLLproect.dll' (error 127) Чем дополнить проект, или что куда вставить, или что? как интересно!! Link to post Share on other sites
Dimka-novitsek 0 Author Share Posted December 16, 2013 Я свой проект с нуля, что бы классно во всем разобраться. Готовый пример к стати при попытке использовать его в коде робота так же себя ведет. Как моему проекту добавить файл .def ? DLLpapka.part01.rar DLLpapka.part02.rar DLLpapka.part03.rar DLLpapka.part04.rar DLLpapka.part05.rar DLLpapka.part06.rar DLLpapka.part07.rar Link to post Share on other sites
AntFX 6,474 Share Posted December 16, 2013 (edited) Как моему проекту добавить файл .def ? %2$s %2$s %2$s Edited December 16, 2013 by AntFX 1 Link to post Share on other sites
Dimka-novitsek 0 Author Share Posted December 16, 2013 Спасибо!! Щас поищу.. Хотя я вроде точно так и делал. щас еще.. Link to post Share on other sites
Dimka-novitsek 0 Author Share Posted December 16, 2013 кажется, у меня такого нету, или не пойму, куда жать. Link to post Share on other sites
Recommended Posts