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

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.

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

Опирался изначально на эту статью:  https://www.mql5.com/ru/articles/43

Но там код только до момента проверки и получения данных индикаторов в буферные массивы, дальше нет примера как работать с полученными данными индикатора. Копался в справочнике, там в основном примеры кода для индикаторов, вот я оттуда и нацеплял уже setindexbuffer. Хотя бы намекните, в какую сторону "копать". Вчера уже замучился, пол дня просидел.

Способы вызова индикаторов в MQL5
Способы вызова индикаторов в MQL5
  • www.mql5.com
В MQL5 существует несколько вариантов вызова индикаторов, и осуществляются они в основном при помощи функций IndicatorCreate() и iCustom(). Причем эти функции лишь возвращают хендл индикатора, и дальнейшая работа с индикаторами ведется именно через него. Так что же такое хендл? Как работать с функциями IndicatorCreate() и iCustom()? И как...
Sayberix:

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

Пример: как из советника получить значения индикатора iEnvelopes

//+------------------------------------------------------------------+
//|                         Example iEnvelopes values on a chart.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//--- input parameters
input int      Input1=9;
//---
int      handle_iEnvelopes;                     // variable for storing the handle of the iEnvelopes indicator
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create handle of the indicator iEnvelopes
   handle_iEnvelopes=iEnvelopes(Symbol(),Period(),3,0,MODE_LWMA,PRICE_OPEN,0.03);
//--- if the handle is not created
   if(handle_iEnvelopes==INVALID_HANDLE)
     {
      //--- tell about the failure and output the error code
      PrintFormat("Failed to create handle of the iEnvelopes indicator for the symbol %s/%s, error code %d",
                  Symbol(),
                  EnumToString(Period()),
                  GetLastError());
      //--- the indicator is stopped early
      return(INIT_FAILED);
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   string text="";
   double upper[],lower[];
   ArraySetAsSeries(upper,true);
   ArraySetAsSeries(lower,true);
   int start_pos=0,count=3;
   if(!iGetArray(handle_iEnvelopes,UPPER_LINE,start_pos,count,upper) ||
      !iGetArray(handle_iEnvelopes,LOWER_LINE,start_pos,count,lower))
     {
      return;
     }
   string text_upper="",text_lower="";
   for(int i=count-1; i>=0; i--)
     {
      text_upper  = text_upper   + "Upper"+"["+IntegerToString(i)+"]"+" "+DoubleToString(upper[i],Digits()+1)  +" | ";
      text_lower  = text_lower   + "Lower"+"["+IntegerToString(i)+"]"+" "+DoubleToString(lower[i],Digits()+1)  +" | ";
     }
   Comment(text_upper+"\n"+text_lower);
  }
//+------------------------------------------------------------------+
//| Get value of buffers                                             |
//+------------------------------------------------------------------+
bool iGetArray(const int handle,const int buffer,const int start_pos,
               const int count,double &arr_buffer[])
  {
   bool result=true;
   if(!ArrayIsDynamic(arr_buffer))
     {
      PrintFormat("ERROR! EA: %s, FUNCTION: %s, this a no dynamic array!",__FILE__,__FUNCTION__);
      return(false);
     }
   ArrayFree(arr_buffer);
//--- reset error code
   ResetLastError();
//--- fill a part of the iBands array with values from the indicator buffer
   int copied=CopyBuffer(handle,buffer,start_pos,count,arr_buffer);
   if(copied!=count)
     {
      //--- if the copying fails, tell the error code
      PrintFormat("ERROR! EA: %s, FUNCTION: %s, amount to copy: %d, copied: %d, error code %d",
                  __FILE__,__FUNCTION__,count,copied,GetLastError());
      //--- quit with zero result - it means that the indicator is considered as not calculated
      return(false);
     }
   return(result);
  }
//+------------------------------------------------------------------+


Результат:


Vladimir Karputov:

Пример: как из советника получить значения индикатора iEnvelopes

Спасибо большое! Буду разбираться!

Vladimir Karputov:


Владимир, скажите пожалуйста: откуда он получает UPPER_LINE и  LOWER_LINE ? Если мы только хендл индикатора получили, неужели из хендла сразу так и получили?

Sayberix:

Владимир, скажите пожалуйста: откуда он получает UPPER_LINE и  LOWER_LINE ? Если мы только хендл индикатора получили, неужели и хендла сразу так и получили?

Вопрос Ваш не понял. Набор букв без смысла. Пожалуйста перефразируйте Ваш вопрос - не спешите набирать текст, обдумайте свой вопрос и спокойно наберите текст.

Vladimir Karputov:

Вопрос Ваш не понял. Набор букв без смысла. Пожалуйста перефразируйте Ваш вопрос - не спешите набирать текст, обдумайте свой вопрос и спокойно наберите текст.

В аргументе ф-ции:

iGetArray(handle_iEnvelopes,UPPER_LINE,start_pos,count,upper)

вы использовали UPPER_LINE.

Откуда берется это значение параметра, из полученного ранее хендла:

handle_iEnvelopes=iEnvelopes(Symbol(),Period(),3,0,MODE_LWMA,PRICE_OPEN,0.03);

?