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

 
В продолжение обсуждения, начатого здесь: "Новый клиентский терминал 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() - запись в файл не происходит. На графике все функции срабатывают гладко, как и было задумано.

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

 
Спасибо за код. Мы проверили, действительно деинициализация не проходила до конца при принудительной остановке тестирования.

Исправление будет в ближайшем билде. Спасибо.