Ошибки, баги, вопросы - страница 1030

 
Al_key:

И еще я баршифт получал с помощью библиотеки компостера. Неужели встроенных средств в метатрейдере нет?

К сожалению нет.  На самом деле в MT4 скорее всего iBarShift() работает примерно так же как в библтотеке компостера.  Но лучше б была встроенная - побыстрей бы работала (поскольку на С++).
 
MetaDriver:

Твой случай лечится небольшим слипом.

У меня хуже.  (Кстате, раньше твой случай без Слип'а работал, перестал несколько недель назад)

Такая же схема перестала срабатывать без жутких слипов на других (не текущем) чартах:

Код отсюда: https://www.mql5.com/ru/code/224

установил сов, посмотреть.

На текущем кидаю стандарт. AMA на график, тык перерасчет (при Sleep от 0 до 2350) - сваливаюсь в М1 и больше не возвращаюсь. Через несколько сек. АМА прорисовывается, ну и всё.

Слип, в общем, не помогает, пробую с флагами (запоминать два флага, текущего тф и м1? если на текущем уже были (флаг), а сейчас на м1 (флаг 2), тогда  ...)

но что то сомневаюсь... тики понедельника раньше придут, пока я на текущий тф вернусь :)

upd да, на графике у меня сотня объектов, и плюс АМА, т. е., он такой тяжеленький.

 
MetaDriver:

"Надо, Федя. Надо."

  (с) Шурик

--

Такая ошибка возникает, например, если память под динамический буфер не распределена (в данном случае под ActualBuffer).  По приведённому участку кода это непонятно.

Вот.

А как распределять память под динамический буфер?

Наверно, как узнаю, вопрос исчезнет.

Вот весь код

#include <TimeSeries.mqh>

#property indicator_separate_window
#property indicator_buffers 3
#property indicator_plots   3
//--- plot Actual
#property indicator_label1  "Actual"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrLime
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot Consensus
#property indicator_label2  "Consensus"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrPeachPuff
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//--- plot Previous
#property indicator_label3  "Previous"
#property indicator_type3   DRAW_LINE
#property indicator_color3  clrLightCyan
#property indicator_style3  STYLE_SOLID
#property indicator_width3  1
//--- indicator buffers
double         ActualBuffer[];
double         ConsensusBuffer[];
double         PreviousBuffer[];
//--- indicator vars
string sDatetime;
string sActual;
string sConsensus;
string sPrevious;
int file_handle;
int barshift;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ActualBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,ConsensusBuffer,INDICATOR_DATA);
   SetIndexBuffer(2,PreviousBuffer,INDICATOR_DATA);
   file_handle = FileOpen("CSV - макроэкономика и госкорпстат/Existing Home Sales Change.csv",FILE_READ|FILE_CSV|FILE_ANSI,',');
   while(!FileIsEnding(file_handle))
        {
         sDatetime  = FileReadString(file_handle);
         sActual    = FileReadString(file_handle);
         sConsensus = FileReadString(file_handle);
         sPrevious  = FileReadString(file_handle);
         
         barshift = iBarShift(Symbol(), Period(), datetime(formatdatetime(sDatetime)), false);
         if(StringToDouble(formatstring(sActual)) > 0 && StringToDouble(formatstring(sActual)) < 10000) ActualBuffer[barshift] = StringToDouble(formatstring(sActual));
         Print(formatdatetime(sDatetime));
         Print("iBarShift = ", barshift, " Datetime = ", formatstring(sDatetime), " sActual = ", sActual, " sConsensus = ", sConsensus, " sPrevious = ", sPrevious);
        }
    
//---
   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[])
  {
//---
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//---
   
  }
//+------------------------------------------------------------------+
//--- Функции форматирования
string formatstring(string strparam)
   {
      string result = StringSubstr(strparam,1, StringLen(strparam) - 2);
      return(result);
   }
string formatdatetime(string strparam)
   {
      string result = StringSubstr(strparam, 1, 4) + "." + StringSubstr(strparam, 5, 2) + "." + StringSubstr(strparam, 7, 11);
      
      return(result);
   }
 
Al_key:

Вот.

А как распределять память под динамический буфер?

Наверно, как узнаю, вопрос исчезнет.

Вот весь код

Ps.

Прочитал про Array Resize там...вот копипаста

"После связывания динамический массив buffer[]  будет иметь индексацию как в обычных массивах, даже если для связываемого массива будет предварительно установлена индексация как в таймсериях. Если необходимо изменить порядок доступа к элементам индикаторного массива, необходимо применить функцию ArraySetAsSeries() после связывания массива функцией SetIndexBuffer(). При этом необходимо иметь ввиду, что нельзя изменять размер для динамических массивов, назначенных в качестве индикаторных буферов функцией SetIndexBuffer(). Для индикаторных буферов все операции по изменению размера производит исполняющая подсистема терминала."

Ступор у меня.

 
Silent:
Сохраните настроенный профиль по дефолту Файл - Профили - Default
Вроде дефолт, все равно данные не подгружаются. Первые раз за пару часов все пошло.
 
Al_key:

Вот.

А как распределять память под динамический буфер?

Наверно, как узнаю, вопрос исчезнет.

Вот весь код

INDICATOR_DATA  это  данные для отрисовки. За этим буфером (размером) следит терминал (по rates_total, как я понимаю).

Добавьте буферы для промежуточных расчетов (INDICATOR_CALCULATIONS). Для них и устанавливайте размер.

PS у меня  #include <TimeSeries.mqh> can"t open почему то, не компилится.

Upd понедельника надо подождать, что то тут не ладно.

 
Silent:

INDICATOR_DATA  это  данные для отрисовки. За этим буфером (размером) следит терминал (по rates_total, как я понимаю).

Добавьте буферы для промежуточных расчетов (INDICATOR_CALCULATIONS). Для них и устанавливайте размер.

PS у меня  #include <TimeSeries.mqh> can"t open почему то, не компилится.

Upd понедельника надо подождать, что то тут не ладно.

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

Вот такой простенький работает. В INDICATOR_DATA пишем из INDICATOR_CALCULATIONS

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrOrangeRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input string   s="EURUSD";
input ENUM_TIMEFRAMES      tf;          // D1
input int      countBars=100;          // count
//--- put parameters
int   copied,i;
//--- indicator buffers
double         Label1Buffer[];
//--- buffers
double         p_Symbol[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   SetIndexBuffer(0,Label1Buffer,INDICATOR_DATA);
   SetIndexBuffer(1,p_Symbol,INDICATOR_CALCULATIONS);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
//---
   if(prev_calculated==0)
     {
      ArrayInitialize(Label1Buffer,EMPTY_VALUE);
      ArrayInitialize(p_Symbol,EMPTY_VALUE);
      ArraySetAsSeries(Label1Buffer,true);
      ArraySetAsSeries(p_Symbol,true);
      ArraySetAsSeries(price,true);
     };
   ArrayCopy(p_Symbol,price,0,0,countBars);
   if(_LastError!=0) {Print(_LastError); return(prev_calculated);};
   if(_LastError==0)
     {
      for(i=countBars;i>0;i--)
        {
         Label1Buffer[i]=p_Symbol[i];
         Print("limitBars i = "+IntegerToString(i));
        };
     };
//--- return value of prev_calculated for next call
   return(rates_total);
  }
 
Silent:

INDICATOR_DATA  это  данные для отрисовки. За этим буфером (размером) следит терминал (по rates_total, как я понимаю).

Добавьте буферы для промежуточных расчетов (INDICATOR_CALCULATIONS). Для них и устанавливайте размер.

PS у меня  #include <TimeSeries.mqh> can"t open почему то, не компилится.

Upd понедельника надо подождать, что то тут не ладно.

Брать здесь: https://www.mql5.com/ru/code/1008

Я нашёл только-что, поэтому код ещё не щупал.  И пока не получится - общественность тут меня по магазинам гонит.

Думаю, что всё заработает, если проблемный код перенести из OnInit() в OnCalculate().  Давно известна особенность пятёрки - не любой код в OnInit нормально работает.  Вполне вероятно, что реальное  распределение автораспределяемых буферов, зарегистрированных через SetIndexBuffer() гарантированно заканчивается только после выхода из OnInit(), поскольку обязано происходить в фоновом режиме (оно же автоматическое, да?).

TimeSeries - Библиотека функций для работы с таймсериями
TimeSeries - Библиотека функций для работы с таймсериями
  • голосов: 12
  • 2012.08.24
  • Andrey Khatimlianskii
  • www.mql5.com
Библиотека функций для работы с таймсериями: iBars, iTime, iOpen, iHigh, iLow, iClose, iVolume, iHighest, iLowest, iBarshift. Для всех функций доступен краткий вариант вызова (с символом и периодом текущего графика).
 

Заметил, что одновременно может работать только 3и агента из 8и, при получении задач из облака.
Хотя если параллельно запустить свой тест, остальные агенты тоже включаются.

Так и должно быть? 

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