Скачать MetaTrader 5

О функции deinit() на графике и в тестере

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Подключи MQL5 Cloud Network. Начни зарабатывать!
Forex Trader
114255
Forex Trader 2006.11.10 23:22 
В продолжение обсуждения, начатого здесь: "Новый клиентский терминал MetaTrader 4 build 199"
Билд терминала 1.9.9 (07 ноября 2006)

Код эксперта для проверки:

//+------------------------------------------------------------------+
//|                                             DeinitTestExpert.mq4 |
//|                      Copyright © 2006, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

//---- input parameters
extern int N_Bars = 10; 
//---- arrays
double MySymbol_Open[]; 
double MySymbol_Close[]; 
double MySymbol_High[]; 
double MySymbol_Low[]; 
double MySymbol_Volume[]; 
//---- variables
string MySymbol_FileName;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
 {
  string sym_period; 
 //----
  if (N_Bars > Bars) { N_Bars = Bars; }
  //
  sym_period = DoubleToStr(Period(), 0);
  MySymbol_FileName = Symbol() + "_" + sym_period + "_" + N_Bars + ".csv"; 
  //
  Print("(1) Init: FileName ", MySymbol_FileName);
  //
  ArrayResize(MySymbol_Open, N_Bars); 
  ArrayInitialize(MySymbol_Open, 0.0); 
  //
  ArrayResize(MySymbol_Close, N_Bars); 
  ArrayInitialize(MySymbol_Close, 0.0); 
  //
  ArrayResize(MySymbol_High, N_Bars); 
  ArrayInitialize(MySymbol_High, 0.0); 
  //
  ArrayResize(MySymbol_Low, N_Bars); 
  ArrayInitialize(MySymbol_Low, 0.0); 
  //
  ArrayResize(MySymbol_Volume, N_Bars); 
  ArrayInitialize(MySymbol_Volume, 0.0); 
  //
  Print("(2) Init: Arrays ", N_Bars, " prepared."); 
 //----
  return(0);
 }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
 {
  int i, file_handle; 
 //----
  if (IsStopped() == true)  
   { Print("(1) Deinit: Expert stopped: ", 
           TimeToStr(TimeCurrent(), TIME_DATE|TIME_SECONDS)); } 
  //
  file_handle = FileOpen(MySymbol_FileName, FILE_CSV | FILE_WRITE); 
  //
  Print("(2) Denit: Try to write file ", MySymbol_FileName); 
  //
  for (i = N_Bars - 1; i >= 1; i--) 
   {
    FileWrite(file_handle, i);
    FileWrite(file_handle, MySymbol_Open[i]); 
    FileWrite(file_handle, MySymbol_High[i]); 
    FileWrite(file_handle, MySymbol_Close[i]); 
    FileWrite(file_handle, MySymbol_Low[i]); 
    FileWrite(file_handle, MySymbol_Volume[i]); 
   }
  FileClose(file_handle); 
  //
  Print("(3) Deinit: File ", MySymbol_FileName, " successfully written."); 
 //----
  return(0);
 }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
 {
  int i, j, k, l, m, n; 
  static bool run_once = false;
 //----
  if (run_once == false)
   {
    for (i = N_Bars - 1; i >= 1; i--)
     {
      MySymbol_Open[i]    = Open[i]; 
      MySymbol_Close[i]   = Close[i]; 
      MySymbol_High[i]    = High[i];
      MySymbol_Low[i]     = Low[i]; 
      MySymbol_Volume[i]  = Volume[i];   
     }
    Print("(0) Start: Arrays ", N_Bars, " bars completed."); 
    run_once = true; 
   }
  // for tester only: some slow abracadabra, 
  // tuned by N_Bars extern parameter
  if (IsTesting() == true)
   {
    for (i = N_Bars - 1; i >= 1; i--)
     {
      for (j = i; j >= 1; j--)
       {
        for (k = j; k >= 1; k--)
         {
          for (l = k; l >= 1; l--)
           {
            for (m = l; m >= 1; m--)
             {
              for (n = m; n >= 1; n--)
               {
                // empty operator 
               }            
             }
           }
         }
       }
     }
   }
 //----
  return(0);
 }
//+------------------------------------------------------------------+



Результаты его работы:

Тестер: естественное завершение процесса (читается снизу вверх):


2006.11.10 22:46:58 2005.05.31 23:59 DeinitTestExpert USDCHF,M15: (3) Deinit: File USDCHF_15_10.csv successfully written.
2006.11.10 22:46:58 2005.05.31 23:59 DeinitTestExpert USDCHF,M15: (2) Denit: Try to write file USDCHF_15_10.csv
2006.11.10 22:46:36 2005.05.02 00:00 DeinitTestExpert USDCHF,M15: (0) Start: Arrays 10 bars completed.
2006.11.10 22:46:36 2005.05.02 00:00 DeinitTestExpert USDCHF,M15: (2) Init: Arrays 10 prepared.
2006.11.10 22:46:36 2005.05.02 00:00 DeinitTestExpert USDCHF,M15: (1) Init: FileName USDCHF_15_10.csv
2006.11.10 22:46:36 DeinitTestExpert inputs: N_Bars=10;
2006.11.10 22:46:23 DeinitTestExpert USDCHF,M15: loaded successfully


Тестер: принудительное завершение по кнопке "Стоп" (читается снизу вверх):


2006.11.10 22:54:05 2005.05.10 21:31 DeinitTestExpert USDCHF,M15: (2) Denit: Try to write file USDCHF_15_10.csv
2006.11.10 22:53:57 2005.05.02 00:00 DeinitTestExpert USDCHF,M15: (0) Start: Arrays 10 bars completed.
2006.11.10 22:53:57 2005.05.02 00:00 DeinitTestExpert USDCHF,M15: (2) Init: Arrays 10 prepared.
2006.11.10 22:53:57 2005.05.02 00:00 DeinitTestExpert USDCHF,M15: (1) Init: FileName USDCHF_15_10.csv
2006.11.10 22:53:57 DeinitTestExpert inputs: N_Bars=10;
2006.11.10 22:53:42 DeinitTestExpert USDCHF,M15: loaded successfully


Демо: Эксперт прицеплен к демо-графику, отработал несколько тиков, затем отцеплен (читается сверху вниз):


22:53:35 Compiling 'DeinitTestExpert'
23:31:37 DeinitTestExpert USDCHF,M15: loaded successfully
23:31:37 DeinitTestExpert USDCHF,M15 inputs: N_Bars=10;
23:31:37 DeinitTestExpert USDCHF,M15: (1) Init: FileName USDCHF_15_10.csv
23:31:37 DeinitTestExpert USDCHF,M15: (2) Init: Arrays 10 prepared.
23:31:37 DeinitTestExpert USDCHF,M15: initialized
23:32:45 DeinitTestExpert USDCHF,M15: (0) Start: Arrays 10 bars completed.
23:32:45 DeinitTestExpert USDCHF,M15: (1) Deinit: Expert stopped: 2006.11.10 21:32:50
23:32:45 DeinitTestExpert USDCHF,M15: (2) Denit: Try to write file USDCHF_15_10.csv
23:32:45 DeinitTestExpert USDCHF,M15: (3) Deinit: File USDCHF_15_10.csv successfully written.
23:32:45 DeinitTestExpert USDCHF,M15: deinitialized
23:32:45 DeinitTestExpert USDCHF,M15: removed


Видно, что при естественном завершении процесса тестирования (и вообще при тестировании) некорректно отрабатывает функция IsStopped(), а при останове по кнопке "Стоп" некорректно завершается функция deinit() - запись в файл не происходит. На графике все функции срабатывают гладко, как и было задумано.

(Примечание: для теста лучше брать данные не более, чем за месяц, иначе придется слишком долго
ждать естественного завершения процесса).

Forex Trader
114255
Forex Trader 2006.11.13 12:05  
Спасибо за код. Мы проверили, действительно деинициализация не проходила до конца при принудительной остановке тестирования.

Исправление будет в ближайшем билде. Спасибо.
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий