Тестируем 'CopyTicks'

 

Начнем с простого - объем. Ниже картинка с обнаруженным глюком. Периодически появляются "двойники" в объемах.


Win7-64

MT5-1085

Брокер Открытие, реальный сервер.

Основной цикл индикатора выглядит так:

//---------------------------------------------------------------------
//      Внешние задаваемые параметры:
//---------------------------------------------------------------------
input int                               TickCount = 2000;
input ENUM_TICK_TYPE                    TickType = ENUM_COPY_TICKS_ALL;
//---------------------------------------------------------------------
//---------------------------------------------------------------------
MqlTick         ticks_Arr[ ];
int             copied;
//---------------------------------------------------------------------
int
OnCalculate( const int _rates_total, const int _prev_calculated, const int _begin, const double& _price[ ] )
{
        if( _prev_calculated <= 0 )
        {
                ArrayInitialize( VolumeBuffer, 0 );
        }

        copied = CopyTicks( _Symbol, ticks_Arr, TickType, 0, TickCount );
        if( copied > 0 )
        {
                for( int i = copied - 1; i >= 0; i-- )
                {
                        MqlTick tick = ticks_Arr[ i ];

                        VolumeBuffer[ _rates_total - copied + i ] = ( double )tick.volume;
//                      Print( tick.volume );
                }
        }

        return( _rates_total );
}

Каких-то закономерностей в появлении "двойников" обнаружить не удалось. Надеюсь, разработчики оперативно исправят.

Индикатор с тиковым объемом прилагается ( скомпилирован на МТ5-1100).

Файлы:
 
Dima_S:

Начнем с простого - объем. Ниже картинка с обнаруженным глюком. Периодически появляются "двойники" в объемах.


Win7-64

MT5-1085

Брокер Открытие, реальный сервер.

Основной цикл индикатора выглядит так:

Каких-то закономерностей в появлении "двойников" обнаружить не удалось. Надеюсь, разработчики оперативно исправят.

Индикатор с тиковым объемом прилагается ( скомпилирован на МТ5-1100).

Я справлялся в сервисдеск по поводу CopyTicks() (была ошибка этой функции)

Вот ответ СД:

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

 
Mikalas:

Я справлялся в сервисдеск по поводу CopyTicks() (была ошибка этой функции)

Вот ответ СД:

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

Вам повезло, мне сервисдеск по поводу этой функции все еще не ответил...
 
Mikalas:

Я справлялся в сервисдеск по поводу CopyTicks() (была ошибка этой функции)

Вот ответ СД:

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

Понятно. Значит, пока это полуфабрикат. Подождем еще))

Не понятно другое - зачем сломали то, что уже работало - расширенный режим "стакана".

 

Пока разработчики чешутся, в смысле думают - предложу вариант структуры MqlTick.

struct MqlTick
{
  datetime   time;           // Время последнего обновления цен
  uint       time_count;     // микросекунды ( крайне желательно брать с биржи )
  double     bid;            // Текущая цена Bid
  double     ask;            // Текущая цена Ask
  double     last;           // Текущая цена последней сделки (Last)
  ulong      volume;         // Объем для текущей цены Last
  ulong      interest;       // Текущая величина ОИ, после исполнения последней сделки Last
  ulong      buy_orders;     // Текущее число ордеров покупателей, после исполнения последней сделки Last
  ulong      sell_orders;    // Текущее число ордеров продавцов, после исполнения последней сделки Last
  ulong      buy_orders_vol; // Текущий объем ордеров покупателей, после исполнения последней сделки Last
  ulong      sell_orders_vol;// Текущий объем ордеров продавцов, после исполнения последней сделки Last
  char       action;         // Действие ( 'B' - покупка, 'S' - продажа )
 };

Все остальное в функции можно оставить как есть.

 
Dima_S:

Пока разработчики чешутся, в смысле думают - предложу вариант структуры MqlTick.

Все остальное в функции можно оставить как есть.

 Класс! ! Поддерживаю! 
 
Dima_S:

Пока разработчики чешутся, в смысле думают - предложу вариант структуры MqlTick.

Все остальное в функции можно оставить как есть.

Я бы добавил направление сделки. Кто был инициатором (продавец или покупатель)
 
Prival-2:
Я бы добавил направление сделки. Кто был инициатором (продавец или покупатель)
Да, упустил - добавлено.
 
И лучше не последнее время обновления цен. Точнее наверное будет время изменения данных + добавить какой объем стоит на биде и какой на аске (возможно лучше сразу весь) стакан.
 
 Да. и возможность получать максимально глубокую накопленную сервером историю по этим всем данным через https://www.mql5.com/ru/docs/series/copyticks  и  тестпровать по ним стратегии в тестере .  Тогда  для скальперов  наступит Рай в МТ5)  А если еще по каждому   BookEvent данные стакана  накапливать - то выйдет громаднейший  размер архива, который не влезет на сервер)  
Документация по MQL5: Доступ к таймсериям и индикаторам / CopyTicks
Документация по MQL5: Доступ к таймсериям и индикаторам / CopyTicks
  • www.mql5.com
Доступ к таймсериям и индикаторам / CopyTicks - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 

зачем хранить всю историю от царя гороха на сервере. Можно ограничится разумной глубиной, к примеру за неделю. А более глубокую историю предоставлять по отдельному запросу (с файлового сервера). Хочет кто то историю стакана за 2010 год, нет проблем, скачивает её, и пусть потом тестирует на ней хоть до посинения.

при этом предоставляя её (историю) другим по технологии торрента. Решений много. Это лишь один из вариантов.