Вопрос про iOpen и iClose

 
int GetInfo(string OurSymbol, int Bar) {
 int OurDigits = MarketInfo(OurSymbol, MODE_DIGITS);
 double KValue;
 KValue = iCustom(OurSymbol, 0, INDICATOR_NAME, false, 0.0, 0.0, 0.0, 0.0, BoldRed1, BoldRed2, 2, Bar);
 if(KValue == EMPTY_VALUE) {
 Print("KValue = EMPTY_VALUE");
 return (STATUS_WAIT);
 }
 KValue = NormalizeDouble(KValue, OurDigits + 1);
 
 double OpenSymb = iOpen(OurSymbol, 0, 1);
 double CloseSymb = iClose(OurSymbol, 0, 1);
 if(OpenSymb == 0.0) {
 Print("OpenSymb " + DoubleToStr(OpenSymb, 8) + " iOpen error GLE: " + GetLastError());
 }
 if(CloseSymb == 0.0) {
 Print("CloseSymb " + DoubleToStr(CloseSymb, 8) + " iClose error GLE: " + GetLastError());
 }
 double Av = MinMax(OpenSymb, CloseSymb, OurDigits);
 double Result = KValue - Av;
 Result = NormalizeDouble(Result, OurDigits + 1);
 if(Result < 0.00000) {
 Print(OurSymbol + " BUY " + Result);
 return (OP_BUY);
 }
 if(Result > 0.00000) {
 Print(OurSymbol + " SELL " + Result);
 return (OP_SELL);
 }
 if(Result == 0.00000) {
 Print(OurSymbol + " WAIT " + Result);
 return (STATUS_WAIT);
 }
}//+---------------------------------------------------------------------------------------------+


тестер выдает что почему то iOpen и iClose бывают равны 0 и иногда даже GetLastError() возвращает 0 при этом.
Bar = 1
 
Может просто не быть данных на запрашиваемую дату.
 
Я смотрю только предыдущий бар относительно текущего. Как может не быть?
 
Прежде чем использовать слово "глюк" по отношению к терминалу, проведите полный анализ своего кода и своих данных.
 
А что если iOpen возвращает 0 и GLE говорит 0 это не глюк?
 
А если ошибку проверять сразу же после ее возникновения?

int GetInfo(string OurSymbol, int Bar) {
 int OurDigits = MarketInfo(OurSymbol, MODE_DIGITS);
 double KValue;
 KValue = iCustom(OurSymbol, 0, INDICATOR_NAME, false, 0.0, 0.0, 0.0, 0.0, BoldRed1, BoldRed2, 2, Bar);
 if(KValue == EMPTY_VALUE) {
 Print("KValue = EMPTY_VALUE");
 return (STATUS_WAIT);
 }
 KValue = NormalizeDouble(KValue, OurDigits + 1);
 
 double OpenSymb = iOpen(OurSymbol, 0, 1);
 if(OpenSymb == 0.0) {
Print("OpenSymb " + DoubleToStr(OpenSymb, 8) + " iOpen error GLE: " + GetLastError()); }
double CloseSymb = iClose(OurSymbol, 0, 1); if(CloseSymb == 0.0) {
Print("CloseSymb " + DoubleToStr(CloseSymb, 8) + " iClose error GLE: " + GetLastError()); }
double Av = MinMax(OpenSymb, CloseSymb, OurDigits); double Result = KValue - Av; Result = NormalizeDouble(Result, OurDigits + 1); if(Result < 0.00000) { Print(OurSymbol + " BUY " + Result); return (OP_BUY); } if(Result > 0.00000) { Print(OurSymbol + " SELL " + Result); return (OP_SELL); } if(Result == 0.00000) { Print(OurSymbol + " WAIT " + Result); return (STATUS_WAIT); } }//+---------------------------------------------------------------------------------------------+
Ведь вызов функции GetLastError() сбрасывает в ноль внутренюю переменную, содержащую код последней ошибки:

Функция возвращает код последней ошибки, после чего значение специальной переменной last_error, в которой хранится код последней ошибки обнуляется. Так что последующий вызов GetLastError() вернет значение 0. Пример:

int err;
int handle=FileOpen("somefile.dat", FILE_READ|FILE_BIN);
if(handle<1)
{
err=GetLastError();
Print("error(",err,"): ",ErrorDescription(err));
return(0);
}
 
ой да, извините. А почему iOpen и iClose возвращает ошибку если входные данные корректны. Я не очень понимаю как может не быть данных по другим валютам. Может быть их необходимо каким-то образом подгружать?
 
pingved:
ой да, извините. А почему iOpen и iClose возвращает ошибку если входные данные корректны. Я не очень понимаю как может не быть данных по другим валютам. Может быть их необходимо каким-то образом подгружать?
Ну вот и выяснили...
 
Посмотрите пример по функции ArrayCopySeries
 
а зачем тогда iOpen и iClose?
 
мне нужно каждый раз связывать массивы с помощью ArrayCopySeries или этого будет достаточно на этапе инициализации?
Причина обращения: