Справочник 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; }
Например для публикации, для собственно контроля дилинга, да много для чего.
Хотя для контроля помимо записи по расписанию добавить ещё и по событию...
то бишь изменилось чё в ордерах, так тут-же ррраз и писанули файл... ;)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Здравствуйте уважаемые коллеги.
У меня следующая проблема: в MetaTrader'e есть такая вкладка "История счета". С помощью меню можно сохранить отчет в точности тот, который на данный момент находится в этой вкладке. Но как то же самое сделать с помощью эксперта. К примеру каждый час сохранять такой отчет в текстовой файл (без html форматирования. Т.е. только данные, которые мне нужны - цена открития, время открытия и т.д.)??