//+------------------------------------------------------------------+ //| Sample DLL for MQL4 | //| Copyright 2001-2013, 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) { 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 double __stdcall Fun_Sp() { RefreshRates(); double bid=MarketInfo(Symbol(),MODE_BID); int mnogitel=10000; double sp=NormalizeDouble(bid*mnogitel,1); return(sp); }
MT4_EXPFUNC double __stdcall Fun_Sp() { RefreshRates(); double bid=MarketInfo(Symbol(),MODE_BID); int mnogitel=10000; double sp=NormalizeDouble(bid*mnogitel,1); return(sp); }
вот эта функция не компилируеться9 что надо добавить и где хз( и как тогда добавлять свои функции в dll если они не компилються(
стоп. а как тогда функции туда добовляют а потом к советнику крепят????
Всё пишется на С++, используя его функционал. В MQL4 описываются только импортируемые функции. Затем уже в коде MQL4 используются функции, написанные в DLL.
Исходник, который Вы привели, компилируете в VS. Затем располагаете полученную dll в папке libraries терминала. А в коде MQL4 описываете (этот пример есть в папке samples\include):
#import "ExpertSample.dll" int GetIntValue(int); double GetDoubleValue(double); string GetStringValue(string); double GetArrayItemValue(double arr[],int,int); bool SetArrayItemValue(double& arr[],int,int,double); double GetRatesItemValue(double rates[][6],int,int,int); int SortStringArray(string& arr[],int); int ProcessStringArray(string& arr[],int);
так на каком языке функции т писать в с++ чтоб в mql4 читались...
мне нужно добавить функцию в мой dll
как её на с++ переписывать то?? и как её потом советник поймет
double Fun_Sp() { RefreshRates(); double bid=MarketInfo(Symbol(),MODE_BID); int mnogitel=10000; double sp=NormalizeDouble(bid*mnogitel,1); return(sp); }
так на каком языке функции т писать в с++ чтоб в mql4 читались...
мне нужно добавить функцию в мой dll
как её на с++ переписывать то?? и как её потом советник поймет
В MQL4 функции не будут "читаться". Их нужно вызывать, использовать.
Попробуйте почитать об этом здесь - https://www.mql5.com/ru/articles/18. Возможно, немного проясните для себя, что к чему.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
не компилируеться dll (
ExpertSample.cpp
c:\documents and settings\nod.d530b5b5729b406\рабочий стол\dllsample\expertsample.cpp(218): warning C4996: 'strcat': This function or variable may be unsafe. Consider using strcat_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
c:\program files\microsoft visual studio 10.0\vc\include\string.h(110): см. объявление "strcat"
c:\documents and settings\nod.d530b5b5729b406\рабочий стол\dllsample\expertsample.cpp(239): error C3861: RefreshRates: идентификатор не найден
c:\documents and settings\nod.d530b5b5729b406\рабочий стол\dllsample\expertsample.cpp(240): error C2065: MODE_ASK: необъявленный идентификатор
c:\documents and settings\nod.d530b5b5729b406\рабочий стол\dllsample\expertsample.cpp(240): error C3861: MarketInfo: идентификатор не найден
c:\documents and settings\nod.d530b5b5729b406\рабочий стол\dllsample\expertsample.cpp(240): error C3861: Symbol: идентификатор не найден
c:\documents and settings\nod.d530b5b5729b406\рабочий стол\dllsample\expertsample.cpp(241): error C2065: MODE_BID: необъявленный идентификатор
c:\documents and settings\nod.d530b5b5729b406\рабочий стол\dllsample\expertsample.cpp(241): error C3861: MarketInfo: идентификатор не найден
c:\documents and settings\nod.d530b5b5729b406\рабочий стол\dllsample\expertsample.cpp(241): error C3861: Symbol: идентификатор не найден
c:\documents and settings\nod.d530b5b5729b406\рабочий стол\dllsample\expertsample.cpp(243): error C3861: NormalizeDouble: идентификатор не найден
СБОЙ построения.
как это можно решить..
в моей функции подчеркнут RefreshRates(); красным цветом..
хотя добавил функцию в стандартный DLLSample