Наряду с,, той самой,, папкорй- samples- не прицепилась, бог с ним- я завел в папке MetaTrader 4 Admiral Markets папку DLLSample - VS2010
соотвественно с проэктом.
Вот файл .cpp проекта, порассматривам его и сходив пару раз в гугл и яндекс, я не обнаружил чего-то вовсе мозголомного, в целом понятно. Вроде даже просто.
Теперь он вот.
//+------------------------------------------------------------------+ //| Sample DLL for MQL4 | //| Copyright 2001-2012, MetaQuotes Software Corp. | //| http://www.metaquotes.net | //+------------------------------------------------------------------+ #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)); } //+------------------------------------------------------------------+ MT4_EXPFUNC void __stdcall Funktsja(char* say) { MessageBox(NULL,say,"Funktsja",NULL); }
Простейший робот, я как мог что-то в него внес.
//+------------------------------------------------------------------+ //| Длильный.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
Нужно разобраться с декорированием имен функций. Оно применяется для возможности перегружать функции, т.е. void f(int) и void f(double) будут иметь разные имена т.к. отличается список параметров, так случается если функция помечена как extern. Но можно экспортировать функцию в Си стиле (без перегрузки), в таком случаи пишется extern "C". Также можно отключить декорирование при помощи def файла. Существуют еще соглашения о вызовах, по умолчанию cdecl, mt4 вроде нормально работает. Попробуйте:
extern "C" void Funktsja(char* say) { MessageBox(NULL,say,"Funktsja",NULL); }
Если опять не получится, то в мета едиторе обзовите функцию как void _Funktsja(char* say)
P.s: я пользуюсь g++ а не MSVC, может у MSVC свои особенности, давно им не пользовался.
Наверное MessageBox ждет wchat_t, попробуйте MessageBoxA(NULL, say, "", MB_OK)
Спасибо!! Попробую.
У меня проект лежит в папке experts лежит весь проэкт визуал студии.
А мне, вот тут посоветовали- Примерно вот таким образом. Чтоб заработало, надо ДЛЛ откомпилировать и положить в папку experts/libraries (читайте справку и учебник, там все подробно расписано).
- У меня в папке experts лежит весь проэкт визуал студии... Откомпилировать- это же файл .exe, точно? Хотел вот скопировать его в папку либрариес... Не найду прикиньте!! Вот папка дебаг проэкта. Я уж извняюсь, тема новая.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Решил вынести в отдельную тему.Опишите пожалуста, как создавать DLL для MetaTrader 4 с помощю Microsoft Visual C++ 2010 Express, как с ее же помощю быстрее тестить, отлаживать роботов, написанных в MetaTrader 4 Admiral Markets, дополнительные всякие финты и возможности.
Отладка программ написанных в MetaTrader 4 в визуал студии, или их написание прямо в Visual C++ 2010 для испрльзования в MetaTrader 4.
По совету, нашол папку samples и пытался открыть что-нибудь в ней с помощю визуал студии. Она все пыталась что-то изменить, удалить, но ничего не смогла, или я не смог. Короче ничего не вышло.