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

 
Sayberix:

Я читаю. Просто еще туда наверное не дошел. Я думаю что не так просто осилить справку в 28 МБ пдф-го формата. Или другими словами - не все прихожане знают всю библию, хоть и свято веруют.

У меня другой вопрос, подскажите пожалуйста - если не трудно:

при выполнении кода в визуализаторе стратегий:

1. программа впадает в бесконечный цикл;

2. отличаются результаты выполнения:

без точек останова:

с точкой останова на Print:


Все делал на отладке исторических данных.

Вы постоянно увеличиваете переменную. Как думаете: когда размер переменной выйдет за рамки её границ?

 
Vladimir Karputov:

Вы постоянно увеличиваете переменную. Как думаете: когда размер переменной выйдет за рамки её границ?

Я думаю что на 10 итераций улонга должно было хватить. Вопрос тогда:

1. почему не обрывается цикл? и

2. почему не отображаются результаты самого счетчика времени выполнения итерации?


Из-за того что отладка проходила на исторических данных?

 
Sayberix:

Я думаю что на 10 итераций улонга должно было хватить. Вопрос тогда:

1. почему не обрывается цикл? и

2. почему не отображаются результаты самого счетчика времени выполнения итерации?


Из-за отладки на исторических данных?

Переменная у Вас объявлена на глобальном программном уровне - Вы её постоянно увеличиваете.

 
А-а понял ... Итерация проходит меньше чем за милисекунду ...
 
Vladimir Karputov:

Переменная у Вас объявлена на глобальном программном уровне - Вы её постоянно увеличиваете.

Все-равно не понимаю, причем тут глобальная переменная. Сама то программа ограничивается циклом: "for(int i=1; i<=10; i++)" ?

Или я чего-то не понимаю, объясните пожалуйста.

 
Sayberix:

Все-равно не понимаю, причем тут глобальная переменная. Сама то программа ограничивается циклом: "for(int i=1; i<=10; i++)" ?

Или я чего-то не понимаю, объясните пожалуйста.

Уберите переменные

ulong count, raschet = 1;

из глобальной области видимости.


Вы на каждом тике многократно увеличиваете переменную raschet. И на следующем тике СНОВА ПРОДОЛЖАЕТЕ ЕЁ многократно увеличивать. Несколько тиков - и переменная raschet выходит за свои границы. В конце концов Вы делаете распечатку значений переменной, но почему то не смотрите в эту распечатку.

 
Vladimir Karputov:

Уберите переменные

из глобальной области видимости.


Вы на каждом тике многократно увеличиваете переменную raschet. И на следующем тике СНОВА ПРОДОЛЖАЕТЕ ЕЁ многократно увеличивать. Несколько тиков - и переменная raschet выходит за свои границы. В конце концов Вы делаете распечатку значений переменной, но почему то не смотрите в эту распечатку.

Спасибо, я понял. Я просто запутался, думая что return вообще останавливает программу, тогда как он просто прерывает ее выполнение на текущем тике. Вместо "return;" поставил "ExpertRemove();".

 

Подскажите пожалуйста, в этом коде:

//+------------------------------------------------------------------+
//|                                                          env.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property indicator_buffers 2

int envHandle;
double upperEnv[], lowerEnv[];

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   envHandle = iCustom(_Symbol,_Period,"Examples\\Envelopes",3,0,MODE_LWMA,PRICE_OPEN,0.03);
   if(envHandle<0)
     {
      Alert("Ошибка при создании индикаторов - номер ошибки: ",GetLastError(),"!!");
      return(INIT_FAILED);
     }
   SetIndexBuffer(0,upperEnv,INDICATOR_DATA);
   SetIndexBuffer(1,lowerEnv,INDICATOR_DATA);

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Deinitialization function of the expert                          |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   IndicatorRelease(envHandle);
  }
//+------------------------------------------------------------------+
//| "Tick" event handler function                                    |
//+------------------------------------------------------------------+
void OnTick()
  {

   ArraySetAsSeries(upperEnv, true);
   ArraySetAsSeries(lowerEnv, true);

   if((CopyBuffer(envHandle,0,0,3,upperEnv)<0) || CopyBuffer(envHandle,1,0,3,lowerEnv)<0)
      Alert("Ошибка копирования буферов индикатора Envelopes - номер ошибки:",GetLastError(),"!!");

   double   upEnv = upperEnv[0];
   double   lowEnv = lowerEnv[0];
  }
//+------------------------------------------------------------------+

как можно получить постоянно обновляемые значения цен линий Envelopes в переменных upEnv и lowEnv? Индикатор то он рисует, а вот значения индикатора в переменных 2 раза обновятся и все.

 
Sayberix:

Подскажите пожалуйста, в этом коде:

как можно получить постоянно обновляемые значения цен линий Envelopes в переменных upEnv и lowEnv? Индикатор то он рисует, а вот значения индикатора в переменных 2 раза обновятся и все.

Вы сначала определитесь: Вы хотите написать советник или индикатор? (Сейчас у Вас в коде каша - смешаны в кучу и индикатор и советник) - то есть код неработоспособный.

Подсказка: для создания заготовки используйте MQL Wizard.

 
Vladimir Karputov:

Вы сначала определитесь: Вы хотите написать советник или индикатор? (Сейчас у Вас в коде каша - смешаны в кучу и индикатор и советник) - то есть код неработоспособный.

Подсказка: для создания заготовки используйте MQL Wizard.

Пробовал уже. Но в мастере он там генерит с классами. Мне бы хотя бы по простому разобраться - в том коде который я хотя бы не много понимаю. Не могли бы подсказать, как подправить код чтобы получить значения индикатора в советнике? 

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