Оптимальное значение для 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;
}