Jump to content

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


Dimka-novitsek

Recommended Posts

Dimka-novitsek

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

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

Edited by AntFX
пункт 9 правил форума
Link to post
Share on other sites
  • Replies 61
  • Created
  • Last Reply

Top Posters In This Topic

  • Dimka-novitsek

    41

  • kazakov.v

    10

  • AntFX

    10

  • Wowa

    1

Top Posters In This Topic

Popular Posts

У меня сейчас VS 2012, но вот вроде нашел проект из 2010, попробуй. Там стандартный пример из МТ4 впихнут.    

Posted Images

kazakov.v

В стандартной поставке МТ4 есть пример .dll и вызвающей .mq4. Собственно, только разобраться с передачей разных типов данных тудой-сюдой.

С отладкой - облом: отладку MQ запретили (ну, т.е. целиком МТ4 не отладить, если только одну dll-ку)


Никому верить нельзя.

Мне - можно.

 

Link to post
Share on other sites
Dimka-novitsek

Необходимо выбрать "MFC AppWizard (dll)" и вбить имя проекта в поле "Project Name"

 

У меня в студии этого нет. У меня как-то не так это организовано, написано по русски, и соотнести я не могу.

 

Попробую вставить скрин.Вотт!

post-89839-1404220558,4026_thumb.jpg

Link to post
Share on other sites
Dimka-novitsek

Фу, это я в другой форум отправлял.

Link to post
Share on other sites
kazakov.v

Ну вот выбираешь консольное приложение Win32, дальше в визарде выберешь dll, и mfc если надо (я, например mfc не использую; на кой она в консольном то приложении?)


Никому верить нельзя.

Мне - можно.

 

Link to post
Share on other sites
Dimka-novitsek

Спасибо!!!! Для начала понял.

Link to post
Share on other sites
Dimka-novitsek

Я что-то создал. Скрин приложу. как в проект добавить что-л действующее ( для обучения )? Или куда его добавить? как организоват взаимодествие с торговой платформой?

Пока глобальная задача использовать Microsoft Visual C++ 2010 Express для оптимизации кода mql4, ускорения тестирования советников. Возможность продолжать тестирование с заданной точки, сохранение его ризультатов при внезапном отключении тока.

post-89839-1404220561,9776_thumb.jpg

Link to post
Share on other sites
kazakov.v

В соседнем разделе есть начальные сведения https://alpariforum.com/showpost.php?p=2051746&postcount=32

На mql4.com (mql5.com) можно поискать - были там неплохие статьи.

 

Но вообще, сейчас уже выпустили вариант МТ4 с новым редактором и компилятором в стиле МТ5. Может есть смысл сразу в ту сторону смотреть - там будет компилироваться уже в машинный код, т.е. быстродействие должно быть на уровне. Да и отладчик свой должен работать.


Никому верить нельзя.

Мне - можно.

 

Link to post
Share on other sites
Dimka-novitsek

Спасибо!!!!!

Link to post
Share on other sites
Dimka-novitsek

Не получается сделать сходу по ссылке- то есть, по-шагово не получается, визуал студия у меня не идентична, опять таки. Пытаюсь в целом разобратья в вопросе, в том числе и пытаясь сделать что-то у себя.

Link to post
Share on other sites
kazakov.v

У меня сейчас VS 2012, но вот вроде нашел проект из 2010, попробуй.

Там стандартный пример из МТ4 впихнут.

 

 

Edited by kazakov.v
  • Downvote 1

Никому верить нельзя.

Мне - можно.

 

Link to post
Share on other sites
Dimka-novitsek

Спасибо!!!! Смотрю.

Link to post
Share on other sites
Dimka-novitsek

Спасибо!!! 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 by AntFX
цитирование кода с тегом CODE
Link to post
Share on other sites
Dimka-novitsek

Простейший робот' 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

Да, я разумеется престроил проект с помощью клавиши эф-семь.

 

Вот, щас дописал еще в ExpertSample.def Funktsja.

Link to post
Share on other sites
AntFX

Исходный код в сообщениях заключайте, пожалуйста, в теги [ CODE ] и [ /CODE ] (без пробелов), а не QUOTE. Ещё есть тег PHP, с цветовой разметкой. Это делает сообщения с большими вставками кода значительно более читаемыми.

 

как повысить репутацию на форуме? Не вижу кнопки.

Инструкция

Edited by AntFX

1

Link to post
Share on other sites
Dimka-novitsek

Да, в папке торговой платформы теперь наряду с нормальной папкой проэкта

DLLSample - VS2010 есть старая папка DLLSample которую моя студия не перестраивает. Думаю, это не играет роли?

Link to post
Share on other sites
Dimka-novitsek

Спасибо! Понял.

Link to post
Share on other sites
Dimka-novitsek

Да, я частично протупил. #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

Создаю проект с помощью визуал студии. Проэкт

post-89839-1404220575,5925_thumb.jpg

Link to post
Share on other sites
Dimka-novitsek

Дальше, я из этого проекта копирую 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

Я свой проект с нуля, что бы классно во всем разобраться. Готовый пример к стати при попытке использовать его в коде робота так же себя ведет. Как моему проекту добавить файл .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
Как моему проекту добавить файл .def ?

%2$s

%2$s

%2$s

Edited by AntFX

1

Link to post
Share on other sites
Dimka-novitsek

Спасибо!! Щас поищу.. Хотя я вроде точно так и делал. щас еще..

Link to post
Share on other sites
Dimka-novitsek

кажется, у меня такого нету, или не пойму, куда жать.

post-89839-1404220575,9427_thumb.jpg

Link to post
Share on other sites
  • Capman locked this topic
Guest
This topic is now closed to further replies.
  • Recently Browsing   0 members

    No registered users viewing this page.


×
×
  • Create New...