Как вызвать пользовательские индикоторы при написании советника?

 
Как при написаниии советника, вызвать пользовательские индикоторы ZigZag и Heiken Ashi?
При использовании "обычного" индикатора значения устанавливаюся ma=iMA(NULL...). Как быть здесь? Пожалуйста покажите на примере с небольшим кодом!
Заранее спасибо!
 

Пример для ЗЗ:

//+----------------------------------------------------------------------------+
//|  Возвращает экстремум ЗигЗага по его номеру.                               |
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL - текущий символ)                 |
//|    tf - таймфрейм                  ( 0   - текущий ТФ)                     |
//|    ne - номер экстремума           ( 0   - последний)                      |
//|    dp - ExtDepth                                                           |
//|    dv - ExtDeviation                                                       |
//|    bs - ExtBackstep                                                        |
//+----------------------------------------------------------------------------+
double GetExtremumZZPrice(string sy="0", int tf=0, int ne=0, int dp=12, int dv=5, int bs=3) {
  if (sy=="" || sy=="0") sy=Symbol();
  double zz;
  int    i, k=iBars(sy, tf), ke=0;
 
  for (i=1; i<k; i++) {
    zz=iCustom(sy, tf, "ZigZag", dp, dv, bs, 0, i);
    if (zz!=0) {
      ke++;
      if (ke>ne) return(zz);
    }
  }
  Print("GetExtremumZZPrice(): Экстремум ЗигЗага номер ",ne," не найден");
  return(0);
}
 
KimIV:

Пример для ЗЗ:



//+----------------------------------------------------------------------------+
//|  Возвращает экстремум ЗигЗага по его номеру.                               |
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL - текущий символ)                 |
//|    tf - таймфрейм                  ( 0   - текущий ТФ)                     |
//|    ne - номер экстремума           ( 0   - последний)                      |
//|    dp - ExtDepth                                                           |
//|    dv - ExtDeviation                                                       |
//|    bs - ExtBackstep                                                        |
//+----------------------------------------------------------------------------+
double GetExtremumZZPrice(string sy="0", int tf=0, int ne=0, int dp=12, int dv=5, int bs=3) {
  if (sy=="" || sy=="0") sy=Symbol();
  double zz;
  int    i, k=iBars(sy, tf), ke=0;
 
  for (i=1; i<k; i++) {
    zz=iCustom(sy, tf, "ZigZag", dp, dv, bs, 0, i);
    if (zz!=0) {
      ke++;
      if (ke>ne) return(zz);
    }
  }
  Print("GetExtremumZZPrice(): Экстремум ЗигЗага номер ",ne," не найден");
  return(0);
}
Пр написания советника. если меня интересует сравнение двух баров по индикатору ZigZag мне пеобходимо употребить весь этот код. А можно так? Что такое
dp - ExtDepth                                                           |
//|    dv - ExtDeviation                                                       |
//|    bs - ExtBackstep



extern double Lots = 0.1;
extern double TrailingStop = 40;

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   double zz1, zz2;
   int cnt, ticket, total;

   if(Bars<100)
     {
      Print("bars less than 100");
      return(0);  
     }
 
   
zz1=iCustom(0, 0, "ZigZag", dp, dv, bs, 0, 1);
zz2=iCustom(0, 0, "ZigZag", dp, dv, bs, 0, 2);

total=OrdersTotal();
if(total<1)
{
// Проверка свободной маржи
if(AccountFreeMargin()<(1000*Lots))
{
Print("We have no money. Free Margin = ", AccountFreeMargin());
return(0);
}
// Условие открытие позиции BUY
if(zz1>zz2)

 
Kostay:

Как при написаниии советника, вызвать пользовательские индикоторы ZigZag и Heiken Ashi?
При использовании "обычного" индикатора значения устанавливаюся ma=iMA(NULL...). Как быть здесь? Пожалуйста покажите на примере с небольшим кодом!
Заранее спасибо!



Посмотрите параграф Учебник по MQL4 - Простые программы на MQL4 - Совместное использование программ . (блок 5-6 в советнике shared.mq4). При необходимости можно вернуться и просмотреть роль буферов в пользовательских индикаторах в паранрафе Создание пользовательских индикаторов.
 
Большое Спасибо.
 
Вопрос. Написать значения индикатора Heiken Ashi получилось (код успешно компилируется). Но как сравнивать при составлении условий? индикатор рисуется на графике цен. если есть значение Буфера 3 (понижающаяся гистограмма), то тогда нет значения Буфера 4 (повышающаяся гистограмма). Как их сравнивать? Позиция на покупку открывается когда появляется растущая гистограмма - буффек 4. Короткая позиция открывается при понижающейся гистограмме - буффер 3. Пытался сравнить так : HA_3_2<HA_4_1 (длинная позиция), HA_4_2>HA_3_1 (короткая позиция). Ничего не получилось.

int start()
{
double HA_3_1, HA_4_1, HA_3_2, HA_4_2;
int cnt, ticket, total;

HA_3_1=iCustom(0,0,"Heiken Ashi",3,1);
HA_4_1=iCustom(0,0,"Heiken Ashi",4,1);
HA_3_2=iCustom(0,0,"Heiken Ashi",3,2);
HA_4_2=iCustom(0,0,"Heiken Ashi",4,2);

total=OrdersTotal();
if(total<1)
{
// Условие открытие позиции BUY
if(!HA_3_1)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",16384,0,Green);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
}
else Print("Error opening BUY order : ",GetLastError());
return(0);
}
// Условие открытие позиции SELL
if(!HA_4_1)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"",16384,0,Red);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
}
else Print("Error opening SELL order : ",GetLastError());
return(0);
}
return(0);
}
for(cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL &&
OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUY) // длинная позиция открыта
{
// условие закрытие длинной позиции
if(!HA_4_1)
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet);
return(0);
}
}
else
{
// условие закрытия короткой позиции
if(!HA_3_1)
{
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet);
return(0);
}
}
}
}
return(0);
}
 
Если вы используете стандартный Heiken Ashi, поставляемый с MT4, то вызов
iCustom(0,0,"Heiken Ashi",3,1)
является неправильным, так как у индикатора имеется четыре входных параметра - color1, color2, color3 и color4.Поэтому правильным будет такой вызов:
iCustom(0,0, "Heiken Ashi", Red, White, Red, White, 3, 1)
это для четвертого буфера предыдущего бара.
Дело в том, что при использовании iCustom необходимо передавать входные параметры индикатора в том порядке, в котором они объявлены в самом индикаторе. В данном случае лично я вижу такой подбор входных параметров в Heiken Ashi:
extern color color1 = Red;
extern color color2 = White;
extern color color3 = Red;
extern color color4 = White;
Версия индикатора, на которую я ссылаюсь, прикрепил.
Файлы:
 
Параметры можно не передавать или можно передавать меньшее количество параметров. Большее нельзя.
 

Поэкспериментировал - оказывается и болшее количество параметров можно передавать

 
У меня версия индикатора такая же. Но как с учетом буферов составлять условие покупки длинных и коротких позиций?
если есть значение Буфера 3 (понижающаяся гистограмма), то тогда нет значения Буфера 4 (повышающаяся гистограмма). Как их сравнивать? Позиция на покупку открывается когда появляется растущая гистограмма - буффек 4. Короткая позиция открывается при понижающейся гистограмме - буффер 3. Пытался сравнить так : HA_3_2<HA_4_1 (длинная позиция), HA_4_2>HA_3_1 (короткая позиция). Ничего не получилось.
 
Scriptong >>:
Если вы используете стандартный Heiken Ashi, поставляемый с MT4, то вызов
является неправильным, так как у индикатора имеется четыре входных параметра - color1, color2, color3 и color4.Поэтому правильным будет такой вызов:
это для четвертого буфера предыдущего бара.
Дело в том, что при использовании iCustom необходимо передавать входные параметры индикатора в том порядке, в котором они объявлены в самом индикаторе. В данном случае лично я вижу такой подбор входных параметров в Heiken Ashi:
Версия индикатора, на которую я ссылаюсь, прикрепил.

А почему именно 3-й индекс указываете? Значения какой тогда линии будут вызываться? Объясните пожалуйста, меня тоже интересует этот вопрос, но я не совсем понимаю. Мне нужны значения те, которые показываются в окне данных в терминале. И там всего одно значение к каждому бару, несмотря на то что 4 буфера и линии!!!

iCustom(0,0, "Heiken Ashi", Red, White, Red, White, 3, 1)