Ошибки, баги, вопросы - страница 3580

 
Aleksandr Slavskii #:

Мультивалютный советник, получает событие "новый тик" с помощью индикатора Spy.

В OnChartEvent получает пользовательское событие, и после этого идёт расчёт по символу, на котором пришёл новый тик.

Spy в советнике запускаю примерно так.

Если символов до девяти штук, то вроде советник работает норм, если символов девять и больше, то время от времени в лог записывается такая ошибка и советник перестаёт работать совсем.

В лог попадают не все символы из советника, обычно только половина.

Подскажите в чём может быть причина такой ошибки? Что в этом индикаторе Spy может тормозить?

тоже иногда проскакивает, но работа не останавливается

не понятно, как может индикатор пройти в данном случае 4 цикла и выдать одинаковый замер 3063 мс, у меня так же в начале серия одинаковых и потом пара с отличием, 

похоже особенность терминала, на последнем то проце i7, да еще и передается только id, и 7 пар участвует

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

 
Alexey Viktorov #:

А зачем, простите, такие извращения, если по перечисленным инструментам есть событие «изменения в стакане цен»???

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

spy индикатор единственный точно работающий способ получать каждый тик по нужным индикаторам

нет тика - нет работы по нему

 
Aleksandr Slavskii #:

Подскажите в чём может быть причина такой ошибки? Что в этом индикаторе Spy может тормозить?

SymbolInfoTick.


Запустил такой советник на 47 символах.

#include <fxsaber\OnTickMulti\OnTickMulti.mqh> // https://www.mql5.com/ru/code/47647

int TicksCounter[]; // Счетчик пришедших тиков каждого заданного символа.

void OnInit()
{
  // Инициализируем счетчик пришедших тиков.
  ArrayResize(TicksCounter, ArraySize(OnTickMulti.Symbols));
  ArrayInitialize(TicksCounter, 0);
  
  ArrayPrint(OnTickMulti.Symbols);
  
  EventSetTimer(1);
}

void OnTimer()
{
  string Str = NULL;
  
  // Распечатываем количество пришедших тиков на каждый заданный символ.
  for (uint i = ArraySize(TicksCounter); (bool)i--;)
    Str += "\n" + IntegerToString(i, 2, '0') + ". "+ OnTickMulti.Symbols[i] + " - " + (string)TicksCounter[i] + " ticks.";

  Comment(Str);
}

// Мультисимвольный OnTick.
void OnTickMulti( const string &Symb, const int &Index )
{
  MqlTick Tick;
  
  if (SymbolInfoTick(Symb, Tick))
    TicksCounter[Index]++; // Увеличили счетчик пришедших тиков по заданному символу.
  else
    Alert(Symb);
}


[ 0] "EURUSD.pro" "GBPUSD.pro" "USDCAD.pro" "USDCHF.pro" "USDJPY.pro" "AUDCAD.pro" "AUDCHF.pro" "AUDJPY.pro" "AUDNZD.pro" "AUDUSD.pro"
[10] "CADCHF.pro" "CADJPY.pro" "CHFJPY.pro" "EURAUD.pro" "EURCAD.pro" "EURCHF.pro" "EURGBP.pro" "EURJPY.pro" "EURNZD.pro" "GBPAUD.pro"
[20] "GBPCAD.pro" "GBPCHF.pro" "GBPJPY.pro" "GBPNZD.pro" "NZDCAD.pro" "NZDCHF.pro" "NZDJPY.pro" "NZDUSD.pro" "EURDKK.pro" "EURHKD.pro"
[30] "EURNOK.pro" "EURPLN.pro" "EURRUB.pro" "EURSEK.pro" "EURSGD.pro" "EURTRY.pro" "USDCNH.pro" "USDDKK.pro" "USDHKD.pro" "USDMXN.pro"
[40] "USDNOK.pro" "USDPLN.pro" "USDRUB.pro" "USDSEK.pro" "USDSGD.pro" "USDTRY.pro" "USDZAR.pro"


Проблемы не увидел. Какие минутные тиковые объемы у ваших символов?

 
Aleksandr Slavskii # :

Мультивалютный советник , получает событие "новый тик" с помощью индикатора Spy.

В OnChartEvent получает пользовательское событие, и после этого идёт расчёт по символу, на котором пришёл новый тик.

Spy в советнике запускаю примерно так.

Если символов до девяти штук, то вроде советник работает норм, если символов девять и больше, то время от времени в лог записывается такая ошибка и советник перестаёт работать совсем.

В лог попадают не все символы из советника, обычно только половина.

Подскажите в чём может быть причина такой ошибки? Что в этом индикаторе  Spy  может тормозить?

Иногда EventChartCustom() возвращается через 3 секунды.
 
HistoryDealGetInteger

В описании функции HistoryDealGetInteger() есть пример, в котором ошибка.



//+------------------------------------------------------------------+ 
//| Trade function                                                   | 
//+------------------------------------------------------------------+ 
void OnTrade() 
  { 
//--- получим тикет последней сделки из истории торговли за неделю 
   ulong last_deal=GetLastDealTicket(); 
   if(HistoryDealSelect(last_deal)) 
     { 
      //--- время совершения сделки в миллисекундах от 01.01.1970 
      long deal_time_msc=HistoryDealGetInteger(last_deal,DEAL_TIME_MSC); 
      PrintFormat("Deal #%d DEAL_TIME_MSC=%i64 => %s", 
                  last_deal,deal_time_msc,TimeToString(deal_time_msc/1000)); 
     } 
   else 
      PrintFormat("HistoryDealSelect() failed for #%d. Eror code=%d", 
                  last_deal,GetLastError()); 
//--- 
  } 
//+------------------------------------------------------------------+ 
//| Возвращает тикет последней сделки в истории или -1               | 
//+------------------------------------------------------------------+ 
ulong GetLastDealTicket() 
  { 
//--- запросим историю за последние 7 дней 
   if(!GetTradeHistory(7)) 
     { 
      //--- сообщим о неудачном вызове и вернем -1 
      Print(__FUNCTION__," HistorySelect() вернул false"); 
      return -1; 
     } 
//---  
   ulong first_deal,last_deal,deals=HistoryOrdersTotal(); 
//--- если ордера есть, начинаем работать с ними 
   if(deals>0) 
     { 
      Print("Deals = ",deals); 
      first_deal=HistoryDealGetTicket(0); 
      PrintFormat("first_deal = %d",first_deal); 
      if(deals>1) 
        { 
         last_deal=HistoryDealGetTicket((int)deals-1); 
         PrintFormat("last_deal = %d",last_deal); 
         return last_deal; 
        } 
      return first_deal; 
     } 
//--- не нашли ни одной сделки, вернем -1 
   return -1; 
  } 
//+------------------------------------------------------------------+ 
//| Запрашивает историю за последние дни и вернет false при неудаче  | 
//+------------------------------------------------------------------+ 
bool GetTradeHistory(int days) 
  { 
//--- зададим недельный период времени для запроса торговой истории 
   datetime to=TimeCurrent(); 
   datetime from=to-days*PeriodSeconds(PERIOD_D1); 
   ResetLastError(); 
//--- сделаем запрос и проверим результат 
   if(!HistorySelect(from,to)) 
     { 
      Print(__FUNCTION__," HistorySelect=false. Error code=",GetLastError()); 
      return false; 
     } 
//--- история получена успешно 
   return true; 
  }

Сами же пишут:

HistoryDealGetInteger

Не следует путать между собой ордера, сделки и позиции. Каждая сделка является результатом исполнения некоего ордера, каждая позиция является итоговым результатом одной или нескольких сделок.

И используют неверную функцию в примере вместо HistoryDealsTotal() используют HistoryOrdersTotal().

Или это троллинг такой от MQ? :)


 
fxsaber #:

SymbolInfoTick.

Запустил такой советник на 47 символах.

Проблемы не увидел. Какие минутные тиковые объемы у ваших символов?

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

ниже Alain написал - " Иногда EventChartCustom() возвращается через 3 секунды. "

вот это похоже...

 
lynxntech #:

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

Да, нарвался через несколько часов.
 
Alain Verleyen #:
Иногда EventChartCustom() возвращается через 3 секунды.

Ого!

Хорошо бы понять бы, из за чего это происходит.

 
Aleksandr Slavskii #:

Хорошо бы понять бы, из за чего это происходит.

const bool Init = EventSetMillisecondTimer(100);

void OnTimer()
{
  for (int i = 0; !IsStopped() && (i < 1e3); i++)
  {
    const ulong StartTime = GetMicrosecondCount();

    EventChartCustom(ChartID(), 0, 0, 0, NULL);
    
    const ulong Interval = GetMicrosecondCount() - StartTime;
    
    if (Interval > 10000) // > 10 ms
      Print((string)i + ": " + (string)Interval + " mcs.");
  }
}


Тормозит на нажатия мышью и прочие GUI-действия.

2024.10.03 15:37:16.933 166: 10582 mcs.
2024.10.03 15:37:17.606 633: 19056 mcs.
2024.10.03 15:37:20.780 45: 32530 mcs.
2024.10.03 15:37:21.543 722: 10520 mcs.
2024.10.03 15:37:22.443 124: 33274 mcs.
2024.10.03 15:37:22.463 184: 18563 mcs.
2024.10.03 15:37:25.717 0: 35650 mcs.
2024.10.03 15:37:27.843 993: 34237 mcs.
2024.10.03 15:37:30.756 775: 20524 mcs.
2024.10.03 15:37:32.170 548: 11959 mcs.
2024.10.03 15:37:34.718 6: 14919 mcs.
2024.10.03 15:37:35.435 671: 20056 mcs.
2024.10.03 15:37:37.677 137: 17856 mcs.
2024.10.03 15:37:41.677 79: 10056 mcs.
2024.10.03 15:37:42.296 122: 14714 mcs.
2024.10.03 15:37:42.873 759: 15313 mcs.
2024.10.03 15:37:49.107 907: 16895 mcs.
2024.10.03 15:37:50.818 215: 19479 mcs.
2024.10.03 15:37:51.097 74: 18896 mcs.

Плохое решение для реала.

Строка для поиска: Uluchshenie 099.
 
fxsaber #:
Плохое решение для реала.

а зачем с рабочим графиком что-то делать?

открываем другой график и с ним работаем