Обсуждение статьи "Расширение стандартной библиотеки MQL5 и повторное использование кода"

 

Опубликована статья Расширение стандартной библиотеки MQL5 и повторное использование кода:

Стандартная библиотека MQL5 значительно упрощает жизнь разработчика. Однако она не может удовлетворить все требования абсолютно всех разработчиков в мире, поэтому если вы хотите иметь в своем распоряжении больше пользовательских элементов, вам необходимо расширить ее. В статье описывается интеграция обычного индикатора ZigZag в стандартную библиотеку. В ходе работы мы придерживались принципов разработки, применяемых в компании MetaQuotes.

Говоря кратко, MQL5 API предлагает вам надежность, гибкость, простоту обслуживания, а также возможность повторного использования кода. Если вы собираетесь совершенствовать ваши навыки в языке MQL5 и разрабатывать сложные приложения, например, мультивалютные советники, вам прежде всего необходимо освоить стандартную библиотеку, чтобы обеспечить своим программам успешную жизнь.

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

Рис. 2. Загрузка стандартного индикатора ZigZag в терминале MetaTrader 5

Автор: Jordi Bassaganas

 

строка

m_handle=iCustom(symbol,period,"zigzag",depth,deviation_create,backstep);

у меня не находит путь к индикатору.

Как правильно указывать здесь путь, индикаторы которые пытаюсь вызвать лежать в стандартной папке

 
Tango_X:

строка

m_handle=iCustom(symbol,period,"zigzag",depth,deviation_create,backstep);

у меня не находит путь к индикатору.

Как правильно указывать здесь путь, индикаторы которые пытаюсь вызвать лежать в стандартной папке

Стандартный Zigzag лежит в папке Examples - нужно добавить имя папки в путь


 
Rashid Umarov:

Стандартный Zigzag лежит в папке Examples - нужно добавить имя папки в путь



2017.07.12 10:38:05.703 Proba2 (EURUSD.m,M1) cannot load custom indicator 'Examples\ZigZag' [4302]

что не так?? все ведь как у вас на рисунке
 
Tango_X:

2017.07.12 10:38:05.703 Proba2 (EURUSD.m,M1) cannot load custom indicator 'Examples\ZigZag' [4302]

что не так?? все ведь как у вас на рисунке

А кто будет смотреть на код ошибки?

ERR_MARKET_NOT_SELECTED

4302

Символ не выбран в MarketWatch

 
Rashid Umarov:

А кто будет смотреть на код ошибки?

ERR_MARKET_NOT_SELECTED

4302

Символ не выбран в MarketWatch


Ставлю NULL - работает, ставлю "EURUSD" - не работает!!!

bool CiZigZag::Create(const string symbol,const ENUM_TIMEFRAMES period,
                      const int depth,const int deviation_create,const int backstep)
  {
//--- проверяем историю
   if(!SetSymbolPeriod(symbol,period))
      return(false);
//--- создаем
   //m_handle=iCustom(symbol,period,"Examples\\ZigZag",depth,deviation_create,backstep);
     //m_handle=iCustom("EURUSD",period,"Examples\\ZigZag",depth,deviation_create,backstep); - НЕ работает
     m_handle=iCustom(NULL,period,"Examples\\ZigZag",depth,deviation_create,backstep);       - работает
//--- проверяем результат
   if(m_handle==INVALID_HANDLE)
      return(false);
//--- индикатор успешно создан
   if(!Initialize(symbol,period,depth,deviation_create,backstep))
     {
      //--- ошибка инициализации
      IndicatorRelease(m_handle);
      m_handle=INVALID_HANDLE;
      return(false);
     }
//--- ok
   return(true);
  }
      IndicatorRelease(m_handle);
      m_handle=INVALID_HANDLE;
      return(false);
     }
//--- ok
   return(true);
  }
 
Все понял! Вопрос снят! у меня имя символа с префиксом) - "EURUSD.m"
 
//+------------------------------------------------------------------+
//| Создаем индикатор "Zig Zag"                                      |
//+------------------------------------------------------------------+
bool CiZigZag::Create(const string symbol,const ENUM_TIMEFRAMES period,
                      const int depth,const int deviation_create,const int backstep)
  {
//--- проверяем историю
   if(!SetSymbolPeriod(symbol,period))
      return(false);
//--- создаем
   m_handle=iCustom(symbol,period,"zigzag",depth,deviation_create,backstep);
//--- проверяем результат
   if(m_handle==INVALID_HANDLE)
      return(false);
//--- индикатор успешно создан
   if(!Initialize(symbol,period,depth,deviation_create,backstep))
     {
      //--- ошибка инициализации
      IndicatorRelease(m_handle);
      m_handle=INVALID_HANDLE;
      return(false);
     }
//--- ok
   return(true);
  }
bool CiZigZag::Initialize(const string symbol,const ENUM_TIMEFRAMES period,
                        const int depth,const int deviation_init,const int backstep)
  {
   if(CreateBuffers(symbol,period,3))
     {
      //--- строка состояния отрисовки
      m_name  ="ZigZag";
      m_status="("+symbol+","+PeriodDescription()+","+
               IntegerToString(depth)+","+IntegerToString(deviation_init)+","+
               IntegerToString(backstep)+") H="+IntegerToString(m_handle);
      //--- сохраняем настройки
      m_depth=depth;
      m_deviation=deviation_init;
      m_backstep=backstep;       
      //--- создаем буферы
      ((CIndicatorBuffer*)At(0)).Name("ZIGZAG");
      ((CIndicatorBuffer*)At(1)).Name("HIGH");
      ((CIndicatorBuffer*)At(2)).Name("LOW");
      //--- ok
      return(true);
     }
//--- ошибка
   return(false);
  }


Помогите понять, как здесь задается направление индексации массива буфера индикатора, т.е. так же как задает ArraySetAsSeries. По умолчанию получается направление от настоящего в прошлое а надо сделать от прошлого в настоящее. Со вчерашнего дня бьюсь над этим вопросом! помогите! 

 
Tango_X:


Помогите понять, как здесь задается направление индексации массива буфера индикатора, т.е. так же как задает ArraySetAsSeries. По умолчанию получается направление от настоящего в прошлое а надо сделать от прошлого в настоящее. Со вчерашнего дня бьюсь над этим вопросом! помогите! 

Ему это не требуется, так как он использует стандартный ZigZag

//--- создаем
   m_handle=iCustom(symbol,period,"zigzag",depth,deviation_create,backstep);

Вот в этом ZigZag и ищите место, где задается направление.  Только все равно непонятно, зачем вам это нужно - направление индексации можно менять самостоятельно в любой момент - https://www.mql5.com/ru/docs/series.

Документация по MQL5: Доступ к таймсериям и индикаторам
Документация по MQL5: Доступ к таймсериям и индикаторам
  • www.mql5.com
Доступ к таймсериям и индикаторам - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Rashid Umarov:

Ему это не требуется, так как он использует стандартный ZigZag

Вот в этом ZigZag и ищите место, где задается направление.  Только все равно непонятно, зачем вам это нужно - направление индексации можно менять самостоятельно в любой момент - https://www.mql5.com/ru/docs/series.


Спасибо за информацию, будем разбираться!

 
Rashid Umarov:

Ему это не требуется, так как он использует стандартный ZigZag

Вот в этом ZigZag и ищите место, где задается направление.  Только все равно непонятно, зачем вам это нужно - направление индексации можно менять самостоятельно в любой момент - https://www.mql5.com/ru/docs/series.


Извините но все равно не понятно как менять направление индексации, к примеру если нет доступа к исходнику Zigzag. Направление индексации задает ArraySetAsSeries() - где входным параметром является массив по ссылке,  

но у нас этого массива нет а есть только указатель на массив буфера индикатора в виде

//--- создаем буферы
      ((CIndicatorBuffer*)At(0)).Name("ZIGZAG");
      ((CIndicatorBuffer*)At(1)).Name("HIGH");
      ((CIndicatorBuffer*)At(2)).Name("LOW");
Причина обращения: