Стакан цен в MetaTrader 5

 
В виндовом терминале стакан цен состоит из 20 предложений по покупке и 20 по продаже, есть какой либо вариант отобразить там больше позиций?
 
mm7lmodl:
В виндовом терминале стакан цен состоит из 20 предложений по покупке и 20 по продаже, есть какой либо вариант отобразить там больше позиций?

Эти настройки делает брокер

Стакан может быть 5-20-50 котировок с каждой стороны 

 
prostotrader:

Эти настройки делает брокер

Стакан может быть 5-20-50 котировок с каждой стороны 

Благодарю!

А есть ли возможность в mql5 экспортировать этот стакан с каждым тиком? Например в CSV, например скриптом.

Есть ли в такой в природе?

 
mm7lmodl:

Благодарю!

А есть ли возможность в mql5 экспортировать этот стакан с каждым тиком? Например в CSV, например скриптом.

Есть ли в такой в природе?

Думаю что нет, но написать можно.
 
prostotrader:
Думаю что нет, но написать можно.
К кому обратиться не подскажите?
 
mm7lmodl:
К кому обратиться не подскажите?
https://www.mql5.com/ru/job
Фриланс-сервис на MQL5.com
Фриланс-сервис на MQL5.com
  • www.mql5.com
Заказы на разработку программ для трейдинга
 
Еще раз спасибо!
 
mm7lmodl:
Еще раз спасибо!
//+------------------------------------------------------------------+
//|                                               Book_collector.mq5 |
//|                                                   Copyright 2016 |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016"
#property link      "https://www.mql5.com"
#property version   "1.00"
//
struct BOOK_DATA
  {
   uint              sell_cnt;
   double            sell_price[];
   long              sell_volume[];
   uint              buy_cnt;
   double            buy_price[];
   long              buy_volume[];
  };
//
BOOK_DATA book_data;
//
int file_handle;
string file_name;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   if(!MarketBookAdd(Symbol()))
     {
      Alert("Book not added!");
      return(INIT_FAILED);
     }
   int book_depth=int(SymbolInfoInteger(Symbol(),SYMBOL_TICKS_BOOKDEPTH));
   if(book_depth>0)
     {
      ArrayResize(book_data.sell_price, book_depth);
      ArrayResize(book_data.sell_volume, book_depth);
      ArrayResize(book_data.buy_price, book_depth);
      ArrayResize(book_data.buy_volume, book_depth);
     }
   else
     {
      Alert("Book not have depth!");
      return(INIT_FAILED);
     }
   file_name=Symbol()+".csv";
   file_handle=FileOpen(file_name,FILE_WRITE|FILE_CSV);
   if(file_handle==INVALID_HANDLE)
     {
      Alert("File not created!");
      return(INIT_FAILED);
     }
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   MarketBookRelease(Symbol());
   if(file_handle!=INVALID_HANDLE)
     {
      FileClose(file_handle);
     }
  }
//+------------------------------------------------------------------+
//| Get Book data function                                           |
//+------------------------------------------------------------------+
bool GetBookData(BOOK_DATA &a_data)
  {
   a_data.buy_cnt=0;
   a_data.sell_cnt=0;
   MqlBookInfo book_price[];
//--- Get book
   if(MarketBookGet(Symbol(),book_price))
     {
      int size=ArraySize(book_price);
      if(size>0)
        {
         for(int i=0; i<size; i++)
           {
            if(book_price[i].type==BOOK_TYPE_SELL)
              {
               a_data.sell_price[a_data.sell_cnt]=book_price[i].price;
               a_data.sell_volume[a_data.sell_cnt]=book_price[i].volume;
               a_data.sell_cnt++;
              }
            else
            if(book_price[i].type==BOOK_TYPE_BUY)
              {
               a_data.buy_price[a_data.buy_cnt]=book_price[i].price;
               a_data.buy_volume[a_data.buy_cnt]=book_price[i].volume;
               a_data.buy_cnt++;
              }
           }
         return(true);
        }
     }
   return(false);
  }
//+------------------------------------------------------------------+
//| BookEvent function                                               |
//+------------------------------------------------------------------+
void OnBookEvent(const string &symbol)
  {
   if(symbol==Symbol())
     {
      if(GetBookData(book_data))
        {
         //запись данных в файл
        }
     }
  }
//+------------------------------------------------------------------+

Вот сборщик стакана, только нет записи данных в файл, т.к

не знаю в каком виде Вам нужны данные  

 
prostotrader:
//+------------------------------------------------------------------+
//|                                               Book_collector.mq5 |
//|                                                   Copyright 2016 |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016"
#property link      "https://www.mql5.com"
#property version   "1.00"
//
struct BOOK_DATA
  {
   uint              sell_cnt;
   double            sell_price[];
   long              sell_volume[];
   uint              buy_cnt;
   double            buy_price[];
   long              buy_volume[];
  };
//
BOOK_DATA book_data;
//
int file_handle;
string file_name;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   if(!MarketBookAdd(Symbol()))
     {
      Alert("Book not added!");
      return(INIT_FAILED);
     }
   int book_depth=int(SymbolInfoInteger(Symbol(),SYMBOL_TICKS_BOOKDEPTH));
   if(book_depth>0)
     {
      ArrayResize(book_data.sell_price, book_depth);
      ArrayResize(book_data.sell_volume, book_depth);
      ArrayResize(book_data.buy_price, book_depth);
      ArrayResize(book_data.buy_volume, book_depth);
     }
   else
     {
      Alert("Book not have depth!");
      return(INIT_FAILED);
     }
   file_name=Symbol()+".csv";
   file_handle=FileOpen(file_name,FILE_WRITE|FILE_CSV);
   if(file_handle==INVALID_HANDLE)
     {
      Alert("File not created!");
      return(INIT_FAILED);
     }
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   MarketBookRelease(Symbol());
   if(file_handle!=INVALID_HANDLE)
     {
      FileClose(file_handle);
     }
  }
//+------------------------------------------------------------------+
//| Get Book data function                                           |
//+------------------------------------------------------------------+
bool GetBookData(BOOK_DATA &a_data)
  {
   a_data.buy_cnt=0;
   a_data.sell_cnt=0;
   MqlBookInfo book_price[];
//--- Get book
   if(MarketBookGet(Symbol(),book_price))
     {
      int size=ArraySize(book_price);
      if(size>0)
        {
         for(int i=0; i<size; i++)
           {
            if(book_price[i].type==BOOK_TYPE_SELL)
              {
               a_data.sell_price[a_data.sell_cnt]=book_price[i].price;
               a_data.sell_volume[a_data.sell_cnt]=book_price[i].volume;
               a_data.sell_cnt++;
              }
            else
            if(book_price[i].type==BOOK_TYPE_BUY)
              {
               a_data.buy_price[a_data.buy_cnt]=book_price[i].price;
               a_data.buy_volume[a_data.buy_cnt]=book_price[i].volume;
               a_data.buy_cnt++;
              }
           }
         return(true);
        }
     }
   return(false);
  }
//+------------------------------------------------------------------+
//| BookEvent function                                               |
//+------------------------------------------------------------------+
void OnBookEvent(const string &symbol)
  {
   if(symbol==Symbol())
     {
      if(GetBookData(book_data))
        {
         //запись данных в файл
        }
     }
  }
//+------------------------------------------------------------------+

Вот сборщик стакана, только нет записи данных в файл, т.к

не знаю в каком виде Вам нужны данные  


К сожалению не владею программированием на данном языке.

Формат нужен либо CSV либо линейно записать в базу MySql.

 
mm7lmodl:


К сожалению не владею программированием на данном языке.

Формат нужен либо CSV либо линейно записать в базу MySql.

Дело не в программировании, а в каком виде Вы ходите видеть данные

в файле (CSV) 

 
prostotrader:

Дело не в программировании, а в каком виде Вы ходите видеть данные

в файле (CSV) 


На подобии того, как можно экспортировать тики из стакана цен в MetaTrader 5.

Пример:

Time,Bid,Ask,Last,Volume,Type

2016.11.26 17:29:51.913,3341.01,201.42,8771.36,349,Buy

2016.11.26 17:29:52.231,8701.04,8771.27,8771.04,144,Sell

К каждому тику нужно добавить стакан цен на момент совершения сделки, стакан цен состоит из 20 котировок в каждую сторону.

Добавить нужно объем и цену, должно получиться нечто вроде такого:

2016.11.26 17:29:51.913,3341.01,201.42,8771.36,349,Buy,31.01,100,31.01,100,31.01,100,31.01,100,31.01,100,31.01,100,31.01,100,31.01,100,31.01,100,31.01,100,31.01,100,31.01,100,31.01,100,31.01,100,31.01,100,31.01,100,31.01,100,31.01,100,31.01,100,31.01,100,31.01,100,31.01,100,31.01,100,31.01,100,31.01,100,31.01,100,31.01,100,31.01,100,31.01,100,31.01,100,31.01,100,31.01,100,31.01,100,31.01,100,31.01,100,31.01,100,31.01,100,31.01,100,31.01,100,31.01,100

2016.11.26 17:29:52.231,8701.04,8771.27,8771.04,144,Sell,31.01,100,31.01,100,31.01,100,31.01,100,31.01,100,31.01,100,31.01,100,31.01,100,31.01,100,31.01,100,31.01,100,31.01,100,31.01,100,31.01,100,31.01,100,31.01,100,31.01,100,31.01,100,31.01,100,31.01,100,31.01,100,31.01,100,31.01,100,31.01,100,31.01,100,31.01,100,31.01,100,31.01,100,31.01,100,31.01,100,31.01,100,31.01,100,31.01,100,31.01,100,31.01,100,31.01,100,31.01,100,31.01,100,31.01,100,31.01,100

Где 31.01 - это цена, а 100 это объем. (Значения одинаковые для примера)

Сначала идут 20 котировок продажи в порядке убывания а затем 20 покупки в порядке возрастания.

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