Запись данных в файл - страница 2

 
Denis Danilov:
Добрый день и всех с прошедшими праздниками!! Не получается записывать данные значений профит,маржа, со всего терминала в мт4 в файл CSV. Пишет час потом сам выключается. Подскажите какой нить скриптик который мог бы писать данные в файл, какие данные записывать может уже получиться прикрутить самостоятельно. Задача такая. Нужно записывать в файл для дальнейшего анализа, такие данные как прибыль чтобы в динамике анализировать.Заранее спасибо.
Так в документации есть примеры на любой вкус. Хоть строку писать, хоть массив, хоть структуру и даже массив структур...

Если что-то не получается, код в студию и там видно будет где что не так.
FileWrite - Файловые операции - Справочник MQL4
FileWrite - Файловые операции - Справочник MQL4
  • docs.mql4.com
FileWrite - Файловые операции - Справочник MQL4
 
по задумке эта штука должна писать спред круглосуточно и профит и баланс но реально пишет только около часа и все
Файлы:
writeFile.mq4  25 kb
 
Denis Danilov:
по задумке эта штука должна писать спред круглосуточно и профит и баланс но реально пишет только около часа и все
Чтобы больше никто не мучился со скачивание кода

//+------------------------------------------------------------------+
//|                                                    writeFile.mq4 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
bool isOpenSpread = false;
bool isOpenBalance = false;
bool isOpenProfit = false;
bool checkSpread = false;
bool checkBalance = false;
bool checkProfit = false;
string             InpFileNameSpread;      // Имя файла
input string             InpDirectoryNameSpread="Data";     // Имя каталога спред
string             InpFileNameBalance;      // Имя файла
string             InpFileNameProfit;      // Имя файла
input string             InpDirectoryNameBalance="Data";     // Имя каталога баланс
input string             InpDirectoryNameProfit="Data";     // Имя каталога profit
int file_handle_spread;
int file_handle_balance;
int file_handle_profit;



//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
    InpFileNameBalance = "Balance"+_Symbol+".csv";
    InpFileNameSpread = "Spread"+_Symbol+".csv";
    InpFileNameProfit = "Profit"+_Symbol+".csv";
    ButtonCreate(0,"spread",0,25,25,100,20,CORNER_LEFT_UPPER,"CheckSpread","Arial",10,clrWhite,clrGreen,clrNONE,false,false,false,true,0);
    ButtonCreate(0,"balance",0,125,25,100,20,CORNER_LEFT_UPPER,"CheckBalance","Arial",10,clrBlack,clrGold,clrNONE,false,false,false,true,0);
    ButtonCreate(0,"profit",0,225,25,100,20,CORNER_LEFT_UPPER,"CheckProfit","Arial",10,clrWhite,clrRed,clrNONE,false,false,false,true,0);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
ObjectDelete(0,"spread");
ObjectDelete(0,"balance");
ObjectDelete(0,"profit");
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {

   //--- сначала запишем количество сигналов
      if(checkSpread && isOpenSpread) FileWrite(file_handle_spread, TimeToString(TimeCurrent(), TIME_DATE), TimeToString(TimeCurrent(), TIME_SECONDS), MarketInfo(_Symbol, MODE_SPREAD));
      if(checkBalance && isOpenBalance) FileWrite(file_handle_balance, TimeToString(TimeCurrent(), TIME_DATE), TimeToString(TimeCurrent(), TIME_SECONDS), AccountEquity());
      if(checkProfit && isOpenProfit) FileWrite(file_handle_profit, TimeToString(TimeCurrent(), TIME_DATE), TimeToString(TimeCurrent(), TIME_SECONDS), GetProfitOpenPosInCurrency());
  }
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//--- проверим событие на нажатие кнопки мышки
   if(id==CHARTEVENT_OBJECT_CLICK)
     {
      string clickedChartObject=sparam;
      //--- если нажатие на объекте с именем buttonID
      if(clickedChartObject=="spread")
        {
         //--- состояние кнопки - нажата кнопка или нет
         bool selected=ObjectGetInteger(0,"spread",OBJPROP_STATE);
         int customEventID;
         //--- если кнопка нажата
         if(selected)
           {
                file_handle_spread=FileOpen(InpDirectoryNameSpread+"//"+InpFileNameSpread,FILE_READ|FILE_WRITE|FILE_CSV);
                  if(file_handle_spread!=INVALID_HANDLE)
                    {
                     isOpenSpread = true;
                     PrintFormat("Запись...",InpFileNameSpread, isOpenSpread);
                    }
                  else{
                     isOpenSpread = false;
                     PrintFormat("Не удалось открыть файл %s, Код ошибки = %d",InpFileNameSpread,GetLastError());
                  }
               customEventID=CHARTEVENT_CUSTOM+1;
               Alert("Записываем спред");
               checkSpread = true;
           }
         else // кнопка не нажата
           {
            customEventID=CHARTEVENT_CUSTOM+999;
            Alert("Перестали записывать спреад");
            FileClose(file_handle_spread);
            checkSpread = false;
           }
         //--- отправим пользовательское событие "своему"графику
         EventChartCustom(0,customEventID-CHARTEVENT_CUSTOM,0,0,"spread");
         //--- отправим сообщение всем открытым графикам
         //--- отладочное сообщение
         Print("Отправлено событие с ID = ",customEventID);
        }
        if(clickedChartObject=="balance")
        {
         //--- состояние кнопки - нажата кнопка или нет
        
         bool selected=ObjectGetInteger(0,"balance",OBJPROP_STATE);
         int customEventID;
         //--- если кнопка нажата
         if(selected)
           {
               file_handle_balance=FileOpen(InpDirectoryNameBalance+"//"+InpFileNameBalance,FILE_READ|FILE_WRITE|FILE_CSV);
               if(file_handle_balance!=INVALID_HANDLE)
                 {
                  isOpenBalance = true;
                  PrintFormat("Запись...",InpFileNameBalance, isOpenBalance);
                 }
               else{
                  isOpenBalance = false;
                  PrintFormat("Не удалось открыть файл %s, Код ошибки = %d",InpFileNameBalance,GetLastError());
               }
               customEventID=CHARTEVENT_CUSTOM+1;
               Alert("Записываем баланс");
               checkBalance = true;
           }
         else // кнопка не нажата
           {
            customEventID=CHARTEVENT_CUSTOM+999;
            Alert("Перестали записывать баланс");
            FileClose(file_handle_balance);
            checkBalance = false;
           }
         //--- отправим пользовательское событие "своему"графику
         EventChartCustom(0,customEventID-CHARTEVENT_CUSTOM,0,0,"balance");
         //--- отправим сообщение всем открытым графикам
        
         //--- отладочное сообщение
         Print("Отправлено событие с ID = ",customEventID);
        }
        if(clickedChartObject=="profit")
        {
         //--- состояние кнопки - нажата кнопка или нет
        
         bool selected=ObjectGetInteger(0,"profit",OBJPROP_STATE);
         int customEventID;
         //--- если кнопка нажата
         if(selected)
           {
               file_handle_profit=FileOpen(InpDirectoryNameProfit+"//"+InpFileNameProfit,FILE_READ|FILE_WRITE|FILE_CSV);
               if(file_handle_profit!=INVALID_HANDLE)
                 {
                  isOpenProfit = true;
                  PrintFormat("Запись...",InpFileNameProfit, isOpenProfit);
                 }
               else{
                  isOpenProfit = false;
                  PrintFormat("Не удалось открыть файл %s, Код ошибки = %d",InpFileNameProfit,GetLastError());
               }
               customEventID=CHARTEVENT_CUSTOM+1;
               Alert("Записываем баланс");
               checkProfit = true;
           }
         else // кнопка не нажата
           {
            customEventID=CHARTEVENT_CUSTOM+999;
            Alert("Перестали записывать баланс");
            FileClose(file_handle_profit);
            checkProfit = false;
           }
         //--- отправим пользовательское событие "своему"графику
         EventChartCustom(0,customEventID-CHARTEVENT_CUSTOM,0,0,"profit");
         //--- отправим сообщение всем открытым графикам
        
         //--- отладочное сообщение
         Print("Отправлено событие с ID = ",customEventID);
        }
     }
}
//+------------------------------------------------------------------+
//| Создает кнопку                                                   |
//+------------------------------------------------------------------+
bool ButtonCreate(const long              chart_ID=0,               // ID графика
                  const string            name="Button",            // имя кнопки
                  const int               sub_window=0,             // номер подокна
                  const int               x=0,                      // координата по оси X
                  const int               y=0,                      // координата по оси Y
                  const int               width=50,                 // ширина кнопки
                  const int               height=18,                // высота кнопки
                  const ENUM_BASE_CORNER  corner=CORNER_LEFT_UPPER, // угол графика для привязки
                  const string            text="Button",            // текст
                  const string            font="Arial",             // шрифт
                  const int               font_size=10,             // размер шрифта
                  const color             clr=clrBlack,             // цвет текста
                  const color             back_clr=C'236,233,216',  // цвет фона
                  const color             border_clr=clrNONE,       // цвет границы
                  const bool              state=false,              // нажата/отжата
                  const bool              back=false,               // на заднем плане
                  const bool              selection=false,          // выделить для перемещений
                  const bool              hidden=true,              // скрыт в списке объектов
                  const long              z_order=0)                // приоритет на нажатие мышью
  {
//--- сбросим значение ошибки
   ResetLastError();
   //--- создадим кнопку
   if(!ObjectCreate(chart_ID,name,OBJ_BUTTON,sub_window,0,0))
     {
      Print(__FUNCTION__,
            ": не удалось создать кнопку! Код ошибки = ",GetLastError());
      return(false);
     }
//--- установим координаты кнопки
   ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x);
   ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y);
//--- установим размер кнопки
   ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width);
   ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height);
//--- установим угол графика, относительно которого будут определяться координаты точки
   ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner);
//--- установим текст
   ObjectSetString(chart_ID,name,OBJPROP_TEXT,text);
//--- установим шрифт текста
   ObjectSetString(chart_ID,name,OBJPROP_FONT,font);
//--- установим размер шрифта
   ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size);
//--- установим цвет текста
   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- установим цвет фона
   ObjectSetInteger(chart_ID,name,OBJPROP_BGCOLOR,back_clr);
//--- установим цвет границы
   ObjectSetInteger(chart_ID,name,OBJPROP_BORDER_COLOR,border_clr);
//--- отобразим на переднем (false) или заднем (true) плане
   ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- переведем кнопку в заданное состояние
   ObjectSetInteger(chart_ID,name,OBJPROP_STATE,state);
//--- включим (true) или отключим (false) режим перемещения кнопки мышью
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
   ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- установим приоритет на получение события нажатия мыши на графике
   ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- успешное выполнение
   return(true);
  }
   //+------------------------------------------------------------------+
//| Get current profit                                               |
//+------------------------------------------------------------------+
double GetProfitOpenPosInCurrency(string sy="", int op=-1, int mn=-1) {
  double p = 0;
  int i, k=OrdersTotal();
  for (i = 0; i < k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol() == _Symbol) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          p += OrderProfit() + OrderCommission() + OrderSwap();
        }
      }
    }
  }
  return(p);
}
 
Надо после открытия файла перевести указатель в конец файла. Иначе записываться новые строки будут поверх имеющихся.
 
Alexey Viktorov:
Надо после открытия файла перевести указатель в конец файла. Иначе записываться новые строки будут поверх имеющихся.
ну получается лучше файл не открывать,а только копировать проводить анализ,а оригинал пусть дальше пишеться новыми данными
 
Denis Danilov:
ну получается лучше файл не открывать,а только копировать проводить анализ,а оригинал пусть дальше пишеться новыми данными
Не понял. Как файл не открывать? А как в него записывать?

Вариантов масса. Использовать флаги совместного чтения и совместной записи, принудительного сбрасывания данных на диск, периодического закрытия и последующего открытия файла. Но всегда после открытия файла для записи следующей порции данных надо переводить указатель в конец файла.

FileSeek(file_handle, 0, SEEK_END);
FileSeek - Файловые операции - Справочник MQL4
FileSeek - Файловые операции - Справочник MQL4
  • docs.mql4.com
FileSeek - Файловые операции - Справочник MQL4
 
Alexey Viktorov:
Не понял. Как файл не открывать? А как в него записывать?

Вариантов масса. Использовать флаги совместного чтения и совместной записи, принудительного сбрасывания данных на диск, периодического закрытия и последующего открытия файла. Но всегда после открытия файла для записи следующей порции данных надо переводить указатель в конец файла.

FileSeek(file_handle, 0, SEEK_END);
Доброго времени суток, Алексей. Проблема не в том, что записанные уже данные затираются новыми, а в том, что при успешной записи некоторого кол-ва данных запись прекращается. Без ошибок. Без закрытия файла. Есть возможно какие то мысли как это поправить или хотя-бы почему это происходит. Есть ли лимиты на обьем записываемой информации? Заранее спасибо!
 
idanilov:
Доброго времени суток, Алексей. Проблема не в том, что записанные уже данные затираются новыми, а в том, что при успешной записи некоторого кол-ва данных запись прекращается. Без ошибок. Без закрытия файла. Есть возможно какие то мысли как это поправить или хотя-бы почему это происходит. Есть ли лимиты на обьем записываемой информации? Заранее спасибо!
Ну в принципе перед записью на диск все данные хранятся в оперативной памяти и разница объёмов говорит о многом. Может и по этому.

Я сейчас колдовал с CopyTicks(), в примере документации предложено скопировать 100 миллионов тиков. А у меня

2017.01.31 18:46:56.621 TestCopyTicks (EURUSD.m,H1)     out of memory
Методом научно-технического тыка получил что влезает только, примерно 40 миллионов.

Попробуй периодически сбрасывать на диск. Только перед каждым сбросом наверное обязательно перемещать указатель в конец файла.
FileFlush - Файловые операции - Справочник MQL4
FileFlush - Файловые операции - Справочник MQL4
  • docs.mql4.com
FileFlush - Файловые операции - Справочник MQL4
Причина обращения: