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

 

Господа, ещё один баг или фича, уж не знаю

во вложении скрин из окна market watch

крайне правый столбец отражает такой параметр, как дневная волатильность; stoxx50 и золото (первые 2 сверху) точно не имеют 10% в последний торговый день, впрочем как и в предыдущие дни; этого просто не может быть, да и ещё несколько инструментов ниже с этой же фишкой

раньше этот параметр работал нормально, но в какой-то момент сошёл с ума; может это у брокера проблема, а может как-то не так начал считать; я запускаю терминал в MacOs с Wine; последний раз апдейт терминала был вчера по-моему 

Файлы:
 

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

// https://www.mql5.com/ru/forum/170952/page68#comment_6406566
#property indicator_chart_window
#property indicator_plots 0
input long Chart = 0; // идентификатор графика-получателя события
input int Index = 0;
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total, const int prev_calculated, const int, const double &[])
  {
   if(prev_calculated)
     {
      MqlTick tikc;
      SymbolInfoTick(_Symbol, tikc);
      EventChartCustom(Chart, 0, Index, tikc.bid, _Symbol);
     }
   return(rates_total);
  }
//+------------------------------------------------------------------+

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

void OnChartEvent(const int id, const long &lparam, const double&, const string&)
  {
   if(id == CHARTEVENT_CUSTOM)
      Calc((int)lparam);// основной расчёт советника
  }

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

   string Symbols[9] = {"SBER", "SBERP", "QIWI", "POLY", "VTBR", "MOEX", "CBOM", "BSPB", "TCSG"};
   int spy[];
   ArrayResize(spy, 9);
   for(int i = 0; i < 9; i++)
      spy[i] = iCustom(Symbols[i], PERIOD_M5, "Spy.ex5", ChartID(), i);

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

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

Spy (BSPB,W1)   indicator is too slow, 3063 ms. rewrite the indicator, please
Spy (TCSG,W1)   indicator is too slow, 3063 ms. rewrite the indicator, please
Spy (SBER,W1)   indicator is too slow, 3063 ms. rewrite the indicator, please
Spy (VTBR,W1)   indicator is too slow, 3063 ms. rewrite the indicator, please
Spy (SBERP,W1)  indicator is too slow, 3031 ms. rewrite the indicator, please
Spy (CBOM,W1)   indicator is too slow, 3078 ms. rewrite the indicator, please

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

 
Aleksandr Slavskii #:

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

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

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

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

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

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

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

 
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 #:

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

Да, нарвался через несколько часов.