Скачать MetaTrader 5

Работа с File(Open:Read,Write), обработка данных из файла

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Скачай документацию одним файлом. Это просто!
Alexander Puzikov
32812
Alexander Puzikov 2011.02.18 21:13 

Доброго все времени суток!

Необходимо записать (после некоего события, в данном случае переворота, закрытия) в файл суммарный Profit

после при наступлении следующего события (подсчет результата) нужно сложить все числовые значения в файле.

Реализовал в коде следующим образом:

//=====================================================
// Закрытие или переворот
void PerClose()
{
    ...............
  
    if (!Perevorot())
      {
       Writeprofit();
       CloseALL();
      }
    else
      {
       Writeprofit();
       PerevALL();
      }
} 
//=====================================================
// запись в файл текущего профита
bool Writeprofit()
{
    if(PositionSelect(Symbol1)) double prof1=PositionGetDouble(POSITION_PROFIT);
    if(PositionSelect(Symbol2)) double prof2=PositionGetDouble(POSITION_PROFIT);
    if(PositionSelect(Symbol3)) double prof3=PositionGetDouble(POSITION_PROFIT);
    if(PositionSelect(Symbol4)) double prof4=PositionGetDouble(POSITION_PROFIT);
    double sum=prof1+prof2+prof3+prof4;
   //------------
    Profit_handle = FileOpen("profit.csv", MODE_WRITE | MODE_READ | MODE_CSV, ";");
    if(h1 < 0)
      {
       Print("Неоткрывается :-) profit.csv");
       return(false);
      }
    FileSeek(Profit_handle,0,SEEK_END);
    FileWrite(Profit_handle,sum);  
    FileClose(Profit_handle);
    return (true);
}
//=====================================================
// Чтение и суммирование всх sum
double SumSum()
{
    double sumsum;
    Profit_handle = FileOpen("profit.csv", MODE_CSV, ";");
    if(h1 < 0)
      {
       Print("Неоткрывается :-) profit.csv");
       return(0);
      }
    FileSeek(Profit_handle,0,SEEK_END);
    double s1=FileReadDouble((Profit_handle); 
    FileSeek(Profit_handle,8,SEEK_END);
    double s2=FileReadDouble((Profit_handle);
    FileSeek(Profit_handle,16,SEEK_END);
    double s3=FileReadDouble((Profit_handle); 
    и т.д.

                 
    ................ЗДЕСЬ НУЖНО СУММИРОВАТЬ ВСЕ ЧТО ЕСТЬ В ФАЙЛЕ ПОСЛЕ РАЗДЕЛИТЕЛЯ
                    

    FileClose(Profit_handle);
    return (sumsum);
  }    
Alexander Puzikov
32812
Alexander Puzikov 2011.02.19 15:19  

Есть задумка чтобы брать значение с конца

FileSeek(Profit_handle,0,SEEK_END);

запомнить его, потом указать смещение 8 (8 байт, или 1 ?),

дальше это значение записываем, и так до начала файла.

Только вот если смещение у нас 8 байт и указывать

его нужно в "for(...)" то i++ тут не сделаешь

--------------------------------------------------------------

осталось только определить сколько нужно раз

писать этот код

    FileSeek(Profit_handle,0,SEEK_END);
    double s1=FileReadDouble((Profit_handle); 
    FileSeek(Profit_handle,8,SEEK_END);
    double s2=FileReadDouble((Profit_handle);
    FileSeek(Profit_handle,16,SEEK_END);
    double s3=FileReadDouble((Profit_handle); 
    и т.д.

Alexander Puzikov
32812
Alexander Puzikov 2011.02.19 15:36  

Для определения смещения можно воспользоваться

наверно общей размерностью файла

ulong file= FileSize(Profit_handle); //получаем размер
uint=file/8;                         //выясняем сколько записей
Sergey Gritsay
6479
Sergey Gritsay 2011.02.19 22:02  
Im_hungry:

Есть задумка чтобы брать значение с конца

запомнить его, потом указать смещение 8 (8 байт, или 1 ?),

дальше это значение записываем, и так до начала файла.

Только вот если смещение у нас 8 байт и указывать

его нужно в "for(...)" то i++ тут не сделаешь

--------------------------------------------------------------

осталось только определить сколько нужно раз

писать этот код

А кто вам мешает сделать так

   ulong file=FileSize(Profit_handle);
   int n=0;
   double s[];
   ArrayResize(s,(file/8));
   for(int i=0;i<file;i+=8)
     {
      FileSeek(Profit_handle,i,SEEK_END);
      double s[n]=FileReadDouble(Profit_handle);
      n++;
     }
Sergey Gritsay
6479
Sergey Gritsay 2011.02.19 22:08  

Немного не дочитал ваш пост. Вам ведь сумма  в итоге нужна, тогда можно так

   ulong file=FileSize(Profit_handle);
   for(int i=0;i<file;i+=8)
     {
      FileSeek(Profit_handle,i,SEEK_END);
      double summa+=FileReadDouble(Profit_handle);
     }

Sergey Gritsay
6479
Sergey Gritsay 2011.02.19 22:35  

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

   while(FileIsEnding(Profit_handle))
     {
      double summa+=FileReadNumber(Profit_handle);
     }

Alexander Puzikov
32812
Alexander Puzikov 2011.02.19 23:30  

Спасибо! Буду думать над вашим кодом,

а сегодня пробовал по-другому сделать но минус в моем случае так это

нельзя будет просмотреть сколько и что там было записано, только общий результат:

С помощью этого кода:

bool WriteProf ()
{
  Profit_handle= FileOpen("profit.bin", FILE_READ|FILE_BIN);
  if(Profit_handle<0)
    {
     Print("-----Неоткрывается :-) profit.bin");
    }
  double sum=0.0;
  sum=FileReadDouble(Profit_handle);   
  double S=sum+profPerev();
  FileClose(Profit_handle);
//---------------------------  
  Profit_handle= FileOpen("profit.bin", FILE_WRITE|FILE_BIN);
  if(Profit_handle<0)
    {
     Print("-----Неоткрывается :-) profit.bin");
    }
  FileWriteDouble(Profit_handle,S); 
  FileClose(Profit_handle);
  Print("S=",S,"-----sum=",sum,"profPerev()=",profPerev());
  return (0);
}

Пытался реализовать то же самое, мы на первом шаге записываем просто 0

bool Sozdaem()
{
  if (FileIsExist("profit.bin",0)==false)
    {
     Profit_handle= FileOpen("profit.bin", FILE_WRITE|FILE_BIN);
     if(Profit_handle<0)
       {
        Print("создаем.....Неоткрывается :-) profit.bin");
       }
     double tu=0.0;  
     FileWriteDouble(Profit_handle,tu);
     Print("Создали и записали 0.0"); 
     FileClose(Profit_handle);
     return(0); 
    }
  return(0);   
}

На следующих читаем сколько там записано, а потом прибавляем к нему текущее значение, после того как

файл нам не нужен удаляем его:

//+=====================================================+//
// удаляем файл
bool Ydalaem()
{
 if (FileIsExist("profit.bin",0)==true)
   {
    FileDelete("profit.bin",0);
    Print("!!! Удалили текущий файл profit.bin");
    return(0); 
   }
 Print("!!! нет файла profit.bin");
 return(0); 
}

В итоге у меня получилось что он все время записывает и не хочет удалять,

буду теперь думать почему, а потом возьмусь за ваш вариант,

еще раз спасибки 


Alexander Puzikov
32812
Alexander Puzikov 2011.02.19 23:46  

Буду думать над вашим кодом, когда пойму что в моем не так еще рас спасибо!

логично спору нет :-)

Alexander Puzikov
32812
Alexander Puzikov 2011.02.22 06:42  
С моим вариантом все Ок, как время будет пробую твой. Всем успехов!

Alexander Puzikov
32812
Alexander Puzikov 2011.06.17 18:32  
sergey1294:

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


Вот только когда настал момент что понадобилось из файла,

где в каждой строке находится 2 значения - первое целое (хранит время в секундах)

второе дробное (цену или еще что),


Когда время (т.е. секунды) в файле совпадает с временем, текущим, используем второе значение

и выводим его. Все это я реализовал следующим образом - работает без косяков - пока :-)


double proverka()
{
 handle= FileOpen("kor.bin", FILE_BIN|FILE_READ);
 if(handle<0) Print("-----Неоткрывается :-)");
 ulong file=FileSize(handle);
 ulong N = 0.0;
 double kor = 0.0;
 datetime bar[1];
 CopyTime(Symbol_1,NULL,0,1,bar);
 ulong New = (ulong) bar[0];
 while (N < file)
  {
   kor=FileReadDouble(handle); 
   N = FileTell(handle);
   if (kor == New) 
    {
     double ss = FileReadDouble(handle);
     FileClose(handle);
     return (ss);
     break;
    }
  } 
 FileClose(handle);
 return (kor);
}
Alexander Puzikov
32812
Alexander Puzikov 2011.06.21 02:02  

По сообщениям из форума и советам знатных людей подвел итог,

работающая схема получилась такая:

записывается в индикаторе МТ4 значение времени в секундах, дальше запись значения буфера,

в мт4 реализован код так:

//======================================================================//
void init()                                       
{
  handle= FileOpen("kor.bin", FILE_BIN|FILE_READ|FILE_WRITE, ";");
  if(handle<1) Print("error",GetLastError());
  return;
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
{
  FileClose(handle);
  return(0);
}
//======================================================================//
void start()
{

.....

//------
      datetime bar = iTime(Symbol1, 0, Pos);
      Print("Buffer[Pos]...",Buffer[Pos],"...bar...",bar,"Pos...",Pos);
      if (handle>=1)
       {
        FileSeek(handle,0,SEEK_END);
        FileWriteDouble(handle,bar,DOUBLE_VALUE); 
        FileSeek(handle,0,SEEK_END);
        FileWriteDouble(handle,Buffer[Pos],DOUBLE_VALUE); 
       }
//------

.....

  }
12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий