Вопросы от "чайника" - страница 57

 
Lizar:

Сейчас посмотрю вариант выложенный в статье. На данный момент сделано несколько экспертов на шпионах, работают замечательно.

MetaDriver:

Я думаю в тестере эта технология работать не будет. 

 Работает.

Это просто замечательно, что это работает в тестере. У меня пока не получилось это реализовать. Но это в силу недостаточного опыта наверное. Остановился пока на таймере, но это долго. 

При попытке повесить на график эксперт-агент выходит вот такое сообщение:

 

Не могу понять при чём здесь USDJPY. Я в коде даже закомментировал  получение хэндла при инициализации и всё равно это сообщение выходит.

 
Lizar:

 Работает.

Константин, правильно ли я понимаю, что исполняемый код эксперта, который обычно находится в функции OnTick() или в OnTimer(), нужно разместить в OnChartEvent(), чтобы Ваша схема работала в мультивалютном режиме, как в реальном времени, так и в тестере.
 
tol64:

Это просто замечательно, что это работает в тестере. У меня пока не получилось это реализовать. Но это в силу недостаточного опыта наверное. Остановился пока на таймере, но это долго. 

При попытке повесить на график эксперт-агент выходит вот такое сообщение:

 

Не могу понять при чём здесь USDJPY. Я в коде даже закомментировал  получение хэндла при инициализации и всё равно это сообщение выходит.

Еще не смотрел.

tol64:
Константин, правильно ли я понимаю, что исполняемый код эксперта, который обычно находится в функции OnTick() или в OnTimer(), нужно разместить в OnChartEvent(), чтобы Ваша схема работала в мультивалютном режиме, как в реальном времени, так и в тестере.

 Да.

 
tol64:

Это просто замечательно, что это работает в тестере. У меня пока не получилось это реализовать. Но это в силу недостаточного опыта наверное. Остановился пока на таймере, но это долго. 

При попытке повесить на график эксперт-агент выходит вот такое сообщение:

 

Не могу понять при чём здесь USDJPY. Я в коде даже закомментировал  получение хэндла при инициализации и всё равно это сообщение выходит.

Посмотрел. Эксперт рабочий. Там просто в сообщении об ошибке закралась опечатка.

То, что он выдавал у вас, то это сообщение о том, что символ не выбран в окно MarketWatch. Либо установите символы, с которыми работает эксперт, в окно  MarketWatch, либо закомментируйте  вызовы шпионов на соответствующих символах в OnInit().

Подправленную версию  exSpy Control panel MCM.mq5 прилагаю.

Документация по MQL5: Стандартные константы, перечисления и структуры / Коды ошибок и предупреждений / Ошибки компиляции
Документация по MQL5: Стандартные константы, перечисления и структуры / Коды ошибок и предупреждений / Ошибки компиляции
  • www.mql5.com
Стандартные константы, перечисления и структуры / Коды ошибок и предупреждений / Ошибки компиляции - Документация по MQL5
Файлы:
 
Lizar:

Посмотрел. Эксперт рабочий. Там просто в сообщении об ошибке закралась опечатка.

То, что он выдавал у вас, то это сообщение о том, что символ не выбран в окно MarketWatch. Либо установите символы, с которыми работает эксперт, в окно  MarketWatch, либо закомментируйте  вызовы шпионов на соответствующих символах в OnInit().

Подправленную версию  exSpy Control panel MCM.mq5 прилагаю.

Я даже рассмеялся над самим собой за свою невнимательность.))) USDJPY ведь был в окне Market Watch. Не было другого символа, а в принтах просто были одинаковые сообщения. )))

Спасибо. 

 
tol64:
Константин, правильно ли я понимаю, что исполняемый код эксперта, который обычно находится в функции OnTick() или в OnTimer(), нужно разместить в OnChartEvent(), чтобы Ваша схема работала в мультивалютном режиме, как в реальном времени, так и в тестере.

Лучше реализовать весь необходимый функционал в виде отдельных процедур и функций (рекомендую последнее), а затем вызывать из любого места в эксперте.

Если используется ООП, то весь необходимый функционал можно реализовать как набор из нескольких методов основного класса (обычно это потомок класса эксперт).

 
Interesting:

Лучше реализовать весь необходимый функционал в виде отдельных процедур и функций (рекомендую последнее), а затем вызывать из любого места в эксперте.

Если используется ООП, то весь необходимый функционал можно реализовать как набор из нескольких методов основного класса (обычно это потомок класса эксперт).

На данный момент весь функционал почти так и реализован. Почти. То есть весь код это несколько функций, в которых размещены основные расчёты. С ООП пока не разобрался полностью, но преимущество уже вижу от его использования. Код с каждым днём растёт и скоро его будет очень неудобно использовать без ООП. 

Я создал отдельную тему, где привёл результаты разных методов тестирования мультивалютника: Результаты тестирования мультивалютных экспертов. Многое по этому вопросу всё ещё остаётся для меня неясным.

 

Почему у меня не грузятся котировки? Например на EURUSD загрузились только до августа того года. И все. Дальше не хотят грузиться. Может где нибудь выложены файлы с котировками?

я установил количество баров unlimited. Несколько раз обновлял. Кнопку HOME нажимал неоднократно. Все равно не грузит 

 

А где "оглашен полный список" всех файлов МТ5 и их реквизитов.

Только сегодня слез с баобаба, простите. 

 

 Мультитаймфреймовый индикатор фракталов.

 Суть индикатора - отображение фракталов одного таймфрейма (или сразу нескольких) на другом.

 Исходная статья: https://www.mql5.com/ru/code/7304, код индикатора на MQL4 

 

 Сперва пытался под копирку передрать с .mq4-варианта с микропоправками под .mq5 (этот код даже не привожу - затык случился тогда, когда я обнаружил в MQL4-исходнике беззаботное манипулирование массивами типа High[shift+i] внутри

bool Fractal (string F,int Per, int shift) {...}

, чего, как я понимаю, нельзя так запросто проделывать в MQL5, то есть нет умолчательной видимости таких массивов вне OnCalculate).

  Затем попытался переписать под MQL5 с использованием вызова нескольких хэндлов iFractals с разными параметрами PERIOD_.... В итоге фракталы рассыпаются, хотя иногда удаётся добиться адекватной посадки лишь какой-то одной серии фрактальных стрелок на соответствующем им ТФ. Что примечательно, при возврате в терминале на один и тот же таймфрейм с некоторых других разных рассыпчатость отрисовывалась разная, что наводит на мысль: данные в терминале от этого недоведённго до ума индикатора гуляют совершенно непостижимым образом, хотя мне всегда думалось, что просто должна стабильно повторяться одна и та же ошибочная картинка да и только. Разумеется, во втором варианте ни до каких bool Fractal (string F,int Per, int shift) {...} дело даже не дошло, с чем, собственно, и хочу обратиться к опытным разработчикам индикаторов.

 Вот что смог нарисовать:

#property indicator_chart_window
#property indicator_buffers 8
#property indicator_plots   8

#property indicator_label1  "FractalUp1"
#property indicator_type1   DRAW_ARROW
#property indicator_color1 clrRed
#property indicator_width1  2

#property indicator_label2  "FractalDw1"
#property indicator_type2   DRAW_ARROW
#property indicator_color2 clrRed
#property indicator_width2  2

#property indicator_label3  "FractalUp2"
#property indicator_type3   DRAW_ARROW
#property indicator_color3 clrBlue
#property indicator_width3  2

#property indicator_label4  "FractalDw2"
#property indicator_type4   DRAW_ARROW
#property indicator_color4 clrBlue
#property indicator_width4  2

#property indicator_label5  "FractalUp3"
#property indicator_type5   DRAW_ARROW
#property indicator_color5 clrGold
#property indicator_width5  2

#property indicator_label6  "FractalDw3"
#property indicator_type6   DRAW_ARROW
#property indicator_color6 clrGold
#property indicator_width6  2

#property indicator_label7  "FractalUp4"
#property indicator_type7   DRAW_ARROW
#property indicator_color7 clrSienna
#property indicator_width7  2

#property indicator_label8  "FractalDw4"
#property indicator_type8   DRAW_ARROW
#property indicator_color8 clrSienna
#property indicator_width8  2

double ExtMapBuffer1[];
double ExtMapBuffer2[];
double ExtMapBuffer3[];
double ExtMapBuffer4[];
double ExtMapBuffer5[];
double ExtMapBuffer6[];
double ExtMapBuffer7[];
double ExtMapBuffer8[];

int ArrowShift=-10;

int handle1;
int handle2;
int handle3;
int handle4;

int OnInit()
  {
//   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
//---
   SetIndexBuffer(0,ExtMapBuffer1,INDICATOR_DATA);
   PlotIndexSetInteger(0,PLOT_ARROW,217);
   PlotIndexSetInteger(0,PLOT_ARROW_SHIFT,ArrowShift);
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);
   ArrayInitialize(ExtMapBuffer1,EMPTY_VALUE);

   SetIndexBuffer(1,ExtMapBuffer2,INDICATOR_DATA);
   PlotIndexSetInteger(1,PLOT_ARROW,218);
   PlotIndexSetInteger(1,PLOT_ARROW_SHIFT,-ArrowShift);
   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,EMPTY_VALUE);
   ArrayInitialize(ExtMapBuffer2,EMPTY_VALUE);

//---
   SetIndexBuffer(2,ExtMapBuffer3,INDICATOR_DATA);
   PlotIndexSetInteger(2,PLOT_ARROW,217);
   PlotIndexSetInteger(2,PLOT_ARROW_SHIFT,ArrowShift);
   PlotIndexSetDouble(2,PLOT_EMPTY_VALUE,EMPTY_VALUE);
   ArrayInitialize(ExtMapBuffer3,EMPTY_VALUE);

   SetIndexBuffer(3,ExtMapBuffer4,INDICATOR_DATA);
   PlotIndexSetInteger(3,PLOT_ARROW,218);
   PlotIndexSetInteger(3,PLOT_ARROW_SHIFT,-ArrowShift);
   PlotIndexSetDouble(3,PLOT_EMPTY_VALUE,EMPTY_VALUE);
   ArrayInitialize(ExtMapBuffer4,EMPTY_VALUE);

//---
   SetIndexBuffer(4,ExtMapBuffer5,INDICATOR_DATA);
   PlotIndexSetInteger(4,PLOT_ARROW,217);
   PlotIndexSetInteger(4,PLOT_ARROW_SHIFT,ArrowShift);
   PlotIndexSetDouble(4,PLOT_EMPTY_VALUE,EMPTY_VALUE);
   ArrayInitialize(ExtMapBuffer5,EMPTY_VALUE);

   SetIndexBuffer(5,ExtMapBuffer6,INDICATOR_DATA);
   PlotIndexSetInteger(5,PLOT_ARROW,218);
   PlotIndexSetInteger(5,PLOT_ARROW_SHIFT,-ArrowShift);
   PlotIndexSetDouble(5,PLOT_EMPTY_VALUE,EMPTY_VALUE);
   ArrayInitialize(ExtMapBuffer6,EMPTY_VALUE);

//---
   SetIndexBuffer(6,ExtMapBuffer7,INDICATOR_DATA);
   PlotIndexSetInteger(6,PLOT_ARROW,217);
   PlotIndexSetInteger(6,PLOT_ARROW_SHIFT,ArrowShift);
   PlotIndexSetDouble(6,PLOT_EMPTY_VALUE,EMPTY_VALUE);
   ArrayInitialize(ExtMapBuffer7,EMPTY_VALUE);

   SetIndexBuffer(7,ExtMapBuffer8,INDICATOR_DATA);
   PlotIndexSetInteger(7,PLOT_ARROW,218);
   PlotIndexSetInteger(7,PLOT_ARROW_SHIFT,-ArrowShift);
   PlotIndexSetDouble(7,PLOT_EMPTY_VALUE,EMPTY_VALUE);
   ArrayInitialize(ExtMapBuffer8,EMPTY_VALUE);

   handle1=iFractals(_Symbol, PERIOD_M15);
   handle2=iFractals(_Symbol, PERIOD_H1);
   handle3=iFractals(_Symbol, PERIOD_H4);
   handle4=iFractals(_Symbol, PERIOD_D1);

   return(0);
  }

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 B1 = BarsCalculated(handle1);
   int B2 = BarsCalculated(handle2);
   int B3 = BarsCalculated(handle3);
   int B4 = BarsCalculated(handle4);

   CopyBuffer(handle1,0,0,B1,ExtMapBuffer1);
   CopyBuffer(handle1,1,0,B1,ExtMapBuffer2);
   CopyBuffer(handle2,2,0,B2,ExtMapBuffer3);
   CopyBuffer(handle2,3,0,B2,ExtMapBuffer4);
   CopyBuffer(handle3,4,0,B3,ExtMapBuffer5);
   CopyBuffer(handle3,5,0,B3,ExtMapBuffer6);
   CopyBuffer(handle4,6,0,B4,ExtMapBuffer7);
   CopyBuffer(handle4,7,0,B4,ExtMapBuffer8);

   return(rates_total);
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   return;
  }
 

 В нём, очевидно, не хватает некоторых условных проверок внутри OnCalculate, а также во внешней функции типа bool или я попросту не совсем верно использую то, что уже есть в коде. Также, возможно, необходимо в нужном месте правильно проинициализировать массивы и установить их как таймсерии?

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