2 вопроса МТ5 - страница 2

 

В OHLC Indicator я допустил ошибку. В версии 1.001 исправил:

//+------------------------------------------------------------------+
//|                                               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.001"
#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=limit; 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);
  }
//+------------------------------------------------------------------+
Файлы:
 

@Vladimir Karputov, а Вы можете сами сделать проверку? В обзоре рынка оставить только один инструмент и запустить Ваш проверочный индикатор?

П.С. Само собой перезагрузив терминал...

 

OHLC Indicator version   "1.002"

MultiSymbols Indicator  version   "1.001"

(проверка)

Файлы:
 

Я почему попросил Вас сделать проверку? Дело в том, что 

  1. Как я понял, создание хендлов Вашего индикатора OHLC_Indicator призвано инициировать синхронизацию инструментов? Я чутка добавил, чтобы ещё раз "подтолкнуть" этот процесс.
  2. Но что с этим ухищрением, что без оного мой индикатор запускается не с первого раза. Хотя и происходит дополнительная проверка синхронизации (из документации к Bars())...

//+------------------------------------------------------------------+
//|                                                        ICTMP.mq5 |
//|                                     Copyright 2020, Tabolin S.N. |
//|                           https://www.mql5.com/ru/users/vip.avos |
//|               Indicator for calculating the total price movement |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, Tabolin S.N."
#property link      "https://www.mql5.com/ru/users/vip.avos"
#property version   "1.03"
//+------------------------------------------------------------------+
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_plots   1
//--- plot ICTMP
#property indicator_label1  "ICTMP"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrDarkOrange
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//+------------------------------------------------------------------+
#include <Math\Stat\Math.mqh>
//+------------------------------------------------------------------+
input    bool        in_market_watch      = false;    // true – только символы в MarketWatch
input    bool        in_use_current       = true;     // использовать в рассчётах текущий инструмент
//input    int         in_bars_calc         = 500;      // количество баров для расчёта
input    int         in_smoothing         = 5;        // сглаживание
//+------------------------------------------------------------------+
double               odds                 = 0.0;
double               request_close[];
string               symbols_name[7]= {"GBPUSD","GBPNZD","GBPJPY","GBPCHF","GBPCAD","GBPAUD","EURGBP"};
int                  odds_bars            = 100;
int                  bars_calc            = 1000;
bool                 ready                = false;
string               vlt                  = "";
int                  array_handles[];
//--- indicator buffers
double               Buffer_plots[];
double               Buffer_su[];
double               Buffer_sy[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
   SetIndexBuffer(0,Buffer_plots,   INDICATOR_DATA);
   SetIndexBuffer(1,Buffer_symb,    INDICATOR_CALCULATIONS);
   SetIndexBuffer(2,Buffer_summ,    INDICATOR_CALCULATIONS);

   ArraySetAsSeries(Buffer_plots,   true);
   ArraySetAsSeries(Buffer_summ,    true);
   ArraySetAsSeries(Buffer_symb,    true);
   ArraySetAsSeries(request_close,  true);
   
   int      nV    = 0;

   bars_calc            = Bars(Symbol(),PERIOD_CURRENT);
   
for(int i=0; i<size_array_symbols; i++)
   {
         if(!SymbolInfoInteger(symbols_name[i],SYMBOL_SELECT))
         {
            if(GetLastError()==ERR_MARKET_UNKNOWN_SYMBOL) return(INIT_FAILED);
            SymbolSelect(symbols_name[i],true);
            Print("= В Обзор Рынка добавлен инструмент ",symbols_name[i]);
         }
         int handle_iCustom=iCustom(symbols_name[i],Period(),"my_used\\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",
                        symbols_name[nV-1],
                        EnumToString(Period()),
                        GetLastError());
            //--- the indicator is stopped early
            return(INIT_FAILED);
         }
         else
         {
            double   chk[];
            ArrayFree(chk);
            CopyBuffer(handle_iCustom,3,0,300,chk);
         }
         int size_array_handles = ArraySize(array_handles);
         ArrayResize(array_handles,size_array_handles+1);
         array_handles[size_array_handles] = handle_iCustom;
   }
   
   ArrayPrint(symbols_name);
   Print("bars_calc = ",bars_calc);
   for(int i = 0; i < ArraySize(symbols_name); i++)
   {
      int bc = Bars(symbols_name[i],PERIOD_CURRENT);
      if(bc > 0)
      {
         Print("Количество баров в истории терминала по символу ",symbols_name[i]," на данный момент = ",bc);
      }
      else  //нет доступных баров
      {
         //--- видимо, данные по символу не синхронизированы с данными на сервере
         bool synchronized = false;
         //--- счетчик цикла
         int attempts = 0;
         // сделаем 5 попыток дождаться синхронизации
         while(attempts < 9)
         {
            if(SeriesInfoInteger(Symbol(),0,SERIES_SYNCHRONIZED))
            {
               //--- есть синхронизация, выходим
               synchronized = true;
               break;
            }
            //--- увеличим счетчик
            attempts++;
            //--- подождем 150 миллисекунд до следующей итерации
            Sleep(150);
         }
         //--- вышли из цикла по факту синхронизации
         if(!synchronized)
         {
            Print("Не удалось получить количество баров на ",symbols_name[i]);
            return(INIT_FAILED);
         }
      }
      
      if(bars_calc > bc)   bars_calc = bc;
      Print(symbols_name[i]," ",i," ~~~ bars_calc = ",bars_calc);
   }
   
   if(bars_calc < odds_bars + in_smoothing + 1)
   {
      Print("Баров для рассчётов меньше необходимого");
      return(INIT_FAILED);
   }
   
   //if(bars_calc > 1000)  bars_calc = 1000;
   Print("bars_calc = ",bars_calc);
   Print("=======================================");
//---
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
2020.01.11 20:14:50.595 ICTMP_1.03 (GBPUSD,H8)  = В Обзор Рынка добавлен инструмент GBPJPY
2020.01.11 20:14:50.611 ICTMP_1.03 (GBPUSD,H8)  = В Обзор Рынка добавлен инструмент GBPCHF
2020.01.11 20:14:50.628 ICTMP_1.03 (GBPUSD,H8)  = В Обзор Рынка добавлен инструмент GBPCAD
2020.01.11 20:14:50.646 ICTMP_1.03 (GBPUSD,H8)  = В Обзор Рынка добавлен инструмент GBPAUD
2020.01.11 20:14:50.663 ICTMP_1.03 (GBPUSD,H8)  = В Обзор Рынка добавлен инструмент EURGBP
2020.01.11 20:14:50.679 ICTMP_1.03 (GBPUSD,H8)  "GBPUSD" "GBPNZD" "GBPUSD" "GBPJPY" "GBPCHF" "GBPCAD" "GBPAUD" "EURGBP"
2020.01.11 20:14:50.679 ICTMP_1.03 (GBPUSD,H8)  bars_calc = 9320
2020.01.11 20:14:50.679 ICTMP_1.03 (GBPUSD,H8)  Количество баров в истории терминала по символу GBPUSD на данный момент = 9320
2020.01.11 20:14:50.679 ICTMP_1.03 (GBPUSD,H8)  GBPUSD 0 ~~~ bars_calc = 9320
2020.01.11 20:14:50.679 ICTMP_1.03 (GBPUSD,H8)  Количество баров в истории терминала по символу GBPNZD на данный момент = 3338
2020.01.11 20:14:50.680 ICTMP_1.03 (GBPUSD,H8)  GBPNZD 1 ~~~ bars_calc = 3338
2020.01.11 20:14:50.680 ICTMP_1.03 (GBPUSD,H8)  Количество баров в истории терминала по символу GBPUSD на данный момент = 9320
2020.01.11 20:14:50.680 ICTMP_1.03 (GBPUSD,H8)  GBPUSD 2 ~~~ bars_calc = 3338
2020.01.11 20:14:50.680 ICTMP_1.03 (GBPUSD,H8)  Количество баров в истории терминала по символу GBPJPY на данный момент = 3338
2020.01.11 20:14:50.680 ICTMP_1.03 (GBPUSD,H8)  GBPJPY 3 ~~~ bars_calc = 3338
2020.01.11 20:14:50.680 ICTMP_1.03 (GBPUSD,H8)  Количество баров в истории терминала по символу GBPCHF на данный момент = 3338
2020.01.11 20:14:50.680 ICTMP_1.03 (GBPUSD,H8)  GBPCHF 4 ~~~ bars_calc = 3338
2020.01.11 20:14:50.680 ICTMP_1.03 (GBPUSD,H8)  GBPCAD 5 ~~~ bars_calc = 0
2020.01.11 20:14:50.680 ICTMP_1.03 (GBPUSD,H8)  GBPAUD 6 ~~~ bars_calc = 0
2020.01.11 20:14:50.681 ICTMP_1.03 (GBPUSD,H8)  EURGBP 7 ~~~ bars_calc = 0
2020.01.11 20:14:50.681 ICTMP_1.03 (GBPUSD,H8)  Баров для рассчётов меньше необходимого
2020.01.11 20:14:59.561 ICTMP_1.03 (GBPUSD,H8)  "GBPUSD" "GBPNZD" "GBPUSD" "GBPJPY" "GBPCHF" "GBPCAD" "GBPAUD" "EURGBP"
2020.01.11 20:14:59.561 ICTMP_1.03 (GBPUSD,H8)  bars_calc = 9320
2020.01.11 20:14:59.561 ICTMP_1.03 (GBPUSD,H8)  Количество баров в истории терминала по символу GBPUSD на данный момент = 9320
2020.01.11 20:14:59.561 ICTMP_1.03 (GBPUSD,H8)  GBPUSD 0 ~~~ bars_calc = 9320
2020.01.11 20:14:59.561 ICTMP_1.03 (GBPUSD,H8)  Количество баров в истории терминала по символу GBPNZD на данный момент = 3338
2020.01.11 20:14:59.561 ICTMP_1.03 (GBPUSD,H8)  GBPNZD 1 ~~~ bars_calc = 3338
2020.01.11 20:14:59.561 ICTMP_1.03 (GBPUSD,H8)  Количество баров в истории терминала по символу GBPUSD на данный момент = 9320
2020.01.11 20:14:59.561 ICTMP_1.03 (GBPUSD,H8)  GBPUSD 2 ~~~ bars_calc = 3338
2020.01.11 20:14:59.561 ICTMP_1.03 (GBPUSD,H8)  Количество баров в истории терминала по символу GBPJPY на данный момент = 3338
2020.01.11 20:14:59.561 ICTMP_1.03 (GBPUSD,H8)  GBPJPY 3 ~~~ bars_calc = 3338
2020.01.11 20:14:59.561 ICTMP_1.03 (GBPUSD,H8)  Количество баров в истории терминала по символу GBPCHF на данный момент = 3338
2020.01.11 20:14:59.561 ICTMP_1.03 (GBPUSD,H8)  GBPCHF 4 ~~~ bars_calc = 3338
2020.01.11 20:14:59.561 ICTMP_1.03 (GBPUSD,H8)  Количество баров в истории терминала по символу GBPCAD на данный момент = 3338
2020.01.11 20:14:59.561 ICTMP_1.03 (GBPUSD,H8)  GBPCAD 5 ~~~ bars_calc = 3338
2020.01.11 20:14:59.561 ICTMP_1.03 (GBPUSD,H8)  Количество баров в истории терминала по символу GBPAUD на данный момент = 3338
2020.01.11 20:14:59.561 ICTMP_1.03 (GBPUSD,H8)  GBPAUD 6 ~~~ bars_calc = 3338
2020.01.11 20:14:59.561 ICTMP_1.03 (GBPUSD,H8)  EURGBP 7 ~~~ bars_calc = 0
2020.01.11 20:14:59.561 ICTMP_1.03 (GBPUSD,H8)  Баров для рассчётов меньше необходимого
2020.01.11 20:15:07.925 ICTMP_1.03 (GBPUSD,H8)  "GBPUSD" "GBPNZD" "GBPUSD" "GBPJPY" "GBPCHF" "GBPCAD" "GBPAUD" "EURGBP"
2020.01.11 20:15:07.925 ICTMP_1.03 (GBPUSD,H8)  bars_calc = 9320
2020.01.11 20:15:07.925 ICTMP_1.03 (GBPUSD,H8)  Количество баров в истории терминала по символу GBPUSD на данный момент = 9320
2020.01.11 20:15:07.925 ICTMP_1.03 (GBPUSD,H8)  GBPUSD 0 ~~~ bars_calc = 9320
2020.01.11 20:15:07.925 ICTMP_1.03 (GBPUSD,H8)  Количество баров в истории терминала по символу GBPNZD на данный момент = 3338
2020.01.11 20:15:07.925 ICTMP_1.03 (GBPUSD,H8)  GBPNZD 1 ~~~ bars_calc = 3338
2020.01.11 20:15:07.925 ICTMP_1.03 (GBPUSD,H8)  Количество баров в истории терминала по символу GBPUSD на данный момент = 9320
2020.01.11 20:15:07.925 ICTMP_1.03 (GBPUSD,H8)  GBPUSD 2 ~~~ bars_calc = 3338
2020.01.11 20:15:07.925 ICTMP_1.03 (GBPUSD,H8)  Количество баров в истории терминала по символу GBPJPY на данный момент = 3338
2020.01.11 20:15:07.925 ICTMP_1.03 (GBPUSD,H8)  GBPJPY 3 ~~~ bars_calc = 3338
2020.01.11 20:15:07.925 ICTMP_1.03 (GBPUSD,H8)  Количество баров в истории терминала по символу GBPCHF на данный момент = 3338
2020.01.11 20:15:07.925 ICTMP_1.03 (GBPUSD,H8)  GBPCHF 4 ~~~ bars_calc = 3338
2020.01.11 20:15:07.925 ICTMP_1.03 (GBPUSD,H8)  Количество баров в истории терминала по символу GBPCAD на данный момент = 3338
2020.01.11 20:15:07.925 ICTMP_1.03 (GBPUSD,H8)  GBPCAD 5 ~~~ bars_calc = 3338
2020.01.11 20:15:07.925 ICTMP_1.03 (GBPUSD,H8)  Количество баров в истории терминала по символу GBPAUD на данный момент = 3338
2020.01.11 20:15:07.925 ICTMP_1.03 (GBPUSD,H8)  GBPAUD 6 ~~~ bars_calc = 3338
2020.01.11 20:15:07.925 ICTMP_1.03 (GBPUSD,H8)  Количество баров в истории терминала по символу EURGBP на данный момент = 3338
2020.01.11 20:15:07.925 ICTMP_1.03 (GBPUSD,H8)  EURGBP 7 ~~~ bars_calc = 3338
2020.01.11 20:15:07.925 ICTMP_1.03 (GBPUSD,H8)  bars_calc = 3338
2020.01.11 20:15:07.925 ICTMP_1.03 (GBPUSD,H8)  =======================================
2020.01.11 20:20:54.321 ICTMP_1.03 (GBPUSD,H8)  = В Обзор Рынка добавлен инструмент GBPJPY
2020.01.11 20:20:54.341 ICTMP_1.03 (GBPUSD,H8)  = В Обзор Рынка добавлен инструмент GBPCHF
2020.01.11 20:20:54.358 ICTMP_1.03 (GBPUSD,H8)  = В Обзор Рынка добавлен инструмент GBPCAD
2020.01.11 20:20:54.375 ICTMP_1.03 (GBPUSD,H8)  = В Обзор Рынка добавлен инструмент GBPAUD
2020.01.11 20:20:54.392 ICTMP_1.03 (GBPUSD,H8)  = В Обзор Рынка добавлен инструмент EURGBP
2020.01.11 20:20:54.408 ICTMP_1.03 (GBPUSD,H8)  "GBPUSD" "GBPNZD" "GBPJPY" "GBPCHF" "GBPCAD" "GBPAUD" "EURGBP"
2020.01.11 20:20:54.408 ICTMP_1.03 (GBPUSD,H8)  bars_calc = 9320
2020.01.11 20:20:54.408 ICTMP_1.03 (GBPUSD,H8)  Количество баров в истории терминала по символу GBPUSD на данный момент = 9320
2020.01.11 20:20:54.408 ICTMP_1.03 (GBPUSD,H8)  GBPUSD 0 ~~~ bars_calc = 9320
2020.01.11 20:20:54.408 ICTMP_1.03 (GBPUSD,H8)  Количество баров в истории терминала по символу GBPNZD на данный момент = 3338
2020.01.11 20:20:54.408 ICTMP_1.03 (GBPUSD,H8)  GBPNZD 1 ~~~ bars_calc = 3338
2020.01.11 20:20:54.408 ICTMP_1.03 (GBPUSD,H8)  Количество баров в истории терминала по символу GBPJPY на данный момент = 3338
2020.01.11 20:20:54.408 ICTMP_1.03 (GBPUSD,H8)  GBPJPY 2 ~~~ bars_calc = 3338
2020.01.11 20:20:54.408 ICTMP_1.03 (GBPUSD,H8)  Количество баров в истории терминала по символу GBPCHF на данный момент = 3338
2020.01.11 20:20:54.408 ICTMP_1.03 (GBPUSD,H8)  GBPCHF 3 ~~~ bars_calc = 3338
2020.01.11 20:20:54.408 ICTMP_1.03 (GBPUSD,H8)  Количество баров в истории терминала по символу GBPCAD на данный момент = 3338
2020.01.11 20:20:54.408 ICTMP_1.03 (GBPUSD,H8)  GBPCAD 4 ~~~ bars_calc = 3338
2020.01.11 20:20:54.408 ICTMP_1.03 (GBPUSD,H8)  Не удалось получить количество баров на GBPAUD
2020.01.11 20:21:07.537 ICTMP_1.03 (GBPUSD,H8)  "GBPUSD" "GBPNZD" "GBPUSD" "GBPJPY" "GBPCHF" "GBPCAD" "GBPAUD" "EURGBP"
2020.01.11 20:21:07.537 ICTMP_1.03 (GBPUSD,H8)  bars_calc = 9320
2020.01.11 20:21:07.537 ICTMP_1.03 (GBPUSD,H8)  Количество баров в истории терминала по символу GBPUSD на данный момент = 9320
2020.01.11 20:21:07.537 ICTMP_1.03 (GBPUSD,H8)  GBPUSD 0 ~~~ bars_calc = 9320
2020.01.11 20:21:07.537 ICTMP_1.03 (GBPUSD,H8)  Количество баров в истории терминала по символу GBPNZD на данный момент = 3338
2020.01.11 20:21:07.537 ICTMP_1.03 (GBPUSD,H8)  GBPNZD 1 ~~~ bars_calc = 3338
2020.01.11 20:21:07.537 ICTMP_1.03 (GBPUSD,H8)  Количество баров в истории терминала по символу GBPUSD на данный момент = 9320
2020.01.11 20:21:07.537 ICTMP_1.03 (GBPUSD,H8)  GBPUSD 2 ~~~ bars_calc = 3338
2020.01.11 20:21:07.538 ICTMP_1.03 (GBPUSD,H8)  Количество баров в истории терминала по символу GBPJPY на данный момент = 3338
2020.01.11 20:21:07.538 ICTMP_1.03 (GBPUSD,H8)  GBPJPY 3 ~~~ bars_calc = 3338
2020.01.11 20:21:07.538 ICTMP_1.03 (GBPUSD,H8)  Количество баров в истории терминала по символу GBPCHF на данный момент = 3338
2020.01.11 20:21:07.538 ICTMP_1.03 (GBPUSD,H8)  GBPCHF 4 ~~~ bars_calc = 3338
2020.01.11 20:21:07.538 ICTMP_1.03 (GBPUSD,H8)  Количество баров в истории терминала по символу GBPCAD на данный момент = 3338
2020.01.11 20:21:07.538 ICTMP_1.03 (GBPUSD,H8)  GBPCAD 5 ~~~ bars_calc = 3338
2020.01.11 20:21:07.538 ICTMP_1.03 (GBPUSD,H8)  Количество баров в истории терминала по символу GBPAUD на данный момент = 3338
2020.01.11 20:21:07.538 ICTMP_1.03 (GBPUSD,H8)  GBPAUD 6 ~~~ bars_calc = 3338
2020.01.11 20:21:07.538 ICTMP_1.03 (GBPUSD,H8)  Не удалось получить количество баров на EURGBP
2020.01.11 20:21:30.637 ICTMP_1.03 (GBPUSD,H8)  "GBPUSD" "GBPNZD" "GBPUSD" "GBPJPY" "GBPCHF" "GBPCAD" "GBPAUD" "EURGBP"
2020.01.11 20:21:30.637 ICTMP_1.03 (GBPUSD,H8)  bars_calc = 9320
2020.01.11 20:21:30.637 ICTMP_1.03 (GBPUSD,H8)  Количество баров в истории терминала по символу GBPUSD на данный момент = 9320
2020.01.11 20:21:30.637 ICTMP_1.03 (GBPUSD,H8)  GBPUSD 0 ~~~ bars_calc = 9320
2020.01.11 20:21:30.637 ICTMP_1.03 (GBPUSD,H8)  Количество баров в истории терминала по символу GBPNZD на данный момент = 3338
2020.01.11 20:21:30.637 ICTMP_1.03 (GBPUSD,H8)  GBPNZD 1 ~~~ bars_calc = 3338
2020.01.11 20:21:30.637 ICTMP_1.03 (GBPUSD,H8)  Количество баров в истории терминала по символу GBPUSD на данный момент = 9320
2020.01.11 20:21:30.637 ICTMP_1.03 (GBPUSD,H8)  GBPUSD 2 ~~~ bars_calc = 3338
2020.01.11 20:21:30.637 ICTMP_1.03 (GBPUSD,H8)  Количество баров в истории терминала по символу GBPJPY на данный момент = 3338
2020.01.11 20:21:30.637 ICTMP_1.03 (GBPUSD,H8)  GBPJPY 3 ~~~ bars_calc = 3338
2020.01.11 20:21:30.637 ICTMP_1.03 (GBPUSD,H8)  Количество баров в истории терминала по символу GBPCHF на данный момент = 3338
2020.01.11 20:21:30.637 ICTMP_1.03 (GBPUSD,H8)  GBPCHF 4 ~~~ bars_calc = 3338
2020.01.11 20:21:30.637 ICTMP_1.03 (GBPUSD,H8)  Количество баров в истории терминала по символу GBPCAD на данный момент = 3338
2020.01.11 20:21:30.637 ICTMP_1.03 (GBPUSD,H8)  GBPCAD 5 ~~~ bars_calc = 3338
2020.01.11 20:21:30.637 ICTMP_1.03 (GBPUSD,H8)  Количество баров в истории терминала по символу GBPAUD на данный момент = 3338
2020.01.11 20:21:30.637 ICTMP_1.03 (GBPUSD,H8)  GBPAUD 6 ~~~ bars_calc = 3338
2020.01.11 20:21:30.637 ICTMP_1.03 (GBPUSD,H8)  Количество баров в истории терминала по символу EURGBP на данный момент = 3338
2020.01.11 20:21:30.637 ICTMP_1.03 (GBPUSD,H8)  EURGBP 7 ~~~ bars_calc = 3338
2020.01.11 20:21:30.637 ICTMP_1.03 (GBPUSD,H8)  bars_calc = 3338
2020.01.11 20:21:30.637 ICTMP_1.03 (GBPUSD,H8)  =======================================
 

Не нужно никаких 'Bars' - достаточно проводить проверку 'BarsCalculated'

//--- determine the number of values calculated in the indicator
   int calculated=BarsCalculated(array_handles[0]);
   if(calculated<=0)

если индикатор посчитан - будет значение > '0'.

 
Vladimir Karputov:

Не нужно никаких 'Bars' - достаточно проводить проверку 'BarsCalculated'

если индикатор посчитан - будет значение > '0'.

С этим вообще не проходит.

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
{
   for(int i = 0; i < ArraySize(symbols_name); i++)
   {
      int calculated;
      if(symbols_name[i] != Symbol())
      {
         calculated=BarsCalculated(array_handles[i]);
         if(calculated<=0)
           {
            PrintFormat("BarsCalculated(%d) returned %d, error code %d",i,calculated,GetLastError());
            return(0);
           }
      }
   }
//---
2020.01.11 21:09:01.317 ICTMP_1.03 (GBPUSD,H8)  Количество баров в истории терминала по символу EURGBP на данный момент = 3338
2020.01.11 21:09:01.317 ICTMP_1.03 (GBPUSD,H8)  EURGBP 6 ~~~ bars_calc = 3338
2020.01.11 21:09:01.317 ICTMP_1.03 (GBPUSD,H8)  bars_calc = 3338
2020.01.11 21:09:01.317 ICTMP_1.03 (GBPUSD,H8)  =======================================
2020.01.11 21:09:01.317 ICTMP_1.03 (GBPUSD,H8)  BarsCalculated(4) returned 0, error code 4806

Как только этот участок скрываю - всё работает.

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

С этим вообще не проходит.

Как только этот участок скрываю - всё работает.

Выше показывал, что это работает даже на выходных (при помощи команды Обновить график).
 

MultiSymbols Indicator version   "1.002"

Отображает все семь цен 

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

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

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

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


1. Надо правильно назначить пустое значение для отображения.

Если поставленок примеру

PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, 0);

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

Если-же для пустых значений используется EMPTY_VALUE по умолчанию, то все значения до начала отображения реальных, рассчитанных значений индикатора должны быть заполнены этим значением, то-есть EMPTY_VALUE.

2. При запуске в тестере все символы, к которым есть обращение в коде, добавляются в обзор рынка автоматом. А в терминале присутствуют только те которые открыты пользователем. Так вот что может показать индикатор по отсутствующей паре??? Ничего. Следовательно в OnInit сделайте проверку присутствия пары в обзоре рынка. Даже необязательно отображение SYMBOL_VISIBLE, достаточно SYMBOL_SELECT

 
Alexey Viktorov:

1. Надо правильно назначить пустое значение для отображения.

Если поставленок примеру

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

Если-же для пустых значений используется EMPTY_VALUE по умолчанию, то все значения до начала отображения реальных, рассчитанных значений индикатора должны быть заполнены этим значением, то-есть EMPTY_VALUE.

2. При запуске в тестере все символы, к которым есть обращение в коде, добавляются в обзор рынка автоматом. А в терминале присутствуют только те которые открыты пользователем. Так вот что может показать индикатор по отсутствующей паре??? Ничего. Следовательно в OnInit сделайте проверку присутствия пары в обзоре рынка. Даже необязательно отображение SYMBOL_VISIBLE, достаточно SYMBOL_SELECT

1. Спасибо.

2. С этим я уже разобрался. Вот здесь цветом выделено всё, что должно, по идее, инициировать синхронизацию (перед первым жёлтым - добавление инструмента в обзор рынка). Я считаю, что там прописаны явно излишние меры, но и они не гарантируют запуск индикатора. К примеру, я запустил индикатор на графике. Инструменты в обзоре есть, данные уже закачаны. Закрываю терминал. Запускаю его. И индикатор не запускается. 

2020.01.12 18:57:17.888 ICTMP_1.03 (EURUSD,H8)  Не удалось получить количество баров на EURTRY

Связывать это с выходными не получается по простой причине - данные то уже есть в терминале.


Кстати, выход по INIT_FAILED не имеет никакого смысла, ибо индикатор всё-равно висит на графике. Помогает такая конструкция

      ChartIndicatorDelete(............);
      return(INIT_FAILED);

Впрочем, в таком случае, уже и return теряет смысл.

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