Запись истории счета в файл (записывать состояние истории счета в файл каждый час)

 

Здравствуйте уважаемые коллеги.


У меня следующая проблема: в MetaTrader'e есть такая вкладка "История счета". С помощью меню можно сохранить отчет в точности тот, который на данный момент находится в этой вкладке. Но как то же самое сделать с помощью эксперта. К примеру каждый час сохранять такой отчет в текстовой файл (без html форматирования. Т.е. только данные, которые мне нужны - цена открития, время открытия и т.д.)??

 

Справочник MQL4 - Торговые функции

С помощью них все и делается.

 

У меня на данный момент уже сделано все. Вот код:

void collectData()
{
   // objavlaem peremennie
   int oTotal = 0; 
   // proveraem na suwestvovanie ordera v istorii s nomerom = i
   int i;
   // ukazatelj na fajl
   int handletxt;      
   // vsego orderov
   oTotal = OrdersHistoryTotal();
   // tip - buy ili sell
   string type;

  // o4iwaem fajl do 0 (t.k. mi znaem, cto on suwestvujet)
  // + nam nuzni tolko novie dannie, a starie nuzno steretj...
  handletxt = FileOpen("orders_history.txt", FILE_WRITE, ';');
  FileClose(handletxt);
  handletxt = 0;   
  
  // ot 0 do kol-va orderov proveraem na suwestvovanie i-order'a
  for(i=0;i<oTotal;i++)
  {
     // esli udastsa vibratj "i" order iz istorii
if(m_OSelect(i,SELECT_BY_POS,MODE_HISTORY,10000)!=-1) //delaem 10000 popitok order select'a
{
   // zapominaem nomer tiketa
   string oTicket = OrderTicket();
   // zapominaem tip sdelki (sell ili buy)
   if(OrderType()==OP_BUY)
   {
  type = "BUY";
   }
   if(OrderType()==OP_SELL)
   {
  type = "SELL";              
   }     
   // zapominaem simvol
   string sym = OrderSymbol();
   // zapominaem cenu otkritija
   double openPrice = OrderOpenPrice();
   // zapominaem cenu zakritija   
   double closePrice = OrderClosePrice();
   
   // perehodim k rabote s fajlom / zapisj dannih
   handletxt = FileOpen("orders_history.txt", FILE_READ, ';');
   
   // sozdaem fajl, esli ego vsjo-taki ne suwestvuet
   if(handletxt < 0)
   {
handletxt = FileOpen("orders_history.txt", FILE_WRITE, ';');
handletxt = FileOpen("orders_history.txt", FILE_READ, ';');
   }   
       
   // esli fajl suwestvuet, to...
   if(handletxt>0)                                                  
   {
  // esli delaem pervuju zapisj (t.e. fajl bil pust)
  if(FileSize(handletxt)==0)                                    
  {   
     // na vsakij slucaj zakrivaem fajl i otkrivaem snova
FileClose(handletxt);                                                          
handletxt=FileOpen("orders_history.txt", FILE_WRITE, ';');    
// zapisj v fajl
FileWrite(handletxt                                          
  ,type+"|"
  +sym+"|"
  +openPrice+"|"
  +closePrice+"|"               
  +oTicket
  );
     // zakrivaem fajl
FileClose(handletxt);
  }
  // esli zapisi v fajle uze estj, to...
  else                                                           
  {
// citaem fajl
string txt=FileReadString(handletxt);                                                 
int len=StringLen(txt);      
// zakladivaem v stroku vsjo to, cto nuzno seicas sohranitj v fajl
string txt1=type+"|"
+sym+"|"
+openPrice+"|"
+closePrice+"|"
+oTicket               
;          
// na vsakij slucaj zakrivaem fajl i snova otkrivaem
FileClose(handletxt);
handletxt=FileOpen("orders_history.txt", FILE_READ | FILE_WRITE, ';') ;     
// v konec fajla dopisivaem novuju informaciju
FileSeek(handletxt, 0, SEEK_END);  
FileWrite(handletxt,txt1);   
// posle zapisi zakrivaem fajl
FileClose(handletxt);                                       
handletxt = 0;
  }
   }            
}
  }
}

// funkcija, kotoraja delaet order select N raz
int m_OSelect(int ct, int sel, int pool, int Attempt)
{
   int i;
   for(i=0;i<Attempt;i++)
   {
      if( OrderSelect(ct,sel,pool)==1 )
      {         
         return(1);
      }
   }   
   
  return(-1);
  
}

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

Пример записи:

||0.00000000|0.00000000|1235660939
BUY|USDJPY|93.59000000|93.56000000|1235662509
BUY|USDJPY|93.59000000|93.56000000|1235662510
BUY|USDJPY|93.59000000|93.56000000|1235662511

В данном случае все ок, кроме 1й записи.

К тому же не понятно, почему он "не схватывает" ордера истории с 1го раза (из за этого приходится 10000 пробовать селект. Тогда обычно схватывает). По этому поводу надеюсь, что у кого-нибудь есть альтернативный код для записи текущей истории в файл. Можно даже html, как с помощью меню в метатрейдере, лишь бы это работало автоматом.

 

Мудреный какой код, надо быть проще... :)

Вот как-то так:

void start() {
   int i,count,handle,_ordertype;
   double _openprice;
//---------------------------
   handle=FileOpen("history.csv",FILE_READ|FILE_WRITE);
   count=OrdersHistoryTotal()-1;
   FileWrite(handle,"Type","OpenPrice",и т.д. все что Вам надо);  // заголовок
   for(i=count;i>=0;i--) {
      if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continue;
      _ordertype=OrderType();
      _openprice=OrderOpenPrice();
      // ... и т.д. все что Вам надо
      FileWrite(handle,_ordertype,_openprice,и т.д. все что Вам надо);
   }
   FileClose(handle);
   return;
}
 
Спасибо за ответ! Хороший и простой код. Буду пробовать. Надеюсь в файле будут отображены все ордера из истории так, как они видны из "История счета"...
 
Если не секрет -- а для чего это надо?
 

Например для публикации, для собственно контроля дилинга, да много для чего.

Хотя для контроля помимо записи по расписанию добавить ещё и по событию...

то бишь изменилось чё в ордерах, так тут-же ррраз и писанули файл... ;)

Причина обращения: