2 вопроса МТ5

 

Первый вопрос.

Как избавиться от "хвоста"?

И вопрос второй. Почему этот индикатор отрисовывается в тестере, а если бросить его на график - не рисуется?


 
Сергей Таболин:

Как избавиться от "хвоста"?

Правильно отсчитывать ВСЕ бары. Ничего не пропускать.

Сергей Таболин:

И вопрос второй. Почему этот индикатор отрисовывается в тестере, а если бросить его на график - не рисуется?

Исправить работу в онлайн. Смотреть в сторону анализа prev_calculated.

 
Vladimir Karputov:

Правильно отсчитывать ВСЕ бары. Ничего не пропускать.

Исправить работу в онлайн. Смотреть в сторону анализа prev_calculated.

Не поможете разобраться?

Для начала, в OnInit() есть такие строки:

   ArrayResize(symbols_name,1);
   symbols_name[nV++]   = Symbol();
   bars_calc            = Bars(Symbol(),PERIOD_CURRENT);
   
   ArrayPrint(symbols_name);
   Print("bars_calc = ",bars_calc);
   for(int i = 1; i < ArraySize(symbols_name); i++)
   {
      int bc = Bars(symbols_name[i],PERIOD_CURRENT);
      if(bars_calc > bc) bars_calc = bc;
      Print(symbols_name[i]," ",i," ~~~ bars_calc = ",bars_calc);
   }

При запуске в тестере получаю

"GBPUSD" "GBPNZD" "GBPJPY" "GBPCHF" "GBPCAD" "GBPAUD" "EURGBP"
bars_calc = 646
GBPNZD 1 ~~~ bars_calc = 646
GBPJPY 2 ~~~ bars_calc = 646
GBPCHF 3 ~~~ bars_calc = 646
GBPCAD 4 ~~~ bars_calc = 646
GBPAUD 5 ~~~ bars_calc = 646
EURGBP 6 ~~~ bars_calc = 646

А при подключении к графику

"GBPUSD" "GBPNZD" "GBPJPY" "GBPCHF" "GBPCAD" "GBPAUD" "EURGBP"
bars_calc = 9317
GBPNZD 1 ~~~ bars_calc = 0
GBPJPY 2 ~~~ bars_calc = 0
GBPCHF 3 ~~~ bars_calc = 0
GBPCAD 4 ~~~ bars_calc = 0
GBPAUD 5 ~~~ bars_calc = 0
EURGBP 6 ~~~ bars_calc = 0

Что здесь не так?

 
Сергей Таболин:

Не поможете разобраться?

Для начала, в OnInit() есть такие строки:

При запуске в тестере получаю

А при подключении к графику

Что здесь не так?

Bars

Примечание

Если данные для таймсерии с указанными параметрами при вызове функции Bars() еще не сформированы в терминале, или данные таймсерии в момент вызова функции не  синхронизированы с торговым сервером, то функция вернет нулевое значение.

Документация по MQL5: Доступ к таймсериям и индикаторам / Организация доступа к данным
Документация по MQL5: Доступ к таймсериям и индикаторам / Организация доступа к данным
  • www.mql5.com
Прежде чем ценовые данные будут доступны в терминале MetaTrader 5, их необходимо получить и обработать. Для получения данных требуется подключение к торговому серверу MetaTrader 5. Данные поступают с сервера по запросу терминала в виде экономно упакованных блоков минутных баров. Механизм обращения к серверу за данными не зависит от того, каким...
 
Vladimir Karputov:

Bars

Примечание

Если данные для таймсерии с указанными параметрами при вызове функции Bars() еще не сформированы в терминале, или данные таймсерии в момент вызова функции не  синхронизированы с торговым сервером, то функция вернет нулевое значение.

Спасибо.

Добавил код из примера, несколько попыток получить количество доступных баров. Работает. Но не с первого раза. Другими словами, при добавлении индикатора на график, он может запуститься только при его повторном добавлении (после удаления его же с графика), а то и двух раз бывает мало...

Отсюда вопрос: как можно "насильно" синхронизировать данные по символу (не текущему)?

 

С "хвостами" разобрался (хотя и не понял как ))). 

А вот с синхронизацией беда. По идее, если уж данные по символу уже скачаны, то при последующем обращении к этому символу уже проблем быть не должно? А выходит так что после перезагрузки терминала, обращение к символу всегда заканчивается неудачей. Приходится по 2-4 раза перезапускать индикатор.

Кто-нибудь знает как это побороть?

 
Следующий уровень - это 

Синхронизация данных терминала и данных сервера #

Документация по MQL5: Доступ к таймсериям и индикаторам / Организация доступа к данным
Документация по MQL5: Доступ к таймсериям и индикаторам / Организация доступа к данным
  • www.mql5.com
Прежде чем ценовые данные будут доступны в терминале MetaTrader 5, их необходимо получить и обработать. Для получения данных требуется подключение к торговому серверу MetaTrader 5. Данные поступают с сервера по запросу терминала в виде экономно упакованных блоков минутных баров. Механизм обращения к серверу за данными не зависит от того, каким...
 
Какие именно цены Вы используете с чужих символов? (Open, High, Low, Close)
 

Я вот такой способ придумал, чтобы не влазить в дебри (Документация по MQL5: Доступ к таймсериям и индикаторам / Организация доступа к данным)

Создаётся пользовательский индикатор:

//+------------------------------------------------------------------+
//|                                               OHLC Indicator.mq5 |
//|                              Copyright © 2020, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2020, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.000"
#property indicator_chart_window
#property indicator_buffers 4
#property indicator_plots   0
//--- indicator buffers
double      OpenBuffer[];
double      HighBuffer[];
double      LowBuffer[];
double      CloseBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,OpenBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,HighBuffer,INDICATOR_DATA);
   SetIndexBuffer(2,LowBuffer,INDICATOR_DATA);
   SetIndexBuffer(3,CloseBuffer,INDICATOR_DATA);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| 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 limit=prev_calculated-1;
   if(prev_calculated==0)
      limit=0;

   for(int i=0; i<rates_total; i++)
     {
      OpenBuffer[i]=open[i];
      HighBuffer[i]=high[i];
      LowBuffer[i]=low[i];
      CloseBuffer[i]=close[i];
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

который в своих индикаторных буферах хранит OHLC.


Остаётся в мультивалютном индикаторе создать несколько этих индикаторов:

//+------------------------------------------------------------------+
//|                                       MultiSymbols Indicator.mq5 |
//|                              Copyright © 2020, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2020, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.000"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Result
#property indicator_label1  "Result"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrLimeGreen
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input int      Input1=9;
//--- indicator buffers
double   ResultBuffer[];
//--- handle storage array
int      array_handles[];
//--- symbols array
string   array_symbols[7]= {"GBPUSD","GBPNZD","GBPJPY","GBPCHF","GBPCAD","GBPAUD","EURGBP"};
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ResultBuffer,INDICATOR_DATA);
//---
   int size_array_symbols=ArraySize(array_symbols);
   MqlRates rates[];
   for(int i=0; i<size_array_symbols; i++)
     {
      //--- create handle of the indicator iCustom
      int handle_iCustom=iCustom(array_symbols[i],Period(),"MyInd\\OHLC Indicator");
      //--- if the handle is not created
      if(handle_iCustom==INVALID_HANDLE)
        {
         //--- tell about the failure and output the error code
         PrintFormat("Failed to create handle of the iCustom indicator for the symbol %s/%s, error code %d",
                     array_symbols[i],
                     EnumToString(Period()),
                     GetLastError());
         //--- the indicator is stopped early
         return(INIT_FAILED);
        }
      int size_array_handles=ArraySize(array_handles);
      ArrayResize(array_handles,size_array_handles+1);
      array_handles[size_array_handles]=handle_iCustom;
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| 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 size_array_symbols=ArraySize(array_symbols);

   for(int i=0; i<size_array_symbols; i++)
      Print(array_symbols[i]," Bars: ",Bars(array_symbols[i],Period())," BarsCalculated: ",BarsCalculated(array_handles[i]));

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+


(так как сегодня выходной - то нужно мультивалютный индикатор прицепить к графику и несколько раз правый лик по графику и выбрать "Обновить)

Результат:

2020.01.11 09:43:35.274 MultiSymbols Indicator (EURUSD,M12)     GBPUSD Bars: 100000 BarsCalculated: 100000
2020.01.11 09:43:35.274 MultiSymbols Indicator (EURUSD,M12)     GBPNZD Bars: 100000 BarsCalculated: 100000
2020.01.11 09:43:35.274 MultiSymbols Indicator (EURUSD,M12)     GBPJPY Bars: 100000 BarsCalculated: 100000
2020.01.11 09:43:35.274 MultiSymbols Indicator (EURUSD,M12)     GBPCHF Bars: 100000 BarsCalculated: 100000
2020.01.11 09:43:35.274 MultiSymbols Indicator (EURUSD,M12)     GBPCAD Bars: 100000 BarsCalculated: 0
2020.01.11 09:43:35.274 MultiSymbols Indicator (EURUSD,M12)     GBPAUD Bars: 100000 BarsCalculated: 0
2020.01.11 09:43:35.274 MultiSymbols Indicator (EURUSD,M12)     EURGBP Bars: 100000 BarsCalculated: -1
2020.01.11 09:43:46.266 MultiSymbols Indicator (EURUSD,M12)     GBPUSD Bars: 100000 BarsCalculated: 100000
2020.01.11 09:43:46.266 MultiSymbols Indicator (EURUSD,M12)     GBPNZD Bars: 100000 BarsCalculated: 100000
2020.01.11 09:43:46.266 MultiSymbols Indicator (EURUSD,M12)     GBPJPY Bars: 100000 BarsCalculated: 100000
2020.01.11 09:43:46.266 MultiSymbols Indicator (EURUSD,M12)     GBPCHF Bars: 100000 BarsCalculated: 100000
2020.01.11 09:43:46.266 MultiSymbols Indicator (EURUSD,M12)     GBPCAD Bars: 100000 BarsCalculated: 100000
2020.01.11 09:43:46.266 MultiSymbols Indicator (EURUSD,M12)     GBPAUD Bars: 100000 BarsCalculated: 100000
2020.01.11 09:43:46.266 MultiSymbols Indicator (EURUSD,M12)     EURGBP Bars: 100000 BarsCalculated: 100000
2020.01.11 09:43:47.656 MultiSymbols Indicator (EURUSD,M12)     GBPUSD Bars: 100000 BarsCalculated: 100000
2020.01.11 09:43:47.656 MultiSymbols Indicator (EURUSD,M12)     GBPNZD Bars: 100000 BarsCalculated: 100000
2020.01.11 09:43:47.656 MultiSymbols Indicator (EURUSD,M12)     GBPJPY Bars: 100000 BarsCalculated: 100000
2020.01.11 09:43:47.656 MultiSymbols Indicator (EURUSD,M12)     GBPCHF Bars: 100000 BarsCalculated: 100000
2020.01.11 09:43:47.656 MultiSymbols Indicator (EURUSD,M12)     GBPCAD Bars: 100000 BarsCalculated: 100000
2020.01.11 09:43:47.656 MultiSymbols Indicator (EURUSD,M12)     GBPAUD Bars: 100000 BarsCalculated: 100000
2020.01.11 09:43:47.656 MultiSymbols Indicator (EURUSD,M12)     EURGBP Bars: 100000 BarsCalculated: 100000
Документация по MQL5: Доступ к таймсериям и индикаторам / Организация доступа к данным
Документация по MQL5: Доступ к таймсериям и индикаторам / Организация доступа к данным
  • www.mql5.com
Прежде чем ценовые данные будут доступны в терминале MetaTrader 5, их необходимо получить и обработать. Для получения данных требуется подключение к торговому серверу MetaTrader 5. Данные поступают с сервера по запросу терминала в виде экономно упакованных блоков минутных баров. Механизм обращения к серверу за данными не зависит от того, каким...
 
Vladimir Karputov:

Я вот такой способ придумал, чтобы не влазить в дебри (Документация по MQL5: Доступ к таймсериям и индикаторам / Организация доступа к данным)

Создаётся пользовательский индикатор:

который в своих индикаторных буферах хранит OHLC.


Остаётся в мультивалютном индикаторе создать несколько этих индикаторов:


(так как сегодня выходной - то нужно мультивалютный индикатор прицепить к графику и несколько раз правый лик по графику и выбрать "Обновить)

Результат:

Спасибо, Владимир.

Пока только пробежался глазами, нету времени разбираться сегодня.

Но сразу два вопроса )))

1. Вы создаёте хендлы индикаторов. Это необходимый шаг для получения данных с соответствующих символов?

2. Обязательно ли добавлять символ в обзор рынка?

У меня используются цены закрытия. Буду посвободнее, выложу шаблон своего индикатора, чтобы на указаниях на ошибки предметно говорить по существу. )))

 
Сергей Таболин:

1. Вы создаёте хендлы индикаторов. Это необходимый шаг для получения данных с соответствующих символов?

Я вот такой способ придумал, чтобы не влазить в дебри (Документация по MQL5: Доступ к таймсериям и индикаторам / Организация доступа к данным)


Сергей Таболин:

2. Обязательно ли добавлять символ в обзор рынка?

У меня используются цены закрытия. Буду посвободнее, выложу шаблон своего индикатора, чтобы на указаниях на ошибки предметно говорить по существу. )))

Да, нужно добавить.

Обновил на версию 1.001

//+------------------------------------------------------------------+
//|                                       MultiSymbols Indicator.mq5 |
//|                              Copyright © 2020, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2020, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.001"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Result
#property indicator_label1  "Result"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrLimeGreen
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input int      Input1=9;
//--- indicator buffers
double   ResultBuffer[];
//--- handle storage array
int      array_handles[];
//--- symbols array
string   array_symbols[7]= {"GBPUSD","GBPNZD","GBPJPY","GBPCHF","GBPCAD","GBPAUD","EURGBP"};
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ResultBuffer,INDICATOR_DATA);
//---
   int size_array_symbols=ArraySize(array_symbols);
   MqlRates rates[];
   for(int i=0; i<size_array_symbols; i++)
     {
      SymbolSelect(array_symbols[i],true);
      //--- create handle of the indicator iCustom
      int handle_iCustom=iCustom(array_symbols[i],Period(),"MyInd\\OHLC Indicator");
      //--- if the handle is not created
      if(handle_iCustom==INVALID_HANDLE)
        {
         //--- tell about the failure and output the error code
         PrintFormat("Failed to create handle of the iCustom indicator for the symbol %s/%s, error code %d",
                     array_symbols[i],
                     EnumToString(Period()),
                     GetLastError());
         //--- the indicator is stopped early
         return(INIT_FAILED);
        }
      int size_array_handles=ArraySize(array_handles);
      ArrayResize(array_handles,size_array_handles+1);
      array_handles[size_array_handles]=handle_iCustom;
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| 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 size_array_symbols=ArraySize(array_symbols);

   for(int i=0; i<size_array_symbols; i++)
      Print(array_symbols[i]," Bars: ",Bars(array_symbols[i],Period())," BarsCalculated: ",BarsCalculated(array_handles[i]));

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
Документация по MQL5: Доступ к таймсериям и индикаторам / Организация доступа к данным
Документация по MQL5: Доступ к таймсериям и индикаторам / Организация доступа к данным
  • www.mql5.com
Прежде чем ценовые данные будут доступны в терминале MetaTrader 5, их необходимо получить и обработать. Для получения данных требуется подключение к торговому серверу MetaTrader 5. Данные поступают с сервера по запросу терминала в виде экономно упакованных блоков минутных баров. Механизм обращения к серверу за данными не зависит от того, каким...
Файлы:
Причина обращения: