Экспорт ордеров и информации о счёте

 

День добрый,


Есть такая задачка. Пока не могу на форуме найти похожее обсуждение.

Есть внешняя система, в которую необходимо по запросу (или по заданному промежутку времени) получать данные по открытым ордерам и минимум данных о счёте. В принципе, отлавливать текущие котировки по необходимым инструментам можно и через DDE, как это было уже не раз озвучено и расписано на форуме. Остаётся вопрос только каким макаром можно из MetaTrader экспортировать информацию по открытым и вновь появившимся ордерам. Достаточно даже части информации из таблицы ордеров - номер ордера, код инструмента, время подачи заявки, время её исполнения, объём и котировка, по которой была исполнена заявка, - а сотальные показатели можно и самому легко рассчитывать. Соответственно и основную информацию о состоянии счёта (доступную маржу и тп тоже можно рассчитывать самому).

Собственно задачу тут можно разделить на 2 этапа : 1) получить данные по уже открытым ордерам 2) получать данные по вновь открытым ордерам и изменению состояния старых ордеров.

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

Вообще можэно ли каким-либо образом запрашивать у терминала эти данные? Например на терминале запущен скрипт, который постоянно слушает команды на обновление данных от внешней тулзы, собирает её и передаёт либо во внешний файл, либо сразу напрямую (через тот же DDE).

 

Собирать данные об ордерах вполне может советник.

Пишите в личку, могу сделать.

 

собирать данные может и сам терминал, вполне...

и тулзы готовые уже давно есть....

 
xrust >>:

собирать данные может и сам терминал, вполне...

и тулзы готовые уже давно есть....

Спасибо за ответ. А каким методом сам терминал может их собирать?

Просто пока не пойму, как из внешней программы передавать сигнал терминалу (и чтобы он его понимал) на экспорт этих данных во внешний файл или БД для дальнейшей обработки и отображения в стороннем приложении. Можете дать примеры или идеи как это можно реализовать? Жаль что DDE ограничивается лишь текущими котировками...

 

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

 
xrust >>:

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

Хм, спасибо за идею про WinAPI, совсем забыл, что MT его переваривает :) А почему именно советник то, а не просто скрипт? Собирать то данные по открытым позициям из таблицы поди лучше скриптом?

 
av.onuchin писал(а) >>

Хм, спасибо за идею про WinAPI, совсем забыл, что MT его переваривает :) А почему именно советник то, а не просто скрипт? Собирать то данные по открытым позициям из таблицы поди лучше скриптом?

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

 

Получите

//|    28.01.2006                                                    |
//|  Скрипт для выгрузки ордеров  в файл.       |
//+------------------------------------------------------------------+
#property copyright ""
#property link      ""
//#property show_inputs
 string   S=";";

//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
void start()
{
  string OT, st;
  int Dig=MarketInfo(Symbol(),MODE_DIGITS);
  string fn="Отчёт.csv";
  FileDelete(fn);
  st="Sym"+S+"Type"+S+"Ticket"+S+"Op_Pr"+S+"Or_Lot"+S+"Or_Mag"+S+"Or_Swap"+S+"Or_Prof"+S+"SL"+S+"TP";
  WritingLineInFile(fn, st);
      for(int r1=0;r1<OrdersTotal();r1++) //  
      {
      if(OrderSelect(r1,SELECT_BY_POS,MODE_TRADES)==false)    continue;
      {
      if (OrderType()==OP_BUY) OT="B";
      if (OrderType()==OP_SELL)OT="S";
      if (OrderType()==OP_BUYLIMIT) OT="B_L";
      if (OrderType()==OP_SELLLIMIT)OT="S_L";      
      if (OrderType()==OP_BUYSTOP) OT="B_S";
      if (OrderType()==OP_SELLSTOP)OT="S_S";
      st=StringSubstr(OrderSymbol(),0,1)+StringSubstr(OrderSymbol(),3,1)+S+OT+S+
      OrderTicket()+S+DoubleToStr(OrderOpenPrice(),Dig)+S+DoubleToStr(OrderLots(),2)+S+
      DoubleToStr(OrderMagicNumber(),0)+S+DoubleToStr(OrderSwap(),2)+S+DoubleToStr(OrderProfit(),2)+
      S+DoubleToStr(OrderStopLoss(),Dig)+S+DoubleToStr(OrderTakeProfit(),2);   
      WritingLineInFile(fn, st);
    }}}



//+------------------------------------------------------------------+
//| Запись строки в файл                                             |
//+------------------------------------------------------------------+
void WritingLineInFile(string FileName, string text)
{  
  int file_handle=FileOpen(FileName, FILE_READ|FILE_WRITE, " ");

	if (file_handle>0)
	{
		FileSeek(file_handle, 0, SEEK_END);
		FileWrite(file_handle, text);
		FileClose(file_handle);
	}
	
}
//+------------------------------------------------------------------+
Да простит меня И Ким,но обратите внимание на дату создания.
Причина обращения: