ФОРТС Прошу помощи - страница 7

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Vladimir Karputov
Модератор
170440
Vladimir Karputov  
Продолжаем скрывать код?
Mikhail Filimonov
5306
Mikhail Filimonov  
barabashkakvn:
Продолжаем скрывать код?

Вы, вообще читаете сообщения?

Mikalas 2015.03.26 18:56   RU

Покричали, обозвали чукчей, а проблема-то не решена!

//+------------------------------------------------------------------+
//|                                                         Test.mq5 |
//|                        Copyright 2014, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//
bool is_failed = false;
datetime start_time;
datetime end_time;
int mix_bars, rts_bars, si_bars;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
    start_time = StringToTime( "2015.03.17" );
    end_time = TimeCurrent();
//--- indicator buffers mapping
  mix_bars = GetBars( "MIX-6.15" , PERIOD_CURRENT, start_time, end_time ); 
  if ( mix_bars < 1 )
  {
    is_failed = true;
    Print( "Init failed. MIX-6.15 ");
  }
  rts_bars = GetBars( "RTS-6.15" , PERIOD_CURRENT, start_time, end_time ); 
  if ( rts_bars < 1 )
  {
    is_failed = true;
    Print( "Init failed. RTS-6.15 ");
  }
  si_bars = GetBars( "Si-6.15" , PERIOD_CURRENT, start_time, end_time ); 
  if ( si_bars < 1 )
  {
    is_failed = true;
    Print( "Init failed. Si-6.15 ");
  }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator Get bars function                               |
//+------------------------------------------------------------------+
int GetBars( string symbol, ENUM_TIMEFRAMES period, const datetime start_date, const datetime end_date )
{
  if ( !SymbolInfoInteger( symbol, SYMBOL_SELECT ) )
  {
    ResetLastError();
//---    
    if ( GetLastError() != ERR_MARKET_UNKNOWN_SYMBOL )
    {
      SymbolSelect( symbol, true );
    }
    else
    {
      Print( "GetBars: Неизвестный символ - ", symbol );
      return( 0 );
    }    
  }
//---  
  if ( MQL5InfoInteger( MQL5_PROGRAM_TYPE ) == PROGRAM_INDICATOR && Period() == period && Symbol() == symbol )
  {
    Print( "GetBars: Не пройдена проверка типа программы!" );
    return( 0 );
  }  
//---
  if ( SymbolIsSynchronized( symbol ) )
  {
    return( Bars( symbol, period, start_date, end_date ) );
  }
  else
  {
    long first_date = 0;
    datetime times[1];
//---    
    if ( SeriesInfoInteger( symbol, PERIOD_M1, SERIES_TERMINAL_FIRSTDATE, first_date ) )
    {
      if ( first_date > 0 )
      {
//--- force timeseries build
        CopyTime( symbol, period, datetime( first_date ) + PeriodSeconds( period ), 1, times );
//--- check date
        if ( SeriesInfoInteger( symbol, period, SERIES_FIRSTDATE, first_date ) )
//---        
        if ( first_date > 0 && first_date <= long( start_date ) )
        {
          return( Bars( symbol, period, start_date, end_date ) );
        } 
      }
    }
    Print( "Необходима загрузка истории с сервера!");
  }       
//---  
  return( 0 );
}  
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   if ( is_failed )
   {
     Print( "Sorry! Get Bars failed." );
   }
   else Print( "Bingo! We done.");
//--- return value of prev_calculated for next call
   return(rates_total);
  }

 Закачку истории не написал ещё, НО данные есть в терминале, а НЕ БЕРУТСЯ из него с первого раза!

 

2015.03.26 20:49:01.641 Test (MIX-6.15,M1)      Необходима загрузка истории с сервера!
2015.03.26 20:49:01.641 Test (MIX-6.15,M1)      Init failed. RTS-6.15 
2015.03.26 20:49:01.641 Test (MIX-6.15,M1)      Необходима загрузка истории с сервера!
2015.03.26 20:49:01.641 Test (MIX-6.15,M1)      Init failed. Si-6.15 
2015.03.26 20:49:01.641 Test (MIX-6.15,M1)      Sorry! Get Bars failed. 

в карман правка удалить 

Mikhail Filimonov
5306
Mikhail Filimonov  

Кто-нибудь может объяснить:

Почему функция с идентификатором SERIES_TERMINAL_FIRSTDATE, при наличии данных

в терминале возвращает FALSE? 

SeriesInfoInteger( symbol, PERIOD_M1, SERIES_TERMINAL_FIRSTDATE, first_date )
Andrey Miguzov
1992
Andrey Miguzov  
Mikalas:

Кто-нибудь может объяснить:

Почему функция с идентификатором SERIES_TERMINAL_FIRSTDATE, при наличии данных

в терминале возвращает FALSE? 

5 сек. Сейчас ссылок накидаю...
Mikhail Filimonov
5306
Mikhail Filimonov  
MigVRN:
5 сек. Сейчас ссылок накидаю...

Из справки Организация доступа к данным --> Пример скрипта для закачки истории:

Если мы успешно прошли все проверки, то сделаем последнюю попытку обойтись без обращения к торговому серверу. Сначала узнаем начальную дату, для которой доступны минутные данные в формате HCC.
Запросим это значение функцией SeriesInfoInteger() с модификатором SERIES_TERMINAL_FIRSTDATE и опять сравним со значением параметра start_date.

   if(SeriesInfoInteger(symbol,PERIOD_M1,SERIES_TERMINAL_FIRSTDATE,first_date))
     {
      //--- there is loaded data to build timeseries
      if(first_date>0)
        {
         //--- force timeseries build
         CopyTime(symbol,period,first_date+PeriodSeconds(period),1,times);
         //--- check date
         if(SeriesInfoInteger(symbol,period,SERIES_FIRSTDATE,first_date))
            if(first_date>0 && first_date<=start_date) return(2);
        }
     }
 
Sergey Chalyshev
7803
Sergey Chalyshev  
MigVRN:

Всё происходит ровно так, как и написано в документации. :)

Набросал для проверки индикатор и эксперта + результат на видео.

1) Сначала бросаю на график эксперта, у которого внутри OnTick есть функция,  работающая в течение 20 секунд.

Результат – чат продолжает работать и отображать всё как надо.  Стакан тоже работает как надо.

2) Потом бросаем на график индикатор, у которого внутри OnCalculate есть функция,  работающая в течение 20 секунд.

Результат – чат подвисает. Причем соседний чат с тем же символом, на котором установлен другой период тоже подвисает. Стакан продолжает работать как надо. После того как функция отработала – всё возвращается на круги своя.

3) На видео этого нет - но если на один чат набросить индикатор (поставьте 60 сек), а на другой эксперта - эксперт не начинает работать пока не отглючит индикатор на другом чате!!! 

Видео прикрепил отдельно - в браузере у меня тормозит. 

Нихренасебе, куда пропала многопоточночть ?!

Пока индикатор не отработает, до советника тики не доходят!

Mikhail Filimonov
5306
Mikhail Filimonov  
Serj_Che:

Нихренасебе, куда пропала многопоточночть ?!

Пока индикатор не отработает, до советника тики не доходят!

До стакана заявки доходят, просто last не отображается на чарте.
Andrey Miguzov
1992
Andrey Miguzov  
Serj_Che:

Нихренасебе, куда пропала многопоточночть ?!

Пока индикатор не отработает, до советника тики не доходят!

так всегда было

Mikalas:
До стакана заявки доходят, просто last не отображается на чарте.

Он тик эксперта не работает. Да и всё остальное на чате. Таймер и пользовательские события правда не проверял.

Mikalas:

Из справки Организация доступа к данным --> Пример скрипта для закачки истории:

Тоже из справки 

... Служебные файлы в формате HCC исполняют роль источника данных для построения ценовых данных по запрошенным таймфреймам в формате HC. Данные в формате HC являются таймсериями, максимально подготовленными для быстрого доступа. Они создаются только по запросу графика или mql5-программы в объеме, не превышающем значения параметра "Max bars in charts", и сохраняются для дальнейшего использования в файлах с расширением hc.

Для экономии ресурсов данные по таймфрейму загружаются и хранятся в оперативной памяти только по необходимости, при длительном отсутствии обращений к данным происходит выгрузка их из оперативной памяти с сохранением в файл. Для каждого таймфрейма данные подготавливаются независимо от наличия уже готовых данных для других таймфреймов. Правила формирования и доступности данных одинаковы для всех таймфреймов. Т.е. не смотря на то, что единицей хранения данных в формате HCC является минутный бар, наличие данных в формате HCC не означает наличие и доступность в том же объеме данных таймфрейма М1 в формате HC.

Andrey Miguzov
1992
Andrey Miguzov  
Mikalas:

Кто-нибудь может объяснить:

Почему функция с идентификатором SERIES_TERMINAL_FIRSTDATE, при наличии данных

в терминале возвращает FALSE? 

Потому что именно она ПЕРВЫЙ раз обращается конкретно к этой серии.
Vladimir Karputov
Модератор
170440
Vladimir Karputov  
Mikalas:

Из справки Организация доступа к данным --> Пример скрипта для закачки истории:

Ну вот. Вы на верном пути. Для проверки того, как именно работает терминал, а не того как Вы это себе представляете простой алгоритм проверки.

  • В терминале открыть один график "MIX-6.15 M1". На графике индикатор из первого поста.
  • Из терминала "Открыть каталог данных".
  • Ищем историю по символу "MIX-6.15" по такому пути ...\Terminal\D0*******CF37AD**55**0E51F**75\bases\Open-Demo\history
  • Выгружаем терминал.
  • Удаляем папку "MIX-6.15".
  • Загружаем терминал. Видим ошибку. Немного издеваемся над графиком - несколько раз меняем таймфрейм. Например M1 и M5  несколько раз. Ошибка исчезает. Это значит, данные другого таймфрейма (отличного от того, что запрашиваем в коде) подготовились. Если не хотим вот так вручную менять таймфреймы - нужно озаботиться подготовкой данных самому.
  • Перезагружаем терминал - ошибки нет.
  • Если не понятно, то повторяем эксперимент. 
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий