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

 
komposter:
Блевать, Эдвард, блЕвать =)
Ну уж , выбачай, у меня этот процесс через "Ю" происходит)))
 
Mikalas:

Это я понял, но скажите, почему нельзя было сделать так, как я описал выше?

На скорость обработки информации это никак бы не повлияло:

Если была какая-либо информация по инструменту - заносим дату первого её появления и храним в памяти - 8 байт!

Можно даже не хранить, а когда делаешь SymbolSelect(), то заносить в память. 

При обращении функцией SeriesInfoInteger ( SERIES_TERMINAL_FIRSTDATE ) получаем:

А -1 - нет никаких данных

Б. 0 - дпнные есть но не готовы

В. Дата первой информации

 Тогда бы всё было ясно и прозрачно.

-1 - Идём на сервер

0 - Ждём следующей итерации, чтобы проверить и (или) построить таймсерию 

> 0 Строим таймсерию

Из вашей справки я понял, что ВЫ почти так и сделали, оказывается нет.

Видимо один программист начинал писать, а кто-то другой закончил 

 Ваша реализация хороша для ФОРЕКС, но очень неудобна для ФОРТС.

На ФОРТС котировки могут долго не приходить, а таймсерия выгружается из паияти

и приходится весь процесс получения данных повторять снова, причём с заходом на сервер

Для работы с данными множества символов используйте экспертов, все будет удобно и просто. Индикаторы в среде МТ5 в первую очередь рассчитаны на быстрый расчет по данным своей таймсерии и отображение результатов расчета на чарте. В процессе развития платформы они получили множество функций доступных экспертам, но базовые архитектурные ограничения остались. И нет никаких оснований полностью стирать отличие индикаторов от экспертов. Еще раз напоминаю, что самое существенное отличие заключается в наличии у экспертов собственного потока обработки. Расчет индикаторов происходит в служебном потоке, и этот поток выполняет множество других функций. Именно поэтому даже общий с экспертами функционал имеет разную реализацию.

Что касается доступа к истории, то универсального решения тут нет. Терминал заранее не может предсказать желание потребителя, т.е. хочет ли эксперт получить только одну дату или хочет запросить всю доступную историю. В терминале сделан выбор в пользу быстрого доступа к таймфрейму, т.е. по запросу пользователя делается попытка закэшировать актуальное (синхронизированное с сервером) состояние истории в полном объеме. Делается ставка на повторный активный доступ.  Да, есть класс приложений где этот подход не удобен. Но если программист не будет зацикливаться на требованиях переписать терминал "лично под себя", то найдет решение в имеющемся функционале. Если решения нет совсем, то вот только тогда встает вопрос расширения функционала.

Описывайте конкретную проблему с конкретным кодом, без обобщений. Иначе получается, что непонятый функционал одной единственной функции раздувается до "все не так" и "все неудобно".

 
antt:

Для работы с данными множества символов используйте экспертов, все будет удобно и просто. Индикаторы в среде МТ5 в первую очередь рассчитаны на быстрый расчет по данным своей таймсерии и отображение результатов расчета на чарте. В процессе развития платформы они получили множество функций доступных экспертам, но базовые архитектурные ограничения остались. И нет никаких оснований полностью стирать отличие индикаторов от экспертов. Еще раз напоминаю, что самое существенное отличие заключается в наличии у экспертов собственного потока обработки. Расчет индикаторов происходит в служебном потоке, и этот поток выполняет множество других функций. Именно поэтому даже общий с экспертами функционал имеет разную реализацию.

Что касается доступа к истории, то универсального решения тут нет. Терминал заранее не может предсказать желание потребителя, т.е. хочет ли эксперт получить только одну дату или хочет запросить всю доступную историю. В терминале сделан выбор в пользу быстрого доступа к таймфрейму, т.е. по запросу пользователя делается попытка закэшировать актуальное (синхронизированное с сервером) состояние истории в полном объеме. Делается ставка на повторный активный доступ.  Да, есть класс приложений где этот подход не удобен. Но если программист не будет зацикливаться на требованиях переписать терминал "лично под себя", то найдет решение в имеющемся функционале. Если решения нет совсем, то вот только тогда встает вопрос расширения функционала.

Описывайте конкретную проблему с конкретным кодом, без обобщений. Иначе получается, что непонятый функционал одной единственной функции раздувается до "все не так" и "все неудобно".

Добрый день, Антон!

Давайте "разберём" Ваш ответ:

1. "Для работы с данными множества символов используйте экспертов, все будет удобно и просто." 

Мне нужна история (close) по 3-м символам с отображением на чарте.

Из советника есть другой способ получения истории по close?

И нужно "городить огород", чтобы нарисовать результаты из советника(в отдельном окне)!

2. "Что касается доступа к истории, то универсального решения тут нет. Терминал заранее не может предсказать желание потребителя, т.е. хочет ли эксперт получить только одну дату или хочет запросить всю доступную историю" 

Не нужно предугадывать желания потребителя. Нужно просто "сказать" в каком состоянии данные по символу И ВСЁ!.

Тогда пользователь ТОЧНО будет знать какие действия ему нужно совершать далее. 

3."Но если программист не будет зацикливаться на требованиях переписать терминал "лично под себя", то найдет решение в имеющемся функционале."

Я не говорил, а тем более не требовал что-то делать "под себя", и решение, конечно всегда найдётся в имеющимся функционале. 

4. "Если решения нет совсем, то вот только тогда встает вопрос расширения функционала."

Не надо расширять функционал, можно просто ввести незначительные изменения для удобства и быстроты использования.

 5. "Описывайте конкретную проблему с конкретным кодом, без обобщений. Иначе получается, что непонятый функционал одной единственной функции раздувается до "все не так" и "все неудобно" "

Хорошо, я подготовлюсь для "расширенного" разъяснения проблемы с конкретным кодом.

Только, к сожалению, на справочник "опираться" нельзя... 

 

Спасибо, что ответили. 

 
Mikalas:


Как всегда позиция пользователя - я центр вселенной и мир вращается вокруг меня. Нужно использовать тот функционал, который есть. Тем более не один раз было показано, как получить данные.
 
barabashkakvn:
Как всегда позиция пользователя - я центр вселенной и мир вращается вокруг меня. Нужно использовать тот функционал, который есть. Тем более не один раз было показано, как получить данные.
А сколько будет 2х2 ?
 
barabashkakvn:
Как всегда позиция пользователя - я центр вселенной и мир вращается вокруг меня. Нужно использовать тот функционал, который есть. Тем более не один раз было показано, как получить данные.

А вы считаете наоборот. Центр вселенной - это разработчики и мир вращается вокруг них ? Так что ли ?

Тогда на один вопрос ответе, терминал этот для кого разрабатывается ? Разработчики сами для себя его делают или для пользователя ?

Если сами для себя то вопросов нет... все ок.

А вот если для пользователя, то к их мнению нужно как минимум прислушиваться... 

 
antt:

........

Описывайте конкретную проблему с конкретным кодом, без обобщений. Иначе получается, что непонятый функционал одной единственной функции раздувается до "все не так" и "все неудобно".

Описываю:

Реальный счёт ФОРТС брокера.

Проблема - Не получаю данные таймсерии. 

 

 

1. На картинках видно, что данные в терминале есть. 

2. Вот код:

//+------------------------------------------------------------------+
//|                                                     Ind_test.mq5 |
//|                                          Copyright 2015, Mikalas |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, Mikalas"
#property link      "http://www.mql5.com"
#property version   "1.00"
//
#property indicator_separate_window

#property indicator_buffers 1
#property indicator_plots   1

//--- plot Label1
#property indicator_label1  "Data"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrYellow
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//---
ENUM_TIMEFRAMES time_frame; //Таймфрейм
//
string sec_symbol;
//
input string StartData = "2015.03.16"; //Дата начала расчёта индикатора
//--- indicator buffers
double MainBuffer[];
//---
datetime start_time;
datetime end_time;
datetime sec_times[];
//
int  sec_bars;
//
int next_month;
//+------------------------------------------------------------------+
//| Indicator Expert set second symbol function                      |
//+------------------------------------------------------------------+
string SetSecSymbol( const string aSymbol )
{
  int str_tire = 0;
  int str_tochka = 0;
  ushort let_symbol;
  string str_month, str_year;
  long aYear;
    
  int str_size = StringLen( aSymbol );
    
  for( int i = 0; i < str_size; i++ )
  {
    let_symbol = StringGetCharacter( aSymbol, i );
      
    if ( let_symbol == '-' )
    {
      str_tire = i;
    }
      
    if ( let_symbol == '.' )
    {
      str_tochka = i;
    }
  }
    
  if ( ( str_tire != 0 ) && ( str_tochka != 0 ) )
  {
    str_month = StringSubstr( aSymbol, str_tire + 1, str_tochka - str_tire - 1 );
    str_year = StringSubstr( aSymbol, str_tochka + 1, str_size - str_tochka - 1 );
    
    if ( str_month == "12" )
    {
      str_month = IntegerToString( next_month );
        
      aYear = StringToInteger( str_year );
      aYear = aYear + 1;
      str_year = IntegerToString( aYear );
    }
    else
    {
      long aMonth = StringToInteger( str_month );
      aMonth = aMonth + next_month;
      
      if ( aMonth > 12 )
      {
        aMonth = aMonth - 12;
        aYear = StringToInteger( str_year );
        aYear = aYear + 1;
        str_year = IntegerToString( aYear );
      } 
      str_month = IntegerToString( aMonth );
    }
  }
//--- Set new symbol 
  return( StringSubstr( aSymbol, 0, str_tire + 1 ) + str_month + "." + str_year );
}
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
bool CheckBrent( const string a_symbol )
{
  ushort let_symbol;
  int str_size = StringLen( a_symbol );
    
  for( int i = 0; i < str_size; i++ )
  {
    let_symbol = StringGetCharacter( a_symbol, i );
      
    if ( let_symbol == '-' )
    {
      string str_info = StringSubstr( a_symbol, 0, i );
//---      
      if ( str_info == "BR" )
      {
        return( true );
      }
    }
  }
  return( false );
}
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{
  time_frame = PERIOD_CURRENT;
  next_month = 3;
//---
  if ( CheckBrent( _Symbol ) ) next_month = 1;
//---
  sec_symbol = SetSecSymbol( _Symbol );
//---
  SymbolSelect( sec_symbol, true );  
//---
  end_time = datetime( SymbolInfoInteger( _Symbol, SYMBOL_EXPIRATION_TIME ) );
  start_time = datetime( StringToTime( StartData ) + 19 * 3600 + 10 * 60 );
//---  
  IndicatorSetInteger( INDICATOR_DIGITS, 0 );
  IndicatorSetString( INDICATOR_SHORTNAME, "FORTS" );
  SetIndexBuffer( 0, MainBuffer, INDICATOR_DATA );
  PlotIndexSetDouble( 0, PLOT_EMPTY_VALUE, EMPTY_VALUE );
  ArraySetAsSeries( MainBuffer, true );
//---
  if ( ( TimeCurrent() - start_time ) < 60 )
  {
    Print( "Слишком мал промежуток времени!" );
    return( INIT_FAILED );
  }
//--- 
  Print( "OnInit: Получение баров для символа ", sec_symbol, "..." ); 
  sec_bars = GetBars( sec_symbol, time_frame, start_time, end_time );
//---
  return( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+
//|  Custom indicator deinitialization function                      |
//+------------------------------------------------------------------+
void OnDeinit( const int reason )
{
  if ( reason == REASON_INITFAILED )
  {
    ChartIndicatorDelete( 0, 1, "FORTS" ); 
  }
}
//+------------------------------------------------------------------+
// Custom indicator Check timer function                             |
//+------------------------------------------------------------------+
bool CheckTimer( const uint start_value, const uint per_value )
{
  uint end_value = GetTickCount();
  
  if ( end_value < start_value )
  {
    if ( ( start_value - end_value ) >= per_value ) return( true );
  } 
  else
  {
    if ( ( end_value - start_value ) >= per_value ) return( true );
  }
  return( false );
}
//+------------------------------------------------------------------+
//| Custom indicator Get local data function                         |
//+------------------------------------------------------------------+
int GetLocalData( const string a_symbol, ENUM_TIMEFRAMES a_period, datetime start_date, datetime end_date )
{
  datetime times[1];
//---  
  long first_date = SeriesInfoInteger( a_symbol, PERIOD_M1, SERIES_TERMINAL_FIRSTDATE );  
  
  if ( first_date > 0 )
  Print( "GetLocalData: Первая дата в терминале есть." );
  {
//--- force timeseries build
    CopyTime( a_symbol, a_period, datetime( first_date ) + PeriodSeconds( a_period ), 1, times );
//--- check date
    first_date = SeriesInfoInteger( a_symbol, PERIOD_M1, SERIES_FIRSTDATE );
//---        
    if ( first_date > 0 && first_date <= long( start_date ) )
    {
      bool is_sync = bool( SeriesInfoInteger( a_symbol, a_period, SERIES_SYNCHRONIZED ) ); 
//---     
      if ( is_sync )
      {
        Print( "GetLocalData: Серия синхронизирована." );
        return( Bars( a_symbol, a_period, start_date, end_date ) );
      }
    }  
  }
  Print( "GetLocalData: Не удалось построить таймсерию!" );
  return( 0 );
}
//+------------------------------------------------------------------+
//| Custom indicator Get server data function                        |
//+------------------------------------------------------------------+
int LoadServerData( const string a_symbol, ENUM_TIMEFRAMES period, const datetime start_date, const datetime end_date  )
{
  SeriesInfoInteger( a_symbol, PERIOD_M1, SERIES_SERVER_FIRSTDATE );
  int fail_cnt = 0;
//---
  while ( fail_cnt < 10 )
  {
    uint start_tick = GetTickCount();
//---    
    while ( !CheckTimer( start_tick, 5 ) )
    {
      if ( SymbolIsSynchronized( a_symbol ) )
      {
        Print( "LoadServerData: Символ синхронизирован." );
        return( GetLocalData( a_symbol, period, start_date, end_date ) );
      }
    }
    fail_cnt++;
    start_tick = GetTickCount();
  }
  Print( "LoadServerData: Не удалось загрузить историю с сервера!" );
  return( 0 );
}
//+------------------------------------------------------------------+
//| Custom indicator Get bars function                               |
//+------------------------------------------------------------------+
int GetBars( string symbol, ENUM_TIMEFRAMES period, const datetime start_date, const datetime end_date )
{
//---Check for symbol present
  if ( !SymbolInfoInteger( symbol, SYMBOL_SELECT ) )
  {
    ResetLastError();
//---    
    if ( GetLastError() != ERR_MARKET_UNKNOWN_SYMBOL )
    {
      SymbolSelect( symbol, true );
    }
    else
    {
      Print( "GetBars: Неизвестный символ - ", symbol );
      return( 0 );
    }    
  }
//---Check program  
  if ( MQL5InfoInteger( MQL5_PROGRAM_TYPE ) == PROGRAM_INDICATOR && Period() == period && Symbol() == symbol )
  {
    Print( "GetBars: Не пройдена проверка типа программы!" );
    return( 0 );
  }  
//---
  if ( SymbolIsSynchronized( symbol ) )
  {
    Print( "GetBars: Символ синхронизирован." );
//---Check series syncronization
    bool is_sync = bool( SeriesInfoInteger( symbol, period, SERIES_SYNCHRONIZED ) );
   
    if ( is_sync )
    {
      Print( "GetBars: Серия синхронизирована." );
      return( Bars( symbol, period, start_date, end_date ) );
    }
    else
    {
      Print( "GetBars: Локальная загрузка..." );
      return( GetLocalData( symbol, period, start_date, end_date ) );
    }  
  }
  else
  {
    Print( "GetBars: Символ НЕ синхронизирован. Загрузка данных с сервера..." );
    return( LoadServerData( symbol, period, start_date, end_date ) );
  }       
//---  
  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[])
{
  int nStartBar = rates_total - prev_calculated;
//---
  ArraySetAsSeries( time, true );
  ArraySetAsSeries( close, true );
  ArraySetAsSeries( sec_times, true );
//---
  Print( "OnCalculate: Получение баров для символа ", sec_symbol, "..." );
  sec_bars = GetBars( sec_symbol, time_frame, start_time, end_time );
//---  
  if ( sec_bars < 1 )
  {
    Print( "OnCalculate: Не получены бары по символу - ", sec_symbol );
    return( prev_calculated );
  }
  else
  {
    sec_bars = CopyTime( sec_symbol, time_frame, 0, sec_bars, sec_times );
    if ( sec_bars < 1 )
    {
      Print( "OnCalculate: Не скопированы тийминги по символу - ", sec_symbol );
      return( prev_calculated );
    }
  }
  Print( "OnCalculate: Данные получены." );
 
  return( rates_total );
}

//+------------------------------------------------------------------+

 

 3. А вот исход:

2015.03.31 06:39:16.826 Ind_test (BR-4.15,M1)   OnInit: Получение баров для символа BR-5.15...
2015.03.31 06:39:16.827 Ind_test (BR-4.15,M1)   GetBars: Символ НЕ синхронизирован. Загрузка данных с сервера...
2015.03.31 06:39:16.848 Ind_test (BR-4.15,M1)   LoadServerData: Символ синхронизирован.
2015.03.31 06:39:16.848 Ind_test (BR-4.15,M1)   GetLocalData: Первая дата в терминале есть.
2015.03.31 06:39:16.848 Ind_test (BR-4.15,M1)   GetLocalData: Не удалось построить таймсерию!
2015.03.31 06:39:16.848 Ind_test (BR-4.15,M1)   OnCalculate: Получение баров для символа BR-5.15...
2015.03.31 06:39:16.848 Ind_test (BR-4.15,M1)   GetBars: Символ синхронизирован.
2015.03.31 06:39:16.848 Ind_test (BR-4.15,M1)   GetBars: Серия синхронизирована.
2015.03.31 06:39:16.848 Ind_test (BR-4.15,M1)   OnCalculate: Не получены бары по символу - BR-5.15
2015.03.31 06:39:49.379 Ind_test (ED-6.15,M1)   OnInit: Получение баров для символа ED-9.15...
2015.03.31 06:39:49.379 Ind_test (ED-6.15,M1)   GetBars: Символ НЕ синхронизирован. Загрузка данных с сервера...
2015.03.31 06:39:49.399 Ind_test (ED-6.15,M1)   LoadServerData: Символ синхронизирован.
2015.03.31 06:39:49.399 Ind_test (ED-6.15,M1)   GetLocalData: Первая дата в терминале есть.
2015.03.31 06:39:49.399 Ind_test (ED-6.15,M1)   GetLocalData: Не удалось построить таймсерию!
2015.03.31 06:39:49.399 Ind_test (ED-6.15,M1)   OnCalculate: Получение баров для символа ED-9.15...
2015.03.31 06:39:49.399 Ind_test (ED-6.15,M1)   GetBars: Символ синхронизирован.
2015.03.31 06:39:49.399 Ind_test (ED-6.15,M1)   GetBars: Серия синхронизирована.
2015.03.31 06:39:49.399 Ind_test (ED-6.15,M1)   OnCalculate: Не получены бары по символу - ED-9.15
2015.03.31 06:39:55.555 Ind_test (Eu-6.15,M1)   OnInit: Получение баров для символа Eu-9.15...
2015.03.31 06:39:55.555 Ind_test (Eu-6.15,M1)   GetBars: Символ НЕ синхронизирован. Загрузка данных с сервера...
2015.03.31 06:39:55.567 Ind_test (Eu-6.15,M1)   LoadServerData: Символ синхронизирован.
2015.03.31 06:39:55.567 Ind_test (Eu-6.15,M1)   GetLocalData: Первая дата в терминале есть.
2015.03.31 06:39:55.567 Ind_test (Eu-6.15,M1)   GetLocalData: Не удалось построить таймсерию!
2015.03.31 06:39:55.567 Ind_test (Eu-6.15,M1)   OnCalculate: Получение баров для символа Eu-9.15...
2015.03.31 06:39:55.567 Ind_test (Eu-6.15,M1)   GetBars: Символ синхронизирован.
2015.03.31 06:39:55.567 Ind_test (Eu-6.15,M1)   GetBars: Серия синхронизирована.
2015.03.31 06:39:55.567 Ind_test (Eu-6.15,M1)   OnCalculate: Не получены бары по символу - Eu-9.15
2015.03.31 06:40:01.683 Ind_test (GAZR-6.15,M1) OnInit: Получение баров для символа GAZR-9.15...
2015.03.31 06:40:01.683 Ind_test (GAZR-6.15,M1) GetBars: Символ НЕ синхронизирован. Загрузка данных с сервера...
2015.03.31 06:40:01.694 Ind_test (GAZR-6.15,M1) LoadServerData: Символ синхронизирован.
2015.03.31 06:40:01.694 Ind_test (GAZR-6.15,M1) GetLocalData: Первая дата в терминале есть.
2015.03.31 06:40:01.694 Ind_test (GAZR-6.15,M1) GetLocalData: Не удалось построить таймсерию!
2015.03.31 06:40:01.694 Ind_test (GAZR-6.15,M1) OnCalculate: Получение баров для символа GAZR-9.15...
2015.03.31 06:40:01.694 Ind_test (GAZR-6.15,M1) GetBars: Символ синхронизирован.
2015.03.31 06:40:01.694 Ind_test (GAZR-6.15,M1) GetBars: Серия синхронизирована.
2015.03.31 06:40:01.694 Ind_test (GAZR-6.15,M1) OnCalculate: Не получены бары по символу - GAZR-9.15
Файлы:
20150331.log  7 kb
 

Как воспроизвести?

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

Лог индикатора с момента старта

2015.03.31 11:00:35.611 tmp6 (GAZR-6.15,M1)     OnInit: Получение баров для символа GAZR-9.15...
2015.03.31 11:00:35.611 tmp6 (GAZR-6.15,M1)     GetBars: Символ НЕ синхронизирован. Загрузка данных с сервера...
2015.03.31 11:00:35.638 tmp6 (GAZR-6.15,M1)     LoadServerData: Символ синхронизирован.
2015.03.31 11:00:35.638 tmp6 (GAZR-6.15,M1)     GetLocalData: Не удалось построить таймсерию!
2015.03.31 11:00:35.638 tmp6 (GAZR-6.15,M1)     OnCalculate: Получение баров для символа GAZR-9.15...
2015.03.31 11:00:35.638 tmp6 (GAZR-6.15,M1)     GetBars: Символ синхронизирован.
2015.03.31 11:00:35.638 tmp6 (GAZR-6.15,M1)     GetBars: Серия синхронизирована.
2015.03.31 11:00:35.638 tmp6 (GAZR-6.15,M1)     OnCalculate: Не получены бары по символу - GAZR-9.15
2015.03.31 11:00:36.306 tmp6 (GAZR-6.15,M1)     OnCalculate: Получение баров для символа GAZR-9.15...
2015.03.31 11:00:36.306 tmp6 (GAZR-6.15,M1)     GetBars: Символ синхронизирован.
2015.03.31 11:00:36.306 tmp6 (GAZR-6.15,M1)     GetBars: Серия синхронизирована.
2015.03.31 11:00:36.306 tmp6 (GAZR-6.15,M1)     OnCalculate: Данные получены.
2015.03.31 11:00:37.123 tmp6 (GAZR-6.15,M1)     OnCalculate: Получение баров для символа GAZR-9.15...
2015.03.31 11:00:37.123 tmp6 (GAZR-6.15,M1)     GetBars: Символ синхронизирован.
2015.03.31 11:00:37.123 tmp6 (GAZR-6.15,M1)     GetBars: Серия синхронизирована.
2015.03.31 11:00:37.123 tmp6 (GAZR-6.15,M1)     OnCalculate: Данные получены.


Как видите менее чем через секунду с момента старта данные по символу стали доступны индикатору.

 
alexvd:

Как воспроизвести?

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

Лог индикатора с момента старта


Как видите менее чем через секунду с момента старта данные по символу стали доступны индикатору.

Добрый день!

Т.е СЕКУНДА, при электронной торговле - это не время? 

1. То есть, при синхронизированном символе и синхронизированной таймсерии, мы не можем получить

бары (сразу) - это нормально?

(Для меня) - это ошибка. 

2015.03.31 11:00:35.638 tmp6 (GAZR-6.15,M1)     GetBars: Символ синхронизирован.
2015.03.31 11:00:35.638 tmp6 (GAZR-6.15,M1)     GetBars: Серия синхронизирована.
2015.03.31 11:00:35.638 tmp6 (GAZR-6.15,M1)     OnCalculate: Не получены бары по символу - GAZR-9.15

 

 2. При наличии данных в ТЕРМИНАЛЕ (см. рис. все бары после 16 марта), мы вынуждены идти на сервер, это нормально?

Неудобство и долгое получение информации (для меня) - очевидно. 

2015.03.31 11:00:35.611 tmp6 (GAZR-6.15,M1)     OnInit: Получение баров для символа GAZR-9.15...
2015.03.31 11:00:35.611 tmp6 (GAZR-6.15,M1)     GetBars: Символ НЕ синхронизирован. Загрузка данных с сервера...
 
Mikalas:

Добрый день!

Т.е СЕКУНДА, при электронной торговле - это не время?

Секунда с момента старта, т.е. один раз на старте. "Не время."