Вопрос к разработчикам по порядку выдаваемых тиков функцией CopyTicksRange() - страница 2

 

Эффект стабильно воспроизводится в том числе на сервере "MetaQuotes-Demo" при следующих условиях:

1) Используя индикатор сохранить тики в файл (контрольный файл) и скопировать его в другую папку, чтобы избежать затирания.

2) Закрыть терминал.

3) ТОЛЬКО ДЛЯ ОПЫТНЫХ ПОЛЬЗОВАТЕЛЕЙ !!! НИКТО НЕ ВИНОВАТ, КРОМЕ ВАС, ЕСЛИ ЧТО-НИБУДЬ СЛОМАЕТЕ !!! В папке Bases терминала стереть папку с именем сервера.

4) Запустить терминал.

5) Запустить индикатор и сохранить тики в файл. Если сохраняется 0 тиков, то удалить индикатор с графика и запустить добавить его еще раз.

В новом сохраненном файле порядок тиков отличается, в том числе порядок тиков с изменением ask & bid.


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


(Предполагаю, что в дальнейшем порядок тиков может измениться, если вызвать докачку тиков из истории.)

//              Parameters
input datetime PBeginTime = D'2019.03.11 00:00';
input datetime PEndTime = D'2019.03.11 11:00';

//=====================================================================
//              Indicator properties
#property indicator_chart_window
#property indicator_buffers 0
#property indicator_plots 0

//=====================================================================

int OnInit(void)
{
        // Load ticks
        MqlTick ticks[];
        int loaded = CopyTicksRange( Symbol() , ticks , COPY_TICKS_ALL , PBeginTime * 1000 , PEndTime * 1000 );
        if ( loaded < 0 )
        {
                Print( "Error loading ticks" );
                return INIT_SUCCEEDED;
        }
        
        // Open file
        string fileName = "ticks.txt";
        int file = FileOpen( fileName , FILE_WRITE | FILE_TXT );
        if ( file == INVALID_HANDLE )
        {
                Print( "Error opening file" );
                return INIT_SUCCEEDED;          
        }
        
        // Saving ticks to file
        int nTick = ArraySize( ticks );
        for ( int iTick = 0 ;   iTick < nTick ;   iTick ++ )
        {
                datetime tickTime = ticks[ iTick ].time;
                if ( tickTime >= PBeginTime && tickTime <= PEndTime )
                        saveTick( ticks[ iTick ] , file );
        }
        
        FileClose( file );
        Print( "Saved ticks " + IntegerToString( nTick ) );
                
        return INIT_SUCCEEDED;
}

void saveTick( const MqlTick& tick , int file_handle )
{
        // Запись в файлы
        int digits = (int) SymbolInfoInteger( Symbol() , SYMBOL_DIGITS );
        FileWriteString( file_handle , msToString( tick.time_msc ) );
        FileWriteString( file_handle , "; " );
        FileWriteString( file_handle , DoubleToString( tick.ask , digits ) );
        FileWriteString( file_handle , "; " );
        FileWriteString( file_handle , DoubleToString( tick.bid , digits ) );
        FileWriteString( file_handle , "; " );
        FileWriteString( file_handle , DoubleToString( tick.last , digits ) );
        FileWriteString( file_handle , "; " );
        FileWriteString( file_handle , DoubleToString( tick.volume , digits ) );
        FileWriteString( file_handle , "; " );
        string flags;
        flags += (bool) (  tick.flags & TICK_FLAG_ASK    ) ? "a" : " ";
        flags += (bool) (  tick.flags & TICK_FLAG_BID    ) ? "b" : " ";
        flags += (bool) (  tick.flags & TICK_FLAG_LAST   ) ? "l" : " ";
        flags += (bool) (  tick.flags & TICK_FLAG_VOLUME ) ? "v" : " ";
        flags += (bool) (  tick.flags & TICK_FLAG_BUY    ) ? "B" : " ";
        flags += (bool) (  tick.flags & TICK_FLAG_SELL   ) ? "S" : " ";
        FileWriteString( file_handle , flags );
        FileWriteString( file_handle , "\n" );  
}

void OnDeinit( const int reason )
{
}

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
        return rates_total;
}

string msToString( ulong ms )
{
        return TimeToString( ms / 1000 , TIME_MINUTES | TIME_SECONDS ) + "." + IntegerToString( ms % 1000 , 3 , '0' );
}
Запуск платформы - Для продвинутых пользователей - MetaTrader 5
Запуск платформы - Для продвинутых пользователей - MetaTrader 5
  • www.metatrader5.com
По завершении установки в меню "Пуск" создается группа программ торговой платформы, а на рабочем столе дополнительно помещается ярлык программы. Используйте их для запуска. Нельзя запускать одновременно две копии платформы из одной директории. Чтобы одновременно запустить несколько копий, установите соответствующее количество программ в разные...
Файлы:
 
Разберёмся
 

Ilya Baranov:

Наблюдается перестановка тиков местами, включая тики ask & bid.

(вопреки моему предположению в первом посте о том, что их порядок сохраняется).

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


Кроме того, в определенных местах файла наблюдаю разницу в заполнении поля volume.

Обе проблемы исправлены (с порядком и объемами). Исправление будет доступно в следующем билде терминала.

Спасибо за сообщение и приложенный код!

 

Билд 2009 проблемы больше нет.

Большое спасибо разработчикам!


Единственный момент заметил - когда запрошена вся история тиков, что подкачалась на данный момент у первых тиков поля Last & Volume заполнены "0" до первого тика со сделкой. 

Проблемой это не является, но, по-моему раньше такого не было.

08:45:03.221; 66400; 66381; 0; 0; ab    

08:47:27.148; 66400; 66381; 0; 0; ab    

08:48:05.797; 66400; 66381; 0; 0;  b    

08:49:04.220; 66400; 66381; 0; 0; ab    

08:50:18.079; 66400; 66381; 0; 0; ab    

08:51:07.227; 66400; 66381; 0; 0;  b    

08:51:59.169; 66400; 66381; 0; 0; a     

08:52:02.804; 66400; 66381; 0; 0;  b    

08:54:05.815; 66400; 66381; 0; 0; ab    

08:55:54.533; 66400; 66381; 0; 0; ab    

08:56:50.035; 66400; 66381; 0; 0;  b    

08:56:57.994; 66400; 66381; 0; 0; a     

08:58:28.820; 66400; 66381; 0; 0; ab    

08:59:04.230; 66400; 66380; 0; 0;  b    

08:59:47.734; 66400; 66380; 0; 0; a     

08:59:47.734; 66400; 66339; 0; 0;  b    

08:59:47.734; 66400; 66318; 0; 0;  b    

09:00:00.001; 66400; 66318; 66380; 25;   lv S

09:00:00.001; 66400; 66318; 66372; 6;   lv S

09:00:00.001; 66400; 66318; 66372; 3;   lv S

 
Ilya Baranov:

Единственный момент заметил - когда запрошена вся история тиков, что подкачалась на данный момент у первых тиков поля Last & Volume заполнены "0" до первого тика со сделкой. 

Это логично, т.к. флага изменения ласта нет. Логичен даже вариант, когда нет той же bid-цены.