HistoryBase: 6 errors in ...

 

Создаю индексы валют, а при обновлении графика

2011.02.23 20:07:35 HistoryBase: 6 errors in '#USD60'

Как избавиться от ошибки (надоели красные замечания фильтра терминала в журнале) .

//+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
// создает и записывает в файл заголовок hst файла
//+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
void CreateHandle(){
  int Tmp[15], TmpTime;
  string FileName = SymbolName + Period() + ".hst";
  handle = FileOpenHistory(FileName, FILE_BIN|FILE_WRITE);
  
  FileWriteInteger(handle, 400);                //4 байта, по умолчанию
  FileWriteString(handle, "Created by xz", 64); //64
  FileWriteString(handle, SymbolName, 12);      //12
  FileWriteInteger(handle, Period());           //4 байта, по умолчанию
  FileWriteInteger(handle, Digits);             //4 байта, по умолчанию
  FileWriteArray(handle, Tmp, 0, 15);           //15*4=60 и того 148 байт на заголовок !!!
  //int, bool, datetime и color записываются поэлементно как 4-байтовые целые
  //double записываются поэлементно как 8-байтовые 
}

Смотрел гугел, оказывается такие ошибки и в архиве котировок есть и связанно с плохим временем бара (6 ошибок не много, но журнал нужен адекватным).

Далее записываю бары ()

//+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
// записывает в файл данные начиная от текущего положения
//+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
void WriteBar( int Pos ){
  close =iCustom(0,0,"Grafic_for_History",ener,speed,0,Pos);
  open = iCustom(0,0,"Grafic_for_History",ener,speed,1,Pos);
  high = iCustom(0,0,"Grafic_for_History",ener,speed,3,Pos);
  low =  iCustom(0,0,"Grafic_for_History",ener,speed,4,Pos);
  
  FileWriteInteger(handle, Time[Pos]);  //4 байта, по умолчанию
  FileWriteDouble(handle, open);        //8 байтов, по умолчанию
  FileWriteDouble(handle, low);         //8 байтов, по умолчанию
  FileWriteDouble(handle, high);        //8 байтов, по умолчанию
  FileWriteDouble(handle, close);       //8 байтов, по умолчанию
  FileWriteDouble(handle, 600); //8 байтов, по умолчанию
                                        //и того 44 байта
  FileFlush(handle);
}

Хелп ми если кто нить сталкивался, спасибо.

 
Проверяйте, чтобы в High была наибольшая цена из OHLC, а в Low - наименьшая.
 
hrenfx:
Проверяйте, чтобы в High была наибольшая цена из OHLC, а в Low - наименьшая.


Вставить свой фильтр для отсеивания-исправления таких баров.

Спасибо.

 

Немного исправил ваш вариант:

#define AMOUNT_OHLCV 5

//+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
// записывает в файл данные начиная от текущего положения
//+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
void WriteBar( int Pos ){
  static double OLHCV[AMOUNT_OHLCV];
  
  for (int i = 0; i < AMOUNT_OHLCV - 1; i++)
    OLHCV[i] = iCustom(0,0,"Grafic_for_History",ener,speed,i,Pos);

  double Tmp = OLHCV[ArrayMaximum(OLHCV, AMOUNT_OHLCV - 1, 0)];
  OLHCV[1] = OLHCV[ArrayMinimum(OLHCV, AMOUNT_OHLCV - 1, 0)];
  OLHCV[2] = Tmp;
  
  OLHCV[AMOUNT_OHLCV - 1] = 600;
  
  FileWriteInteger(handle, Time[Pos]);  //4 байта, по умолчанию
  FileWriteArray(handle, OLHCV, 0, AMOUNT_OHLCV);

  FileFlush(handle);
}
 

Попробовав увидеть такие бары не нашел их,

//+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
// записывает в файл данные начиная от текущего положения
//+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
void WriteBar( int Pos ){
  close =iCustom(0,0,"Grafic_for_History",ener,speed,0,Pos);
  open = iCustom(0,0,"Grafic_for_History",ener,speed,1,Pos);
  high = iCustom(0,0,"Grafic_for_History",ener,speed,3,Pos);
  low =  iCustom(0,0,"Grafic_for_History",ener,speed,4,Pos);
  
  if((high<open||high<close||high<low)||(low>open||low>close||low>high)){
    Alert("Fib,jxrf yf ,fht "+Pos);
  }
  
  FileWriteInteger(handle, Time[Pos]);  //4 байта, по умолчанию
  FileWriteDouble(handle, open);        //8 байтов, по умолчанию
  FileWriteDouble(handle, low);         //8 байтов, по умолчанию
  FileWriteDouble(handle, high);        //8 байтов, по умолчанию
  FileWriteDouble(handle, close);       //8 байтов, по умолчанию
  FileWriteDouble(handle, 600); //8 байтов, по умолчанию
                                        //и того 44 байта
  FileFlush(handle);
}

Уменьшил количество записываемых баров -7 баров и все отлично, спосибо. ( WriteBars(Bars-7); //пишем все бары )

 
hrenfx:

Немного исправил ваш вариант:

#define AMOUNT_OHLCV 5

//+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
// записывает в файл данные начиная от текущего положения
//+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
void WriteBar( int Pos ){
  static double OLHCV[AMOUNT_OHLCV];
  
  for (int i = 0; i < AMOUNT_OHLCV - 1; i++)
    OLHCV[i] = iCustom(0,0,"Grafic_for_History",ener,speed,i,Pos);

  double Tmp = OLHCV[ArrayMaximum(OLHCV, AMOUNT_OHLCV - 1, 0)];
  OLHCV[1] = OLHCV[ArrayMinimum(OLHCV, AMOUNT_OHLCV - 1, 0)];
  OLHCV[2] = Tmp;
  
  OLHCV[AMOUNT_OHLCV - 1] = 600;
  
  FileWriteInteger(handle, Time[Pos]);  //4 байта, по умолчанию
  FileWriteArray(handle, OLHCV, 0, AMOUNT_OHLCV);

  FileFlush(handle);
}

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

иначе ошибка затрется (хай подменится на опен если опен > хая лоу и клосе).

Думаю не рационально использовать, да и строк больше получается ))

Спасибо за помощь!

 
costy_:

А э зачем, проверять ведь надо при написании, в дальнейшем ведь при появлении ошибки Вы уведите ее в журнале терм

Если есть вероятность ошибки, почему не исправить?

Например, NASDAQ, Yahoo! Finance и Google Finance содержат иногда в своих исторических данных подобные ошибки, а иногда не содержат. Поэтому здесь сразу учтены варианты таких ошибок, что вам рекомендую сделать тоже.

 
hrenfx:

Если есть вероятность ошибки, почему не исправить?

Например, NASDAQ, Yahoo! Finance и Google Finance содержат иногда в своих исторических данных подобные ошибки, а иногда не содержат. Поэтому здесь сразу учтены варианты таких ошибок, что вам рекомендую сделать тоже.


Спасибо, отличный скрипт для примера.

Я формирую графики из "обзора рынка", ошибка возможна лишь когда нет данных какого элемента,

пересчет новых баров через 20 сек., столько времени нужно моему случаю на подкачку данных, решает проблему.

 if(дополнительный_пересчет_через(20)>0){
   FileClose(handle);
   ...

Еще раз Спасибо!

 
hrenfx:
Проверяйте, чтобы в High была наибольшая цена из OHLC, а в Low - наименьшая.

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

В журнале сообщение такое же - как у топикстартера.

Например: Бар с параметрами T=04:00:00 O=1.46520000 L=1.46410000 H=1.46670000 C=1.46670000 V=815 по мнению терминала ошибочен.

Вылечилось путем добавления к high + 0.00000001 и к low - 0.00000001.

Какой-то бред....

..........

Посмотрел в hex редакторе файлы истории терминала, в них полно одинаковых значений high и open, low и close и при этом никаких ошибок терминала нет.

...............

Кто в материале, прокомментируйте пожалуйста ситуацию.

 

Увеличьте Дижитс до 8, наверно в расчетах ошибка, и проверьте high >= low уменьшить колво Bars - 10

if(hi<lo){Alert(hi+" < "+lo);return;}

//+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
// создает и записывает в файл заголовок hst файла
//+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
void CreateHandle(string Symbol_Create, int &handle.XXX){
  int Tmp[15], TmpTime;
  string FileName = Symbol_Create + Period() + ".hst";
  handle.XXX = FileOpenHistory(FileName, FILE_BIN|FILE_WRITE);

  FileWriteInteger(handle.XXX, 400);                //4 байта, по умолчанию
  FileWriteString(handle.XXX, "Created by xz", 64); //64
  FileWriteString(handle.XXX, Symbol_Create, 12);      //12
  FileWriteInteger(handle.XXX, Period());           //4 байта, по умолчанию
  FileWriteInteger(handle.XXX, 6);             //4 байта, по умолчанию
  FileWriteArray(handle.XXX, Tmp, 0, 15);           //15*4=60 и того 148 байт на заголовок !!!
  //int, bool, datetime и color записываются поэлементно как 4-байтовые целые
  //double записываются поэлементно как 8-байтовые 
}

терминал ест только high < low и считает их колво потом пишет в журнал .

"хотя изначально в файл записывается" читали файл после создания но перед открытием оффлайн граф?!!

 
lasso:

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

В журнале сообщение такое же - как у топикстартера.

Например: Бар с параметрами T=04:00:00 O=1.46520000 L=1.46410000 H=1.46670000 C=1.46670000 V=815 по мнению терминала ошибочен.

Вылечилось путем добавления к high + 0.00000001 и к low - 0.00000001.

Какой-то бред....

..........

Посмотрел в hex редакторе файлы истории терминала, в них полно одинаковых значений high и open, low и close и при этом никаких ошибок терминала нет.

...............

Кто в материале, прокомментируйте пожалуйста ситуацию.


У меня были те же ошибки, поставив проверку, что бы High был не меньше, а Low не больше, чем любое другое значение и не было бы 2 баров с одним временем, как результат исправил собственную ошибку в алгоритме и теперь где надо бывают нулевые бары где H=O=L=C и Volume=0;


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