Скачать MetaTrader 5

Получение тиков в одном советнике по всем валютным парам

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
alchemist-trade
8
alchemist-trade  

Привет!

Читаю документацию по MQL4 и не могу найти функций, которые бы позволили получить свежие данные по валютным парам.

Пока вижу единственный способ использовать свежие данные такой:

RefreshRates(); // Далее гарантируется, что все данные у обновлены

int  CopyRates(    string           symbol_name,       // имя символа    ENUM_TIMEFRAMES  PERIOD_M1,         // период    int              start_pos=0,         // откуда начнем     int              count=num,             // сколько копируем    MqlRates         rates_array[]      // массив, куда будут скопированы данные    ); // Получается, что в rates_array[num-1] будет лежать самая свежая свечка, которая еще полностью не сформирована?

 Подскажите, пожалуйста, насколько я прав? Может есть более простой путь?

Stanislav Korotky
18240
Stanislav Korotky  
alchemist-trade:

Привет!

Читаю документацию по MQL4 и не могу найти функций, которые бы позволили получить свежие данные по валютным парам.

Все правильно. По умолчанию советник получает только тики того инструмента, на котором стоит. Если нужны котировки других инструментов, их нужно запрашивать.
Alexey Volchanskiy
17145
Alexey Volchanskiy  
marketeer:
Все правильно. По умолчанию советник получает только тики того инструмента, на котором стоит. Если нужны котировки других инструментов, их нужно запрашивать.

Верно, и в мультивалютном советнике это удобно делать через таймер. Но с таймером возникает проблема, по крайней мере на МТ4 она точно есть и в сервисдеске мне ответили, что в ближайшее время решать ее не будут. Проблема - в тестере таймер на работает! Я выкручиваюсь так, имитирую вызов таймера в OnTick:

// код написан для MQL4, для MQL5 возможны небольшие отличия
// имитирует вызов таймера с интервалом 1 сек при работе под тестером

// Возвращает true, если работает под тестером
bool IsRunOnTester()
{
    if(MQLInfoInteger(MQL_TESTER) || MQLInfoInteger(MQL_VISUAL_MODE) || MQLInfoInteger(MQL_OPTIMIZATION))
        return true;
    return false;    
}

void OnTick()
{
    if(IsRunOnTester())
    {
        static datetime dt1 = 0, dt2 = 0;
        static bool tfirst = true;
        if(tfirst)
        {
            tfirst = false;
            dt1 = dt2 = TimeCurrent();
            return;
        }
    
        dt2 = TimeCurrent();
        for(datetime TimeTesterCurrent = dt1+1; TimeTesterCurrent <= dt2; TimeTesterCurrent++)
        {
            TimeToStruct(TimeTesterCurrent, TimeCurrStruct);
            OnTimer();
        }    
        dt1 = dt2;
    }
}

void OnTimer()
{
    if(!IsRunOnTester() && TimeCurrent() >= D'2014.10.19 00:00') // для тестировщиков, ограничение работы по времени
        return;
    OnTimerCounter++;
    if(!IsRunOnTester())
        TimeToStruct(TimeCurrent(), TimeCurrStruct);
    for(int n = 0; n < ArraySize(SmartDspArr); n++) // перебор всех экземпляров класса стратегии CSmartDSP, каждый экземпляр торгует на своем инструменте
        SmartDspArr[n].ReceiveTick(TimeCurrStruct);    
    //TrailingStop.DoTrailing();   
    if(FlashCounter++ >= FlashPeriod) // флешим лог-файлы
    {
        FlashAllFiles(); 
        FlashCounter = 0;
    }
    if(EnableScreenShot && SSCounter++ >= SSPeriod) // делаю скриншоты, потом прикольно посмотреть торговлю за день на видео в ускоренном режиме
    {
        string fname = SShotFileName + "ss_" + TimeToString(TimeCurrent(), TIME_DATE | TIME_MINUTES | TIME_SECONDS);
        WindowScreenShot(fname, 1280, 720);
        SSCounter = 0;
    }
}
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий