Ошибка cannot refresh history [4073] MT4

 

MT4 

я понимаю что это ошибка доступа к историческим данным

просто советник работает на реале а тут из-за неё он начал открывать сделки где попало и закрывать так же

пока сделал так , просто проверяю  все валюты циклом на наличие цен

if(MarketInfo(ValArr[vi],MODE_ASK)==0 || !MarketInfo(ValArr[vi],MODE_ASK) || MarketInfo(ValArr[vi],MODE_BID)==0 || !MarketInfo(ValArr[vi],MODE_BID)){ tradebuy=false; tradesell=false; tradeusr=false; canclose=false; }
err = GetLastError();
if(err!=0){ tradebuy=false; tradesell=false; tradeusr=false; canclose=false; mess + "Ошибка "+err+" на стр.190 \n"; }

 но пока не знаю поможет или нет, или в чем то другом эта ошибка выражается а не в отсутствии Ask и Bid торгуемых валют 

кто нить сталкивался с такими ошибками ? как победили ? 

3       19:03:17.067    MultiValuta-Gold EURUSD,M5: cannot refresh history [4073]
3       19:03:17.067    MultiValuta-Gold EURUSD,M5: predefined variables wrong initialization [0 - 14151]
3       19:03:17.069    MultiValuta-Gold EURUSD,M5: cannot refresh history [4073]
2       19:03:17.388    MultiValuta-Gold EURUSD,M5: open #145911376 buy 0.02 GBPUSD at 1.54653 ok
 
Juriy Iziymov:

MT4 

я понимаю что это ошибка доступа к историческим данным

просто советник работает на реале а тут из-за неё он начал открывать сделки где попало и закрывать так же

пока сделал так , просто проверяю  все валюты циклом на наличие цен

 но пока не знаю поможет или нет, или в чем то другом эта ошибка выражается а не в отсутствии Ask и Bid торгуемых валют 

кто нить сталкивался с такими ошибками ? как победили ? 

RefreshRates(); // получили свежие котировки

if(MarketInfo(ValArr[vi],MODE_ASK)< 0.01 || MarketInfo(ValArr[vi],MODE_BID)< 0.01) // нельзя числа типа double сравнивать через ==
// а вот это я ваще не понял )) 
// !MarketInfo(ValArr[vi],MODE_ASK)

// вот эти функции удобно использовать для получения строкового описания ошибки
// узнает код последней ошибки и возвращает строку с описанием
// код ошибки возвращается, т.к. передается по ссылке
string GetMyLastError(int &err)
{
   err = GetLastError();
   string serr = ErrorDescription(err);
   ResetLastError();
   return(serr);
}

// узнает код последней ошибки и возвращает строку с описанием
string GetMyLastError2()
{
   int err = GetLastError();
   string serr = ErrorDescription(err);
   ResetLastError();
   return(serr);
}
 
 

Мы расширили логгирование проблем с памятью.

Раньше всё это тоже происходило, но молча.

Какой у Вас номер билда клиентского терминала?

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

 
Juriy Iziymov:

MT4 

я понимаю что это ошибка доступа к историческим данным

просто советник работает на реале а тут из-за неё он начал открывать сделки где попало и закрывать так же

пока сделал так , просто проверяю  все валюты циклом на наличие цен

 но пока не знаю поможет или нет, или в чем то другом эта ошибка выражается а не в отсутствии Ask и Bid торгуемых валют 

кто нить сталкивался с такими ошибками ? как победили ? 

У вас ощипки в коде фильтра.

if(||||||)//Так условия сравнивать нельзя.
if(||&&||)//Так можно

if(MarketInfo(ValArr[vi],MODE_ASK)== 0.0 || MarketInfo(ValArr[vi],MODE_BID)== 0.0&&!MarketInfo(ValArr[vi],MODE_ASK) || !MarketInfo(ValArr[vi],MODE_BID)

if(!MarketInfo(ValArr[vi],MODE_ASK) || !MarketInfo(ValArr[vi],MODE_BID)// В этом условии, непонятно, что вы хотите сравнить и с чем, 
//восклицательный знак в этом случае неуместен
 
Slawa:

Мы расширили логгирование проблем с памятью.

Раньше всё это тоже происходило, но молча.

Какой у Вас номер билда клиентского терминала?

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

MT4 билд 890
 
Juriy Iziymov:
MT4 билд 890
Да. Ждите новый билд с изменениями
 
Juriy Iziymov:

При сравнении ( ==, <, >, <=,>=, !=) числа double c нулём, корректный результат сравнения даёт применение нормализации (NormalizeDouble).

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

 
Juriy Iziymov:

P./S.:

Т.е., для чисел типа double корректны могут следующие сравнения:

      ...
      if(NormalizeDouble(number1,digits)==0)//!=, <, >, <=,>= 0.0
      ...
      if(NormalizeDouble(number1-numbers2,digits)==0)//!=, <, >, <=,>= 0.0
      ...

А не корректным может быть итог сравнения, если:

      ...
      if(number1==0)//!=, <, >, <=,>= 0.0
      ...
      if(number1==numbers2)//!=, <, >, <=,>=
      ...
      double sr=NormalizeDouble(number1-number2,digits);
      if(sr==0)//!=, <, >, <=,>= 0.0
 

суть в том что я по сути не понял что произошло но как подумал - из-за этой ошибки т.к. я сравниваю несколько валют - по какой то из валют не пришли котировки из-за этого индикатор отрисовал ерунду а по этой ерунде советник отторговал тоже ерунду и всё это в мгновение ока =). но это только предположение

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

а что будет на выходе MarketInfo(ValArr[vi],MODE_ASK) - если там нет котировки я не знаю, по этому типа перебрал все возможные варианты типа 0 или вообще ничего !MarketInfo(ValArr[vi],MODE_ASK) 

RefreshRates(); я вставлю, но не знаю все он обновляет или только текущую 

и не понял =) отсутствие переменной double что пишется не  !MarketInfo(ValArr[vi],MODE_ASK)  ?

 
Juriy Iziymov:

суть в том что я по сути не понял что произошло но как подумал - из-за этой ошибки т.к. я сравниваю несколько валют - по какой то из валют не пришли котировки из-за этого индикатор отрисовал ерунду а по этой ерунде советник отторговал тоже ерунду и всё это в мгновение ока =). но это только предположение

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

а что будет на выходе MarketInfo(ValArr[vi],MODE_ASK) - если там нет котировки я не знаю, по этому типа перебрал все возможные варианты типа 0 или вообще ничего !MarketInfo(ValArr[vi],MODE_ASK) 

RefreshRates(); я вставлю, но не знаю все он обновляет или только текущую 

и не понял =) отсутствие переменной double что пишется не  !MarketInfo(ValArr[vi],MODE_ASK)  ?

if(!z) - такое условие применимо по своему смыслу к типу данных bool, см. логические операции.

А MarketInfo(ValArr[vi],MODE_ASK) - это не bool.

MarketInfo - Документация на MQL4
  • docs.mql4.com
MarketInfo - Документация на MQL4
 
Juriy Iziymov:

суть в том что я по сути не понял что произошло но как подумал - из-за этой ошибки т.к. я сравниваю несколько валют - по какой то из валют не пришли котировки из-за этого индикатор отрисовал ерунду а по этой ерунде советник отторговал тоже ерунду и всё это в мгновение ока =). но это только предположение

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

а что будет на выходе MarketInfo(ValArr[vi],MODE_ASK) - если там нет котировки я не знаю, по этому типа перебрал все возможные варианты типа 0 или вообще ничего !MarketInfo(ValArr[vi],MODE_ASK) 

RefreshRates(); я вставлю, но не знаю все он обновляет или только текущую 

и не понял =) отсутствие переменной double что пишется не  !MarketInfo(ValArr[vi],MODE_ASK)  ?

Ошибка у вас скорее в критерии открытия, не желе в отсутствии котировки.