Файл не открывается в MQL4

Я надеялся, что кто-нибудь сможет посмотреть на мой код и сказать мне, почему он не открывает файл. Это в мета-редакторе, программе для MQL4. Все остальное работает корректно. Также никаких ошибок не выдает. Он просто не откроет файл. Значение Handle равно единице при открытии файла. Эта функция отлично работает в MQL5, но не в MQL4. Это проблема исключительно MQL4 или что-то с моим кодом?

//+------------------------------------------------------------------+
//|                                                  DailyReport.mq4 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

int OnStart()
  {

  int Handle;
  Handle = FileOpen("Indicator Output", FILE_WRITE|FILE_TXT);

  if(Handle == INVALID_HANDLE){
      Alert("Error while opening file");
      return(-1);
  }

  int count = 0;
  int end_value = count + 100;

  double open_value; 
  while (count < end_value){

   string string1, string2, string3, string4, string5, final_string;
   double values[5]; 

   values[0] = iMomentum(0, 0, 14, 0, count); //calculated at closing
   values[1] = iStochastic(0, 0, 5, 3, 3, 0, 0, 0, count);
   values[2] = iMA(0,0, 14, 0, 0, 0, count); //this is calculating at close
   values[3] = iMFI(0, 0, 14,count);
   values[4] = iOpen(0, 0, count);

   open_value = iOpen(0, 0, count + 1);

   if (values[0] >= 100){
      values[0] = 1;
   }
   else{
      values[0] = 0;
   }

   if (values[1] >= 50){
      values[1] = 1;
   }
   else{
      values[1] = 0;
   } 

   if (values[2] >= values[4]){
      values[2] = 1;
   }
   else{
      values[2] = 0;
   }   

   if (values[3] >= 50){
      values[3] = 1;
   }
   else{
      values[3] = 0;
   }   

   if (values[4] >= open_value){
      values[4] = 1;
   }
   else{
      values[4] = 0;
   }   

   string1 = IntegerToString(values[0], 1, " ");
   string2 = IntegerToString(values[1], 1, " ");
   string3 = IntegerToString(values[2], 1, " ");
   string4 = IntegerToString(values[3], 1, " ");
   string5 = IntegerToString(values[4], 1, " ");

   final_string = string1 + " " + string2 + " " + string3 + " " + string4 + " " + string5;
   printf(final_string);

   FileWrite(Handle, final_string);

   count = count + 1;
  }
  FileClose(Handle);
  return(1);
  }

person G Shank    schedule 08.10.2018    source источник


Ответы (3)


Функции File работают одинаково как в MQL4, так и в MQL5. Во-первых, вы должны проверить причину, по которой вы не можете открыть файл (иначе у вас не будет такой ошибки, как вы написали).

if(Handle==INVALID_HANDLE){
   Alert("failed to open file. error=",GetLastError());
   return;}

Далее имя файла должно быть передано с расширением, иначе могут возникнуть проблемы с его открытием в редакторе. string fileName="Индикатор Output.txt"; int handle = FileOpen (имя файла, FILE_WRITE | FILE_TXT);

Основная причина может заключаться в том, что вы открыли файл и забыли закрыть его во время работы над своим кодом. Самый простой способ проверить это — закрыть MT4, снова открыть и снова попробовать скрипт. Все открытые в МТ4 файлы закрываются при завершении работы МТ4. Если не поможет - проверьте ошибку.

person Daniel Kniaz    schedule 08.10.2018
comment
Спасибо за ваш ответ. Честно говоря, не ожидал, что так быстро получу. Вы дали мне много информации, которую я не знал о MQL4. Оказывается, файл не был сохранен там, где я думал, что он должен быть сохранен. Пришлось рыться в ПК, чтобы найти. - person G Shank; 09.10.2018

Вот несколько советов:

  • Обработчик события OnStart имеет тип void. void OnStart(){}

  • Цикл while можно улучшить с помощью цикла for

  • Вы открываете свой файл как текстовый файл без соответствующего расширения файла. то есть .txt, и вы используете FileWrite, предназначенный для CSV-файлов. Возможно, вы захотите взглянуть на документы и открыть файл как csv и использовать FileWrite так, как он предназначен, для автоматической вставки разделителей.

  • При желании вы можете использовать объект CFile для работы с файлами, поскольку он автоматически закрывает файлы.

  • Вам не нужно использовать массив для временного хранения значений индикатора. Это сбивает с толку. Вместо этого используйте описательные имена переменных.
  • тернарные операторы могут значительно упростить и сократить ваш код.

Вот как это выглядит после рефакторинга.

#property strict

#include <Files\File.mqh>
#include <stdlib.mqh>

void OnStart()
{
   CFile file;
   file.Open("indicator_output.csv", FILE_WRITE|FILE_CSV, ',');
   if(file.Handle() == INVALID_HANDLE){
      Print("FileOpenError: ", ErrorDescription(_LastError));
      return;
   }
   for(int i=0; i<100; i++){
      double mom = iMomentum(NULL, 0, 14, 0, i); //calculated at closing
      double sto = iStochastic(NULL, 0, 5, 3, 3, 0, 0, 0, i);
      double sma = iMA(NULL, 0, 14, 0, 0, 0, i); //this is calculating at close
      double mfi = iMFI(NULL, 0, 14, i);
      double open = iOpen(NULL, 0, i);
      double prev = iOpen(NULL, 0, i + 1);  
      uint row_bytes = FileWrite(file.Handle(),
         mom >= 100   ? 1 : 0,
         sto >= 50    ? 1 : 0,
         sma > open   ? 1 : 0,
         mfi >= 50    ? 1 : 0,
         open >= prev ? 1 : 0
      );
      if(row_bytes == 0){
         Print("FileWriteError: ", ErrorDescription(_LastError));
         break;
      }
   }
   Alert(StringFormat("%s written with a size of %d bytes.",
      file.FileName(),
      file.Size()
   ));
}
person nicholishen    schedule 09.10.2018

Сначала проверьте, существует ли ваш файл.

//+------------------------------------------------------------------+
//|                                                  FileIsExist.mq4 |
//|                        Copyright 2019, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
     string terminal_data_path=TerminalInfoString(TERMINAL_DATA_PATH);
     string filename     = "teste2.txt";
     int fileHandle      ;    

     if(FileIsExist(filename,0))
       {
          Print("Specified File Has");
          fileHandle     =    FileOpen(filename , FILE_WRITE|FILE_TXT);
          FileWriteString(fileHandle,"teste");  
          FileClose(fileHandle); 
          Print("Write to Existing File Completed");

       }else
          {
               Print("File Not Available, Regenerating....." );
               fileHandle     =    FileOpen(filename , FILE_READ|FILE_WRITE|FILE_TXT);
               FileWriteString(fileHandle,"Writing to Newly Created File Completed - teste     \n");  
               FileClose(fileHandle); 
               Print("Writing to Newly Created File Completed");
          }

  }
//+------------------------------------------------------------------+
person Umit Terzi    schedule 05.01.2020