Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 774

 
fxsaber:

Спасибо, советник с этим классом откомпилировался - правда не знаю, будет ли конфликтовать...


Теперь получаю ошибку при запуске теста

2017.08.23 11:22:59.929 Core 3 2016.06.01 00:00:00   DLL loading is not allowed

2017.08.23 11:22:59.929 Core 3 global initialization failed

2017.08.23 11:22:59.929 Core 3 global initialization critical error

2017.08.23 11:22:59.929 Core 3 tester stopped because expert initialization failed


используется вызов библиотеки - в MT4 все корректно.

#import "Kernel32.dll"
bool CopyFileW(string lpExistingFileName,string lpNewFileName,bool bFailIfExists);
#import 

В чем может быть причина?

 
Aleksey Vyazmikin:

Спасибо, советник с этим классом откомпилировался - правда не знаю, будет ли конфликтовать...

Не будет.

Теперь получаю ошибку при запуске теста

2017.08.23 11:22:59.929 Core 3 2016.06.01 00:00:00   DLL loading is not allowed

2017.08.23 11:22:59.929 Core 3 global initialization failed

2017.08.23 11:22:59.929 Core 3 global initialization critical error

2017.08.23 11:22:59.929 Core 3 tester stopped because expert initialization failed


используется вызов библиотеки - в MT4 все корректно.

В чем может быть причина?

В Терминале разрешить использование DLL.

 
fxsaber:

Не будет.

В Терминале разрешить использование DLL.


Не поверите - разрешил, но эффекта небыло - видимо кэш там, который чистится через некоторое время - сейчас заработало. Спасибо.

 

Как агентов научить писать в один файл? Сейчас каждый создает свой файл в своей папке, что не хорошо.

 
Aleksey Vyazmikin:

Как агентов научить писать в один файл? Сейчас каждый создает свой файл в своей папке, что не хорошо.

Алексей, ну хоть один раз открой документацию... Там ведь всё чётко расписано какой флаг указывают на общую папку, какой открывает общий доступ к файлу. Ну не уже-ли ждать ответа проще чем прочесть документацию???

Документация по MQL5: Файловые операции
Документация по MQL5: Файловые операции
  • www.mql5.com
Файловые операции - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Aleksey Vyazmikin:

Как агентов научить писать в один файл? Сейчас каждый создает свой файл в своей папке, что не хорошо.


Сначала (Шаг 1) нужно побороть:

...  в своей папке, ...


Это делается при помощи флага FILE_COMMON - все агенты теперь будут писать в общую папку (но по прежнему каждый агент будет писать в свой файл).


Пример советника:

//+------------------------------------------------------------------+
//|                                           Agents FILE_COMMON.mq5 |
//|                              Copyright © 2017, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2017, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
//---
input int s=0;
//---
string InpFileName="";
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Initialize the generator of random numbers 
   MathSrand(GetTickCount());
   InpFileName=IntegerToString(MathRand())+".txt";
//--- open the file 
   ResetLastError();
   int file_handle=FileOpen(InpFileName,FILE_WRITE|FILE_TXT|FILE_COMMON);
   if(file_handle!=INVALID_HANDLE)
     {
      //--- the string is formed, write it to the file 
      FileWriteString(file_handle,InpFileName);
      //--- close the file 
      FileClose(file_handle);
      PrintFormat("Data is written, %s file is closed",InpFileName);
      PrintFormat("Common path for all of the terminals installed on a computer: %s",TerminalInfoString(TERMINAL_COMMONDATA_PATH));
     }
   else
     {
      PrintFormat("Failed to open %s file, Error code = %d",InpFileName,GetLastError());
      return(INIT_FAILED);
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---

  }
//+------------------------------------------------------------------+


Чтобы быстро открыть эту общую папку сделайте так: в редакторе кода MetaEditor в меню File выберите пункт "Open Common Data Folder".


Теперь запустите этот советник на оптимизацию и наблюдайте, как по мере прохождения тестов в общей папке будут создаваться новые файлы.

Файлы:
 
Vladimir Karputov:

Сначала (Шаг 1) нужно побороть:


Это делается при помощи флага FILE_COMMON - все агенты теперь будут писать в общую папку (но по прежнему каждый агент будет писать в свой файл).


Пример советника:


Чтобы быстро открыть эту общую папку сделайте так: в редакторе кода MetaEditor в меню File выберите пункт "Open Common Data Folder".


Теперь запустите этот советник на оптимизацию и наблюдайте, как по мере прохождения тестов в общей папке будут создаваться новые файлы.


В коммон не хочу, так как терминал работает в своей директории, да и много файлов, как вы говорите все равно будет, что не решает проблемы.

 
Aleksey Vyazmikin:

В коммон не хочу, так как терминал работает в своей директории, да и много файлов, как вы говорите все равно будет, что не решает проблемы.


Написано же: " ... Шаг 1 ..."

Над шагом 2 - теперь думайте сами, а именно, каким образом несколько потоков БЕЗ КОНФЛИКТОВ смогут писать в ОДИН файл.

 
Vladimir Karputov:

Написано же: " ... Шаг 1 ..."

Над шагом 2 - теперь думайте сами, а именно, каким образом несколько потоков БЕЗ КОНФЛИКТОВ смогут писать в ОДИН файл.


Да в том то и дело, что не смогут...

Я так понимаю, что сетевые агенты не могут работать с библиотеками dll?


Как то можно узнать номер прохода тестера? Что б потом склеивать файлы...

 
Aleksey Vyazmikin:

Как агентов научить писать в один файл? Сейчас каждый создает свой файл в своей папке, что не хорошо.

Для записи данных Агентов в один файл нужно использовать Фрейм-режим.

// Пример записи данных Агентов (включая Облачные) в один файл
input int Range = 0;

void OnTick()
{
// ....
}

// Файл открываем только в режимах одиночночного прогона или Фрейма.
const int handle = ((MQLInfoInteger(MQL_TESTER) && !MQLInfoInteger(MQL_OPTIMIZATION)) || MQLInfoInteger(MQL_FRAME_MODE)) ?
                   FileOpen(__FILE__, FILE_WRITE | FILE_TXT) : INVALID_HANDLE;

// Подготовка данных
void GetData( string &Str, MqlTick &Ticks[], double &Balance )
{
  Str = "Hello World!";
  
  CopyTicks(_Symbol, Ticks, COPY_TICKS_ALL, 0, 2); // Последние два тика (пример)
  
  Balance = AccountInfoDouble(ACCOUNT_BALANCE);
}

// Запись данных
void SaveData( const string &Str, const MqlTick &Ticks[], const double Balance )
{
  FileWrite(handle, Str);
  
  for (int i = 0; i < ArraySize(Ticks); i++)
    FileWrite(handle, Ticks[i].bid);
    
  FileWrite(handle, Balance);
}

void OnTesterDeinit()
{
  if (handle != INVALID_HANDLE)  
    FileClose(handle);
    
  ChartClose();
}

#include <TypeToBytes.mqh> // https://www.mql5.com/ru/code/16280

double OnTester()
{
  string Str;
  MqlTick Ticks[];
  double Balance;
  
  GetData(Str, Ticks, Balance); // Подготовка данных для записи

  if (MQLInfoInteger(MQL_OPTIMIZATION)) // Оптимизация
  {
    CONTAINER<uchar> Container; // https://www.mql5.com/ru/forum/95447/page4#comment_5464205
    
    Container[0] = Str;
    Container[1] = Ticks;
    Container[2] = Balance;
  
    FrameAdd(NULL, 0, 0, Container.Data); // Отправили данные из Агента на Терминал
  }
  else // Одиночный прогон
  {    
    if (handle != INVALID_HANDLE)
      SaveData(Str, Ticks, Balance); // Данные будут записаны в MQL5\Files-папку Агента (не Терминала)
    
    FileClose(handle);
  }
  
  return(0);
}

void OnTesterPass()
{    
  if (handle != INVALID_HANDLE)
  {
    ulong Pass;
    string Name;
    long ID;
    double Value;
  
    CONTAINER<uchar> Container; // https://www.mql5.com/ru/forum/95447/page4#comment_5464205
  
    while (FrameNext(Pass, Name, ID, Value, Container.Data))
    {
      string Str;
      MqlTick Ticks[];
      double Balance;
      
      // Получили данные от Агента
      Container[0].Get(Str);
      Container[1].Get(Ticks);
      Container[2].Get(Balance);
      
//      FileWrite(handle, Pass);     // Если хочется записать номер прохода
      SaveData(Str, Ticks, Balance); // Данные будут записаны в MQL5\Files-папку Терминала (не Агента)
    }
  }
}