Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 466

 

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

исходники индикатора приложены. Готов выслушать советы и подсказки, что делаю не так.

Код из советника:

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(Time[0] == prevtime) return;
   prevtime = Time[0];
   

   if(iCustom(NULL,0,"modify_Fractal",0,0) > 0) Print("x = ", 0, "  fractal Up: ", iCustom(NULL,0,"modify_Fractal",0,0));     
   if(iCustom(NULL,0,"modify_Fractal",0,2) > 0) Print("x = ", 2, "  fractal Up: ", iCustom(NULL,0,"modify_Fractal",0,2));
   if(iCustom(NULL,0,"modify_Fractal",0,3) > 0) Print("x = ", 3, "  fractal Up: ", iCustom(NULL,0,"modify_Fractal",0,3));   
   if(iCustom(NULL,0,"modify_Fractal",0,4) > 0) Print("x = ", 4, "  fractal Up: ", iCustom(NULL,0,"modify_Fractal",0,4));
   if(iCustom(NULL,0,"modify_Fractal",0,5) > 0) Print("x = ", 5, "  fractal Up: ", iCustom(NULL,0,"modify_Fractal",0,5)); 
   if(iCustom(NULL,0,"modify_Fractal",0,6) > 0) Print("x = ", 6, "  fractal Up: ", iCustom(NULL,0,"modify_Fractal",0,6));
   
  // тут везде 0
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
      Print("Deinit Function");
      
      for (int x = 0; x < 100; x++ )
      {
         if(iCustom(NULL,0,"modify_Fractal",0,x) > 0) Print("x = ", x, "  fractal Up: ", iCustom(NULL,0,"modify_Fractal",0,x));
         if(iCustom(NULL,0,"modify_Fractal",1,x) > 0) Print("x = ", x, "  fractal Down: ", iCustom(NULL,0,"modify_Fractal",1,x));
      }
   // а здесь полный буфер правильных значений индикатора.
  }
Файлы:
 
Karputov Vladimir:

Можно if'ы в конце заменить на:

хо так просто ,,,:)

Спасибо

 
Maxim Dobrovolskii:

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

исходники индикатора приложены. Готов выслушать советы и подсказки, что делаю не так.

Код из советника:

Очень бегло глянул. Вопрос: а разве фрактал может быть на нулевом баре? А вот в OnDeinit() вы пробегаетесь в цикле по барам и, естественно, находите фрактал (не пустое значение буфера).
 
Artyom Trishkin:
Очень бегло глянул. Вопрос: а разве фрактал может быть на нулевом баре? А вот в OnDeinit() вы пробегаетесь в цикле по барам и, естественно, находите фрактал (не пустое значение буфера).
на нулевом баре не может, у меня минимум на 4, 0-3 я написал для "а может я такой криворукий и что то не так накодил". в Deinit я так же прохожу по 4-6 и все на своих местах, значения имеются.  это мне и не понятно.
 
Maxim Dobrovolskii:
на нулевом баре не может, у меня минимум на 4, 0-3 я написал для "а может я такой криворукий и что то не так накодил". в Deinit я так же прохожу по 4-6 и все на своих местах, значения имеются.  это мне и не понятно.

В OnDeinit() вы пробегаете в цикле (от 0 до 100) по барам в поиске не нулевого значения и выводите в журнал найденное значение.

А в OnTick() вы пытаетесь вывести только 6 последних баров буфера 0. На них фрактала может и не быть.

Сначала найдите бар, на котором есть фрактал, а потом значение этого бара и выводите.

 
Artyom Trishkin:

В OnDeinit() вы пробегаете в цикле (от 0 до 100) по барам в поиске не нулевого значения и выводите в журнал найденное значение.

А в OnTick() вы пытаетесь вывести только 6 последних баров буфера 0. На них фрактала может и не быть. Сначала найдите бар, на котором есть фрактал, а потом значение этого бара и выводите.

в 6 баре по задумке и должен быть фрактал.

2015.11.01 13:19:11.023    2015.10.30 22:54  MoneyRobotics_Proboi! EURUSD,H1: x = 29  fractal Up: 1.09855
2015.11.01 13:19:11.023    2015.10.30 22:54  MoneyRobotics_Proboi! EURUSD,H1: x = 21  fractal Up: 1.09976
2015.11.01 13:19:11.023    2015.10.30 22:54  MoneyRobotics_Proboi! EURUSD,H1: x = 16  fractal Down: 1.09652
2015.11.01 13:19:11.023    2015.10.30 22:54  MoneyRobotics_Proboi! EURUSD,H1: x = 6  fractal Up: 1.10721
2015.11.01 13:19:10.577    2015.10.30 22:54  MoneyRobotics_Proboi! EURUSD,H1: Deinit Function
2015.11.01 13:19:08.380    2015.10.01 00:00  MoneyRobotics_Proboi! test started

это начало лога. старт теста, советник отработал, запускается Deinit, и сразу на 6 позиции находит фрактал. мне в таком случае не понятно, как обращаться к индикаторному буферу.



https://charts.mql5.com/9/256/eurusd-h1-alpari-limited-3.png

повтор изображения.

Файлы:
 
Maxim Dobrovolskii:

в 6 баре по задумке и должен быть фрактал.

2015.11.01 13:19:11.023    2015.10.30 22:54  MoneyRobotics_Proboi! EURUSD,H1: x = 29  fractal Up: 1.09855
2015.11.01 13:19:11.023    2015.10.30 22:54  MoneyRobotics_Proboi! EURUSD,H1: x = 21  fractal Up: 1.09976
2015.11.01 13:19:11.023    2015.10.30 22:54  MoneyRobotics_Proboi! EURUSD,H1: x = 16  fractal Down: 1.09652
2015.11.01 13:19:11.023    2015.10.30 22:54  MoneyRobotics_Proboi! EURUSD,H1: x = 6  fractal Up: 1.10721
2015.11.01 13:19:10.577    2015.10.30 22:54  MoneyRobotics_Proboi! EURUSD,H1: Deinit Function
2015.11.01 13:19:08.380    2015.10.01 00:00  MoneyRobotics_Proboi! test started

это начало лога. старт теста, советник отработал, запускается Deinit, и сразу на 6 позиции находит фрактал. мне в таком случае не понятно, как обращаться к индикаторному буферу.



https://charts.mql5.com/9/256/eurusd-h1-alpari-limited-3.png

повтор изображения.

Вот это:

if(Time[0] == prevtime) return;
   prevtime = Time[0];

сделайте

prevtime = Time[0];

в самом конце

 
Artyom Trishkin:

Вот это:

сделайте

в самом конце

а как это может повлиять? к сожалению ничего не изменилось.

как я себе представляю процесс: индикатор подгружается, начинает каждый тик/бар проверять условие, если оно соблюдается, кладет значение в выбранный буфер или буферы, затем советник обращается к индикатору по номеру буфера к значению по определенному смещению и берет значение. Так?

 
Maxim Dobrovolskii:

а как это может повлиять? к сожалению ничего не изменилось.

как я себе представляю процесс: индикатор подгружается, начинает каждый тик/бар проверять условие, если оно соблюдается, кладет значение в выбранный буфер или буферы, затем советник обращается к индикатору по номеру буфера к значению по определенному смещению и берет значение. Так?

А зачем в индикаторе контроль нового бара? Судя по всему сложных расчетов нет
 
Victor Nikolaev:
А зачем в индикаторе контроль нового бара? Судя по всему сложных расчетов нет
контроль нового бара в советнике, который использует индикатор.
Причина обращения: