Оптимальное значение для onTimer()

 
Добрый день, назрел такой вопрос: у меня есть мультивалютные советники, в котором использую onTimer с интервалом 100msc для обхода валютных пар (до пяти пар на один советник). Имеет ли смысл уменьшать интервал меньше 100msc или это излишне? 
 
Pavlo Minakov:
Добрый день, назрел такой вопрос: у меня есть мультивалютные советники, в котором использую onTimer с интервалом 100msc для обхода валютных пар (до пяти пар на один советник). Имеет ли смысл уменьшать интервал меньше 100msc или это излишне? 
Зависит от частоты поступления тиков. А она в свою очередь зависит от инструмента, дня недели, времени суток ...
 
Alexander Sevastyanov #:
Зависит от частоты поступления тиков. А она в свою очередь зависит от инструмента, дня недели, времени суток ...
Это понятно, мне интересно, может кто-то на практике имел опыт для разных сценариев?
 

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

Вариант рабочий. Я это делал, но каждый инструмент даёт разные результаты при одинаковых параметрах. То-есть при одних параметрах инструмент_1 даёт прибыль, а инструмент_2 убытки. Поменяли параметры и ситуация совсем противоположная… По этой причине я отказался от этой затеи и сделал этот советник для работы только с тем инструментом на график которого установлен.

 
Pavlo Minakov:
Добрый день, назрел такой вопрос: у меня есть мультивалютные советники, в котором использую onTimer с интервалом 100msc для обхода валютных пар (до пяти пар на один советник). Имеет ли смысл уменьшать интервал меньше 100msc или это излишне? 
Если вы работаете только на Форекс, то меньше 100 мс делать нет смысла. Все равно время исполнения на сервере считается отличным, если 300 мс. А есть брокеры, которые не дают закрывать прибыльные сделки минутами! 
У меня скальперы работают по OnTimer с частотой дискретизации 1 Гц и я считаю это оптимальным с точки зрения нагрузки на CPU и пропуском несущественных данных. HFT в данное время на форе это фантастика, надо быть реалистом. Вот нашел свой старый советник, должен писать даные в файл, не проверял
------------------
//+------------------------------------------------------------------+
//|                                                    SaveTicks.mq5 |
//|                                               Alexey Volchanskiy |
//|                                            http://mql.gnomio.com |
//+------------------------------------------------------------------+
#property copyright "Alexey Volchanskiy"
#property link      "http://mql.gnomio.com"
#property version   "1.01"
#property description "SaveTicks save tick data for multiple symbols in files"

enum ESelectSymbols 
{
    EAllSymbols,        //All symbols
    EMarketWatchSymbols,//MarketWatch symbols
    ELoadFromFile       //Load list of symbols from file
};

enum EFormatRecording
{
    ECsv,   //CSV
    EBin,   //Binary
    EAll    //CSV+Binary
};

enum EFormatTime
{
    EServerTime,    //Server time, 1 sec precision
    ELocalTime    //Local windows time, 1 ms precision
};

input int               TimerMsInterval = 500;                      //Recording interval 
input ESelectSymbols    SelectSymbols   = EMarketWatchSymbols;      //The symbols chosen as...
input string            SymbolsFileName = "InputSymbolList.txt";    //Name of file with all symbol names  
input EFormatRecording  FormatRecording = ECsv;                     //Format recording
input EFormatTime       FormatTime      = EServerTime;              //Time format

string SymbolList[];
int FileSymbolCsv[];
int FileSymbolBin[];
int FileSymbolList;

int OnInit()
{
    if(CreateSymbolList() == -1)
        ExpertRemove();
    EventSetMillisecondTimer(TimerMsInterval);
    return(INIT_SUCCEEDED);
}

void OnDeinit(const int reason)
{
    EventKillTimer();
    for(int n = 0; n < ArraySize(SymbolList); n++)
    {
        FileClose(FileSymbolCsv[n]);
        FileClose(FileSymbolBin[n]);
    }    
}

void OnTimer()
{
    static string dt;
    static SYSTEMTIME st;
    static MqlTick mt;

    if(FormatTime == ELocalTime)
        dt = TimeToString(TimeLocal(), TIME_DATE|TIME_MINUTES|TIME_SECONDS);
    else
        dt = TimeToString(TimeCurrent(), TIME_DATE|TIME_MINUTES|TIME_SECONDS);
    for(int n = 0; n < ArraySize(SymbolList); n++)
    {
        if(!SymbolInfoTick(SymbolList[n], mt))
            return;
        if(FormatRecording == ECsv || FormatRecording == EAll)
        {
            if(FileSymbolCsv[n] == INVALID_HANDLE)
                return;
            FileWrite(FileSymbolCsv[n], dt, mt.bid, mt.ask);
        }    
        if(FormatRecording == EBin || FormatRecording == EAll)
        {
            if(FileSymbolBin[n] == INVALID_HANDLE)
                return;
            if(FormatTime == ELocalWinAPI)
            {
                FileWriteStruct(FileSymbolBin[n], st);
                FileWriteStruct(FileSymbolBin[n], mt);
            }
            else    
            {
                FileWriteLong(FileSymbolBin[n], TimeCurrent());
                FileWriteStruct(FileSymbolBin[n], mt);
            }
        }    
    }
   
}

int CreateSymbolList()
{
    int stotal = 0;
    if(SelectSymbols == ELoadFromFile)
        stotal = LoadSymbolList(SymbolsFileName);
    else    
    {
        stotal = SymbolsTotal((bool)SelectSymbols);
        ArrayResize(SymbolList, stotal);
    }    
    ArrayResize(FileSymbolCsv, stotal);
    ArrayResize(FileSymbolBin, stotal);
    for(int n = 0; n < stotal; n++)
    {
        if(SelectSymbols != ELoadFromFile)
            SymbolList[n] = SymbolName(n, (bool)SelectSymbols);
        string fname = SymbolList[n] + "_" + MQLInfoString(MQL_PROGRAM_NAME);
        if(FormatRecording == ECsv || FormatRecording == EAll)
        {
            FileSymbolCsv[n] = FileOpen(fname + ".csv", FILE_WRITE | FILE_READ | FILE_SHARE_READ | FILE_CSV | FILE_ANSI, ',');
            if(FileSymbolCsv[n] == INVALID_HANDLE)
            {
                Alert("Can't open file " + fname, "Error of opening file");
                return -1;
            }
            FileSeek(FileSymbolCsv[n], 0, SEEK_END);
        }    
        if(FormatRecording == EBin || FormatRecording == EAll)
        {
            FileSymbolBin[n] = FileOpen(fname + ".bin", FILE_WRITE | FILE_READ | FILE_SHARE_READ | FILE_BIN);
            if(FileSymbolBin[n] == INVALID_HANDLE)
            {
                Alert("Can't open file " + fname, "Error of opening file");
                return -1;
            }
            FileSeek(FileSymbolBin[n], 0, SEEK_END);
        }    
    }    
    return SaveSymbolList();    
}

int SaveSymbolList()
{
    string fname = "AllSymbols_" + MQLInfoString(MQL_PROGRAM_NAME) + ".txt";
    int file = FileOpen(fname, FILE_WRITE | FILE_TXT);
    if(file == INVALID_HANDLE)
    {
        Alert("Can't open file " + fname, "Error of opening file");
        return -1;
    }
    FileWrite(file, IntegerToString(ArraySize(SymbolList)));
    for(int n = 0; n < ArraySize(SymbolList); n++)
        FileWrite(file, SymbolList[n]);
    FileClose(file);    
    return ArraySize(SymbolList);
} 

int LoadSymbolList(string fname)
{
    int file = -1;
    file = FileOpen(fname, FILE_READ | FILE_TXT);
    if(file == INVALID_HANDLE)
    {
        Alert("Can't open file " + fname);
        return -1;
    }
    int size = (int)StringToInteger(FileReadString(file));
    Print("size=", size);
    if(size > 0)
        ArrayResize(SymbolList, size);
    else
    {
        Alert("First string <size> is incorrect in file " + fname);
        return -1;
    }
    for(int n = 0; n < ArraySize(SymbolList); n++)
    {
        SymbolList[n] = FileReadString(file);
        Print(SymbolList[n]);
    }
    FileClose(file);    
    return size;
}
 
Pavlo Minakov:
Добрый день, назрел такой вопрос: у меня есть мультивалютные советники, в котором использую onTimer с интервалом 100msc для обхода валютных пар (до пяти пар на один советник). Имеет ли смысл уменьшать интервал меньше 100msc или это излишне? 

а померь сколько времени занимает твой OnTimer, "обход пар" и сколько прочие и как часто они вызываются, сколько всё занимает в сумме с таймером и без

от этой статистики и прикинь

----

PS/ но это относится не непосредственно к OnTimer, а к тому как часто из него можно дёргать "обход валютных пар" не порушив всё прочее.
Сам по себе OnTimer вполне можно ставить и на 50 или даже 20msc, а в нём простые+быстрые проверки "не пора ли запустить то, или сё" 

 
Maxim Kuznetsov #:
Сам по себе OnTimer вполне можно ставить и на 50 или даже 20msc
Можно и на 10.
А меньше 10 не получится, всё равно интервал будет 10msc.
 
Pavlo Minakov:
Добрый день, назрел такой вопрос: у меня есть мультивалютные советники, в котором использую onTimer с интервалом 100msc для обхода валютных пар (до пяти пар на один советник). Имеет ли смысл уменьшать интервал меньше 100msc или это излишне? 

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

у меня для этого таймер, время 30 секунд

 

кстати, про таймеры :

время в милисек. Не относящееся к теме замазано.

смотрим внимательнее: даже SymbolInfoTick выполнялся почти секунду :-( 

что случилось ? а это фоновое обновление терминала, оно вот так сказывается - всё начинает притормаживать. Даже пинг увеличивается, на скриншоте самое верхнее. 

 
Alexander Sevastyanov #:
Зависит от частоты поступления тиков. А она в свою очередь зависит от инструмента, дня недели, времени суток ...
Вопрос ТС прочитайте, он про период OnTimer.