Мультивалютный советник - как организовать ловлю тиков с других пар

 

Ведь понятно , советник стоит на конкретной  паре  и тики приходят в  функцию OnTick()  только по этой паре.

Как быть если нужно получить в функцию тики от других инструментов  ?

  понятно что в OnTick  можно читать  состояние  других пар  - но читаь их только когда тик пришел именно от того инструмента на котором стоит советник!

  а как не пропустить тик на другом инструменте ?

 
Yuriy Zaytsev:

Ведь понятно , советник стоит на конкретной  паре  и тики приходят в  функцию OnTick()  только по этой паре.

Как быть если нужно получить в функцию тики от других инструментов  ?

  понятно что в OnTick  можно читать  состояние  других пар  - но читаь их только когда тик пришел именно от того инструмента на котором стоит советник!

  а как не пропустить тик на другом инструменте ?

пока вижу только использование конструкции EventSetMillisecondTimer  с минимальным квантом

и затем чтением в OnTime нужных пар с анализом на изменения цены

В тестере стратегий используется минимальный интервал в 1000 миллисекунд. 
В общем случае при уменьшении периода таймера увеличивается время тестирования, 
так как возрастает количество вызовов обработчика событий таймера. 
При работе в режиме реального времени события таймера генерируются не чаще 1 раза в 10-16 миллисекунд, 
что связано с аппаратными ограничениями.

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

 
Yuriy Zaytsev:

Ведь понятно , советник стоит на конкретной  паре  и тики приходят в  функцию OnTick()  только по этой паре.

Как быть если нужно получить в функцию тики от других инструментов  ?

  понятно что в OnTick  можно читать  состояние  других пар  - но читаь их только когда тик пришел именно от того инструмента на котором стоит советник!

  а как не пропустить тик на другом инструменте ?

Данная тема уже неоднократно обсуждалась. Если кратко, то решения два:

  • Через таймер. 
  • Через специальный индикатор, который загружает эксперт на инструмент, после чего получает от него событие приход нового тика через OnChartEvent. 

 
Vasiliy Sokolov:

Данная тема уже неоднократно обсуждалась. Если кратко, то решения два:

  • Через таймер. 
  • Через специальный индикатор, который загружает эксперт на инструмент, после чего получает от него событие приход нового тика через OnChartEvent. 

Спасибо!  вопрос снят тема закрыта

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

и пожалуй она лучше чем таймер - вот только тестировать такой вариант чуть сложней

 
Благодарю за тему и ответ , тики просто иногда приходят очень редко (пример раз несколько десятков секунд когда рынок неактивен) и получаю off quotes при попытке торговли, и все торговые мультивалютные фукции ломаются 
Попробую ваши варианты может что поможет
 
Yuriy Zaytsev:

Ведь понятно , советник стоит на конкретной  паре  и тики приходят в  функцию OnTick()  только по этой паре.

Как быть если нужно получить в функцию тики от других инструментов  ?

  понятно что в OnTick  можно читать  состояние  других пар  - но читаь их только когда тик пришел именно от того инструмента на котором стоит советник!

  а как не пропустить тик на другом инструменте ?

Самый нормальный вариант это 

OnBookEvent

Но в тестере не будет работать.   
 
Yuriy Zaytsev:

Спасибо!  вопрос снят тема закрыта

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

и пожалуй она лучше чем таймер - вот только тестировать такой вариант чуть сложней

Нет. В следующем билде можно будет тестировать по полной программе (а в визуальном тестере уже сейчас можно). Здесь было обсуждение
 

Просмотрел темы и идеи  понравилась одна из них

https://www.mql5.com/ru/articles/234



//+------------------------------------------------------------------+
//|                                                         iSpy.mq5 |
//|                                            Copyright 2010, Lizar |
//|                                               lizar-2010@mail.ru |
//+------------------------------------------------------------------+
#define VERSION         "1.00 Build 2 (26 Dec 2010)"

#property copyright   "Copyright 2010, Lizar"
#property link        "https://www.mql5.com/ru/users/Lizar"
#property version     VERSION
#property description "Индикатор iSpy - индикатор-шпион."
#property description "Запускается на нужном торговом инструменте для получения тиков"
#property indicator_chart_window

input long            chart_id=0;        // идентификатор графика-получателя события
input ushort          custom_event_id=0; // идентификатор события

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate (const int rates_total,      // размер массива price[]
                 const int prev_calculated,// обработано баров на предыдущем вызове
                 const int begin,          // откуда начинаются значимые данные
                 const double& price[]      // массив для расчета
   )
  {
   double price_current=price[rates_total-1];

   //--- Инициализация:
   if(prev_calculated==0) 
     { // Генерируем и отправляем событие "Инициализация"
      EventChartCustom(chart_id,0,(long)_Period,price_current,_Symbol);
      return(rates_total);
     }
   
   // При появлении нового бара генерируем пользовательское событие "новый тик", 
   // которое можно будет поймать в эксперте или индикаторе
   EventChartCustom(chart_id,custom_event_id+1,(long)_Period,price_current,_Symbol);
   
   //--- return value of prev_calculated for next call
   return(rates_total);
  }


//+------------------------------------------------------------------+
//|                                                        exSpy.mq5 |
//|                                            Copyright 2010, Lizar |
//|                            https://www.mql5.com/ru/users/Lizar |
//+------------------------------------------------------------------+
#define VERSION       "1.00 Build 1 (26 Dec 2010)"

#property copyright   "Copyright 2010, Lizar"
#property link        "https://www.mql5.com/ru/users/Lizar"
#property version     VERSION
#property description "Эксперт демонстрирует работу индикатора-шпиона iSPY"

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {   
   if(iCustom("GBPUSD",PERIOD_M1,"iSpy",ChartID(),0)==INVALID_HANDLE) 
      { Print("Ошибка установки шпиона на GBPUSD"); return(true);}
   if(iCustom("EURUSD",PERIOD_M1,"iSpy",ChartID(),1)==INVALID_HANDLE) 
      { Print("Ошибка установки шпиона на EURUSD"); return(true);}
   if(iCustom("USDJPY",PERIOD_M1,"iSpy",ChartID(),2)==INVALID_HANDLE) 
      { Print("Ошибка установки шпиона на USDJPY"); return(true);}
      
   Print("Шпионы засланы, ждем шифровок...");
   //---
   return(0);
  }
  
//+------------------------------------------------------------------+
//| Стандартная функция обработки событий. Она может использоваться  |
//| по своему прямому назначению, как описано в документации.        |
//|                                                                  |
//| В данном примере демонстрирует декодирвание сообщений индикатора-|
//| шпиона iSPY.                                                     |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,  // идентификатор события:
                              // если id-CHARTEVENT_CUSTOM=0 - событие "инициализация"
                  const long&   lparam, // период графика
                  const double& dparam, // цена
                  const string& sparam  // инструмент 
                 )
  {
   if(id>=CHARTEVENT_CUSTOM)      
     {
      Print(TimeToString(TimeCurrent(),TIME_SECONDS)," -> id=",
           id-CHARTEVENT_CUSTOM,":  ",sparam," ",
           EnumToString((ENUM_TIMEFRAMES)lparam)," price=",dparam);
     }
  }
Реализация мультивалютного режима в MetaTrader 5
Реализация мультивалютного режима в MetaTrader 5
  • 2011.01.10
  • Konstantin Gruzdev
  • www.mql5.com
Интерес к мультивалютному анализу и мультивалютной торговле существует давно. Но только с выпуском в свет терминала MetaTrader 5 и языка программирования MQL5 появилась возможность реализации полноценного мультивалютного режима. В данной статье предложен способ, позволяющий проводить анализ и обработку всех поступающих тиков по множеству финансовых инструментов. В качестве иллюстрации рассмотрен мультивалютный индикатор RSI для индекса доллара USDx.
 
Alexander Laur:
Тики приходят ну 10-ть в секунду, т.е. интервал порядка 100 млсек. Просто в цикле (без таймеров, без шпионов и т.д.) опрашивайте нужные инструменты и существенной разницы не будет. Пробовал различные варианты и все-равно вернулся в самому простому: опрос инструментов в цикле при приходе очередного тика.

идея с таймером  плохая

Событие лучше получать в тот момент когда оно возникает!

Причина обращения: