Полторы минуты разницы между локальным временем и временем свежего тика. Что делать. - страница 3

 
pivomoe:

TimeCurrent() - Время последнего тика по символу будет меньше времени задержки, поэтому его можно использовать. Использование локального времени в первой версии было не удачной идеей. 

Уоу... дак текущая версия, походу, тоже неудачная. 

Читаем определение TimeCurrent():

TimeCurrent

Возвращает последнее известное время сервера, время прихода последней котировки по одному из выбранных в "Обзоре рынка" символов.

По одному из значит, что отображается время самого часто меняющегося (для простоты - самого ликвидного). А это не то, что Вам нужно. Вам нужно SymbolInfoInteger( бла-бла, SYMBOL_TIME ). Вроде так.

 
Alexey Kozitsyn:

Уоу... дак текущая версия, походу, тоже неудачная. 

Читаем определение TimeCurrent():

По одному из значит, что отображается время самого часто меняющегося (для простоты - самого ликвидного). А это не то, что Вам нужно. Вам нужно SymbolInfoInteger( бла-бла, SYMBOL_TIME ). Вроде так.

Это я так для  prostotrader пытался до нести, в чем я вижу проблему. В последний версии я прохожу по всем символам и беру максимальное время последнего полученного тика. 

   for(int i=0; i<KolichestvoSimvolov; i++)     
   if( InformaziaOPoslednemTike[i].LastTick.time_msc > VremaySamogoSvegegoTikaPoVsemSimvolam ) VremaySamogoSvegegoTikaPoVsemSimvolam= InformaziaOPoslednemTike[i].LastTick.time_msc;
Alexey Kozitsyn:

 Если же кто-то информацию о тике в 17:59:00 получил в 17:59:01, а я не получил даже в 18:00 - вот это уже большая проблема.

И вот тут вопрос. В чем проблема (и есть ли она)? В сервере брокера, который долго не отдает тик (всем), или в МТ5, который долго его не получает.

   С одной стороны среднее время между "TimeCurrent" и временем прихода последнего тика 5 миллисекунд,  с другой стороны бывают тики которые приходят с опаданием десятки секунд. Например с 18 25. У далось поймать тик с задержкой 45 секунд. И это на паре десятке не ликвидных символах. 


+ к этому проблему термина можно усугубить использованием CopyTicks для получения последнего тика
if(CopyTicks(Symbol(),ticks,COPY_TICKS_TRADE,0,1)==1) 

Она мало того, что медленнее в разы, так ещё и может выполняться на ровном месте полторы секунды.

Ещё удалось понять, что OnBookEvent подходит только, для торговли на одном символе.

 
pivomoe:

Это я так для  prostotrader пытался до нести, в чем я вижу проблему. В последний версии я прохожу по всем символам и беру максимальное время последнего полученного тика. 

   С одной стороны среднее время между "TimeCurrent" и временем прихода последнего тика 5 миллисекунд,  с другой стороны бывают тики которые приходят с опаданием десятки секунд. Например с 18 25. У далось поймать тик с задержкой 45 секунд. И это на паре десятке не ликвидных символах. 


+ к этому проблему термина можно усугубить использованием CopyTicks для получения последнего тика. 

Она мало того, что медленнее в разы, так ещё и может выполняться на ровном месте полторы секунды.

Ещё удалось понять, что OnBookEvent подходит только, для торговли на одном символе.

Приплыли. Оказывается, Вы только сейчас смекнули, что стакан формируется для каждой валютной пары отдельный, поэтому торговать по его данным разными парами не получится. 

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

Поэтому, если в Вашей очередности первым проверяется стакан EURUSD, а последним - BTCUSD и между ними есть еще пара десятков символов различной ликвидности, то время поступления тиков вполне может выглядеть как-то так: 

18:50:00.000; 18:48:59.018; 18:51:00.001; 18:47:59.000 ну и так далее. Без всякой теории заговора, косяков МТ и брокера. Что запрограммировали, то и получили. 

 
Алексей Тарабанов:

Приплыли. Оказывается, Вы только сейчас смекнули, что стакан формируется для каждой валютной пары отдельный, поэтому торговать по его данным разными парами не получится. 

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

Поэтому, если в Вашей очередности первым проверяется стакан EURUSD, а последним - BTCUSD и между ними есть еще пара десятков символов различной ликвидности, то время поступления тиков вполне может выглядеть как-то так: 

18:50:00.000; 18:48:59.018; 18:51:00.001; 18:47:59.000 ну и так далее. Без всякой теории заговора, косяков МТ и брокера. Что запрограммировали, то и получили. 

   Ловить новые тики через OnBookEvent меня надоумил prostotrade , написав что так "правильней." К самому стакану я вообще не обращаюсь просто подписываюсь на его обновления по всем символам в обзоре рынка. OnBookEven  я по сути использую лишь для определения символа по которому обновился стакан. Далее идет проверка на новый тик, а потом смотрю не установил ли советник новые антирекорды.  Вот собственно вся функция:

void OnBookEvent(const string &symbol)
  {   
   if( MestoPoluchenieTikov == ON_TIMER ) return;
//--- Ищем индекс символа для которого полученно событие OnBookEvent
   int IndeksSimvola= -1;
   for(  int i=0;  i < KolichestvoSimvolov; i++ )
   if(  symbol == GCInformaziaOPoslednemTike[i].Simvol  ) { IndeksSimvola= i; break; }
   
   if( IndeksSimvola== -1 ){Print(__FUNCTION__,"Не удалось найти символ по которому полученно событие OnBookEvent ");ExpertRemove();return;}
   
   bool PoluchiliNoviiTick= false;
          
    //--- Получаем тик заданным в настройках способом.
   if( SposobPoluchenieTikov == SYMBOL_INFO_TICK  ) PoluchiliNoviiTick= PolychaemNoviiTickSymbolInfoTick(GCInformaziaOPoslednemTike[IndeksSimvola]);
   if( SposobPoluchenieTikov == COPY_TICKS       )  PoluchiliNoviiTick= PolychaemNoviiTickCopyTicks(GCInformaziaOPoslednemTike[IndeksSimvola]);    
       
     //--- Смотрим не установлены ли новые рекорды.  
   if(  PoluchiliNoviiTick ) PitaemsayObnovitRekordi( GCInformaziaOPoslednemTike, IndeksSimvola );                 
   
   ObnovlaemInformacyyNaGrafikeEslePora();
 
  }   
Алексей Тарабанов:

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

    Насколько я понимаю если я не получаю стакан с помощью MarketBookGet, то ничего я не перебираю. Вы наверное мой код со второй страницы просто не смотрели.  

 
pivomoe:

   Ловить новые тики через OnBookEvent меня надоумил prostotrade , написав что так "правильней." К самому стакану я вообще не обращаюсь просто подписываюсь на его обновления по всем символам в обзоре рынка. OnBookEven  я по сути использую лишь для определения символа по которому обновился стакан. Далее идет проверка на новый тик, а потом смотрю не установил ли советник новые антирекорды.  Вот собственно вся функция:

    Насколько я понимаю если я не получаю стакан с помощью MarketBookGet, то ничего я не перебираю. Вы наверное мой код со второй страницы просто не смотрели.  

Сигнал в МТ не обрабатывается, пока не обработан предыдущий сигнал.  

 
pivomoe:

   Ловить новые тики через OnBookEvent меня надоумил prostotrade , написав что так "правильней." К самому стакану я вообще не обращаюсь просто подписываюсь на его обновления по всем символам в обзоре рынка. OnBookEven  я по сути использую лишь для определения символа по которому обновился стакан. Далее идет проверка на новый тик, а потом смотрю не установил ли советник новые антирекорды.  Вот собственно вся функция:

    Насколько я понимаю если я не получаю стакан с помощью MarketBookGet, то ничего я не перебираю. Вы наверное мой код со второй страницы просто не смотрели.  

Не смотрел. 

 
pivomoe:

С логикой у вас все ок, не слушайте тех, кто проходит мимо.

1. Попробуйте оставить 3-5 инструментов (один из которых малоликвидный). Воспроизведется?

2. Запустите на чистой машине без другого софта, использующего интернет. Повторится?

3. Попробуйте разнести ловлю задержек в разных советников (1 на инструмент).

Если проблема не в ресурсах (было какое-то ограничение на количество потоков, выделяемых одному терминалу), то баг должны исправить.

 
Andrey Khatimlianskii:

С логикой у вас все ок, не слушайте тех, кто проходит мимо.

1. Попробуйте оставить 3-5 инструментов (один из которых малоликвидный). Воспроизведется?

2. Запустите на чистой машине без другого софта, использующего интернет. Повторится?

3. Попробуйте разнести ловлю задержек в разных советников (1 на инструмент).

Если проблема не в ресурсах (было какое-то ограничение на количество потоков, выделяемых одному терминалу), то баг должны исправить.

Спасибо за ответ. Сегодня немного продвинулся в решении этой проблемы. Она лечиться командой Sleep() между  вызовами SymbolInfo() . Раньше я просто в цикле по всему обзору рынка проходил без пауз. Я тестировал на 40 символах на вечерке сегодня. Если Sleep(5) то ловился  "новый тик" который должен был придти секунды две назад. А вот на Sleep(10) все идеально задержка 400 миллисекунд ( за счет этого Sleep(10)                ( 40 символов *10  )  ) .  Попробовал протестировать на 4 самых ликвидных на вечерке. Со Sleep(1) никаких задержек нет.... все идеально. Вот я не понимаю как такое может быть, если символ в обзоре мало SymbolInfo можно пользоваться без всяких пауз. А если символов много уже нужно паузы использовать.

Теперь ответы:

1) На ликвидных на вечерке не воспроизводиться.

2) На 40 символах повторяется даже с отключенным софтом.

3) Я не понял, что вы предлагаете. Ловить новые тики сразу из двух советников в одном терминале ?

ЗЫ Сейчас копаю в направлении целесообразности вызов  SymbolInfo. Например удалось выяснить, что даже один символ в обзоре рынка не способен отдавать новые тики чаще 3.5 миллисекунд( на вечерке правда дело было). 

 
pivomoe:

1) На ликвидных на вечерке не воспроизводиться.

2) На 40 символах повторяется даже с отключенным софтом.

3) Я не понял, что вы предлагаете. Ловить новые тики сразу из двух советников в одном терминале ?

ЗЫ Сейчас копаю в направлении целесообразности вызов  SymbolInfo. Например удалось выяснить, что даже один символ в обзоре рынка не способен отдавать новые тики чаще 3.5 миллисекунд( на вечерке правда дело было). 

1. Попробуйте добавить один неликвидный

3. Ловить пропуски по одному инструменту из одного советника. И запустить 40 советников.

 
pivomoe:

Спасибо за ответ. Сегодня немного продвинулся в решении этой проблемы. Она лечиться командой Sleep() между  вызовами SymbolInfo() . Раньше я просто в цикле по всему обзору рынка проходил без пауз. Я тестировал на 40 символах на вечерке сегодня. Если Sleep(5) то ловился  "новый тик" который должен был придти секунды две назад. А вот на Sleep(10) все идеально задержка 400 миллисекунд ( за счет этого Sleep(10)                ( 40 символов *10  )  ) .  Попробовал протестировать на 4 самых ликвидных на вечерке. Со Sleep(1) никаких задержек нет.... все идеально. Вот я не понимаю как такое может быть, если символ в обзоре мало SymbolInfo можно пользоваться без всяких пауз. А если символов много уже нужно паузы использовать.

Кусок кода приведите пожалуйста, который ловит задержки. Прямо тут, через кнопку вставки кода.

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