Отладка прог MetaTrader 4 с помощю Microsoft Visual C++ 2010 Express.

 

Решил вынести в отдельную тему.Опишите пожалуста, как создавать DLL для MetaTrader 4 с помощю Microsoft Visual C++ 2010 Express, как с ее же помощю быстрее тестить, отлаживать роботов, написанных в MetaTrader 4 Admiral Markets, дополнительные всякие финты и возможности.

Отладка программ написанных в MetaTrader 4 в визуал студии, или их написание прямо в Visual C++ 2010 для испрльзования в MetaTrader 4.

По совету, нашол папку samples и пытался открыть что-нибудь в ней с помощю визуал студии. Она все пыталась что-то изменить, удалить, но ничего не смогла, или я не смог. Короче ничего не вышло.

 
Та самая папка
 

Наряду с,, той самой,, папкорй- 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 свои особенности, давно им не пользовался.

 
Спасибо!!!!
 
Не, пока ничего... 'char' - parameter definition expected C:\Program Files\MetaTrader 4 Admiral Markets\МЕТАТРАЙДЕР\experts\Длильный.mq4 (9, 18)
Мне в первой dll писать, могу что угодно ппутать.
 
Вот проект Не знаю, выберите файл- выбрал, внизу вроде вижу.
 

Наверное MessageBox ждет wchat_t, попробуйте MessageBoxA(NULL, say, "", MB_OK)

 

Спасибо!! Попробую.

У меня проект лежит в папке experts лежит весь проэкт визуал студии.

А мне, вот тут посоветовали- Примерно вот таким образом. Чтоб заработало, надо ДЛЛ откомпилировать и положить в папку experts/libraries (читайте справку и учебник, там все подробно расписано).

- У меня в папке experts лежит весь проэкт визуал студии... Откомпилировать- это же файл .exe, точно? Хотел вот скопировать его в папку либрариес... Не найду прикиньте!! Вот папка дебаг проэкта. Я уж извняюсь, тема новая.

 
Так вот, я может что-то совсем не так делаю. А как можно отследить происходящее буквально на каждом шагу- вот метатрайдер как-то куда-то (куда) запрос отсылает, не находит ддл... или находит, из нее тоже сообщаем... Что-то в этом духе, простите.
Причина обращения: